python网站开发模板,python网站模板下载

大家好,给大家分享一下python网站开发模板,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!

Source code download: 本文相关源码

说明

搭建网站模板的原因是未来需要快速的启动多个不同的web服务,建立一个 基于自有算网的分布式web服务。

本篇梳理一下网站的模板(结构及静态资源),未来新的网站可以把模板拷贝过去再进行个性化调整就可以了 不会c语言可以学python吗。

1 结构

首先使用函数生成docker-compose项目结构。

import DataManipulation as dm 
# base_prj2 建立基础的web模板
dm.make_folder_struct(project_name='base_prj2', appname='base_web')

在这里插入图片描述
模板生成时,模型文件是空的,这里尝试使用jinja的方式写入。未来会形成几套模板,对应生成项目时就可以直接写入内容,表面手工的文件操作。(同理,系统的设置也将如此)

jinja的写入这里就不细说了,下次在别的地方专门说。

2 资源

资源的加载是有顺序的,本例用到了以下资源,都是耳熟能详的,就不解释了。

  • 1 网页图标
<link rel="shortcut icon" href="/static/img/tem_logo.ico" type="image/x-icon">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
  • 2 Bootstrap4
<link rel="stylesheet" href="/static/vendor/Bootstrap/css/bootstrap.min.css">
< src="/static/vendor/jquery/jquery.js"></>
< src="/static/vendor/Bootstrap/js/bootstrap.min.js"></>
< src="/static/vendor/Bootstrap/js/popper.min.js"></>

-3 DataTables

<link rel="stylesheet" href="/static/vendor/DataTables/css/dataTable.css">
< src="/static/vendor/DataTables/js/dataTable.js"></>

<!-- 3.1下载数据表的插件 -->
< src="/static/vendor/DataTables/js/dataTables.buttons.min.js"></>
< src="/static/vendor/DataTables/js/buttons.html5.min.js"></>

<!-- 3.2下载数据表的插件 -->
< src="/static/vendor/ajax/pdfmake.min.js"></>
<!-- vfs_fonts要在pdfmake之后导入,否则会找不到字体 -->
< src="/static/vendor/ajax/vfs_fonts.js"></>
< src="/static/vendor/ajax/jszip.min.js"></>
  • 4 inputfile
<link href="/static/vendor/fileinput/css/fileinput.min.css" media="all" rel="stylesheet" type="text/css" />
< src="/static/vendor/fileinput/js/plugins/sortable.js" type="text/java"></>
< src="/static/vendor/fileinput/js/fileinput.min.js" type="text/java"></>
< src="/static/vendor/fileinput/js/locales/zh.js" type="text/java"></>
< src="/static/vendor/fileinput/themes/explorer-fa/theme.js" type="text/java"></>
< src="/static/vendor/fileinput/themes/fa/theme.js"></>
  • 5 FontAweson 要放在inputfile之后
<link rel="stylesheet" href="/static/vendor/FontAwesome/css/font-awesome.min.css">
<link href="/static/vendor/fileinput/themes/explorer-fa/theme.css" media="all" rel="stylesheet" type="text/css" />
  • 6 echarts
< src="/static/vendor/echarts/echarts.min.js"></>

3 基础网络服务

3.1 代码参考及解析

先参考一段代码
app. _init _.py

...
def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    # 为app增加功能
    db.init_app(app)
    login_manager.init_app(app)
    mail.init_app(app)
    bootstrap.init_app(app)
    moment.init_app(app)


    # 注册蓝本
    # 主函数
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
...

project.config.py

# 数据库/Mail两个是刚性设置
...
class Config:
    SECRET_KEY = '加密的种子文本,最好从环境变量读入'

    # 数据库
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True

    # 类方法
    # Config.init_app('') 直接调用
    @staticmethod
    def init_app(app):
        print('*** creating app by Config class')
... 

project.manage.py

...
app = create_app('test')
...
manager = Manager(app)

if __name__ == '__main__':
    # 阻塞版
    manager.run()

启动的结构为,进入project目录,执行命令(调试模式)。

