博客系统设计_第1页
博客系统设计_第2页
博客系统设计_第3页
博客系统设计_第4页
博客系统设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论随着互联网的飞速发展,博客在生活中已经随出可见,比如腾讯QQ中的空间、微信中的朋友圈、微博等等,都是以博客为基础的。而今在这个大数据大媒体、信息科技发达的时代,博客的多样化也日渐呈现出来,它不仅仅只局限于将生活中的琐事以日志流水的形式呈现出来。现阶段博客与专业媒体组织存在着互补并存的关系,博客新闻已经成为了专业媒体获取重要信息的来源。在国外,博客的影响程度甚至上升到影响政治的局面,其中克林顿和莱温斯基丑闻的德拉吉被世人看作是第一个影响了美国政治的博主。后续的“911事件”更是显示出博客群体参与政治的巨大潜力。在国内,各类明星、网红每日在线上发表的生活工作上的琐事来获取知名度赚取流量钱已成为很正常的一件事了。新闻博客也成为了国内新闻报道的主流形式。另一方面来看,博客与更多新生力量融会贯通,使得博客自身的发展成为了带动整个社会进步的不竭动力。网络技术上,博客不断地与新兴的技术相结合,使得博客模式越来越多。内容上,现今的博客已经走出了只是单纯的写作记录方式,视屏博客、企业博客、媒体博客等等的出现使得博客有着更大的舞台,也使“博客”一词变得丰富多彩。线下,还出现了博客出版社,就是先把作品通过博客传播出去,在进行印刷出版,可以想象得到这种新模式将会在以后成为主流。在最近的几年里,Python一词日渐火爆,在编程语言中,更是排到首位,在国内外有很多大型的网站都是由Python开发而来或者转换为Python进行开发,例如知乎、YouTube、NASA(美国航天局)等等。本课题就是将Python技术和博客相结合而设计的。本博客系统是在B/S(browsers/servers)模式下,利用python-Flask技术来进行博客系统设计与实现,也就是前端浏览器页面设计与后端接数据链接,用户可通过前端页面对后端连接的数据库进行访问与使用,能够让用户简单便捷的在博客系统中进行操作,这充分的体现出B/S(browsers/servers)模式体系的功便捷性与实用性。本项目是在Windows操作系统开发的高效的博客系统,本系统分为前台和后台模块:前台模块拥有查看功能,可浏览他人日志、评论他人日志、查看发表日志的博主个人信息;后台模块拥有编辑管理功能,可登录注册、新建或编辑个人日志、管理个人日志评论、修改密码。该系统的实践意义在于:将当前新起的技术与博客相结合,开发出一种多元素的博客系统。1系统概述1.1系统开发背景“博客”一词最早出现在1998年,当时只是构思通过网络发表博客,一直到2000年博客才真正出现在人们眼前并开始流行起来。在中国到2005年才开始逐渐的大众化,目前为止活跃的博客博主已经达到了1.13亿人,博客不仅改变着我们的交流方式更是改变着我们的生活方式。计算机技术的发展和普及,使人们对资源共享的需求也在不断地增强。B1og是Weblog的简称,它是继E-mai1等网络交流后的一种全新的生活方式,更是一种全新的学习方式和工作方式。使用博客的用户越来越多,身份也各不相同,有学生、老师、记者、科研人员等。在领域上博客的发展也各不相同,企业中将博客融入到企业内部网站里,用来进行网络营销。政府部门里使用博客来构建内部文化交流与知识管理,让职工自由发表言论,学习、积累自身的知识,进行资源共享,促进彼此沟通交流。校园里把博客引入校园网中用于推动整体校园文化向深度和广度的方向发展。现今进行网站开发的语言有很多,而Python编程语言的火爆是当今的一大热点,所以选择Python-Flask来进行博客系统的开发与设计无疑是最好的选择。Flask是Pythoy编程语言中一种轻量级可定制框架,非常的轻便、安全,并且简单易上手。它是基于MVC(模型、视图、控制器)模式来进行开发的,能够在短时间里实现功能丰富的中小型网站开发,非常适合小型团体进行web项目的开发。此外,Flask定制型和拓展性极强,它属于给你搭建好根基,然后有非常多的扩展库供你使用,让你能够根据自己个性来实现出你想要的网站。1.2系统开发的目标(1)拥有博客系统账号的人:除了基本的博客系统网页浏览外还能够登录博客系统,可以发表言论进行文章发表、文章评论和发表评论查看,可以管理自己的账号信息、更改个人资料、修改邮箱和账号密码。(2)浏览博客系统的游客:能够浏览博客系统网页中的文章,浏览发表文章博主所展示的个人信息,查看该博主的所有文章,如果想要评论文章,需要通过注册登录来实现操作。2系统分析2.1可行性分析本系统开发是否具备开发可行性,主要进行了以下几个方面来分析:(1)经济可行性。系统开发人员开发本系统并不需要投入过高的成本,只需要对管理系统的管理人员付出相应的酬劳即可,而且开发本系统周期数不长,节省了财力、人力和物力上的资源,所以在经济上是可行的。(2)技术上的可行性。本系统采用的是Python编程语言中Flask框架进行系统开发,前端网页设计使用的是HTML语言,数据库系统采用的是关系型数据库MySQL数据库,开发的的软件工具是PyCharm。在现有的环境中完全支持技术上的开发,所以在技术上是可行的。(3)管理可行性。本系统主要管理在后台维护和数据库管理两个方面,只需技术人员日常维护即可,所以在管理上是可行的。(3)时机可行性。目前Python日渐火热,许多应用在后端开发上都开始转向Python开发,并且现在Internet已经广泛使用,所以在时机上是可行的。通过上面的分析,可以看出本系统在经济、技术、管理和时机方面都具备可行性,并且本系统有着投入少,见效快的优点,所以开发本系统是可行的。2.2需求分析博客系统是一个多用户、多界面的系统,主要包括以下几个模块组成:功能类别子功能匿名用户管理(浏览者)注册浏览网站内容用户管理发布文章浏览文章查看其他用户信息评论文章修改个人信息(密码、邮箱、头像)前台:匿名用户:即浏览网站的游客,可以随意浏览网站中的文章。用户注册:游客通过在本系统中的注册页面上填写完整的个人信息,再存储到数据库中,此时注册账号的邮箱会收到博客系统发送的激活邮件,点击激活邮件即可进行激活,成为本博客系统中的用户。用户登录:用户使用之前在本系统中注册的帐号和密码在登录页面上登录。用户修改个人信息:系统从数据库中将已此次登录用户的用户信息用一个网页显示出来,在该网页上面可以进行个人信息的更改。文章发表:用户在文章发表表单里填好要发表的文章内容,点击发表进行表单提交,并将文章内容存储到数据库中。文章评论:用户可以对浏览博客中的感兴趣的文章加以评论。后台:通过计算机网络将前台页面与后台的数据库相连,以便用户通过前台读取后台信息并对获取的信息进行处理,实现文章管理、个人信息管理等。3开发环境及系统框架3.1开发工具Pycharm工欲善其事必先利其器,在使用Python编程时,那必然需要有一个专属于的Python编程的工具,这款工具就是PyCharm。PyCharm是一种PythonIDE,能够帮助用户在使用Python语言开发时提高其效率的工具。3.2系统框架本博客系统设计如图3-1所示,分为前台和后台模块:前台模块拥有浏览功能,可浏览他人日志、评论他人日志、查看发表日志的博主个人信息和查看文章评论;后台模块拥有编辑管理功能,可登录注册、新建或编辑个人日志、管理个人日志评论。博客系统博客系统前台模块后台模块前台模块后台模块评论管理日志管理登录注册查看博主日志评论浏览日志评论管理日志管理登录注册查看博主日志评论浏览日志注册登录注册登录图3-1系统设计框图4数据库设计4.1数据库技术概述数据库(DB)是一种专门储存信息与维护信息的容器,也就是说数据库是:按照数据结构来组织、存储和管理信息的仓库,构成图如下图。图4-1数据库系统构成图数据库的特征:数据结构化、实现数据共享、减少数据冗余、数据独立性4.2数据库选择本系统使用的数据库是MySQL数据库,它是一种关系型数据库。采用的是二维结构来组织和管理数据,并且规定了表内和表与表之间数据的依赖关系。下图两个表中,学生信息表与成绩表就是相互依赖的关系,比如说我们可以通过学号在学生信息表中找到名为张力的学生的个人信息,也可以通过学号从学生成绩表中找出名为张力的学生的成绩。学生个人信息表学生成绩表图4-2关系型数据库是指一些相关的表和其他数据库对象的集合,对于关系型数据库来说,关系就是表的同义词,数据结构图如下;图4-3数据库数据结构图4.3数据库结构设计4.3.1数据库的E-R图(1)博客系统整体E-R图如图所示本系统表模型分为用户表和文章表,一个用户可以发表多篇文章,但一篇文章只对应一个用户,即一对多的关系。图4-4博客系统整体E-R图博客系统用户实体E-R图如图所示如下图所示用户表由用户名称、加密后的密码、邮箱、是否激活这些字段构成图4-5用户实体E-R图(3)博客系统文章实体E-R图如图所示如下图所示文章表由评论的文章、文章的内容、发表时间、发表文章用户这些字段构成图4-6文章实体E-R图4.3.2数据库逻辑结构数据库的理论上的概念结构设计完成后,就可以将概念结构转化为MySQL数据库系统所支持的实际数据模型,也就是数据库逻辑结构。其中的编号id是数据库通过id来找到这个对象,也就是此对象的索引,是系统随着你储存数据自动设置出来的。具体数据如下图的User表和Posts文章表就是存储到数据库中的表格设计的实际数据模型。User用户表字段名称数据类型字段大小是否主键默认值是否必填备注id整数型11是——用户编号username字符串32否—是用户名称password_hash字符串128否—是加密后的用户密码email字符串64否—是电子邮箱confirmed布尔型—否—是是否邮箱激活Posts文章表字段名称数据类型字段大小是否主键默认值是否必填备注id整数型11是——文章编号rid整数型11否—否评论文章的编号content文本—否—是文章内容timestamp时期和时间类型—否—是发表文章日期与时间uid整数型11否—是用户编号5系统设计5.1项目总体架构在做项目时最重要的是先想好该项目的基本架构,这样才不会中途出错却不知道从哪里找问题,有助于思路的延伸,如下图5-1就是在开始项目之前构造出来的基本框架,其中带“/”的表示文件包,其余的表示文件,前面的空格表示为层级关系。图5-15.2相关扩展配置配置文件就是用户登录时定义系统加载所需环境的设置和文件的集合,以下的配置文件书写包括环境变量的读取、数据库相关操作、邮件相关操作。主要代码如下:#秘钥,禁止使用中文

