版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要-PAGEII-摘要近年来,在此期间,互联网上的信息对人们现实生活的影响越来越大,人们的思想逐渐开放,不再满足传统媒体方式的信息获取方式,同时人们也渴望自我思想的表达,由此产生了以邮箱、论坛、博客、即时通讯等互联网工具。博客相较于邮箱、论坛、即时通讯等工具具有操作简单、表达详细、逻辑性强等特点,并且具有开放精神和共享精神的互联网精神。而现在大多数博客多以公司企业博客为主,个人博客则较少,并且个人博客的主要实现方式是在公共平台上进行编写发布等。经过不断的调查研究,对个人博客系统相关功能需求的组织,设计出了基于SpringBoot框架的,功能丰富,风格优美的个人博客系统。本个人博客的架构实现通过对比与研究,选用了B/S的架构,从结构化来实现相关功能,分离系统的功能模块。采用了MVC模式来设计WEB应用程序的代码,实现个人博客的界面、功能、数据的分层结构,使整个WEB应用程序的代码耦合性低,并且在后期能够方便维护相关的代码,有利于工程化管理。本博客的实现主要以SpringBoot框架技术为基础,在前端采用了Thymeleaf技术,并且使用SpringDataJPA技术来对后端的数据进行操作,使对数据库的操作更加方便。其中将SpringBoot框架作为业务处理层的处理基础框架,以便于Thymeleaf、SpringDataJPA等其它技术与SpringBoot的结合使用,并且在SpringBoot框架中内置了Tomcat,方便后期对WEB应用程序进行相关部署。最后对个人博客项目中的代码进行测试,保证个人博客的可靠性与安全性。关键词: 个人博客;SpringBoot;数据库;沟通平台AbstractAbstractAtthebeginningofthe21stcentury,withtherapiddevelopmentofInternetinChina,withthepopularizationofpersonalcomputers,people'slifestylehaschangeddramatically.Duringthisperiod,peoplereceivedmoreinformationontheInternet,andtheirideasgraduallyopenedup,whichnolongersatisfiedthetraditionalmediawayofinformationacquisition.Atthesametime,peoplealsoyearnedfortheexpressionoftheirownthoughts,resultingintheInternettoolssuchasemail,forum,blog,instantmessaging,etc.Comparedwithemail,forum,instantmessagingandothertools,bloghasthecharacteristicsofsimpleoperation,detailedexpression,stronglogic,andthespiritofopenandsharingInternet.Therefore,blogismoreacceptedbypeopleasanimportantwayofonlineinformationdissemination.Nowmostoftheblogsaremainlycorporateblogs,butfewpersonalblogs,andthemainwaytorealizepersonalblogsistowriteandpublishonthepublicplatform.Throughcomparisonandresearch,thearchitectureofthispersonalblogselectstheB/Sarchitecturetorealizetherelatedfunctionsfromthestructureandseparatethefunctionalmodulesofthesystem.MVCmodeisusedtodesignthecodeofwebapplicationprogramandrealizethehierarchicalstructureofpersonalbloginterface,functionanddata,whichmakesthecodeofthewholewebapplicationprogramlowcoupling,easytomaintainandconducivetoengineeringmanagement.Theimplementationofthisblogmainlyadoptsspringboottechnology,andthetechnologyofthymeleafisconvenientinthefrontend.ThetechnologyofspringdataJPAisusedtooperatethedatainthebackend,makingtheoperationofthedatabasemoreconvenient.Thebusinesslogicmainlyusesspringboottechnology,whichisconvenientwiththymeleafandspringdataJPAandothertechnologiesarecoupled,andTomcatisbuiltintofacilitatethedeploymentofwebapplications.MySQLrelationaldatabaseisusedindatamanagement,whichisfast,easytooperateandeasiertouseindevelopmentanddeployment.Finally,thecodeinpersonalblogprojectistestedtoensurethereliabilityandsecurityofpersonalblog.KeyWords: Personalblog;SpringBoot;database;Communicationplatform目录-PAGEIV-目录18719摘要 I24220Abstract II135481引言 1228691.1研究背景与意义 1294361.1.1研究背景 1231881.1.2研究意义 1272831.2国内外研究现状 2309661.3本文创新点与技术难点 268092相关技术介绍 4305892.1B/S结构 4253112.2MVC模式 410832.3SpringBoot框架 4308602.4Thymeleaf前端摸板引擎 6188462.5SpringDataJPA框架 6263162.6数据库技术 6201643需求分析 7179873.1功能性系统需求分析 7183673.1.1博主需求分析 7268343.1.2普通用户需求分析 8155413.1.3VIP用户需求分析 9257663.2非功能性系统需求分析 9264273.2.1故障处理 91763.2.2软件质量 9244213.3可行性分析 10220083.3.1技术可行性 10159593.3.2经济可行性 10216084系统设计 11190354.1系统设计原则 1138384.2系统功能结构设计 1184024.3前台子模块设计 1247474.3.1注册和登录模块 12134304.3.2文章浏览模块 13254444.3.3文章搜索模块 13273254.3.4用户评论模块 14250144.4后台子模块设计 14146994.4.1博主注册与登录功能 1444444.4.2文章管理 14280454.4.3分类管理模块和标签管理模块 15269734.4.4评论管理 15203414.4.5系统管理 15124244.5数据库设计 16131674.5.1数据库命名规则 16224714.5.2数据库设计 16177354.5.3数据库逻辑实现 1720745系统实现 2232915.1前台功能实现 2223945.1.1博客文章浏览 22236225.1.2前台的主要功能 2541545.1.3前台的其它功能 2572765.2后台功能的实现 27135935.2.1标签的添加 27212375.2.2博客设置的预先加载 2988726系统测试 31217437结论 3317003参考文献 3429616致谢 36第一章引言-PAGE11-引言研究背景与意义研究背景自从一九九一年第一个互联网友好接口被开发出来,经过三十年的时间,互联网获得极大的发展。而近年来传统媒体已经满足不了人们日常的生活娱乐学习需要,而个人计算机的普及以及互联网的发展则为人们通过网络丰富个人精神世界提供了良好的方式。因此产生了邮箱、论坛、即时通讯、博客等一系列网上交流工具[1]。相较于邮箱、论坛、即时通讯工具等缺乏个性化,不能很好阐述想法和知识等缺点,博客写日志,发表、交流对事实的看法,共享信息等功能,更适应现代用户的需求[2]。在一九九七年,第一个weblog个人博客建立,个人博客得到了快速的发展。在一九九九年,PeterMerholz以缩略词blog命名博客[3-4]。知道二十一世纪初期,blog才传入中国,在中国获得了快速的发展,产生了像新浪、CSDN、博客园等编写和发布博客的公共平台。自二零零八年后,博客的热度逐渐下降。但自2014年后,博客的使用量又逐渐上升,平均在百度上PC端的搜素日均值位于500左右,在移动端的搜索指数在200左右。但现在的博客主要是公司或者企业博客,主要是用来宣传公司或企业的品牌、树立公司或者企业的形象,而个人博客较少。研究意义现在的博客网站主要分为两类,有两种用途,一种是企业博客,一种是个人博客。企业博客是公司企业或者某个产品的博客,其功能也主要分为三方面。如果是对内的博客,这种企业博客可以促进企业内部交流[5],如果企业对外的博客,则往往发挥着树立企业的形象的作用,同时作为企业公关的一种窗口。个人博客往往通过作为个人的网路版日记、学习交流平台、展示形象,获得话语权等方式起到个人自由表达,知识过滤和积累、深度学习交流等作用[6]。博客系统一般来说专注于表达,例如对特定的新闻或者研究课题的评论,记录个人生活的日记或者专业知识学习笔记[7]。博客应用的发展和使用人群的不同,很难使博客系统符合每个人使用习惯与风格[8]。现在建立个人博客主要有两种方式,一种是通过新浪、CSDN、Blog或者开源中国这种公共平台进行建立,但这种建立方式往往出现个人特点,博主话题不明确等问题。而另一种建立个人博客的方式往往是同过搭建服务器,部署相关的博客应用实现,对于大部分用户来说,缺少相关的技术积累,建立起来较为繁琐。而在本次基于SpringBoot个人博客系统的实现中,便保证个人博客是一种具有个人特点,简单优美易部署的博客。国内外研究现状随着时代的发展,博客自一九九七年诞生以来,博客经过近十年的发展达到顶峰,但近年来博客的趋势却在渐渐减少。在中国博客发展则起于二零零二年,博客引入中国,使用博客的中国人不到一万人。二零零三年是中国博客发展年,中国博客用户达到二十万人[9]。二零零四年,方兴东以及姜旭平发起了《博客(Blog)技术及其对组织沟通和社会交流方式的影响研究》的研究项目使中国的博客开始商业化[10]。二零零八年,中国博客的发展进入顶峰。“百度指数”中表明,二零一一年开始到二零一八年,个人博客的搜索量又出现缓慢增长的现象,个人博客的使用缓慢上升,在百度中,中国的仅“个人博客”的搜索日均达到446次。个人博客在游戏、教育培训、资讯、书籍阅读、家电数码、软件应用、休闲爱好、医疗健康、、影视音乐金融财经方面使用较多。从全球看,通过“谷歌趋势”,个人博客在全球范围内自二零零四年起到二零零九年趋势上升,自二零零九年之后博客趋势逐渐下降。“个人博客”的搜索量最高主要在中国和美国两个国家,其中中国的“个人博客”热度最高。其中博客平台,主要是新浪博客、博客中国和blog使用人数最多,而博客组题也往往涉及到数据、空间研究领域较多。个人博客中中国主要的博客平台已支持MarkDown编写方式,操作简单,功能完整,并分为技术博客和非技术博客等。非技术博客如新浪等。在国外主要的博客平台是blog,其中编写主要使用了富文本的编写方式,操作较为繁琐。本文创新点与技术难点本次的基于SpringBoot的个人博客是一款个人博客,它不同于在公共平台上建立的博客,它用户单一,个性化突出,博客主题简单优美。该个人博客系统是基于SpringBoot的个人博客,在博客用户的编写上也使用了MarkDown的方式,并且MarkDown的编写方式中集成了插入视频的功能。MACROBUTTONAcceptAllChangesInDocAndStopTracking第二章相关技术介绍相关技术介绍本个人博客系统为了方便开发和维护采用了B/S架构,以SpringBoot框架为个人博客系统开发的核心,以SpringDataJPA框架来访问数据库,进而进行相关的数据库操作。Thymeleaf摸板引擎来构建前端页面,使用传统MVC模式来编写代码。个人博客系统需要数据库来存储和修改所需的相关数据,本个人博客采用现阶段较为流行的关系型数据库——MySQL数据库作为数据库管理系统。B/S结构系统的实现结构采用的是B/S结构。其中浏览器层相当于C/S结构的客户端层,浏览器为了方便用户进行交互操作,采用了Javascript等脚本语言[11]。浏览器本身就能够解析HTML语言,使其显示为用户能够轻松读懂的语言[12]。用户仅仅安装浏览器便能够使用B/S结构的系统,不需要如同C/S结构一样专门安装相关的客户端软件才能使用相关服务,因此对于开发人员来说也减少了客户端的开发和维护工作[13]。因此B/S结构的系统在开发时具有成本低、开发简单的优点,而在生产部署时有维护方便、分布性强的优点。MVC模式基于SpringBoot的个人博客系统采取的是MVC模式的软件设计典范。MVC模式根据其全称便可知道MVC的三个核心部件是模型、视图、控制器[14]。其中模型在MVC中是负责数据的存储部分,视图是负责数据的显示和用户的交互部分,而控制器则是负责数据的输入、相关业务逻辑的处理等功能,它是在用户访问端与数据访问端之间插入的一个中间层[15]。由于个人博客系统的开发时间短、开发成本低,因此MVC软件设计模式是本次基于SpringBoot的个人博客系统的软件设计方式的最佳选择SpringBoot框架SpringBoot是Spring项目的产品之一,其在WEB系统的开发中被广泛的应用。SpringBoot不同于原先Spring的配置和Spring与第三方框架整合时的配置过于繁琐,SpringBoot提供了比较齐全的关于项目和第三方框架整合的默认配置方案,因此能够快速的创建应用程序[16]。SpringBoot框架的打包方式有两种,一种可以采取传统的方案将项目打包成war包,然后放在Tomcat中运行,也可以直接将项目打包成jar包,可以使用相关的命令行让SpringBoot框架中内嵌的Tomcat服务器来运行。SpringBoot框架具有一下优势:基于Spring项目的快速搭建。提供了生产级的服务监控方案。内嵌服务器,能够快速部署。提供了一些通用配置。SpringBoot框架个人博客系统的方方面面提供了便利。首先SpringBoot能够作为框架的粘合剂,能够集成Thymeleaf前端摸板引擎和数据库访问框架SpringDataJPA。在几年前WEB应用程序开发使用Spring时,配置多为XML文件,在项目的配置上既要在web.xml配置Spring的启动器外,还需要另外新建XML文件来配置数据源、事务管理、日志记录和视图解析等许多功能,而在SpringBoot中添加了很多的默认配置和自动配置功能,因此极大的减少了项目配置复杂和繁琐。其次,SpringBoot的部分自定义配置使用的是原生的Java配置,不用生成其它代码。SpringBoot也提供了一些监控功能,集成方便,同时也能对项目运行进行监控,保证项目的正常运行。SpringBoot成为个人博客系统的基础框架并不仅仅是上面这几个方面。在传统的WEB应用程序开发中前端使用的是JSP技术,而该技术往往是在前端代码中夹杂着Java代码,极其不利于开发与后期的维护。而SpringBoot官方默认的前端摸板——Thymeleaf引擎具有自己的前端语法,往往能够更好的解决上述问题。其次传统的WEB应用程序在MVC模式中Controller层使用的还是Servlet技术,该技术在每定义一个Servlet就必须在web.xml中配置相关代码,这样大大增加了开发的时间。其它框架也改善了这种情况,但也必须添加属于自己框架的XML配置文件,其配置文件虽然较原生的简单,但比起SpringBoot依然繁琐。以Struts为例,在服务器启动时会加载StrutsPrepareAndExecuteFilter对象,接着创建Dispather,通过Dispather加载默认的配置文件,然后开始解析默认的XML文件,最后加载用户自定义的属性文件和相应的XML文件。XML配置文件是标签配置文件,往往在配置时需要大量的标签使用[17]。而在SpringBoot中直接使用@Controller注解进行标注,用@RequestMapping的注解进行uri的匹配,直接查找到要执行的方法[18]。在Service层也可以直接使用@Service进行标注,具有类自动注入的功能,极大的方便了系统的开发。不仅如此,SpringBoot提供了事务管理和实体类的注解能够直接将实体类映射到数据库的表结构上便于对数据进行操作[19]。通过前面展示的代码可以看到SpringBoot提供的功能穿插在项目的各个方面,使项目的开发更加方便和容易,极大的缩短了项目开发的时间。Thymeleaf前端摸板引擎Web前端是一个网站开发的起始部分,也关系这网站的设计是否人性化,前端开发的好坏直接影响到整个网站的交互效果[20]。与MVC对应的视图层,包括HTML,JSP、Freemarker、Volicity、Thymeleaf等视图技术[21]。Thymeleaf是使用于WEB应用程序开发的新一代摸板引擎,它不同于传统的Java模板引擎,能够支持原生的HTML原型。其中HTML语言是网络上使用最广泛的语言,也是构成网页文档的主要语言[22]。通过Thymeleaf创建的HTML摸板不仅仅能够在服务器中运行,也能像静态资源一样直接在浏览器中展示。并且Thymeleaf模板引擎是SpringBoot框架的官方默认的摸板引擎,能够方便的与SpringBoot进行集成。SpringDataJPA框架SpringData是基于Spring的编程模型,同时保留底层数据存储特殊特性的数据访问框架,它的任务是为数据访问提供一个熟悉的、一致的数据访问接口。SpringDataJPA是能够增强基于JPA的数据访问层技术的框架。SpringDataJPA是能够极大的减少开发人员的相关工作量。并且由于SpringDataJPA使用的是基于JPA的数据访问技术,因此它使用起来更加的简单。数据库技术为了保障计算机网络信息安全,相关人员研发并建立了集计算机技术、信息技术、网络技术于一体的计算机数据库和计算机数据库管理系统[23]。MySQL数据库是最优秀的数据库管理系统之一,它能够统一管理和控制数据[24]。MySQL支持复杂的WEB应用程序、电子商务、SasS和在线事务处理程序等[25]。目前为止,MySQL是作为WEB应用程序开发所选择最好的关系数据库管理系统,MySQL官网中提供了一系列便于开发的管理工具,它降低了开发、部署和管理关键性业务的风险和成本。第三章需求分析需求分析软件系统需求分析中的功能性分析主要是研究系统所需要的功能,是软件系统使用者需求的最直接体现。而非功能性需求则往往是对系统的其它条件限制,如软件质量保证,系统出现故障的处理方式等。领域性需求往往是系统领域所反映的基本问题。基于SpringBoot的个人博客系统是属于本人使用博客产品,因此在进行需求分析时不必进行需求调研,仅仅根据本人需求来进行系统需求分析即可。该系统的需求分析首先从大体上描述个人博客系统的大体功能流程,其次从个人博客的使用角色上进行功能系统需求分析,然后在进行博客的分功能需求分析,最后从个人博客系统的可行性上进行分析。功能性系统需求分析博主需求分析博主是该博客系统的所有者,能够使用和浏览该博客的所有信息。博主的功能主要有注册和登录功能,当然因为个人博客系统的博主有且仅有一个,因此博客的注册功能进能够使用一次。当博主在登录账户后,在某些情况下需要修改自己的个人账户信息,因此个人博客具有账户信息的修改功能。博客文章作为博主与其他用户交流的方式,便具有文章评论与文章评论恢复的功能。博客文章在越来越多的情况下是非常难以管理的,因此博主可以通过文章的分类和标签以及创建时间来管理,因此博主还具有文章的分类管理和标签管理功能。博主除了是博客文章的编写者与发布者,同时也是个人博客系统的所有者,因此博主也有个人博客系统的相关功能设置以及个性化设置权限。个人博客系统中博主的可用功能如图3-1所示:图3-1博主需求分析普通用户需求分析个人博客系统中普通用户角色的功能是相对较少的。普通用户仅仅是浏览博客文章,并通过评论与博主或其他用户进行讨论的一种角色。因此普通用户具有的功能有博客文章浏览,博客文章搜索、博客文章评论以及回复文章评论的功能。图3-2所示便是普通用户需求的用例图分析:图3-2普通用户需求分析VIP用户需求分析VIP用户角色是在普通用户的基础上添加了部分功能实现的。现在是一个知识付费的时代,因此在博主编写知识型文章时可以选择文章未VIP文章,此时博客的普通用户则不能浏览VIP文章,而VIP用户便可以浏览相关的VIP文章。因此VIP用户使用的功能在普通用户功能的基础上添加了充值功能,浏览VIP文章的功能。非功能性系统需求分析非功能性系统需求分析是除去系统功能需求的其他系统指标实现,例如软件系统的个性化需求、易用性需求、安全性需求、系统的可扩展与可维护性需求以及系统开发中软件质量保证等。结合实际,个人博客系统开发中的非功能性需求主要表现在两个方面,一个是故障处理,另一个便是软件质量保证方面。故障处理故障处理是该个人博客系统开发中一个较为重要的部分。在软件开发中往往会出现一些问题,而这时软件的故障处理尤为重要,因此在软件开发中要使用防卫式编程方式并且在软件系统运行中加强对于软件系统的监控,例如软件运行日志等。同时要保证个人博客系统的数据安全性,一旦个人博客系统出现运行故障,要对个人博客系统中的数据进行备份并发送备份数据。软件质量软件质量的保障是软件系统开发过程中重要的一部分。软件质量主要包含的准则如下:一是功能性,由于个人博客系统是为本人专门开发的博客系统,因此其功能性极其是符合用户需求的。二是可靠性,个人博客系统是基于SpringBoot框架来实现的,其中使用的技术都是经过市场检验的,因此在开发过程中是能够保证系统的可靠性的。三是可用性,个人博客系统是易部署、易使用的,其操作深度最大为3,即往往仅需三步便能到达用户所需的页面。四是效率,个人博客系统使用的数据库是MySQL数据库管理系统,其交互效率是较为好的,用户的交互效率要保证在秒级以内。五是可维护性,个人博客开发过程中使用的技术都是较新的并且较为广泛使用的,并且在开发中软件的设计模式是MVC模式,因此该个人博客系统的可维护性是可以保证的。最后是可移植性,系统的开发语言是Java语言,在Windows平台和Linux平台都是可以方便部署的,代码的开发方式也是模块化分层开发,因此其可移植性是有保证的。可行性分析技术可行性个人博客系统使用Java语言,使用简单,并且Java语言具有成熟的生态系统,其操作性和可行性都是具有保证的。在个人博客系统的WEB应用程序是以SpringBoot框架为基础的。SpringBoot具有对第三方框架自动配置的功能,因此在WEB开发中使用较为简单。因此在个人博客系统开发的技术可行性是完全可行的。经济可行性在开发个人博客系统中编写Java程序使用的工具是IntelliJIDEA的社区版IDE,数据库存储上使用的是MySQL社区版。个人博客的开发语言是Java语言,在个人非商业使用上也是免费的,而Java使用的框架SpringBoot、SpringDataJPA、Thymeleaf也是开源免费的。因此,在个人博客系统的开发过程中其经济可行性是完全可行的。第四章系统设计系统设计系统设计原则在软件系统设计时应遵守一下原则:可靠性:可靠性意味着软件系统对于系统运行时出现问题的处理能力。健壮性:软件设计的健壮性是对于在系统的运行中用户错误输入的处理能力,只有健壮性越好,软件发生故障的概率便越小。可测试性:对于软件能够进行测试,防止软件系统出现故障。标准化:在软件系统的开发过程中编写的软件代码要符合开发规范,以便于后续维护和扩展。安全性:能够保护系统正常运行,保护用户的数据不损坏、不丢失。系统功能结构设计软件系统的功能采用的是模块化设计。首先将系统分为前台和后台两个大的功能模块,然后前台的使用主要是普通用户和VIP用户,模块的组要功能也是浏览博客,发表评论等。而在后台主要是博主使用的功能模块,主要包含博客文章的管理、博客文章分类管理、博客博客标签管理等。详细的系统功能如图4-1所示:图4-1系统总体功能结构设计系统总体模块设计主要根据系统的三个使用角色划分,根据图4-1可知其中前台模块组要是普通用户和VIP用户来使用,在前台模块中又有一些小的功能模块,其中最主要的是用户的注册与登录模块,文章浏览模块、文章搜素模块和发表评论模块。而在后台模块主要是博主使用,在模块设计中又将后台模块分成若干个子模块使用。其中在后台模块中最主要的是注册和登录、文章管理、博客文章分类、博客文章评论以及系统管理等功能模块。前台子模块设计注册和登录模块博客系统具有四个用户角色,分别是博主、游客、普通用户、VIP用户。其中游客是仅浏览博客的非VIP文章,但不用注册用户账号。而注册用户是在个人博客网站中具有个人账号的用户但未充值VIP的用户。其中注册用户主要有两种途径实现,一种是游客注册账号成为注册用户,另一种是VIP用户的VIP到期变为普通用户但这几种用户在个人博客系统中注册与登录的方式和流程是相同的。在用户注册时,是通过注册功能传入自己的个人信息,然后将向数据库中的数据查找匹配的数据,如果没有相同的用户账号,则保存用户数据,用户注册成功,其注册的具体过程如图4-2所示。在登录过程中,也是用户信息通过输入相关信息,如果数据库中有信息,则登录成功,否者失败。登录过程如图4-3所示。图4-2前台用户注册时序图图4-3前台用户登录时序图文章浏览模块根据用户的不同,文章的浏览有两种方式,一种是游客不用注册和登录直接查看博客文章,其他注册用户则可以选择直接浏览或者登录后浏览文章。如果VIP用户想要阅读VIP文章则必须要进行登录。文章搜索模块用户在查看文章时,可以通过输入需要查询的关键字进行搜索。在搜索时用户需要将关键字输入到输入栏,然后系统提取关键字并在数据库中进行查找,然后将搜索到的文章数据返回给业务逻辑层进行处理,然后将处理后的数据绑定在前端页面的模板引擎上以便于用户查看和操作。其具体过程如图4-4所示。图4-4用户文章搜索时序图用户评论模块在该模块上,无论是游客、注册用户、VIP用户甚至是博主都能在前台发布评论和回复评论,并且并不需要进行用户登录,仅是在输入评论信息是输入自己的邮箱便可以正常发表评论。后台子模块设计博主注册与登录功能与其他用户不同,由于个人博客系统是专属于博主的博客系统,因此在个人博客系统中具有博主身份的人和账户有且仅有一个,因此博主的注册能且仅能使用一次,但对于博主用户的个人账户信息在博主登录之后是可以更改的。关于博主的登录功能与其他用户的登录功能大体相同。文章管理在博主登录进账户后,会进入后台管理,其中文章管理是分为量部分的,一部分为文章列表,可以查看文章列表,查找文章,删除文章。而第二大部分则是修改和添加文章的功能。在文章修改或者添加时可以改变文章的状态,例如文章的原创、转载、翻译等,改变文章的首图,保存为草稿或者发布等。分类管理模块和标签管理模块分类管理主要是对文章种类的管理,而标签管理则是每篇文章技术点、关键词的一个集合的管理。分类管理和标签管理都可以添加新的种类或者是标签,也可以修改种类或者标签的名字,也可以删除相关标签和种类。同样,后台模块的分类管理和标签管理也是博主必须登录后进入分类管理或者标签管理的页面才能够使用的功能。评论管理博主的虽然能够像其他用户那样发布评论,但博主的评论管理与其他用户的评论还是有不同的。在博主登录后台后,会有专门的评论管理页面,如果有用户对博主的文章进行评论后,而博主从未查看,则该评论会显示在后台评论页面,博主可以选择忽略,也可以查看评论后进行回复。系统管理在个人博客系统中,个性化是个人博客中重要的一项非功能需求,因此在个人博客中添加了系统设置功能。系统设置就是对系统的相关功能进行管理,它可以管理前台的功能模块显示和部分样式。在系统管理模块中,博客系统状态数据是存储在数据库中,因此在个人博客WEB程序运行时便要向数据库提取相关状态数据,然后博客根据该数据进行初始化。在后期如果更改博客的设置是需要博主登录后台,然后在博客设置页面进行相关的博客设置的。具体博客系统管理流程如图4-5所示。图4-5博客设置模块时序图数据库设计数据库命名规则数据库名称为blog,在数据库建立的表以t开头,以实体类名结尾,中间以下划线链接。当实体类不能以一个单词描述的时候,表的名称可以每个单词小写,然后通过下划线来连接。数据库表中的字段名以小写的英文单词命名,两个单词之间同样要以以下划线连接。在表中的外键以外键所对应表的实体类名小写加上外键所对应实体类字段,中间使用下滑线连接。这样对于数据库命名,有利于见名知义,能够对表的名称和字段起到很好的解释作用。数据库设计关于数据库的设计从实际需求出发,更具应用到的实体类来建立的。个人博客有使用用户,必定有用户表。在个人博客中博主主要是添加博客文章,因此是一对多的关系,而其它用户主要是浏览博客,其中一个博客可以很多用户进行浏览,同时一个用户也可以浏览很多博客文章因此是多对多的关系,其中还有博客文章与标签、分类的关系,用户和订单的关系,用户和评论的关系等。由于每个实体的属性过多,因此不在此描述,同时不在图中显示。具体的实体关系通过数据库的ER图来表示,数据库的ER图如图4-6所示。图4-6个人博客数据库ER图数据库逻辑实现上面描述的数据库的命名规则和数据库的相关设计。下面是数据库具体的逻辑结构的实现。个人博客系统是一个博客系统,最重要的就是博客表。博客表t_blog。包含字段有id,博客主题title,博客内容content,博客首图first_picture,博客类型flag,博客观看次数views,博客摘要description,博客赞赏appreciation,博客转载share_statement,博客评论commentabled,博客发布published,博客推荐recommend,博客vip,博客创建时间create_time,博客更新时间update_time。博客包含外键有博客种类type_id,博客标签tag_id,博客用户user_id,博客评论comments_id。具体表结构如表4-1。表4-1博客文章表字段名数据类型约束idBITINT(20)主键,不能为空appreciationBIT(1)不能为空commentabledBIT(1)不能为空contentTEXT无约束create_timeDATETIME(6)无约束字段名数据类型约束descriptionVARCHAR(255)无约束first_pictureVARCHAR(255)无约束flagVARCHAR(255)无约束publishedBIT(1)不能为空recommendBIT(1)不能为空share_statementBIT(1)不能为空titleVARCHAR(255)无约束update_timeDATETIME(6)无约束viewsINT(11)无约束type_idBIGINT(20)无约束user_idBIGINT(20)无约束vipBIT(1)不能为空个人博客系统是需要博主进行登录注册的,同时其他用户也需要注册和登录,因此用户表也很重要。用户表表明为t_user,其中有字段id,昵称nickname,用户名username,密码password,邮箱email,头像avatar,用户类型type,创建时间create_time,更新时间update_time。具体的表设计如表4-2所示。表4-2用户表字段名数据类型约束idBIGINT(20)主键,不能为空avatarVARCHAR(255)无约束create_timeDATETIME(6)无约束emailVARCHAR(255)无约束nicknameVARCHAR(255)无约束passwordVARCHAR(255)无约束typeINT(11)无约束update_timeDATETIME(6)无约束字段名数据类型约束usernameVARCHAR(255)无约束在个人博客中,用户与博主交流的最佳评论是博客下面的评论功能,因此评论表也是博客一样重要的表。评论表名为t_comment,其表中具有一下字段:id,昵称nickname,邮箱email,内容content,头像avatar,创建时间create_time,是否是博主评论回复admin_comment,博主是否已读view,具有外键博客blog_id,父评论parent_comment_id。其具体的表结构如表4-3所示。表4-3博文评论表字段名数据类型约束idBIGINT(20)主键,不能为空admin_commentBIT(1)不能为空avatarVARCHAR(255)无约束contentVARCHAR(255)无约束create_timeDATETIME(6)无约束emailVARCHAR(255)无约束nicknameVARCHAR(255)无约束blog_idBIGINT(20)无约束parent_comment_idBIGINT(20)无约束viewBIT(1)不能为空博客文章是有文章种类和文章标签。其中文章种类表名为t_type,表中有字段id,种类名name。文章标签表名为t_tag,表中有字段id,标签名name。这两种表的表结构相同,如表4-4所示。表4-4文章种类表或者标签表的表结构字段名数据类型约束idBIGINT(20)主键,不能为空nameVARCHAR(255)无约束由于博客文章和文章种类是多对一的关系,所以直接在博客文章中引入文章种类的外键便可,但是博客文章和文章标签是多对多的关系,因此需要加上一张中间表。博客文章和文章标签的中间表名为t_blog_tag,其中有字段id,博客文章blogs_id和文章标签的tags_id。以为是中间表,所以这里不展示具体的表结构。个人博客启动时需要向数据库中读取个人博客的相关配置信息,因此在个人博客中还有博客设置表。博客设置表的表名为t_setting,其中有字段id,是否展示分类信息classification,是否显示标签tag,是否归档archive,是否显示“关于我”页面about_me,是否搜索search,是否显示侧边分类列表side_classification,是否显示侧边标签列表side_tag,是否显示侧边推荐列表side_recommend,是否显示侧边二维码sideqrcode,是否显示侧边side,是否显示底部二维码footerqrcode,底部邮箱footer_email,底部的即时通信账号footerqq,博客文章底部是否显示评论comment。具体的表结构如表4-5所示。表4-5博客设置表字段名数据类型约束idBIGINT(20)主键,不能为空about_meBIT(1)不能为空archiveBIT(1)不能为空classificationBIT(1)不能为空commentBIT(1)不能为空footer_emailVARCHAR(255)无约束footerqqVARCHAR(255)无约束footerqrcodeBIT(1)不能为空searchBIT(1)不能为空sideBIT(1)不能为空side_classificationBIT(1)不能为空sideqrcodeBIT(1)不能为空side_recommendBIT(1)不能为空side_tagBIT(1)不能为空tagBIT(1)不能为空在进行充值时服务器也要做好记录,因此在数据库中是由订单表的。订单表为t_order,其中有字段id,订单编号out_trade_no,支付宝交易号trade_no,交易金额total_amount,订单标题subject,订单描述body,vip开始时间start_date,vip结束时间stop_date,vip是否有效valid,外键交款用户user_id。具体的表结构如表4-6所示。表4-6订单表字段名数据类型约束idINT(11)主键,不能为空bodyVARCHAR(255)无约束out_trade_noVARCHAR(50)不能为空start_dateDATETIME(6)无约束stop_dateDATETIME(6)无约束字段名数据类型约束subjectVARCHAR(255)无约束total_amountVARCHAR(255)无约束trad_noVARCHAR(255)无约束validBIT(1)不能为空user_idBIGINT(20)不能为空第五章系统实现系统实现个人博客系统的代码设计模式采取的时MVC模式,也就是模型—视图—控制器模式。在具体代码上便是用户通过前端视图将相关数据传入到控制器中,然后经过控制器的逻辑处理,将数据根据模型保存到数据库中。以上便是个人博客系统代码的核心实现方式。个人博客的代码根据不同的功能将代码放入到不同的文件夹,使代码结构层次更加清晰。其中aspect包是对于个人博客日志记录的实现,config包是个人博客的部分配置,其中controller包对应者MVC模式中的控制器层,其中dao包对应MVC中的M层,exception包是个人博客中的自定义异常,其中init包是个人博客启动时进行博客设置初始化功能的实现,util则对应者工具包,在templates文件夹中则保存者前端页面的文件,static中则保存者前端的静态资源。而在resources中剩下的文件则是整个项目中最终要的配置文件。前台功能实现博客文章浏览个人博客系统中未注册用户和已注册用户都能够进行博客文章的浏览,其中未注册用户浏览博客文章是不需要登录的,并且鉴于登录后浏览博客文章解释较为麻烦,因此该处介绍的是不需要登录直接进行博客文章浏览。首先用户向浏览器输入网址进入博客首页,而博客后端将从数据库中提取详细的数据,并向前端输送展示给用户。其中关于数据的提取使用的SpringDataJPA框架,通过dao层映射实体类获取相关的数据。而在前端显示的不仅仅有博客列表信息,还有博客种类和博客标签以及博客推荐列表等。因此在后端的数据提取仅截取博客列表为例。部分代码如下:在dao层的代码:publicinterfaceBlogRepositoryextendsJpaRepository<Blog,Long>,JpaSpecificationExecutor<Blog>{
@Query("selectbfromBlogbwhereb.recommend=true")
List<Blog>listRecommendBlog(Pageablepageable);
@Query("selectbfromBlogbwhereb.published=trueandb.titlelike?1orb.contentlike?1")
Page<Blog>findByQuery(Stringquery,Pageablepageable);
@Query("selectbfromBlogbwhereb.published=?1")
Page<Blog>findByQuery(Booleanpublished,Pageablepageable);
@Query("selectfunction('date_format',b.updateTime,'%Y')asyearfromBlogbgroupbyfunction('date_format',b.updateTime,'%Y')orderbyyeardesc")
List<String>findGroupYear();
@Query("selectbfromBlogbwherefunction('date_format',b.updateTime,'%Y')=?1orderbyb.updateTimedesc")
List<Blog>findByYear(Stringyear);
}其中实体类是Blog类,因为BlogRepository继承了JpaRepository,因此BlogRepository具有了简单操作数据库的能力,但对于较为复杂的处理还需要自己定义方法,由于博客文章较多,采取的是分页显示列表,又因为因为展示的博客是发布状态的,因此定义了上述findByQuery(Booleanpublished,Pageablepageable)的方法获取博客列表。在dao层获取了数据,在后台再将数据传到service层,代码如下:@Override
publicPage<Blog>listBlog(Booleanpublished,Pageablepageable){
returnblogRepository.findByQuery(published,pageable);
}其中blogRepository是通过@Autowired自动注入的。在Service层获取到数据后在将数据传送到controller层,controller层代码如下:@GetMapping("/")
publicStringindex(@PageableDefault(size=6,sort={"createTime"},direction=Sort.Direction.DESC)
Pageablepageable,Modelmodel){
BooleanisPublished=NonsenseUtil.ArticlePublish.PUBLISH.isPublished();
model.addAttribute("page",blogService.listBlog(isPublished,pageable));
//model.addAttribute("types",typeService.listTypeTop(6));
model.addAttribute("types",typeService.listTypeTopByPublished(6));
//model.addAttribute("tags",tagService.listTag(10));
model.addAttribute("tags",tagService.listTagTopByPublishedCount(10));
model.addAttribute("recommendBlogs",blogService.listRecommendBlog(8));
return"index";
}由上述代码可以知道controller层获取到了数据,其中blogService是通过@Autowired注入而来的。而@GetMapping(“/”)是访问url为“http;//主机地址:端口号/”时,运行该方法,并将数据传到前端index.html界面。此时前端获取到数据并将数据展示给用户浏览。在前端使用的是Thymeleaf摸板引擎,其中特定的语法能够将后端传入的数据在前端进行显示。当用户在前端看到数据后便可以通过点击跳转到相应的博客文章页面进行阅读浏览了。通过上面的信息能够获取后台的信息并在相对应的位置显示。由于单个列表的标签内带有“th:href=’@{/blog/{id}(id=${blog.id})}’”属性,因此当数据传入到前端后,相应的href属性便会出现博客文章对应的连接,因此在点击列表的一条时,便会跳转到相应的博客文章页面。代码如下:@GetMapping("/blog/{id}")
publicStringblog(@PathVariableLongid,Modelmodel){
model.addAttribute("comments",commentService.listComentByBlogId(id));
model.addAttribute("blog",blogService.getAndConvert(id));
return"blog";
}上述代码显示了在跳转到blog页面时会将原本博客的评论数据同样传到前端。同时也会将博客内容传到前端。而前端的blog.html页面会根据Thymeleaf摸板引擎的相关规则将数据显示到页面上。实现的界面如图5-1所示:图5-1文章浏览页面前台的主要功能前台浏览文章的功能模块如上所述。关于前台的其它主要功能,如注册和登录模块、文章搜索模块、用户评论模块都与前端文章浏览模块相同。采取的是前端发起请求,后端对请求数据进行处理,然后在dao层进行数据库的相关操作,最后将的到的数据返回到前端,前端通过摸板引擎的相关规则,将数据在特定的地方显示。这样前台的主要功能便完成了大部分。前台的其它功能由于个人博客系统最求个性化和易用性,前台的相关功能还需要一些其它技术点。例如在前端博客文章页面的回到顶部操作,评论的层级显示,以及生成文章目录并根据目录定位文章、如何将后端Markdown格式的文章转换为HTML格式的前端页面等问题。其中回到顶部、根据目录定位文章都属于在博客文章右下角的小工具,其前端代码如下:<divid="toolbar"class="m-paddedm-fixedm-right-bottom">
<divclass="uiverticaliconbuttons">
<buttonclass="uitealtocbutton"type="button">目录</button>
<ahref="#comment-container"class="uitealbutton">留言</a>
<buttonclass="uiwechaticonbutton"><iclass="qrcodeicon"></i></button>
<divid="toTop-button"class="uiiconbutton"><iclass="chevronupicon"></i></div>
</div>
</div>上述分别对应着右下角的一个小工具栏,仅在博客文章页面向下滑动后才能出现,这个工具栏总共具有4个工具,分别是显示文章目录,定位到文章评论部分,显示文章的二维码,扫描后可以用手机进行查看,还有回到顶部按钮。其中光有HTML标签是不能够实现功能,还有相关JavaScript代码负责进行与用户的交互,其中显示目录的JavaScript如下:tocbot.init({
tocSelector:'.js-toc',
contentSelector:'.js-toc-content',
headingSelector:'h1,h2,h3',
hasInnerContainers:true,
});$('.toc').popup({
popup:$('.toc-container.popup'),
on:'click',
position:'leftcenter'
});从上述代码可以看出使用了tocbot的前端插件,可以根据HTML的标签生成相应的目录,并且生成的目录显示在工具栏左边。关于文章回到顶部是使用了一下代码:$('#toTop-button').click(function(){
$(window).scrollTo(0,500);
});虽然定位到评论的位置的功能与回到顶部的功能都是定位文章的位置,但实现的方式却不同。回到文章顶部使用的scrollTo()函数,而定位到文章评论的位置却是锚点定位的方式。而生成二维码,并且能够用手机扫描从而在手机上查看博客的JavaScript代码如下:varservurl="87:8080";
varurl=/*[[@{/blog/{id}(id=${blog.id})}]]*/'';
varqrcode=newQRCode("qrcode",{
text:servurl+url,
width:110,
height:110,
colorDark:"#000000",
colorLight:"#ffffff",
correctLevel:QRCode.CorrectLevel.H
});其中关于文章回到顶部以及生成文章目录如图5-2所示:图5-2目录生成以及置定实现后台功能的实现后台的功能主要是博主所使用的功能,主要功能在于个人博客文章管理,博客文章分类管理,博客文章评论管理,博客文章标签管理,博客系统设置管理。因此在此主要以标签管理为例进行描述,除系统设置管理外其它大体相同。而博主的注册登录模块因为篇幅过多,并不过多描述。标签的添加在标签管理中主要具有的功能是个人博客文章标签的添加,个人博客文章标签的修改以及标签的删除。在代码编写中依然遵循MVC模式,是前端经过页面按钮或者链接等向后端发送特殊URL的请求,然后在Controller层进行请求匹配,然后在业务逻辑层相关处理,将数据传送到dao层,在dao层进行与数据库交互,然后将dao层将交互的结果返回到业务逻辑层,业务逻辑层在将结果返回到Controller层,然后Controller层将结果返回给前端用户。其中标签添加功能的Controller层代码如下:@PostMapping("/tags")
publicStringpost(@ValidTagtag,BindingResultresult,RedirectAttributesattributes){
//后端验证name不能为空
if(result.hasErrors()){
return"admin/tags-input";
}
//后端验证分类名不能重复
Tagtag1=tagService.getTagByName(tag.getName());
if(tag1!=null){
result.rejectValue("name","nameError","不能重复添加标签");
return"admin/tags-input";
}
Tagt=tagService.saveTag(tag);
if(t==null){
attributes.addFlashAttribute("message","操作失败!");
}
return"redirect:/admin/tags";
}其中注解@PostMapping("/tags")便是URL为“http://主机地址:端口号/tags”的路径匹配这个方法。如上述代码所示,其中BindingResult类主要在于验证,而RedirectAttributes主要作用是重定位的传参。tagService是通过主机注入而来,而其中tagService调用的方法便是在Service层定义的。saveTag()方法的实现代码如下:@Override
publicTagsaveTag(Tagtag){
returntagRepository.save(tag);
}其中tagRepository是通过注解注入进来的,而tagRepository调用的便是dao层的方法。其中关于标签添加的dao层代码如下:publicinterfaceTagRepositoryextendsJpaRepository<Tag,Long>{
TagfindByName(Stringname);
@Query("selecttfromTagt")
List<Tag>findTop(Pageablepageable);
}可见在TagRepository中并未定义save()方法,那是因为SpringDataJPA已经默认实现了,并不用再定义了。关于标签管理的实现如图5-3所示:图5-3标签管理功能博客设置的预先加载在博客系统设置管理的功能上,主要是博客系统设置在启动时的预先加载和博客系统设置修改功能。其中博客系统设置修改与前面的流程大体相同,这里主要描述博客设置的预先加载功能。博客设置的预先加载是在博客启动时,SpringBoot框架还未完全初始化完全时,从数据库中加载数据并初始化博客系统的相关设置。这里的难点在于SpringBoot框架还未启动完全,系统任务和dao层的Repository接口并不能同时使用。因此在此使用的时监听方式,通过实现ApplicationListener接口实现监听ApplicationStartedEvent事件类型,ApplicationStartedEvent事件是在系统启动完成后在用户请求发生前的事件,在这里执行,及不妨碍系统的启动,也不妨碍用户的使用。其中详细代码如下;@Component
publicclassBlogSettingInit/*implementsApplicationListener<ApplicationStartedEvent>*/{
@Autowired
privateBlogSettingServiceblogSettingService;
@EventListener
publicvoidinit(ApplicationReadyEventapplicationReadyEvent){
ServletContextservletContext=((WebApplicationContext)applicationReadyEvent.getApplicationContext()).getServletContext();
List<BlogSetting>blogSettings=blogSettingService.findBlogSetting();
if(blogSettings.isEmpty()||blogSettings==null){
BlogSettingblogSetting=newBlogSetting();
BlogSettingblogSetting1=blogSettingService.BlogSettingSaveOrUpdate(blogSetting);
blogSetting.setId(blogSetting1.getId());
servletContext.setAttribute("setting",blogSetting);
}else{
servletContext.setAttribute("setting",blogSettings.get(0));
}
}
}在上述代码中使用@EventListener注解与实现ApplicationListener是等价的,这里的处理在于SpingBoot源码层次实现的,这里不做深究。关于该段代码实现的类图如图5-4所示。图5-4BlogSettingInit类实现的相关类图这里ApplicationListener接口,ApplicationEvent接口,ApplicationReadyEvent类是SpringBoot提供的,而BlogSettingInit类、BlogSettingService接口和BlogSettingServiceImpl类是自己实现。由于这里展现的是类的关系图,因此不对类之中的属性和方法进行描述。第六章系统测试系统测试系统的测试对于软件系统是非常重要的一步,它为软件的功能性需求和非功能性需求提供了保证。也保证了软件开发时的标准化和软件系统数据的安全性,在软件系统开发和生产过程中确保软件系统具有足够的排除系统故障的能力和保护系统数据安全的能力。软件系统测试主要分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 香料精制工岗中基础能力考核试卷含答案
- 衬板工岗前设备考核试卷含答案
- 普通机床装调维修工标准化水平考核试卷含答案
- 时钟装配工成果考核试卷含答案
- 衬板工岗前学习型组织考核试卷含答案
- 砖瓦成型工岗位技术突破考核试卷含答案
- 2026年光伏电站运维AI系统安全审计工具
- 健康宣教剧场
- 冬季饮食健康建议
- 血液透析器全球市场总体规模
- 学校教师年度考核工作实施方案(2026新修订)
- 医疗护理员试题含答案
- 2026广西交投集团招聘第三季度招聘188人易考易错模拟试题(共500题)试卷后附参考答案
- 人工智能教学设计案例高中政治哲学
- 长江船舶经济航速的多维度探究与优化策略
- 沉井基础工程施工应急处理保证措施
- 货车驾驶员安全驾驶培训
- 食品行业停水、停电、停汽时应急预案
- 化工厂设备技术员工作总结报告
- 小儿喘息性支气管炎课件
- 文学类文本赵树理《套不住的手》阅读练习及答案
评论
0/150
提交评论