java+SpringBoot+mysql新闻管理系统的设计与实现61362-计算机毕设原创(赠源码)
随着信息时代的到来,新闻行业面临着更多的挑战和机遇,需要更高效的管理工具来应对不断增长的新闻内容和读者需求。本新闻管理系统旨在提供一个综合的新闻发布平台,涵盖新闻编辑、发布、分类、浏览、搜索、评论等一系列功能。借助Spring Boot框架和Java技术开发,搭配MySQL数据库存储数据的支持,系统具备良好的模块化设计、快速开发和易于扩展的特点。
通过该系统,新闻编辑团队能够高效地编辑和发布新闻内容,用户也可以方便地浏览、搜索感兴趣的新闻,从而实现新闻内容的快速传播和互动。系统的开发旨在推动新闻行业的数字化转型,提高新闻发布的效率和质量,同时为用户提供更优质的新闻阅读体验。基于Java的Spring Boot技术的应用,使得新闻管理系统具有稳定性、可靠性和高性能,为新闻行业的发展注入了新的活力。这样的系统不仅有助于满足现代新闻行业的需求,也为新闻内容的生产、传播和消费提供了便利和支持,助力新闻行业迈向数字化时代的发展。
关键词:Java;SpringBoot;新闻管理系统;MySQL
Abstract
With the advent of the information age, the news industry is facing more challenges and opportunities, requiring more efficient management tools to cope with the growing demand for news content and readers. This news management system aims to provide a comprehensive news release platform, covering a series of functions such as news editing, publishing, classification, browsing, searching, commenting, etc. Developed with the Spring Boot framework and Java technology, combined with the support of MySQL database for storing data, the system has the characteristics of good modular design, fast development, and easy scalability.
Through this system, the news editing team can efficiently edit and publish news content, and users can easily browse and search for news of interest, thereby achieving rapid dissemination and interaction of news content. The development of the system aims to promote the digital transformation of the news industry, improve the efficiency and quality of news release, and provide users with a better news reading experience. The application of Java based Spring Boot technology has made news management systems stable, reliable, and high-performance, injecting new vitality into the development of the news industry. Such a system not only helps to meet the needs of the modern news industry, but also provides convenience and support for the production, dissemination, and consumption of news content, helping the news industry move towards the digital age.
Keywords:Java; SpringBoot; News management system; MySQL
1 绪论
随着信息化和数字化时代的来临,新闻行业面临着许多新的挑战和机遇,需要更加高效、便捷的管理工具来适应快速变化的市场需求和用户期望。互联网的普及和社交媒体的兴起导致新闻信息爆炸式增长,用户面临着海量信息和内容过载的问题,需要更有效的方式来筛选和获取信息。新闻发布涵盖了多个平台,如网站、移动应用、社交媒体等,需要系统化管理多样化的新闻内容和形式,以满足不同用户群体的需求。用户希望参与新闻内容的讨论和互动,个性化推荐和定制化服务逐渐成为用户关注的焦点,新闻管理系统需要具备相应的功能和机制。新闻行业正处于数字化转型的关键阶段,需要整合最新的技术创新,提升新闻生产、传播和用户体验的水平。新闻管理系统不仅是内容生产和发布的工具,更是涉及商业模式创新和用户增长的关键一环,需要研究如何在激烈的市场竞争中脱颖而出。综上所述,新闻管理系统的研究背景包括信息爆炸、多平台发布、用户互动、数字化转型和商业模式创新等多个方面,对于适应新闻行业发展的需求和趋势具有重要意义。新闻管理系统的研究和应用将有助于推动新闻行业的进步和发展,提升新闻生产和传播的效率与质量,以及满足用户多样化的需求和期望。
1.2国内外研究现状
在当今发展迅速的信息时代中,人们获取新闻信息的方式从原来的看报纸到现在的上网查询,从这里可以看出,人们对于新闻所拥有的实时性属性越来越看重。与此同时新闻载体也从原来单纯的纸质承载发展到今天变为了具有各种各样的以网络为载体的多媒体新闻信息。以上所说的这些特点,也使得企业对于拥有一个新闻管理系统的需求也越来越明显。从这个世纪初开始的全球信息化的行动开始,全世界各行各业都开始了轰轰烈烈的大转型,从信息化得到的好处使大家更加热烈的推进这个行动的进程。而传统的新闻媒体行业也开始了产业的升级步伐,越来越多的新闻企业开始转变为网络化和数字化企业,然后想要运用互联网技术进行从线下发行纸质报纸的方式转变为线上发布数字信息的方式来进行企业的运营。
就国外来说,因为是互联网最先传播的地方,所以他们的数字化信息系统的发展很快,要领先国内许多,他们的新闻管理系统很早就形成了一定规模,比如美联社等全球领先的几大通讯社,在新闻网络化的路上已经探索出了相当成熟的道路。据相关统计,早在2010年,美国75%以上的新闻期刊报纸都已经可以让人们进行网络在线阅读,数千家的期刊杂志已经完成了数字化的进程,并且随着数字化程度的提高衍生了各种新的传播模式,例如新闻、视频、博客以及手机应用等方式7]。国外优秀的报纸期刊都是拥有自己的新闻管理系统,来实现数字化办公的需求,从新闻的编写、审核到新闻的排版、发布都有一整套的网络化的新闻管理系统来支撑,由此来提高新闻工作者的效率。国际日报、太阳报、世界报等国际知名报纸都已经从新闻的编辑、新闻业务的管理、新闻的发布审查等等部分都进行了网络自动化进行。另外,新闻管理系统也能够进行高校信息的发布,学校公告以及学生遇到问题之后的对学校的反馈功能。
国内来说,因为互联网化进程开始较晚,所以数字化信息进程较慢。据不完全统计,目前国内的各种市面上发行的报纸期刊数量已经达到了一种骇人听闻的数量,已超过了10000种,这些报纸期刊分布在人文、社科、电子等等我们能够想到的各个领域,不论是否权威,但是它的统计说明了,人们日常获取信息的途径,新闻报纸期刊还是占据了很主要的作用。但是新闻企业是最近几年才开始开展他们的数字化进程,但是我国信息化进程的速度很快,已经取得了令人很瞩目的成绩,也许是因为借鉴了国外的成熟企业的发展经验,根据中国国情发展了属于自己的新闻产业。主要是有两种,一种是自己新闻产业的网络化显示,比如澎湃新闻,它是上海报业集团自己上线的隶属于自己企业的具有独立的新闻系统;另一种是新闻发布平台,比如今日头条等等一些新闻媒体平台,它们的兴起,保证了新闻的实时性和快速传播性,他们这些平台下的自媒体都会在自己得知消息后的第一时间撰写新闻稿,以获取点击量,而平台又通过这些自媒体的努力使自己的平台也越来越有权威性,这种发展模式也是非常好的。当然,也并不是所有人都可以随意发表论述,他们拥有自己的审核系统,这是非常重要的。避免了一些虚假信息或者不当言论的传播。
因此,设计一个新闻管理系统对与当今越来越多的新闻媒体来说是越来越有必要的。这样可以使新闻媒体可以获得更高的处理效率,而且也可以是用户们享受更便捷的服务,更快的获取消息。
1.3论文结构与章节安排
本文共分为六章,章节内容安排如下:
第一章为引言,此章节对所设计和实现的系统的背景和意义进行详细的论述以及说明,同时进行了论文整体框架的结构的简要介绍。
第二章为系统需求分析,章节所做的主要的工作是对系统进行了技术、经济和操作方面可行性的分析;对系统实行了总体功能的需求、用例分析。
第三章为系统的设计,主要是对系统的功能结构进行设计,并对系统数据库的概念结构以及物理结构的设计进行了分析。
第四章就是对系统的实现,根据系统功能的划分,分别的对系统所需要实现的前台客户功能和后台管理员功能进行了分析和说明。
第五章:系统测试。主要对系统的部分界面进行测试并对主要功能进行测试
2 新闻管理系统系统分析
系统需求分析是系统开发的一个关键环节,它在系统的设计和实现上起到了一个承上启下的位置。系统需求分析是对所需要做的系统进行一个需求的挖掘,如果分析的准确可以精准的解决现实中碰到的问题。如果分析不到位会影响后期系统的实现。一个系统的优秀程度需求分析也是占据了非常大的比例,如果需求分析不到位,后面的系统设计要实现就是一个偏离导航的设计。
2.1 可行性分析
系统可行行分析是对系统对系统可行性进行一个探讨。在探讨系统的可行性上我们主要从技术上的可行性和经济上的可行性以及法律层面的可行性上进行分析,如果三个层面度通过,我们则认为系统是比较可行的。
2.1.1 技术可行性分析
新闻管理系统存储所使用的mysql数据库以及开发中所使用的IDEA、Tomcat这些开发工具的使用,能够给我们的编写工作带来许多的便利。系统使用SpringBoot框架进行开发,使系统的可扩展性和维护性更佳,减少Java配置代码,简化编程代码,目前SpringBoot框架也是很多企业选择的框架之一。
2.1.2 经济可行性分析
从经济可行性上看项目在开发阶段需要一台开发PC,在生产阶段需要web服务器和数据库服务器。一台个人PC从经济上来看也不是太多问题,在后期的系统部署生产上来说,服务器的投入也不会过高,在经济层面上是一个比较可行的。
系统从法律层面上来没有对第三方有其他放有法律层面的问题,系统数据库采用的Mysql 开源社区数据库、框架采用的是开源的SpringBoot。系统资讯和相关内容也是法律层面的。在源码的管理上采用git开源进行管理,所以在法律可行性上是成立的。
2.2 系统功能分析
新闻管理系统我划分为了用户管理模块和管理员模块这两大部分。
(1)首页信息:当用户进入本新闻管理系统的前台的时候,首先展示在眼前的是导航栏、系统公告、留言反馈、新闻资讯、交流论坛等信息,用户可以根据自己个人的需求进行查看;
(2)注册登录:在系统的右上角有登录+注册按钮,如果用户想要登录到系统当中,可以点击“登录”按钮,然后填写号用户名+密码,点击“登录”按钮,系统会对你的用户名密码进行核对,正确的话就会登录成功了,如果没有账号的话,可以点击右上角的“注册”按钮,然后根据提示输入好用户信息,就可以得到账号和密码了;
(3)系统公告:当用户点击“系统公告”这一菜单按钮,会显示管理员在后台发布的所有的系统公告,可以查看详情;
(4)交流论坛:用户点击“交流论坛”菜单显示所有的交流论坛信息,可以按照分类查看帖子信息,或者输入关键词进行局部搜索,点击可以进入帖子的详细展示界面,在此界面用户可以点赞、收藏、评论,也可以点击“发布内容”输入帖子信息进行发帖。
(5)新闻资讯:当用户点击“新闻资讯”这一菜单按钮,会显示管理员在后台发布的所有的新闻资讯,支持通过关键词对新闻进行搜索,选择需要的新闻资讯点击可以进入到新闻资讯详细的介绍界面,在详细界面可以查看到新闻的新闻分类等信息,同时可以进行点赞、收藏、评论操作;
管理员:
(1)登录:管理员在后台可以通过账号和密码进行登录,管理员的账号和密码是在数据库中直接设定的,如果忘记密码可以点击“忘记密码”进行密码找回;
(2)公共管理:管理员点击“公共管理”菜单后,可以对首页展示的轮播图、留言板以及系统公告进行增加、删除、修改和查询操作。
(3)用户管理:管理员点击“用户管理”菜单后,可以对系统中存在的用户进行管理,包括管理员用户和普通用户。管理员可以进行用户信息的添加、查看、编辑、删除等操作。
(4)论坛管理:管理员点击“论坛管理”这一菜单会显示交流论坛和论坛分类这两个子菜单,管理员可以对这两部门涉及到的功能进行更新维护,更好的服务于前台用户;
(5)新闻资讯:管理员点击“新闻资讯”会显示出所有的新闻资讯,支持输入新闻编号或者新闻标题对新闻资讯进行查询,也可以选择某一条新闻资讯,点击“删除”进行删除,也可以对用户提交的新闻资讯评论的信息进行管控;
(6)新闻编辑:管理员可以通过点击“新闻编辑”来查看所有的新闻编辑。系统支持根据新闻内容进行查询,同时管理员也可以选择特定的新闻编辑。管理员可以通过点击“删除”来删除选定的新闻编辑,同时还可以管理新闻发布信息。
2.2.2 非功能性分析
新闻管理系统的非功能性需求比如新闻管理系统的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等。具体可以表示在如下3-1表格中:
表3-1新闻管理系统非功能需求表
| 安全性 | 主要指新闻管理系统数据库的安装,数据库的使用和密码的设定必须合乎规范。 |
| 可靠性 | 可靠性是指新闻管理系统能够按照用户提交的指示进行操作,经过测试,可靠性90%以上。 |
| 性能 | 性能是影响新闻管理系统占据市场的必要条件,所以性能最好要佳才好。 |
| 可扩展性 | 比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 |
| 易用性 | 用户只要跟着新闻管理系统的页面展示内容进行操作,就可以了。 |
| 可维护性 | 新闻管理系统开发的可维护性是非常重要的,经过测试,可维护性没有问题 |
2.3 系统用例分析
新闻管理系统的完整UML用例图分别是图2-1和图2-2。
图2-1就是管理员角色的用例展示。
图2-1 新闻管理系统管理员角色用例图
图2-2就是用户角色的用例展示。
图2-2 新闻管理系统用户角色用例图
2.4 系统流程分析
管理员权限下的工作流程主要为:管理员通过系统界面提供登录按钮并点击,转入管理员登录界面,并在界面上填入相应的管理员账户和管理员密码,进入管理员权限下的后台系统,并且在系统左侧导航条设置了相应的操作功能。
用户权限下的工作流程主要为:用户通过系统提供的注册功能,进行身份验证并注册,而后在登录界面进行个人身份验证,并且进入用户的个人后台界面,并进行相应的操作。
新闻管理系统的业务流程如下图所示。
图2-3业务流程图
2.5本章小结
本章主要通过对新闻管理系统的可行性分析、功能需求分析、系统用例分析、系统流程分析,确定整个新闻管理系统要实现的功能。同时也为新闻管理系统的代码实现和测试提供了标准。
3 新闻管理系统总体设计
本章主要讨论的内容包括新闻管理系统的功能模块设计、数据库系统设计。
3.1 系统功能模块设计
在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了本新闻管理系统中的用例。那么接下来就要开始对本新闻管理系统的架构、主要功能和数据库开始进行设计。新闻管理系统根据前面章节的需求分析得出,其总体设计模块图如图3-1所示。
图3-1 新闻管理系统功能模块图
3.1.2用户模块设计
本系统的用户包括管理员和用户两种用户模块的功能基本是相同的,用户比管理员多了一个注册功能,所以以用户模块的结构图为例进行分析,用户模块结构图为例进行分析,如下图:
图3-2用户模块结构图
3.1.3 评论管理模块设计
新闻管理系统是一个交流性质的公开平台,用户在平台上提交评论,增加用户之间的互动性。但是同时也为了更好的规范评论的内容,给予管理员删除不合适的评论的功能,所以需要专门设计一个评论管理模块,具体的结构图如下:
图3-3评论管理模块结构图
3.1.4新闻资讯管理模块设计
新闻管理系统需要存储不少新闻资讯信息,其模块功能结构,具体的结构图如下:
图3-4新闻资讯信息管理模块结构图
3.2 数据库设计
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。
3.2.1 数据库概念结构设计
下面是整个新闻管理系统中主要的数据库表总E-R实体关系图。
图3-6 新闻管理系统总E-R关系图
通过上一小节中新闻管理系统中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。
表comment (评论)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | comment_id | int | 10 | 0 | N | Y | 评论ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 评论人ID: |
| 3 | reply_to_id | int | 10 | 0 | N | N | 0 | 回复评论ID:空为0 |
| 4 | content | longtext | 2147483647 | 0 | Y | N | 内容: | |
| 5 | nickname | varchar | 255 | 0 | Y | N | 昵称: | |
| 6 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 9 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 10 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 11 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
表forum (论坛)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | forum_id | mediumint | 8 | 0 | N | Y | 论坛id | |
| 2 | display | smallint | 5 | 0 | N | N | 100 | 排序 |
| 3 | user_id | mediumint | 8 | 0 | N | N | 0 | 用户ID |
| 4 | nickname | varchar | 16 | 0 | Y | N | 昵称:[0,16] | |
| 5 | praise_len | int | 10 | 0 | Y | N | 0 | 点赞数 |
| 6 | hits | int | 10 | 0 | N | N | 0 | 访问数 |
| 7 | title | varchar | 125 | 0 | N | N | 标题 | |
| 8 | keywords | varchar | 125 | 0 | Y | N | 关键词 | |
| 9 | description | varchar | 255 | 0 | Y | N | 描述 | |
| 10 | url | varchar | 255 | 0 | Y | N | 来源地址 | |
| 11 | tag | varchar | 255 | 0 | Y | N | 标签 | |
| 12 | img | text | 65535 | 0 | Y | N | 封面图 | |
| 13 | content | longtext | 2147483647 | 0 | Y | N | 正文 | |
| 14 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 15 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 16 | avatar | varchar | 255 | 0 | Y | N | 发帖人头像: | |
| 17 | type | varchar | 64 | 0 | N | N | 0 | 论坛分类:[0,1000]用来搜索指定类型的论坛帖 |
表forum_type (论坛分类)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | type_id | smallint | 5 | 0 | N | Y | 分类ID:[0,10000] | |
| 2 | name | varchar | 16 | 0 | N | N | 分类名称:[2,16] | |
| 3 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该分类的作用 | |
| 4 | url | varchar | 255 | 0 | Y | N | 外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置 | |
| 5 | father_id | smallint | 5 | 0 | N | N | 0 | 上级分类ID:[0,32767] |
| 6 | icon | varchar | 255 | 0 | Y | N | 分类图标: | |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表hits (用户点击)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | hits_id | int | 10 | 0 | N | Y | 点赞ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
| 3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
表message (留言板)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | message_id | int | 10 | 0 | N | Y | 留言板ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 用户ID: |
| 3 | title | varchar | 64 | 0 | Y | N | 标题: | |
| 4 | content | longtext | 2147483647 | 0 | N | N | 内容: | |
| 5 | nickname | varchar | 32 | 0 | N | N | 昵称: | |
| 6 | avatar | varchar | 255 | 0 | Y | N | 头像: | |
| 7 | | varchar | 125 | 0 | Y | N | 留言者邮箱 | |
| 8 | phone | varchar | 11 | 0 | Y | N | 留言者手机号码 | |
| 9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 11 | reply | longtext | 2147483647 | 0 | Y | N | 回复 | |
| 12 | reply_state | tinyint | 4 | 0 | Y | N | 0 | 回复状态 |
表news_and_information (新闻资讯)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | news_and_information_id | int | 10 | 0 | N | Y | 新闻资讯ID | |
| 2 | news_id | varchar | 64 | 0 | N | N | 新闻编号 | |
| 3 | news_headlines | varchar | 64 | 0 | Y | N | 新闻标题 | |
| 4 | news_cover | varchar | 255 | 0 | Y | N | 新闻封面 | |
| 5 | news_classification | varchar | 64 | 0 | Y | N | 新闻分类 | |
| 6 | author | varchar | 64 | 0 | Y | N | 作者 | |
| 7 | related_videos | varchar | 255 | 0 | Y | N | 相关视频 | |
| 8 | edit_users | int | 10 | 0 | Y | N | 0 | 编辑用户 |
| 9 | release_date | date | 10 | 0 | Y | N | 发布日期 | |
| 10 | news_content | text | 65535 | 0 | Y | N | 新闻内容 | |
| 11 | hits | int | 10 | 0 | N | N | 0 | 点击数 |
| 12 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 13 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 14 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表news_classification (新闻分类)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | news_classification_id | int | 10 | 0 | N | Y | 新闻分类ID | |
| 2 | news_classification | varchar | 64 | 0 | Y | N | 新闻分类 | |
| 3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表news_editor (新闻编辑)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | news_editor_id | int | 10 | 0 | N | Y | 新闻编辑ID | |
| 2 | news_id | varchar | 64 | 0 | Y | N | 新闻编号 | |
| 3 | news_headlines | varchar | 64 | 0 | Y | N | 新闻标题 | |
| 4 | news_cover | varchar | 255 | 0 | Y | N | 新闻封面 | |
| 5 | news_classification | varchar | 64 | 0 | Y | N | 新闻分类 | |
| 6 | related_videos | varchar | 255 | 0 | Y | N | 相关视频 | |
| 7 | author | varchar | 64 | 0 | Y | N | 作者 | |
| 8 | release_date | date | 10 | 0 | Y | N | 发布日期 | |
| 9 | edit_users | int | 10 | 0 | Y | N | 0 | 编辑用户 |
| 10 | news_content | text | 65535 | 0 | Y | N | 新闻内容 | |
| 11 | examine_state | varchar | 16 | 0 | N | N | 未审核 | 审核状态 |
| 12 | examine_reply | varchar | 16 | 0 | Y | N | 审核回复 | |
| 13 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 14 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表notice (公告)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | notice_id | mediumint | 8 | 0 | N | Y | 公告id: | |
| 2 | title | varchar | 125 | 0 | N | N | 标题: | |
| 3 | content | longtext | 2147483647 | 0 | Y | N | 正文: | |
| 4 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 5 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表praise (点赞)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | praise_id | int | 10 | 0 | N | Y | 点赞ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
| 3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 8 | status | bit | 1 | 0 | N | N | 1 | 点赞状态:1为点赞,0已取消 |
表regular_users (普通用户)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | regular_users_id | int | 10 | 0 | N | Y | 普通用户ID | |
| 2 | user_name | varchar | 64 | 0 | N | N | 用户姓名 | |
| 3 | gender | varchar | 64 | 0 | Y | N | 性别 | |
| 4 | mobile_phone_number | varchar | 16 | 0 | Y | N | 手机号码 | |
| 5 | examine_state | varchar | 16 | 0 | N | N | 已通过 | 审核状态 |
| 6 | user_id | int | 10 | 0 | N | N | 0 | 用户ID |
| 7 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表sensitive_vocabulary (敏感词汇)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | sensitive_vocabulary_id | int | 10 | 0 | N | Y | 敏感词汇ID | |
| 2 | sensitive_vocabulary | varchar | 64 | 0 | Y | N | 敏感词汇 | |
| 3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表slides (轮播图)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | slides_id | int | 10 | 0 | N | Y | 轮播图ID: | |
| 2 | title | varchar | 64 | 0 | Y | N | 标题: | |
| 3 | content | varchar | 255 | 0 | Y | N | 内容: | |
| 4 | url | varchar | 255 | 0 | Y | N | 链接: | |
| 5 | img | varchar | 255 | 0 | Y | N | 轮播图: | |
| 6 | hits | int | 10 | 0 | N | N | 0 | 点击量: |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表upload (文件上传)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | upload_id | int | 10 | 0 | N | Y | 上传ID | |
| 2 | name | varchar | 64 | 0 | Y | N | 文件名 | |
| 3 | path | varchar | 255 | 0 | Y | N | 访问路径 | |
| 4 | file | varchar | 255 | 0 | Y | N | 文件路径 | |
| 5 | display | varchar | 255 | 0 | Y | N | 显示顺序 | |
| 6 | father_id | int | 10 | 0 | Y | N | 0 | 父级ID |
| 7 | dir | varchar | 255 | 0 | Y | N | 文件夹 | |
| 8 | type | varchar | 32 | 0 | Y | N | 文件类型 |
表user (用户账户:用于保存用户登录信息)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | user_id | mediumint | 8 | 0 | N | Y | 用户ID:[0,8388607]用户获取其他与用户相关的数据 | |
| 2 | state | smallint | 5 | 0 | N | N | 1 | 账户状态:[0,10](1可用|2异常|3已冻结|4已注销) |
| 3 | user_group | varchar | 32 | 0 | Y | N | 所在用户组:[0,32767]决定用户身份和权限 | |
| 4 | login_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 上次登录时间: |
| 5 | phone | varchar | 11 | 0 | Y | N | 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时 | |
| 6 | phone_state | smallint | 5 | 0 | N | N | 0 | 手机认证:[0,1](0未认证|1审核中|2已认证) |
| 7 | username | varchar | 16 | 0 | N | N | 用户名:[0,16]用户登录时所用的账户名称 | |
| 8 | nickname | varchar | 16 | 0 | Y | N | 昵称:[0,16] | |
| 9 | password | varchar | 64 | 0 | N | N | 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成 | |
| 10 | | varchar | 64 | 0 | Y | N | 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时 | |
| 11 | email_state | smallint | 5 | 0 | N | N | 0 | 邮箱认证:[0,1](0未认证|1审核中|2已认证) |
| 12 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
| 13 | open_id | varchar | 255 | 0 | Y | N | 针对获取用户信息字段 | |
| 14 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
表user_group (用户组:用于用户前端身份和鉴权)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | group_id | mediumint | 8 | 0 | N | Y | 用户组ID:[0,8388607] | |
| 2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000] |
| 3 | name | varchar | 16 | 0 | N | N | 名称:[0,16] | |
| 4 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该用户组的特点或权限范围 | |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 8 | register | smallint | 5 | 0 | Y | N | 0 | 注册位置: |
| 9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
3.4本章小结
整个新闻管理系统的需求分析主要对系统总体架构以及功能模块的设计,通过建立E-R模型和数据库逻辑系统设计完成了数据库系统设计。
4 新闻管理系统详细设计与实现
新闻管理系统的详细设计与实现主要是根据前面的新闻管理系统的需求分析和新闻管理系统的总体设计来设计页面并实现业务逻辑。主要从新闻管理系统界面实现、业务逻辑实现这两部分进行介绍。
4.1用户功能模块
4.1.1 前台首页界面
当进入新闻管理系统的时候,系统以上中下的布局进行展示,首先映入眼帘的是系统的导航栏,下面是轮播图,再往下是系统公告,其主界面展示如下图4-1所示。
图4-1 前台首页界面图
4.1.2 用户注册界面
新闻管理系统的用户可以进行注册登录,当用户左上角“注册”按钮的时候,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号,选择身份,然后填写身份信息后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可注册成功。其用注册界面展示如下图4-2所示。
图4-2注册界面图
注册关键代码如下:
/**
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));
query.put("username",user.getUsername());
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
}
map.put("password",service.encryption(String.valueOf(map.get("password"))));
service.insert(map);
return success(1);
}
4.1.3用户登录界面
新闻管理系统中的前台上注册后的用户是可以通过自己的账户名和密码进行登录的,当用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到新闻管理系统的首页中;否则将会提示相应错误信息,用户登录界面如下图4-3所示。
图4-3用户登录界面图
登录关键代码如下:
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
Duration duration = Duration.ofSeconds(7200L);
redisTemplate.opsForValue().set(accessToken.getToken(), accessToken,duration);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
4.1.4 交流论坛界面
用户点击“交流论坛”菜单显示所有的交流论坛信息,可以按照分类查看帖子信息,或者输入关键词进行局部搜索,点击可以进入帖子的详细展示界面,在此界面用户可以点赞、收藏、评论,也可以点击“发布内容”输入帖子信息进行发帖,交流论坛界面如下图4-4所示。
图4-4交流论坛界面图
4.1.5我的账户界面
当用户点击右上角“我的”这个按钮,会出现子菜单,点击“我的账户”可以对个人的资料、登录系统的密码进行设置管理。我的账户界面如图4-5所示。
图4-5我的账户界面图
4.1.6系统公告界面
用户点击“系统公告”菜单显示管理员在后台发布的所有的系统公告,可以查看系统公告详情。系统公告界面如下图4-6所示。
图4-6系统公告界面图
4.2管理员功能模块
4.2.1用户管理界面
管理员在“用户管理”界面能够对用户信息进行管理,可以进行增删改查操作。界面如下图4-7所示。
图4-7用户管理界面图
用户管理关键代码如下:
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
4.2.2公共管理界面
管理员点击“公共管理”这一菜单会显示轮播图、系统公告以及留言板这三个子菜单,管理员可以对前台展示的系统公告、留言板和轮播图进行设置。界面如下图4-8所示。
图4-8公共管理界面图
公共管理关键代码如下:
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
public void delete(Map<String,String> query,Map<String,String> config){
QueryWrapper wrapper = new QueryWrapper<E>();
toWhereWrapper(query, "0".equals(config.get(FindConfig.GROUP_BY)),wrapper);
baseMapper.delete(wrapper);
log.info("[{}] - 删除操作:{}",wrapper.getSqlSelect());
}
管理员点击“论坛管理”菜单可以对其下论坛列表和论坛的分类进行增删改查。界面如下图4-9所示。
图4-9论坛管理界面图
论坛管理关键代码如下:
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
public void delete(Map<String,String> query,Map<String,String> config){
QueryWrapper wrapper = new QueryWrapper<E>();
toWhereWrapper(query, "0".equals(config.get(FindConfig.GROUP_BY)),wrapper);
baseMapper.delete(wrapper);
log.info("[{}] - 删除操作:{}",wrapper.getSqlSelect());
}
4.2.4新闻编辑管理界面
管理员点击“新闻编辑”会显示出所有的新闻编辑,支持选择新闻标题或者新闻分类对新闻编辑进行查询,如果想要添加新的新闻编辑,点击“添加”按钮,输入相关信息,点击“提交”按钮就可以添加了,同时可以选择某一条新闻编辑,点击“删除”进行删除。界面如下图4-11所示。
图4-11新闻编辑管理界面图
新闻编辑管理关键代码如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
管理员点击“新闻资讯”会显示出所有的新闻资讯信息,支持选择新闻标题或者新闻分类对新闻资讯信息进行查询,如果想要添加新的新闻资讯信息,点击“添加”按钮,输入相关信息,点击“提交”按钮就可以添加了,同时可以选择某一条新闻资讯信息,点击“删除”进行删除,也可以对用户提交的新闻资讯评论的信息进行管控,界面如下图4-12所示。
图4-12新闻资讯管理界面图
5系统测试
5.1 系统测试用例
系统测试包括:用户登录功能测试、新闻资讯展示功能测试、新闻资讯添加、新闻资讯搜索、密码修改、新闻编辑功能测试,如表5-1、5-2、5-3、5-4、5-5、5-6所示:
表5-1 用户登录功能测试表
| 用例名称 | 用户登录系统 |
| 目的 | 测试用户通过正确的用户名和密码可否登录功能 |
| 前提 | 未登录的情况下 |
| 测试流程 | 1) 进入登录页面 2) 输入正确的用户名和密码 |
| 预期结果 | 用户名和密码正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入 |
| 实际结果 | 实际结果与预期结果一致 |
新闻资讯查看功能测试:
表5-2 新闻资讯查看功能测试表
| 用例名称 | 新闻资讯查看 |
| 目的 | 测试新闻资讯查看功能 |
| 前提 | 用户登录 |
| 测试流程 | 点击新闻资讯列表 |
| 预期结果 | 可以查看到所有新闻资讯信息 |
| 实际结果 | 实际结果与预期结果一致 |
管理员添加新闻资讯管理界面测试:
表5-3 管理员添加新闻资讯管理界面测试表
| 用例名称 | 添加新闻资讯测试用例 |
| 目的 | 测试新闻资讯添加功能 |
| 前提 | 管理员用户正常登录情况下 |
| 测试流程 | 1)管理员点击新闻资讯,然后点击添加后并填写信息。 2)点击进行提交。 |
| 预期结果 | 提交以后,页面首页会显示新的新闻资讯 |
| 实际结果 | 实际结果与预期结果一致 |
新闻资讯搜索功能测试:
表5-4新闻资讯搜索功能测试表
| 用例名称 | 新闻资讯搜索测试 |
| 目的 | 测试新闻资讯搜索功能 |
| 前提 | 无 |
| 测试流程 | 1)在搜索框填入搜索关键字。 2)点击搜索按钮。 |
| 预期结果 | 页面显示包含有搜索关键字的新闻资讯 |
| 实际结果 | 实际结果与预期结果一致 |
密码修改搜索功能测试:
表5-5 密码修改功能测试表
| 用例名称 | 密码修改测试用例 |
| 目的 | 测试管理员密码修改功能 |
| 前提 | 管理员用户正常登录情况下 |
| 测试流程 | 1)管理员密码修改并完成填写。 2)点击进行提交。 |
| 预期结果 | 使用新的密码可以登录 |
| 实际结果 | 实际结果与预期结果一致 |
新闻编辑功能测试:
表5-6新闻编辑功能测试表
| 用例名称 | 新闻编辑测试用例 |
| 目的 | 测试用户新闻编辑功能 |
| 前提 | 用户正常登录情况下 |
| 测试流程 | 1)搜索查看新闻编辑,点击新闻编辑。 2)填写新闻编辑,点击进行提交。 |
| 预期结果 | 新闻发布成功 |
| 实际结果 | 实际结果与预期结果一致 |
5.2 系统测试结果
通过编写新闻管理系统的测试用例,已经检测完毕用户登录模块、新闻资讯展示模块、新闻资讯添加模块、新闻资讯搜索模块、密码修改模块、新闻编辑模块功能测试,通过这6大模块为新闻管理系统的后期推广运营提供了强力的技术支撑。
在新闻管理系统开发之前,需要先对用户的具体需求进行分析。包括系统的可行性分析、功能需求分析以及其他需求等。在可行性分析过程中,对系统实现的技术性、经济性以及管理等方面进行了分析。总体上证明了系统实施的可行性。
本文总结了新闻管理系统实现背景与现状,然后阐述了系统的具体业务需求,并根据系统需求对系统结构以及功能模块等进行了详细地设计,将整个系统划分为多个不同的功能模块。在分析系统功能需求时,对整个系统的总体架构以及功能模块等进行了分析,并选择合适的系统开发技术完成了对各个模块的开发工作。系统开发完成之后进行了部署,同时进行了系统的测试过程,通过测试证明了系统在功能以及性能等方面都达到了预期的要求,具有较高的稳定性与可靠性。
参考文献
[1]赵彩霞,张栽培,杨璇. 基于Java编程导航学习平台开发设计的研究 [J]. 家电维修, 2024, (03): 62-64.
[2]孙铁强,刘俊,于洪健等. 基于SpringBoot框架的在线监测和专家系统的研究 [J]. 自动化应用, 2024, 65 (04): 15-16+19.
[3]吴昊,张丹. 基于SpringBoot框架的大学生网上兼职系统设计与实现 [J]. 电脑知识与技术, 2023, 19 (35): 68-72.
[4]苏婉怡,揣小龙,刘美瑜等. 基于Java技术的实验室管理系统设计与实现 [J]. 无线互联科技, 2023, 20 (23): 58-60.
[5]魏素雅,肖伟,司忠波等. 一种基于互联网的融媒体新闻管理系统[P]. 山东省: CN117196223A, 2023-12-08.
[6]田玉昆. 基于Java Web技术的手机销售网站的设计与实现 [J]. 电脑知识与技术, 2023, 19 (32): 47-49.
[7]蒋先梅. 基于MVC模式的新闻管理系统的设计与实现 [J]. 无线互联科技, 2023, 20 (11): 77-79.
[8]牛怀岗,林关成. 基于SSM框架的新闻发布管理系统设计与实现 [J]. 现代电子技术, 2020, 43 (21): 127-131.
[9]任超. 面向互联网的新闻管理系统设计与实现[D]. 山东大学, 2020.
[10]韩旭. 基于WEB的新闻管理系统的设计与实现 [J]. 电子世界, 2020, (03): 204-205.
[11]袁文涛, 微擎新闻管理系统V2.5. 安徽省, 宿州市微擎云计算有限公司, 2020-01-14.
[12]仉允苇. 石油新闻管理系统的设计与实现[D]. 西安电子科技大学, 2019.
[13]陈东亮. 校园新闻管理系统的设计与实现[D]. 华南理工大学, 2019.
[14]Zhang S ,Zhang S ,Li H . Research on Sign News Management System [J]. Energy Procedia, 2019, 13 9833-9838.
[15]Anonymous . Omroep Gelderland adopts ANNOVA Systems news management system [J]. Broadcast Engineering, 2019,
[16]Hee H K ,Soo S P . An XML-based Multimedia News Management System [J]. The KIPS Transactions:PartB, 2019, 11B (7): 785-792.
致 谢
眨眼之间,大学生活就要结束了。在本文的最后,我要感谢我和蔼可亲的导师、团结有爱的同学的帮助和鼓励。此刻,我找不到感谢之词可以用来表达我最深切的感激之情。尤其感谢我的指导老师,在选题的过程中与我进行了深入的交流,在毕业设计期间给我提供了一些指导。四年的学习生活让我受益良多,老师们的丰富的学术知识、认真负责的学习态度让我受益匪浅。在此,我深深地感谢那些曾经给予我帮助和指导的老师!
我们的论文得益于许多学者的贡献,他们的研究成果为我们提供了宝贵的指导,使我们能够更好地完成这篇文章。感谢我的同学和朋友在我的写作以及排版过程中给予热情的帮助,才使得我比较顺利的完成了这篇论文。
感谢大学里遇见的朋友,你们在我这四年里留下无数的温暖和快乐,让我对这个校园多了一份留念。最后,感谢我的父母、辅导员、班长,以及室友们对我大学生活上的关心和理解,让我能保持乐观和追求我所热爱的。尽管我的能力有限,但我仍然尽力去完善这篇论文,并且诚挚地希望各位老师和学友能够给予宝贵的指导与意见!
免费领取源码,请关注+点赞+收藏+私信博主,谢谢!
更多推荐


所有评论(0)