博客管理系统的设计开发_第1页
博客管理系统的设计开发_第2页
博客管理系统的设计开发_第3页
博客管理系统的设计开发_第4页
博客管理系统的设计开发_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

PAGEII博客管理系统的设计开发摘要本文根据我的毕业设计课题“博客管理系统”写作而成。主要介绍博客管理系统的设计开发过程及工作原理,分析实现中的难点以及重点。设计实现了用户信息修改、用户登录、设计管理员新增的博客文章查看,以及对博客信息的删除、用户与服务器保持会话功能、文章缓存功能、防止网络爬虫访问频率限制功能等功能模块。分析并解决了现实中的若干技术问题。达到了预期设计目标。博客系统的开发,采用了Python编程技术、Mysql数据库技术以及SQL数据查询语言。 关键词:博客管理系统,Python,Mysql。

ABSTRACTThedesignandimplementationofuserlogin,userinformationmodification,designadministrator'snewblogpostview,aswellasthedeletionofbloginformation,userandservertomaintainaconversationfunction,articlecachefunction,preventwebcrawleraccessfrequencylimitfunctionandotherfunctionalmodules.Sometechnicalproblemsinrealityareanalyzedandsolved.Theexpecteddesigngoalisachieved.Thedevelopmentofblogsystemadoptspythonprogrammingtechnology,MySQLdatabasetechnologyandSQLdataquerylanguage.Keywords:blogmanagementsystem,python,MySQL

目录629473866摘要 I1062820740目录 III592014341引言1课题开发背景 114672974911.2博客管理系统的应用状况 113142127362系统开发环境和工具 311041445572.1Python的介绍 39513757722.1.1编程语言Python概述 317568480892.1.2Python语言的基本特点 315931692202.2Python应用的基本开发方法 315689697442.2.1交互式开发工具Pycharm 37227858952.2.2控件对象应用 416950298332.2.3B/S程序开发模式设计 419958257762.3系统开发工具技术和相关要求 41492510922.3.1关系数据库标准语言SQL简介 42022035482.3.2系统硬件需求 511159016822.3.3系统软件需求 59848801232.4基于Python的数据库连接访问技术 6762761853需求分析 720735876833.1系统的需求分析 714235646653.1.1登陆注册功能 77360134283.1.2博客访问 76718776763.1.3博客用户模块 87790846063.1.4系统管理员 88671772834系统设计 918245668394.1系统结构分析和规划 915758675604.1.1系统逻辑架构 96902624694.1.2系统主界面设置 105346553894.1.3博客列表 108815438754.1.4博客页面显示模块 116182264724.3系统模块窗体文件说明 1110064307184.3.1系统界面文件 1114998736544.3.2系统功能模块文件 1112134542924.3系统数据库逻辑架构 1220215737324.3.1数据库逻辑架构设计 1212509345374.3.2数据表设计 155918592295功能编码实现 182338088995.1数据建模 1818785751305.1.1用户模型 189076317165.1.2博客模型 229899061715.2博客界面 257972026885.3用户界面 29435103583总结 32604101446致谢 331977803553参考文献 34PAGE201引言1.1课题开发背景在家尽知天下事早已成为现实,这一切与网络技术是密不可分的,尤其近些年网络的高速发展,对社会的进步发展起到至关重要的作用。现如今,远程办公、远程教学、远程购物是我们的生活、工作更加方便、快捷、高效。即使相隔千里,有了网络依然可以做到近在咫尺。近几年“博客”在国内发展迅速,它可以作为其使用者个人或者工作中的文章、日记、照片等分享的平台,其渐渐成为新兴的网路媒介,并且扩展至营销、商业推广等商业应用,越来越多的人们建立了属于自己的博客来展示自己的才华。BLOG,把它翻译成我们所熟悉的意思就是“网络文章”,现在一般叫做“博客”。具体说来,使用浏览器或者某些程序,在互联网上去创作、书写、发贴和刊登自己的文章、照片等信息的人就是博客。是一个急速发展的网络活动,现在博客一词已经被现代汉语词典所收录,标志着这种新兴事物已经被人们所接受。1.2博客管理系统的应用状况博客出现于九七年底,在九八年“DrudgeReport”这一blog成为披露克林顿绯闻案的先锋;