python3 manager.py runserver -d
  • 1 manage.py 包装了app再启动的
  • 2 app是通过init.py里面的create_app创建的
  • 3 init.py初始文件从config.py里读取了配置。因为此时启动的路径是config.py的同级目录,所以在init.py中是这样导入配置的
  • 4 在init.py文件中,子模块通过蓝图的方式挂到了app下面。
from config import config

Note:如果把app当成一个程序包就比较好理解了。比较特殊的是static和template两个文件夹,被flask固定使用了。

原来的flask服务里面加了很多组件,但是作为基础板块,我们都不需要加,只要留一个框子就可以了。

3.2 构建最精简的web结构

最终的项目结构如下

base_web
├── Dockerfile
├── app
│   ├── __init__.py
│   ├── main
│   │   ├── __init__.py
│   │   └── views.py
│   ├── static
│   │   ├── img
│   │   └── vendor
│   └── templates
│       ├── base.html
│       └── main
├── config
│   └── config.py
├── data
├── entry_base_web.py
├── env
│   ├── entrypoint.sh
│   └── requirements.txt
├── log
└── packages
    └── DataManipulation-0.1.16.10-py3-none-any.whl

我们按顺序进行说明(项目的依赖包,环境什么的就不说了)

  • 1 首先我们得有一个入口函数entry_base_web.py
    函数很简单,就是调用app(此时被视为一个函数包,因为有init文件,python会自动认定)中的create_app函数,生成实际运行的app,并且设置为调试模式。如果要切换环境什么的可以参考我的 这篇文章进行微调就可以了。
from app import create_app

if __name__ == '__main__':

    app = create_app('test')
    app.run(debug=True)
  • 2 我们得要在app下面的__init__.py文件中创建create_app函数(当然另起一个文件也行)
from flask import Flask
# >>>>>>>>>>>>>>>>>>> 为了给Jinja导入bootstrap/wtf_form.html
from flask_bootstrap import Bootstrap
bootstrap = Bootstrap()

# >>>>>>>>>>>>>>>>>>> 自定义通用函数包
import DataManipulation as dm 


# >>>>>>>>>>>>>>>>>>> 创建app的函数,可以用于以后灵活的加插件
def create_app(config_name):
    app = Flask(__name__)
    bootstrap.init_app(app)

    # 注册蓝本 
    # 1 默认一个主函数
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app 

# >>>>>>>>>>>>>>>>>>> 值错误的处理,暂时不定义
class ValidationError(ValueError):
    pass

在app包的初始化文件中,其实只是导入了Flask基本包,Bootstrap插件,以及我自定义的DataManipulation包。在create_app中我们引入了一个main主函数,避免网站起来什么都看不到。

  • 3 创建main基本包。写入对应的__init__.pyviews.py两个文件。前者负责沟通结构,把定义的视图函数传给main包,以便create_app通过蓝图注册。
    __init__.py
from flask import Blueprint

# 优先指定蓝本
# main = Blueprint('main', __name__, url_prefix='/main')
# main的目录就是根目录
main = Blueprint('main', __name__)

from . import views

views.py

# 导入蓝图名称
from . import main
# 导入最基本的必要功能
from flask import render_template, jsonify
import DataManipulation as dm
# 定义whoami
@main.route('/whoami/', methods=['GET', 'POST'])
def whoami():
    res_dict ={}
    res_dict['hostname'] = dm.get_machine_hostname()
    res_dict['machine_ip'] = dm.get_machine_ip()
    res_dict['eid'] ='No Claimed'
    return jsonify(res_dict)


# 定义基础页面
@main.route('/', methods=['GET', 'POST'])
def index():
    return render_template('/main/index.html')

一个是whoami函数,指明了本机的身份。会以接口形式返回结果。
在这里插入图片描述
另一个则是网站启动时显示的函数。里面用到了一个页面index.html

{% extends 'base.html'%}

{%block navcontent%}

<div class="container-fluid"><a xtype="a" class="navbar-brand" href="#">Base_Web</a>
    <ul xtype="h5_ele" class="navbar-nav navbar-top mr-5">
        <li xtype="h5_ele" class="nav-item"><a xtype="h5_ele" href="{{url_for('main.index')}}" class="nav-link">主页</a>
        </li>
    </ul>