SECRET_KEY=os.environ.get('SECRET_KET')or'123456'

#数据库操作

SQLALCHEMY_COMMIT_ON_TEARDOWN=True

SQLALCHEMY_TRACK_MODIFICATIONS=False

#邮件配置

MAIL_SERVER=os.environ.get('MAIL_SERVER')or''

MAIL_USERNAME=os.environ.get('MAIL_USERNAME')or'lijie@1000'

MAIL_PASSWORD=os.environ.get('MAIL_PASSWORD')or'123456'

#使用本地库中bootstrap依赖包

BOOTSTRAP_SERVE_LOCAL=True#连接MySQL数据库

DEBUG=True

SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:421125@:3306/flask_blog'

#会打印原生sql语句,便于观察测试

SQLALCHEMY_ECHO=True5.3蓝图配置我们的应用经常会区分用户站点和管理员后台,本博客系统中,就有网站和后台两部分。两者虽然都在同一个应用中,但是风格迥异。把它们分成两个应用吧,总有些代码我们想重用;放在一起嘛,耦合度太高,代码不便于管理。所以Flask提供了蓝图(Blueprint)功能。蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响。但是它们又属于应用中,可以共享应用的配置。对于大型应用来说,我们可以通过添加蓝图来扩展应用功能,而不至于影响原来的程序。本系统中主要设计为两个蓝图,分别是主页相关蓝图和用户相关蓝图,具体代码如下:主页面相关蓝图main:fromflaskimportBlueprintmain=Blueprint('main',__name__)用户相关蓝图user:fromflaskimportBlueprintuser=Blueprint('user',__name__)5.4项目基础模板视图函数有两个作用,一个是业务逻辑一个是表现逻辑。举例说明:访问本系统的游客在本系统页面注册账号,首先点击注册跳转到注册页面,在注册页面中会让你填写你想要注册的用户名、用户密码和电子邮箱地址,填写完后点击确认注册按钮,这是服务器会收到此用户提交的输入请求,然后Flask会把该请求发送给专门处理这个注册请求的视图函数,这个视图函数需要访问数据库,将此次请求注册的用户信息存储到数据库中,这个叫业务逻辑,然后生成相应的回应返回到浏览器上,这叫表现逻辑。这是两个完全不相同的作用,但是当你混淆到一起时,会时你写出来的代码不好维护并且难以理解,所以我们选择把表现逻辑(响应)迁移到模板当中去。