2000年博客开始走入中国,并且得到迅速发展,但并没取得突出业绩;

2004年是对于中国博客的发展至关重要的一年,木子美事件使很多中国人了解了博客,并学会了使用用博客;

2005年,像搜狐,新浪现在的大公司,起初对博客这一事物不抱期望的的国内网站,也都加入到博客的队伍,从此国内博客的迅速发展。

最近几年,一些网络名人的一炮走红也使得博客更加深入人心。

博客们每天把他们其浏览互联网的的感受和想法记录下来,然后发表出来,以供其他人参考和借鉴。

2系统开发环境和工具2.1Python的介绍2.1.1编程语言Python概述Python是一种解释性、面向对象、编译性的脚本语言。Python在网页开发,数据分析,以及现如今最流行的人工智能方面发挥着的显著作用。2.1.2Python语言的基本特点(1)相比其他编程语言(比如Java),Python代码简单,上手容易。比如我们要完成某个功能,假如用Java需要100行代码,可用Python可能只需要40行代码可能更少,这是Python具有巨大吸引力之一。(2)Python简洁的语法和扩展性强是它的两大特色(3)Python的语法很简洁。(4)Python的可扩展性体现为它的模块和第三方库,入数据分析库Pandas,Numpy,网页开发库Django、Flask等。2.2Python应用的基本开发方法2.2.1交互式开发工具Pycharm(1)集成开发环境(IDE)顾名思义,这些工具通常包括一个专门为了处理代码的编辑器(例如语法高亮和自动补全),构建、执行、调试工具和某种形式的源代码控制。(2)一般的集成开发环境包含多种功能,因此体积较大,需要时间去下载和安装并且为了正确使用需要更高深的知识。2.2.2控件对象应用Pycharm为用户提供了可视化界面,以及代码提示功能,版本控制功能,大大提高了开发效率,就可实现交互开发。2.2.3B/S程序开发模式设计随着网络技术不断革新,计算机技术正由C/S(客户端/服务器)模式的应用系统逐步转变为基于B/S(l浏览器/服务器)模式的应用系统。这样开发成本及维护成本大大降低。2.3系统开发工具技术和相关要求2.3.1关系数据库标准语言SQL简介SQL(StructuredQueryLanguage),即结构化查询语言,是关系数据库的标准语言,SQL是一个通用的、功能极强的关系数据库语言。SQL功能极强同时又简介易学的语言。SQL集数据查询、数据操纵、数据定义和数据控制功能于一体。SQL的特点:(1)综合统一(2)高度非过程化(3)面向集合的操作方式(4)以同一种语法结构提供两种使用方法(交互式,嵌入式)语言简洁,易学易用SQL语言功能极强,语言十分简捷,完成4种核心功能只用9个动词如下表所示:表2-1SQL功能表SQL功能动词数据查询SELECT数据定义CREATE,DROP,ALTER数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE2.3.2系统硬件需求表2-2系统硬件需求表物理部署节点名称硬件配置应用服务器应用服务器CPU:1颗4c内存:16GB硬盘可用空间:500GB以上2个万兆网卡+2个千兆网卡数据库服务器数据库服务器单个数据库可用表空间150G2.3.3系统软件需求表2-3系统软件需求表物理部署节点名称软件名称版本应用服务器操作系统RedHatEnterpriseLinuxServer开发语言Python、Javascript开发框架Django、Bootstript其他组件Redis、MySQL、Pymysql2.4基于Python的数据库连接访问技术Python之所以能流行起来的原因与提供丰富的第三方库是分不开的,与数据库交互的包有Pymysql,MysqlDB,本系统采用Python第三方库Pymysql实现与数据库交互。