</div>
{%endblock%}

{%block pagecontent%}
<!-- 空白行作为间隔 -->
<div class="m-5"></div>

<div class="row">
    <div class="col md-12">
        <div xtype="h5_ele" class="jumbotron">
            <h1>BaseWeb</h1>
            <hr>
            <p> BaseWeb</p>
            <p> BaseWeb</p>
            <p> BaseWebBaseWebBaseWebBaseWebBaseWebBaseWeb</p>
            <p> BaseWebBaseWebBaseWebBaseWebBaseWebBaseWeb</p>
            <p> BaseWebBaseWebBaseWebBaseWebBaseWebBaseWeb</p>
        </div>
    </div>
</div>

<!-- 空白行作为间隔 -->
<div class="m-5"></div>

<div class="row">
    <div class="col md-12">
        <img src="static/img/main/test1.jpg" alt="" style="width: 100%;">
    </div>

</div>


{%endblock%}

页面继承了基础的页面 base.html并随便写了些内容。

<!DOCTYPE html>
<html>
{% import "bootstrap/wtf.html" as wtf %}
{%block head%} 
<!-- 1 网页图标 -->
<link rel="shortcut icon" href="/static/img/tem_logo.ico" type="image/x-icon">

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- 2 Bootstrap4 -->
<link rel="stylesheet" href="/static/vendor/Bootstrap/css/bootstrap.min.css">
< src="/static/vendor/jquery/jquery.js"></>
< src="/static/vendor/Bootstrap/js/bootstrap.min.js"></>
< src="/static/vendor/Bootstrap/js/popper.min.js"></>



<!-- 3 DataTables -->
<link rel="stylesheet" href="/static/vendor/DataTables/css/dataTable.css">
< src="/static/vendor/DataTables/js/dataTable.js"></>

<!-- 3.1下载数据表的插件 -->
< src="/static/vendor/DataTables/js/dataTables.buttons.min.js"></>
< src="/static/vendor/DataTables/js/buttons.html5.min.js"></>

<!-- 3.2下载数据表的插件 -->
< src="/static/vendor/ajax/pdfmake.min.js"></>
<!-- vfs_fonts要在pdfmake之后导入,否则会找不到字体 -->
< src="/static/vendor/ajax/vfs_fonts.js"></>
< src="/static/vendor/ajax/jszip.min.js"></>

<!-- 4 inputfile -->
<link href="/static/vendor/fileinput/css/fileinput.min.css" media="all" rel="stylesheet" type="text/css" />

<!-- FontAweson 要放在inputfile之后 -->
<link rel="stylesheet" href="/static/vendor/FontAwesome/css/font-awesome.min.css">
<link href="/static/vendor/fileinput/themes/explorer-fa/theme.css" media="all" rel="stylesheet" type="text/css" />


< src="/static/vendor/fileinput/js/plugins/sortable.js" type="text/java"></>
< src="/static/vendor/fileinput/js/fileinput.min.js" type="text/java"></>
< src="/static/vendor/fileinput/js/locales/zh.js" type="text/java"></>
< src="/static/vendor/fileinput/themes/explorer-fa/theme.js" type="text/java"></>
< src="/static/vendor/fileinput/themes/fa/theme.js"></>

<!-- 5 echarts-->
< src="/static/vendor/echarts/echarts.min.js"></>


<title>BaseWeb</title>

{%endblock%}

{%block nav%} 
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
    {%block navcontent%}
    <!-- Brand -->
    <a class="navbar-brand" href="{{url_for('main.index')}}">BaseWeb</a>
    {%endblock%}
</nav>
{%endblock%}


{%block body%} 
<body>
<div id="a0"></div>
    <div class="container">
            {%for message in get_flashed_messages()%}
            <div class='alert alert-warning'>
                <button type='button' class='close' data-dismiss='alert'> &times;</button>
                {{message}}
            </div>
            {%endfor%}
        {%block pagecontent%}
        <!-- row1 -->
        <div class="row">
            <div class="col">
                First Row First Col
            </div>

        </div>
        {%endblock%}
    </div>

</body>
{%endblock%}
</html>