本系统沿用的是Bootstrap中文网中的前端代码加以改进为本系统所需的基础模板,主要代码如下:{#继承bootstrap模板#}

{%extends'bootstrap/base.html'%}

{#导入注册表单#}

{%import'bootstrap/wtf.html'aswtf%}

{#HTML头部#}

{%blocktitle%}博客{%endblock%}

{#导航栏#}

{%blocknavbar%}

<navclass="navbarnavbar-inverse"style="border-radius:0px">

<divclass="container">

<divclass="navbar-header">

<buttontype="button"class="navbar-togglecollapsed"data-toggle="collapse"

data-target=".navbar-collapse"aria-expanded="false">

<spanclass="sr-only">Togglenavigation</span>

<spanclass="icon-bar"></span>

<spanclass="icon-bar"></span>

<spanclass="icon-bar"></span>

</button>

<aclass="navbar-brand"href="{{url_for('main.index')}}">博客</a>

</div>

<divclass="collapsenavbar-collapse">

<ulclass="navnavbar-nav">

<li><ahref="#">板块1</a></li>

<li><ahref="#">板块2</a></li>

<li><ahref="#">板块3</a></li>

</ul>

<ulclass="navnavbar-navnavbar-right">

{%ifcurrent_user.is_authenticated%}

<li><ahref="{{url_for('user.logout')}}">退出</a></li>

<liclass="dropdown">

<ahref="#"class="dropdown-toggle"data-toggle="dropdown"role="button"

aria-haspopup="true"aria-expanded="false">{{current_user.username}}<spanclass="caret"></span></a>

<ulclass="dropdown-menu">

<li><ahref="{{url_for('file')}}">个人信息</a></li>

<li><ahref="{{url_for('user.change_password')}}">修改密码</a></li>

<li><ahref="#">邮箱设置</a></li>

</ul>

</li>

{%else%}

<li><ahref="{{url_for('user.login')}}">登录</a></li>

<li><ahref="{{url_for('user.register')}}">注册</a></li>

{%endif%}

</ul>

</div><!--/.navbar-collapse-->

</div><!--/.container-->

</nav>

{%endblock%}

{#页面内容#}

{%blockcontent%}

<divclass="container">

{#get_flashed_messages获取所有的flash消息#}

{%formessageinget_flashed_messages()%}

<divclsaa="alertalert-warningalert-dismissible"

role="alert">

<buttontype="button"class="close"

data-dismiss="alert"aria-label="Close"><span

aria-hidden="true">×</span></button>

{{message}}

</div>

{%endfor%}

{%blockpage_content%}默认内容{%endblock%}

</div>

{%endblock%}

{%blockscripts%}

{{super()}}

{{moment.include_moment()}}

{{moment.locale('zh-CN')}}

{%endblock%}5.5自定义错误页面如果你在浏览网页时,在浏览器输入地址栏中输入了一个错误的或者不能用的网址(路由)时,这时浏览器网页中会显示出一个状态码为“404”的错误页面。这个错误页面样式简陋、平庸,并且和本系统前端页面所使用的Bootstrap定制的页面不一致,所以我们需要定制一个属于本系统的错误页面。与写常规路由一样,Python-Flask允许使用基于模板的自定义错误页面。在网上冲浪时,我们最常见的错误代码有两个:一个是“404”,也就是上文所说的浏览错误或者不能用的网址(路由)时显示出来的页面;另一个是“500”,是在服务端内部出现出现错误时显示出来的页面。与视图函数一样,处理错误程序也会返回一个响应。它们还返回与该错误对应的数字状态码,通过这个错误状态码,我们可以进行自定义错误页面。主要代码如下:#错误页面注册

defconfig_errorhandler(app):

@app.errorhandler(404)

defpage_not_found(e):

returnrender_template('errors/404.html')

@app.errorhandler(500)

defserver_inside(e):

returnrender_template('errors/500.html')错误处理程序中引用的模板也需要编写。主要代码如下:{%extends'common/base.html'%}

{%blocktitle%}出错了{%endblock%}

{%blockpage_content%}

<b>!!!臣妾找不到了!!!</b>

{%endblock%}5.6用户管理5.6.1用户模型设计Flask的扩展中有一个名为Flask-SQLAlchemy的扩展,它简化了在Flask中使用SQLAlchemy的相关操作。SQLAlchemy是一个非常强大的关系型数据库框架,能够支持多种数据库后台。本系统所设计的系统模型都是通过该扩展关系映射到MySQL数据库中的,主要代码如下:classUser(UserMixin,db.Model):

#指定表名

__tablename__='users'

#用户id长整型primary_key=True设置主键

id=db.Column(db.Integer,primary_key=True)

#用户名字符串类型unique=True设置唯一键

username=db.Column(db.String(32),unique=True)

#加密后的用户密码

password_hash=db.Column(db.String(128))

#邮箱

email=db.Column(db.String(64),unique=True)

#用户激活状态Boolean表示两种类型0,1default=False默认为未激活

confirmed=db.Column(db.Boolean,default=False)

#用户头像

posts=db.relationship('Posts',backref='user',lazy='dynamic')

5.6.2用户注册与激活系统运行过程:(1)通讯双方进行连接:首先通讯双方遵从HTTP协议。当我们输入这样一个请求:\t"C:\Users\yezi\AppData\Local\Temp\_blank"/api/info,首先请求端会进行DNS解析,把\t"C:\Users\yezi\AppData\Local\Temp\_blank"变成一个ip地址,如果url里不包含端口号,则会使用该协议的默认端口号。通过ip地址和端口,三次握手建立一个tcp连接。(2)请求:连接成功建立后,开始向web服务器发送HTTP请求。Flask通过wsgi协议传递请求。(3)响应:接到请求后,交给相应路由处理,根据地址转发给相应的控制器(函数)处理。后端大部分工作就是写这些处理过程。处理完成后将最终的response返回给用户。这其中我们拿到的request与response都是由python的wsgi工具包werkzeug提供的。(4)关闭连接:通讯双方均可关闭socket结束tcp/ip会话。服务器发送请求至数据库进行数据处理服务器响应并处理相关请求客户端进行操作请求,发送至服务器服务器发送请求至数据库进行数据处理服务器响应并处理相关请求客户端进行操作请求,发送至服务器服务器端处理完成后将结果返回至客户端数据库处理后返回给服务器端服务器端处理完成后将结果返回至客户端数据库处理后返回给服务器端图5-1系统运行流程图关于wsgi:wsgi协议将处理请求的组件按照功能及调用关系分成了三种:(1)server(2)middleware(3)application(4)其中,server可以调用middleware和application,middleware可以调用application。用户注册:用户在客户端注册页面填写账户名称、账户密码、邮箱进行提交,服务端会将密码进行加密,然后将这些数据存入数据库,再向注册的邮箱中发送邮件,客户端通过邮件进行激活账号。主要代码如下:@user.route('/register/',methods=['GET','POST'])

defregister():

form=RegisterFrom()

ifform.validate_on_submit():

#创建对象

u=User(username=form.username.data,

password=form.password.data,

email=form.email.data)

#写入数据库

db.session.add(u)

#因为下面产生token时需要用到用户id,此时还没有用户id

mit()

#生成token

token=u.generate_activate_token()

#发送激活邮件

send_mail(form.email.data,'账户激活','email/account_activate',

token=token,username=form.username.data)

flash('激活邮件已发送,请点击链接完成用户激活')

returnredirect(url_for('main.index'))

returnrender_template('user/register.html',form=form)密码加密:数据储存到数据库中都是明文,如果账户密码储存到数据库中也是明文,一旦数据库信息泄漏,那么我们的账户会被人随意登录,所以保证用户账户的私密,我们进行密码加密,将加密过后的密码存入数据库可提高账户的安全性。目前对密码(password)进行加密的技术主要有:明文转码加密:BASE64,7BIT等,这种方式只是个障眼法,不是真正的加密。对称算法加密:AES,DES,3DES等。就是将数据分为固定长度的小数据块,再进行加密。签名算法加密:也可以理解为单向哈希加密,比如MD5,SHA1等。加密算法固定,容易被暴力破解和字典攻击破解。如果密码相同,得到的哈希值是一样的。加盐哈希加密:将存入数据库的密码明文中混入一段随机生成的字符串(盐值)再进行哈希加密。这时即便密码是相同的,但是盐值是不同的,所以得到的哈希值也是不同的。本系统采用的就是加盐哈希加密技术进行用户密码的加密,此方法安全性极高,到目前为止也没有被破解过,现在网站开发中主要是运用就是这种加密方法。主要代码如下:#设置密码,加密储存

@password.setter

defpassword(self,password):

self.password_hash=generate_password_hash(password)

#密码校验

defverify_password(self,password):

returncheck_password_hash(self.password_hash,password)5.6.3用户登录认证与退出当用户登录某个应用时,应用需要记住该用户的登陆状态。在开发过程中,如果我们自己造轮子,去实现管理用户登录状态的代码,就会浪费大量时间并且不一定实用。但现实中,我们往往需要聚焦在业务上的开发,Flask_Login就是前人造好的管理用户登录状态的轮子,如图5-2为登录验证流程图。在开始之前有必要了解下用户登录的步骤:登录:用户提供登录凭证(如用户名和密码)提交给服务器。建立会话:服务器验证用户提供的凭证,如果通过验证,则建立会话(Session),并返回给用户一个会话号(Sessionid)。验证:用户在后续的交互中提供会话号,服务器将根据会话号(Sessionid)确定用户是否有效。登出:当用户不再与服务器交互时,注销与服务器建立的会话。依据以上步骤,我们设计一个应用场景,作为实现:提供一个主页,需要登录才能访问。如果没有登录,跳转到登录页面,登陆成功后再跳回。登陆成功后,可以点击登出退出登录。在登录页面提供注册链接,点击后跳转到注册页面。注册完成后,跳转到登录页面。图5-2首次登录验证流程图主要代码如下:#登录

@user.route('/login/',methods=['GET','POST'])

deflogin():

form=LoginForm()

ifform.validate_on_submit():

u=User.query.filter_by(username=form.username.data).first()

ifuisNone:

flash('用户名无效')

elifu.verify_password(form.password.data):

#验证通过,用户登录,顺便可以完成'记住我'的功能

login_user(u,remember=form.remember_me.data)

#如果有下一跳转地址就跳转到指定地址,没有就跳转到首页

returnredirect(request.args.get('next')orurl_for('main.index'))

else:

flash('密码无效')

returnrender_template('user/login.html',form=form)

#用户退出登录

@user.route('/logout/')

#保护路由

@login_required

deflogout():

logout_user()

flash('您已退出登录')

returnredirect(url_for('main.index'))5.7博客管理5.7.1博客模型设计模型设计要求已经在前面介绍过了,以下是主要代码:#帖子表

classPosts(db.Model):

__tablename__='posts'

#帖子id长整型primary_key=True设置主键

id=db.Column(db.Integer,p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论