3需求分析3.1系统的需求分析本系统需要实现4个大的功能模块:登陆注册模块、博客访问者模块、用户模块、系统管理员模块。其中每个模块又分成详细11个功能子模块。系统的总体模板图如下:图3-1功能模块图3.1.1登陆注册功能主要包括:用户的注册功能、登陆功能、登出功能、用户信息修改功能(1)登陆功能:用户输入账号密码登陆系统,发表或修改个人博客。(2)登出功能:用户登出将清除session、cookie信息;(3)用户注册:用户可通过邮箱实现手机号码注册;3.1.2博客访问主要包括:阅读日志功能、博客列表功能、反爬虫功能;(1)阅读日志功能:只有系统管理员有权限查看日志信息;(2)博客列表功能:将博客访问量进行排序;(3)反爬虫功能:通过响应算法,判断用户是否为网络爬虫;3.1.3博客用户模块主要包括:博客评论功能、修改个人信息、管理公告模块;(1)博客评论功能:只有系统登录的用户才有权限对博客发表评论;(2)修改个人信息功能:用户可对个人信息进行修改和完善功能;3.1.4系统管理员系统管理员可以进行添加功能、修改和删除用户的违规操作和不当言论的相关操作功能。博客管理系统用例图如下图:图3-1-2博客管理系统用例图