base.html导入了网站所需的资源。到这里就完成了最简网站的所有配置,可以启动了。切换到项目所在的文件夹,执行:

python3 entry_base_web.py

在浏览其中访问,可以看到后端在第一次访问时载入了资源
在这里插入图片描述

前端的效果
在这里插入图片描述
后面就可以在这个基础上进行各种修改了。

w666666Wwwwwww
关注 关注
  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python flask开发模板
01-03
python flask框架开发模板,配置了数据库迁移(migrate) 日志logger 等 启动:python runserver.py 数据库迁移 :python manage.py db init
基于 Python 语言的 Django Web 项目模板
一米阳光的博客
01-31 1878
一款 Python 语言基于Django、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。
python网站开发模板,python网站模板采集
最新发布
2401_84668163的博客
05-02 11
前面提到的通用“Web 项目”模板只提供了一个空的 Visual Studio 项目,只有一个 Python 项目,没有代码,也没有任何假设。Command: can be a Python (*.py file), a module name (as in, python.exe -m module_name), or a single line of code (as in, python.exe -c "code"). 下拉列表中的值表明这些类型中有哪些适用。
使用Python进行页面开发——模板
weixin_63994459的博客
08-01 1345
首先在当前应用目录下创建一个模板标签目录,建议内放一个的空文件然后在目录下创建一个模板标签文件pagetag.py(这个名字随意取),具体代码如下#自定义过滤器(实现大写转换)',val)#自定义标签(实现减法计算)使用在模板文件使用6.自定义标签大写相减。...
python制作前端页面模块--Flask模块
qq_37037438的博客
02-27 4634
什么是Flask? Flask是一个web框架,也就是说web为你提供工具,库和技术来允许你构建一个web应用程序。这个web应用程序可以是一些web页面、博客、wiki、基于web的日历应用或商业网站。 Flask属于微框架这一类别,微框架通常是很小且不依赖外部库的框架。优点是框架很轻量,更新时依赖少,并且专注安全方面的bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。...
再见HTML ! 用纯Python就能写一个漂亮的网页!简单好用!
爬遍所有网站
07-10 2309
我们在写一个网站或者一个网页界面的时候,需要学习很多东西,对小白来说很困难!比如我要做一个简单的网页交互: 要懂后端,比如Python里面的Django或者Flask,或者是Java里面的SpringBoot 要懂前端,现在都叫大前端了(因为很复杂),比如前端的框架Vue/React, 然后页面的美化框架Bootstrap ,还有html ,csss 和Javascript 三驾马车. 天啊,听听头都大呢!其实我就给老板做一个简单的交互的页面,而且我只会Python ,有没有很简单的办法可以做到呢。
Python开发工程师简历模板
01-28
Python开发工程师简历模板(word版本),可以直接修改使用,助你快速被HR筛选到该简历Python开发工程师简历模板(word版本),可以直接修改使用,助你快速被HR筛选到该简历Python开发工程师简历模板(word版本),...
Python开发项目描述模板
08-04
Python开发项目描述模板
Python Web开发模板引擎优缺点总结
12-25
我陆续也接触了 Python 的不少模板引擎,感觉可以总结一下了。 一、首先按照我的熟悉程度列一下:pyTenjin:我在开发 Doodle 和 91 外教时使用。Tornado.template:我在开发知乎日报时使用。PyJade:我在开发知乎...
Python开发简历技能点模板
08-04
Python开发简历技能点模板
Python-TemPy一个Python向对象的快速HTML模板系统
08-10
TemPy一个Python向对象的快速HTML模板系统
Python 架简单网站
06-11
使用Python 搭建的简单网站。虽然没有复杂的功能,数据的读取,处理之类的也都有,算是动网了。很简单入门用。
python网页登录模板
PanDaoxi
02-07 4623
python网页登录模板
Python开发入门与实战4-模板页面
weixin_30478619的博客
07-14 149
4.Django基于模板页面 在前一章中,HTML是直接被硬编码在 Python views.py代码中,如下: from django.http import HttpResponse import datetime def hello(request): return HttpResponse("Hello world") def...
使用模板
cabbage2008的专栏
05-06 782
Web框架把我们从WSGI中拯救出来了。现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了。 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,但是,想想新浪首页的6000多行的HTML,你确信能在Python的字符串中正确地写出来么?反正我是做不到。
Python爬虫实战案例:一键爬取,多种网页模板任你选!
Code皮皮虾的博客
08-14 4461
文章目录一、网页查看二、网页爬取数据分析三、代码分析四、图片辅助分析五、运行结果 更多博主开源爬虫教程目录索引 一、网页查看 进入网页模板 多页爬取 二、网页爬取数据分析 三、代码分析 数据爬取部分 # 使用etree进行数据解析 tree = etree.HTML(page_text) #参考图1,使用xpath语法根据id定位,定位后拿到下面的所有div标签下的a标签的href属性 #所有详情页url a_list = tree.xpath("//div[@id='contain
Python 创建网页之模板使用
taxuezcy的博客
02-27 1607
一、概要说明1、之所以需要创建模板,主要是因为一旦项目庞大后,有许多网页具有许多相同的元素,基于此,应用模板会使得更新和维护更便利一些二、具体流程1、创建父模板base.html&lt;p&gt; Learning Log &lt;/p&gt; {% block content %}{% endblock content %} 这里 Learning Log是一个超链接,为所有继承的子模版...
python网页设计模板_Django-从0到1写出一全面的网页(3)模型,模板和视图
weixin_39527768的博客
12-08 606
前期准备1. 请看我的Django基础文章,用Django写出最简单的网页。可以带着大家从无到有,写出一个含有"Hello, world!"的基本网页。最基础的下载等基本操作都在这篇文章了,本系列文章属于更“高级”一点,所以不会再花时间在这方面了。3. How to tango with Django 1.7。这是一本英文写的手把手教你使用Django的好书,旧版本是online免费的,新版本都需...
简单而直接的Python web 框架:web.py
热门推荐
freeking101的博客
11-03 6万+
web.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。
python网站爬虫模板及注释
05-27
以下是一个简单的Python网站爬虫模板及注释,用于爬取目标网站的HTML页面信息: ```python import requests from bs4 import BeautifulSoup # 目标网站的URL url = "https://www.example.com" # 发送HTTP请求并...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • python编程游戏代码可复制,python编程游戏代码教程 2365
  • python大作业有哪些题目,python作业提交什么文件 2249
  • python项目开发案例集锦pdf,python项目开发案例100行 2188
  • python编写程序后怎么运行,python程序写好怎么运行 1947
  • python比较炫酷的代码,python漂亮gui界面模板 1808

分类专栏

  • 降低ai辅写率 1篇
  • 降低aigc 1篇
  • 毕业论文
  • 智能写作 1篇

最新评论

  • python的pip在哪个文件夹下,python pip下载安装教程

    m0_57526114: 多谢大神

  • python做出的炫酷的可视化,python做大屏数据可视化

    科研民工小7: 使用pyqt5可以开发出第一张图上的效果不

  • python爱心代码怎么运行,python爱心的编程代码

    2401_83349485: 名字哪里我的显示错误

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 简单且有创意的python作品,python创意编程大赛作品
  • python高级程序设计及应用,python高级程序设计难吗
  • python编写小游戏详细教程,python编程小游戏简单的
2024
04月 7篇
03月 204篇
02月 197篇
01月 322篇
2023年158篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码赣州网站seo优化公司惠州网站推广方案哪家好莆田百搜标王公司镇江营销网站威海关键词按天扣费公司渭南网站改版价格醴陵网站优化按天收费哪家好许昌网站改版多少钱南宁SEO按天计费多少钱菏泽seo优化十堰网站建设推荐郑州至尊标王报价梧州关键词排名包年推广价格德宏设计网站哪家好黑河网站设计价格襄樊百度seo价格郴州网站优化价格广州优化价格怀化建网站公司平凉设计公司网站多少钱淮南企业网站改版报价三明高端网站设计多少钱临沂网站设计模板公司陇南关键词排名公司喀什百度seo价格延安网络推广公司玉溪网站改版价格东营网络营销价格迁安企业网站建设推荐临汾SEO按天计费价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化