4系统设计4.1系统结构分析和规划4.1.1系统逻辑架构(1)系统架构设计:采用线性结构,把项目分为“表示层、业务逻辑层、数据访问层”。(2)系统采用非常经典的设计模式MVC。(3)利用Mysql关系型数据库实现用户数据、系统数据的存储、查询等操作。(4)通过Python编程语言对各个业务功能点进行实现。(5)通过Javascript编程语言和Bootstrip前端框架实现功能展示。图4-1系统逻辑架构4.1.2系统主界面设置(1)本管理系统主界面上设置了热门博客页面推荐、最新博客日志推荐、常业务管理、日志信息关键字搜索、系统帮助信息。(2)系统主窗体界面的设置效果图如图所示:图4-2系统主界面效果图4.1.3博客列表网络用户可以进行注册、登录、浏览等操作。用户可以根据日志标题进行搜索;查看热门文章;文章排行榜;图4-3系统文章列表效果图4.1.4博客页面显示模块该功能模块实现了如下几个子功能。(1)可以分页查看对应的日志内容及评论信息。(2)可以日志内容以及发表评论。(3)可以针对某个博客留言。4.3系统模块窗体文件说明4.3.1系统界面文件本系统所设计的各个相关界面文件说明如表所示:表4-1系统窗体文件界面名称文件说明base.html系统主界面Login.html登录界面post_list.html博客列表界面search.html搜索功能edit_post.html编辑博客界面read_post.html阅读博客界面create_post.html创建博客界面register.html用户注册界面user_info.html个人信息界面4.3.2系统功能模块文件系统模块文件包含系统所涉及的公共模块、数据库连接模块、公共变以及其他公用功能函数等。如表所示:表4-2系统模块文件模块文件文件说明models.py数据模块helper.py工具类模块middleware.py反网络爬虫模块error.log错误日志模块4.3系统数据库逻辑架构4.3.1数据库逻辑架构设计为了更能更好的把用户的数据要求表达出来,采用ER图描述现实中的实体,而不涉及这些实体实现方法。用这种方法表示,称为ER模型。ER模型包含“实体”、“联系”、“属性”。博客信息管理系统涉及的实体包括:(1)用户:用户ID,用户名称,用户密码,博客主题,说明,E-mail,注册日期,发表日志数。(2)类别:类别名,类别编号,用户ID,类别描述。(3)日志:用户ID,日志标题,日志内容,日志编号,类别编号,最后修改日期,浏览次数,发表日期,评论数。(4)评论:评论编号,评论内容,最后回复日期,评论人,发表日期,日志编号。(5)留言:留言内容,留言编号,最后回复日期,留言标题,发表日期,用户ID,留言人下面给出系统各个实体的实体图:1.博客管理员实体图图4-4博客管理员实体图2日志类别实体图图4-5日志类别实体图3日志实体图图4-6日志实体图4日志评论实体图图4-7日志评论实体图5留言实体图图4-8留言实体图4.3.2数据表设计1用户表主要保存用户基本信息:表4-3用户表类名含义类型长度BlogID用户编号int4UserName用户名varchar20Password用户密码varchar20NickName博客主题varchar50Description博客描述varchar100Email电子邮件Email50RegisterTime注册日期datetime8ArticleNum发表的日志数int41日志表用于保存日志信息表4-4日志表类名含义类型长度ArticleID日志编号Int4Title日志标题Varchar50Content日志内容text8CategoryID类别IDint4PublishTime日志发表时间Datetime8LastModifyTime日志最后修改时间Datetime8BlogID用户IDInt4ReadTimes日志浏览次数Int4FeedBackNum日志评论数Int43日志评论表用于保存日志信息表4-5日志评论表类名含义类型长度FeedBackID评论编号Int4Title评论标题Varchar20Content评论内容Text8PublishTime发表时间Datetime8UserName用户名Varchar20ArticleID日志IDInt4FeedBackID评论编号Int204留言表用于保存留言信息表4-6留言表类名含义类型长度MessageID留言编号Int4Title留言标题Varchar20Content留言内容text8PublishTime发表时间Datetime8LastModifyTime最后回复时间Datetime8UserName用户名Varchar20BlogID用户IDInt45类别表用于保存日志信息表4-7类别表类名含义类型长度CategoryID类别编号Int4Name类别名Varchar20Description类别描述Varchar100BlogID用户编号Int46数据表在设计完成后,指定好各数据表主键、外键。各个关联表之间通过设置好的外键连接在一起。本系统具体的数据表之间关系图如图所示:图4-9数据库表关系图5功能编码实现系统的整体代码是跟据各功能模块编写的,在此就不一一列出。下面列出的是几个主要功能模块的代码:5.1数据建模5.1.1用户模型r'''用户\多对多/角色\多对多/权限'''fromdjango.dbimportmodelsclassUser(models.Model):SEX=(('M','男性'),('F','女性'),('S','保密'),)nickname=models.CharField(max_length=32,unique=True)password=models.CharField(max_length=128)age=models.IntegerField(default=18)sex=models.CharField(max_length=8,choices=SEX)icon=models.ImageField()plt_icon=models.URLField(default='',verbose_name='第三方平台的头像URL')@propertydefavatar(self):'''统一的头像地址'''returnself.plt_iconifself.plt_iconelseself.icon.urldefroles(self):'''当前用户具有的所有角色'''relations=UserRoleRelation.objects.filter(uid=self.id).only('role_id')role_id_list=[r.role_idforrinrelations]returnRole.objects.filter(id__in=role_id_list)defhas_perm(self,perm_name):'''检查是否具有某权限'''forroleinself.roles():forperminrole.perms():if==perm_name:returnTruereturnFalseclassUserRoleRelation(models.Model):'''用户和角色的关系表'''uid=models.IntegerField()role_id=models.IntegerField()@classmethoddefadd_role_for_user(cls,uid,role_id):cls.objects.create(uid=uid,role_id=role_id)@classmethoddefdel_role_from_user(cls,uid,role_id):cls.objects.get(uid=uid,role_id=role_id).delete()classRole(models.Model):'''角色表admin超级管理员manager管理员user普通用户'''name=models.CharField(max_length=16,unique=True)defperms(self):'''当前角色具有的所有权限'''relations=RolePermRelation.objects.filter(role_id=self.id).only('perm_id')perm_id_list=[r.perm_idforrinrelations]returnPermission.objects.filter(id__in=perm_id_list)classRolePermRelation(models.Model):'''角色和权限的关系表'''role_id=models.IntegerField()perm_id=models.IntegerField()@classmethoddefadd_perm_for_role(cls,role_id,perm_id):cls.objects.create(role_id=role_id,perm_id=perm_id)@classmethoddefdel_perm_from_role(cls,role_id,perm_id):cls.objects.get(role_id=role_id,perm_id=perm_id).delete()classPermission(models.Model):'''权限表add_post添加帖子add_comment添加评论add_manager添加管理员del_post删除帖子del_comment删除评论del_manager删除管理员del_user删除用户'''name=models.CharField(max_length=16,unique=True)图5-1用户注册5.1.2博客模型fromdjango.dbimportmodelsfromuser.modelsimportUserclassPost(models.Model):uid=models.IntegerField()title=models.CharField(max_length=64)created=models.DateTimeField(auto_now_add=True)updated=models.DateTimeField(auto_now=True)content=models.TextField()classMeta:ordering=['-created']@propertydefauth(self):ifnothasattr(self,'_auth'):self._auth=User.objects.get(pk=self.uid)returnself._authdefcomments(self):'''帖子对应的所有评论'''returnComment.objects.filter(post_id=self.id)deftags(self):'''帖子对应的所有标签'''relations=PostTagRelation.objects.filter(post_id=self.id).only('tag_id')tag_id_list=[r.tag_idforrinrelations]returnTag.objects.filter(id__in=tag_id_list)defupdate_tags(self,tag_names):'''更新帖子对应的标签'''exist_tags=set(self.tags())#当前对应的所有的tagupdated_tags=set(Tag.ensure_tags(tag_names))#更新完以后的所有对应的tag#处理新增关系new_tags=updated_tags-exist_tagsneed_create_tid_list=[t.idfortinnew_tags]#需要建立关联的tagid列表PostTagRelation.add_relations(self.id,need_create_tid_list)#处理需要删除的关系old_tags=exist_tags-updated_tagsneed_delete_tid_list=[t.idfortinold_tags]#需要删除关联的tagid列表PostTagRelation.del_relations(self.id,need_delete_tid_list)classComment(models.Model):uid=models.IntegerField()post_id=models.IntegerField()created=models.DateTimeField(auto_now_add=True)content=models.TextField()classMeta:ordering=['-created']@propertydefauth(self):ifnothasattr(self,'_auth'):self._auth=User.objects.get(pk=self.uid)returnself._auth@propertydefpost(self):ifnothasattr(self,'_post'):self._post=Post.objects.get(pk=self.post_id)returnself._postclassTag(models.Model):name=models.CharField(max_length=16,unique=True)@classmethoddefensure_tags(cls,tag_names):'''确保传入的Tag已存在,如果不存在直接创建出来'''#过滤出已存在的tagnameexist_tags=cls.objects.filter(name__in=tag_names)exist_names={fortinexist_tags}#创建不存在的Tagnot_exist_names=set(tag_names)-exist_names#过滤出不存在的tagnameneed_create_tags=[Tag(name=name)fornameinnot_exist_names]cls.objects.bulk_create(need_create_tags)returncls.objects.filter(name__in=tag_names)classPostTagRelation(models.Model):post_id=models.IntegerField()tag_id=models.IntegerField()@classmethoddefadd_relations(cls,post_id,tag_id_list):'''批量增加帖子和标签的关系'''need_create=[cls(post_id=post_id,tag_id=tid)fortidintag_id_list]cls.objects.bulk_create(need_create)@classmethoddefdel_relations(cls,post_id,tag_id_list):'''批量删除帖子和标签的关系'''cls.objects.filter(post_id=post_id,tag_id__in=tag_id_list).delete()图5-2博客评论5.2博客界面frommathimportceilfromdjango.core.cacheimportcachefromdjango.shortcutsimportrender,redirectfromcommonimportrdsfrompost.modelsimportPostfrompost.modelsimportCommentfrompost.modelsimportTagfrompost.helperimportpage_cachefrompost.helperimportget_top_nfromuser.helperimportlogin_requiredfromuser.helperimportneed_perm@login_required@need_perm('add_post')defcreate_post(request):ifrequest.method=='POST':uid=request.session['uid']title=request.POST.get('title')content=request.POST.get('content')post=Post.objects.create(uid=uid,title=title,content=content)returnredirect('/post/read/?post_id=%d'%post.id)else:returnrender(request,'create_post.html')@login_requireddefedit_post(request):ifrequest.method=='POST':post_id=int(request.POST.get('post_id'))post=Post.objects.get(pk=post_id)post.title=request.POST.get('title')post.content=request.POST.get('content')post.save()str_tags=request.POST.get('tags')tag_names=[t.strip()fortinstr_tags.title().replace(',',',').split(',')]post.update_tags(tag_names)#更新帖子缓存key='Post-%s'%post_idcache.set(key,post)print('缓存更新')returnredirect('/post/read/?post_id=%d'%post.id)else:post_id=int(request.GET.get('post_id'))post=Post.objects.get(pk=post_id)str_tags=','.join([fortinpost.tags()])returnrender(request,'edit_post.html',{'post':post,'tags':str_tags})defread_post(request):post_id=int(request.GET.get('post_id'))key='Post-%s'%post_idpost=cache.get(key)print('从缓存获取:',post)ifpostisNone:#从数据库取出数据,并且添加到缓存里post=Post.objects.get(pk=post_id)cache.set(key,post)print('从数据库获取:',post)#增加阅读计数rds.zincrby('ReadCounter',post_id)returnrender(request,'read_post.html',{'post':post})@login_required@need_perm('del_post')defdelete_post(request):'''删除对象'''post_id=int(request.GET.get('post_id'))Post.objects.get(pk=post_id).delete()rds.zrem('ReadCounter',post_id)#同时删除排行数据returnredirect('/')@page_cache(5)defpost_list(request):page=int(request.GET.get('page',1))#当前页码total=Post.objects.count()#帖子总数per_page=10#每页帖子数pages=ceil(total/per_page)#总页数start=(1)*per_page#当前页开始的索引end=start+per_page#当前页结束的索引posts=Post.objects.all()[start:end]returnrender(request,'post_list.html',{'posts':posts,'pages':range(pages)})defsearch(request):keyword=request.POST.get('keyword')posts=Post.objects.filter(content__contains=keyword)returnrender(request,'search.html',{'posts':posts})deftop10(request):#rank_data=[#[Post(9),100],#[Post(5),91],#[Post(7),79],#]rank_data=get_top_n(10)returnrender(request,'top10.html',{'rank_data':rank_data})@login_requireddefcomment(request):uid=request.session['uid']post_id=int(request.POST.get('post_id'))content=request.POST.get('content')Comment.objects.create(uid=uid,post_id=post_id,content=content)returnredirect('/post/read/?post_id=%s'%post_id)@login_required@need_perm('del_comment')defdel_comment(request):post_id=int(request.GET.get('post_id'))comment_id=int(request.GET.get('comment_id'))Comment.objects.get(pk=comment_id).delete()returnredirect('/post/read/?post_id=%s'%post_id)@login_required@need_perm('del_user')defdel_user(request):returnrender(request,'')图5-3撰写博客5.3用户界面fromdjango.confimportsettingsfromdjango.shortcutsimportrender,redirectfromdjango.contrib.auth.hashersimportmake_password,check_passwordfromuser.formsimportRegisterFormfromuser.modelsimportUserfromuser.helperimportget_wb_access_tokenfromuser.helperimportwb_user_showfrompost.helperimportpage_cachefromuser.helperimportlogin_requireddefregister(request):ifrequest.method=='POST':form=RegisterForm(request.POST,request.FILES)ifform.is_valid():user=form.save(commit=False)user.password=make_password(user.password)user.save()returnredirect('/user/login/')else:returnrender(request,'register.html',{'error':form.errors})else:returnrender(request,'register.html')deflogin(request):ifrequest.method=='POST':nickname=request.POST.get('nickname').strip()password=request.POST.get('password').strip()#检查用户是否存在try:user=User.objects.get(nickname=nickname)exceptUser.DoesNotExist:returnrender(request,'login.html',{'error':'用户不存在','auth_url':settings.WB_AUTH_URL})#检查密码是否正确ifcheck_password(password,user.password):request.session['uid']=user.idrequest.session['nickname']=user.nicknamerequest.session['avatar']=user.avatarreturnredirect('/user/info/')else:returnrender(request,'login.html',{'error':'密码错误','auth_url':settings.WB_AUTH_URL})else:returnrender(request,'login.html',{'auth_url':setting

温馨提示

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

最新文档

评论

0/150

提交评论