版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于SpringBoot的个人博客系统的设计与实现摘要:伴随着Internet的飞速发展,博客系统作为一种人们在互联网上分享自己生活,显现自我意识的方式,一经出现便在互联网上得到了广泛的认可,如今其规模也在不停扩大。随着Web2.0时代的到来,各种技术层出不穷,人们对编写以及阅读博客的需求也越来越旺盛,在这种形势下,人与人之间的交流也越来越多地在博客上实现。有人形象地说,博客是一本书,微博是一份报纸,那么个人博客则是一本个人出版的杂志。人们可以在自己的个人博客中发表自己对这个世界的看法,记录自己生活的点滴。本设计基于SpringBoot并配合MySQL数据库、组件化的前端框架和缓存中间件Redis、实时搜索与数据分析引擎ElasticSearch等当前互联网的热门技术旨在设计开发一个属于自己与朋友之间的个人博客。此博客系统基于RBAC模型构建权限管理模块实现了相对完整的后台管理,完成了对于个人博客对于不同用户权限分配的问题。关键词:博客;SpringBoot;Redis;Elasticsearch;RBAC模型目录目录TOC\o"1-3"\h\u15344目录 绪论本节简要阐述本设计的应用来源,结合现实需求及研究意义,分析设计的可行性和必要性。研究必要性伴随着Internet的飞速发展,博客系统作为一种人们在互联网上分享自己生活,显现自我意识的方式,一经出现便在互联网上得到了广泛的认可,如今其规模也在不停扩大。随着Web2.0时代的到来,各种技术层出不穷,人们对编写以及阅读博客的需求也越来越旺盛,在这种形势下,人与人之间的交流也越来越多地在博客上实现[]。1997年,JornBarger首次提出weblog,九年之后,EvanWilliams在2006年创立了Twitter,DavidKarp在2007年创建了介于Twitter和blogger之间的Tumblr。博客在国外星期的同时,2002年方兴东和合作者王俊秀最先将Blog翻译成“博客”。他还撰写了《中国博客宣言》,并成立了“博客中国”项目,此后博客在中国进入全面推广时期。博客首次被引入国内时,当年国内博客的数量不足1万个,2003年底则达到了20万,2004年底约200万个,到了2005年底则升至1600万个。2007年开始出现个人独立微博的踪影,2009年微博因新浪微博的上线开始在全国流行。2011年出现第一个轻博客——点点网,同一个时期各大网站纷纷推出了自己的轻博客,如网易的乐乎,新浪Qing等,轻博客开始受到关注[]。同时,博客作为web2.0中最为人所熟悉的标志,在其发展、运作过程中也潜藏着技术垄断、信息安全、侵权、不良信息过多等问题。互联网上的博客大多受制于其开发公司的所制定的用户规则,无法做到个人化,个性化。而对于该个人博客而言,用户掌握了博客的全部以及权限的分配。设计目的个人博客是一种表达自我思想、记录生活、分享知识的一种方式。如今的互联网上的博客种类百花齐放目且具有相当的规模,可以说它已经被人们所接受,博客影响着人们的交流方式和意识形态,改变着人们聚散的方式;它拥有着改变人们对于事物看法的能力,也影响着互联网的发展趋势,甚至在未来,可以波及或影响社会的民主决策。如今的互联网时代也给人们提供了很多认识和感知世界的方式,比如新浪微博,点击热搜就可以知道这一刻最新最精彩的新闻;微信,摇一摇去认识天南海北的朋友;抖音,你可以用一个镜头记录下感人或有趣的瞬间。个人博客作为介于微博和博客之间的网络社交模式,既继承了博客的表达基因,又注重基于内容和兴趣驱动,保留了用户之间的互动。,以高质量分享与交流为基石,进而形成互相分享、互相学习、互相探讨的良好社交氛围。不仅仅成为在校学生记录各人的所想所思、点点滴滴的非纸质型日志,也冲击着大学生传统的学习模式,为在校大学生的专业成长提供了新的方法和新的平台[]。“博客被大学生推上了书架”,大学生对博客的热情也激发了教师们将博客应用到日常教学中去。因此,以大学生为主体,集师生知识交流、资源共享、成长反思为一体的校园博客成为校园的新热点,为大学生提供了同伴交流、群体共生、记录反思、知识管理、平等对话等功能。设计意义博客可以帮助我们养成使用文字表达的良好习惯,个人博客作为比专业博客相对轻松,没有浓重的学术气息,比微博相对正式,让我们有机会以更多的话语分享生活;个人博客对于访客的范围更为明确,可能是志同道合的网友,可能是生活圈中的三五好友,也可能是工作上的同事...稍显小众的圈子,可以让我们可以尽情表达自己的思想,有助于深度交流和沟通。对于本人来说,借这次毕业设计的契机来完成个人博客的设计与实现,一方面可以将自己所学的知识加以运用,另一方面通过这次实践必将提升自身对Java语言、数据库、业务设计等专业的技术,积累相关的开发经验。它作为我独立开发并完成的第一件作品,肯定存在许许多多不足的地方,但对于这个个人博客的维护与功能添加并不会因为毕业设计的结束而终止。能够持续维护这个个人博客和为其添加新功能是我的期望。希望能够在其中感受到不断学习的乐趣和体会博客所精神带给我的意义。个人博客所用技术栈分析本章将阐述个人博客技术的设计与实现所用到的一些关键技术,包括基于Java的SpringMVC开发模式;Spring、SpringBoot、SpringSecurity框架;缓存中间件Redis和全文搜索引擎ElasticSearch,加快访问速度并实现文章信息的快速搜索和关键字的高亮显示;组件化的前端框架LayUI SpringMVCMVC的含义为Model(模型层)、View(视图层)、Controller(控制层)。MVC,是目前Java体系中应用最为广泛的架构模式,将应用程序划分为三个相互连接的部分,体现了高内聚、低耦合的设计理念。将信息的内部表示与向用户呈现和接收信息的方式分开。这种架构现在经常被用来设计网页、主机、手机和其他客户端。模型层管理系统数据和数据库之间的交互。视图层是数据的呈现方式,即页面、图表等;控制器控制模型和视图之间的转换,接收输入并将其转换为模型或视图。MVC的基本工作流程如图2.1所示:第一步:发起请求到前端控制器(DispatcherServlet)第二步:前端控制器请求HandlerMapping根据xml配置、注解查找Handler第三步:处理器映射器HandlerMapping向前端控制器返回Handler第四步:前端控制器调用处理器适配器去执行Handler第五步:处理器适配器去执行Handler第六步:Handler执行完成给适配器返回ModelAndView第七步:处理器适配器向前端控制器返回ModelAndView第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成视图 第九步:视图解析器向前端控制器返回View第十步:前端控制器进行视图渲染,视图渲染将模型数据填充到request域第十一步:前端控制器向用户响应结果图2.1MVC的执行流程Spring框架Spring框架是Java平台上的一个开源应用程序框架,它提供了一个容器,具有控制翻转特性。尽管Spring框架本身对编程模型没有任何限制,但它在Java应用程序中的频繁使用使其流行起来,因此它被用作EJB(EnterpriseJavaBeans)模型的补充,甚至是替代品。Spring框架提供了一系列开发解决方案,如利用控制反转的核心特征,通过依赖注入实现管理对象生命周期容器化,使用AOP编程实现声明性事务管理,集成各种持久化技术来管理数据访问,并为开发者提供大量优秀的Web框架。Spring框架具有控制反转(IOC)的特点。IOC旨在促进项目维护和测试,它通过Java提供了反射开发人员可以通过依赖项查找或依赖项注入来获取对象。Spring框架有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,可在运行时配置。AOP框架侧重于模块间交叉关注的模块化。Spring框架下的事务管理、远程访问等功能可以通过使用SpringAOP技术来实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够使用保存点,并且几乎可以在Java平台的任何环境中工作。Spring集成了各种事务模板。系统可以通过事务模板、XML或Java注释配置事务,事务框架集成了消息传递、缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅支持Java:JDBC、iBATS/MyBatis、Hibernate、JavaDataObject、ApacheOJB、ApacheCayne等所有流行的数据访问框架,还可以与Spring的事务管理一起使用,为数据访问提供灵活的抽象。最初,Spring框架的开发人员没有建立自己的WebMVC框架,而是在开发过程中决定现有StrutsWeb框架的表示层和请求处理层之间,以及请求处理层和模型之间没有足够的分离,并创建了SpringMVC。SpringBoot框架SpringBoot是一个新的开源轻量级框架,由Pivotal团队在2013年开发,并于2014年4月发布。它基于Spring4.0进行设计,既继承了Spring框架原有的优秀特性,又通过简化配置进一步简化了Spring应用程序的整个构建和开发过程。此外,SpringBoot集成了大量的框架,很好地解决了依赖包的版本冲突和引用的不稳定性。其设计目的是简化Spring应用程序的初始构建环境和开发过程,框架使用特定的方式进行配置,使开发人员不再需要繁琐的配置。通过这种方式,SpringBoot致力于成为蓬勃发展和快速的应用程序开发领域的领导者。SpringBoot应用系统开发模板的基本架构设计:前端经常使用模板引擎,主要包括FreeMarker和Thymeleaf,它们是用Java语言编写的,渲染模板并输出相应的文本,使得界面设计与应用逻辑分离。前端开发也使用了Bootstrap,AngularJS,JQuery等。浏览器的数据传输格式使用的是Json,而不是xml,同时提供RESTful接口。SpringMVC的设计模式有利于数据到达服务器后处理请求。数据访问层主要包括Hibernate、MyBatis、MyBatis-plus、JPA等持久性层框架;MySQL是常用的数据库;开发工具使用IDEA。SpringSecurity安全框架SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了SpringIoC(InversionofControl控制反转),DI(DependencyInjection依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。SpringSecurity拥有以下特性:1.对身份验证和授权的全面且可扩展的支持2.防御会话固定、点击劫持,跨站请求伪造等攻击3.支持ServletAPI集成4.支持与SpringWebMVC集成。RedisRedis(RemoteDictionaryServer)即远程字典服务,它是一款基于Key-Value的NoSQL,编写代码为C语言,且数据并非存储于磁盘中,而是基于内存存储数据,它的性能极高读写速度可分别达到110000次/s、81000次/s。支持丰富的数据类型和操作的原子性。项目的开源地址为:/redis/redis。ElasticSearchElasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、ApacheGroovy、Ruby和许多其他语言中都是可用的。LayUI框架LayUI是一套开源的WebUI解决方案,其内部采用的是自身经典的模块化规范,并遵循原生HTML/CSS/JS的开发方式,是低门槛开箱即用的前端UI解决方案。方案小结众本章阐述了个人博客系统在开发中所用到的技术包括开发使用的MVC设计模式以及搭建框架所用到的Spring、SpringBoot、SpringSecurity以及缓存中间件Redis和全文搜索引擎ElasticSearch,加快访问速度并实现文章信息的快速搜索和关键字的高亮显示和前端模块化的LayUI大大降低了前端页面的设计难度,可参照LayUI的代码文档实现拿来即用的快速开发。这几个技术加上负责持久化数据的MySQL数据库等其他系统相关技术会在后续的系统设计中说明。系统设计本章将分别阐述个人博客系统的需求分析、总体架构设计、模块功能设计,并根据功能进行具体设计,以及系的数据库设计。系统需求分析需求分析是系统开发中最初始也是最为重要的的阶段,需求分析阶段得到的结果是项目开发中设计阶段、编码阶段、测试阶段和维护阶段的重要基础。通过对系统的需求描述分析可以得出系统的基本功能模块,以及如何较为全面的去设计数据库和系统安全性需求。系统需求概述个人博客系统主要是用于人们表达自我和兴趣交流的一种平台,一方面可以发表自己的博文,记录自己的生活;一方面可以通过阅读他人作者所编写的博客文章找到与自己志同道合的伙伴,如学习、健身、工作等等,进而形成自己的“小天地”,进一步的可以促进一起组织线下活动。系统前台展示的功能应至少具备用户注册、用户登录等基本功能,同时不管作为已注册或者未注册的用户,均应拥有浏览博客文章和搜索其内容的功能,作为已注册的用户,可以登录系统,同时具备修改个人信息功能,并且作者在后台登录时对于自己的博文应具备发布、修改和删除等功能,同时为加强用户之间的互动,应对博文加上评论和点赞等互动型功能。系统管理人员,作为后台管理人员,对系统的管理具有最高权限,对所有界面上体现出来的功能都具有操作的权限,同样包括一般作者、审核人员所不具备的功能,比如直接对用户账号具有修改和注销的权限,同时可以对一些违反网络规范的博文等信息进行屏蔽和删除的权限等,以及对系统的日志信息进行管理。系统功能分析从需求描述中可知个人博客系统的主要功能分为前台的访问首页、浏览博文、搜索博文、注册登录、查看博文的标签及分类等以及后台对应的有用户管理、角色管理、访客管理、日志管理、文章管理、标签/分类管理、评论管理等功能。以下通过大致功能描述来说明该个人博客系统的功能。-首页:访客可以查看文章。-文章详情页:访客可以查看文章的详细内容,可以对文章进行点赞、分享和评论。-标签展示页:访客可以查看博主的文章标签。-访客注册登录功能:访客评论文章时需要登录。-ElasticSearch全局搜索功能:通过关键字、词进行分词搜索可智能匹配文章标题、内容等响应结果。-登录功能:用户进入后台时要登录,需要输入用户名、密码和验证码。-用户管理:用户可以查看系统的用户信息。-角色管理:用户可以查看系统的角色信息。-访客管理:用户可以查看系统的访客信息。-日志管理:用户可以查看系统的日志信息。-文章管理:用户可以查看系统的文章信息,可以发布新的文章、修改文章信息和发布状态、审核文章、删除文章。-分类/标签管理:用户可以查看系统的分类/标签信息,。-评论管理:用户可以查看系统的评论信息可以回复评论、删除评论。系统安全需求个人博客系统对于系统安全主要做到以下几点:保证数据库事务的原子性。对于传到后台的参数进行过滤判断。遵循RABC权限策略来管理不同用户。实现对存放与数据库的用户、访客密码进行不可逆加密。系统总体设计个人博客系统的体系结构将采用B/S架构。B/S(Browser/Server)架构也被称为浏览器/服务器体系结构,这种体系结构可以理解为是对C/S体系结构的改变和促进。由于网络的快速发展,B/S结构的功能越来越强大。这种结构可以进行信息分布式处理,可以有效降低资源成本,提高设计的系统性能。B/S架构是有更广的应用范围,在处理模式上大大简化了客户端,用户只需安装浏览器即可,而将应用逻辑集中在服务器和中间件上,可以提高数据处理性能。在软件的通用性上,B/S架构的客户端具有更好的通用性,对应用环境的依赖性较小,同时因为客户端使用浏览器,在开发维护上更加便利,可以减少系统开发和维护的成本。从系统架构上来看,项目可以被分为IE/Chrome浏览器层、TomcatWeb服务器层和MySQL数据库服务器、Redis层,如图3.1所示。IE/Chrome浏览器层是架构中直接与用户有交互行为的一层,用户通过客户端浏览器IE/Chrome来访问和操作系统;系统借助Thymeleaf模板引擎以及LayUI、Materialize等设计界面显示和部分互动。TomcatWeb服务器层为整个架构中的核心层,将Tomcat集成于Web容器中,为浏览器层提供服务实现;借助表示层(UI).业务逻辑层(BLL)、数据访问层(DAL)设计和部署功能业务,其中包括用户信息管理、博文管理、标签管理、互动管理和系统管理。MySQL数据库服务器层是架构中的最底层,也是很重要的一层,因为当今时代正是一个数据"无价”的时代,这一层主要集成了MySQL数据库的相关服务,为TomcatWeb服务器层提供数据存储和数据查询等服务。缓存中间件Redis则是用户第一次使用个人博客时,将从MySQL数据库服务器中查询到的数据放入到Redis的高速缓存中,数据一次加载过后只要Redis中有数据便不通过数据库查询,直接Redis中获取所需数据并返回。图3.1系统架构图系统功能模块设计个人博客系统主要分为系统前端模块与后台管理模块。下面将会对这两个模块的具体功能进行说明。系统前台系统前台模块主要是对访客的个人博客页面的展示其页面效果来自于LayUI、Materialize,主要包括首页、文章详情、分类、标签、归档、关于、搜索模块,功能结构如图3.2.1-1所示。图STYLEREF2\s3.2SEQ图\*ARABIC\s21系统前台功能结构图-首页:访客可以查看博客文章的概述,包括置顶文章和推荐文章。-文章详细页面:访客可以查看文章的详细内容,其中有目录,高亮代码和语言显示,并可以点击复制。可以对文章内容点赞、分享和评论文章。-分类显示页面:访客可以查看博客的文章分类和文章分类的雷达统计,并根据文章分类查看文章。-标签显示页面:访客可以查看博客的文章标签和文章标签生成的标签云统计图,并根据文章标签查看文章。-存档显示页面:访客可以查看博客的文章发布时间热图,并根据时间轴查看文章。-关于我的展示页面:访客可以查看博客的个人信息、联系方式、文章统计信息、博客技能展示、相册等。-访客注册和登录功能:访客评论文章时需要登录。-ElasticSearch全局搜索功能:通过关键字、词进行分词搜索可智能匹配文章标题、内容等响应结果。创建索引流程图:如图3.2.1-1。图3.2.1-1创建索引流程图后台管理模块系统前台模块主要是对访客的个人博客页面的展示其页面效果来自于LayUImini的后端管理框架如图3.2.2-1所示。图3.2.2-1后台管理框架模板主要包括管理员登录、用户管理、角色管理、菜单管理、访客管理、公告管理、日志管理、文章管理、分类/标签管理、评论/留言管理、相册管理,功能结构如图3.2.2-2所示。图3.2.2-2后台管理结构功能图-登录功能:用户进入后台时要登录,需要输入用户名、密码和验证码,可以选择记住密码。-用户管理:用户可以查看系统的用户信息,并可以输入用户名等信息进行搜索,可以添加新的用户、修改用户信息和用户状态、删除用户。-角色管理:用户可以查看系统的角色信息,并可以输入角色名等信息进行搜索,可以添加新的角色、修改角色信息和角色状态、删除角色。-菜单管理:用户可以查看系统的菜单信息,可以添加新的菜单、修改菜单信息、删除菜单。-访客管理:用户可以查看系统的访客信息,并可以输入用户名等信息进行搜索、可以修改访客状态、删除访客。-日志管理:用户可以查看系统的访问、操作的日志信息,根据特定列进行排序,并可以输入日期范围等信息进行搜索,可以删除访问日志。-文章管理:用户可以查看系统的文章信息,根据特定列进行排序,并可以输入文章标题等信息进行搜索,可以发布新的文章、修改文章信息和发布状态、审核文章、删除文章。-分类管理:用户可以查看系统的分类信息,根据特定列进行排序,并可以输入分类名称等信息进行搜索,可以添加新的分类、修改分类信息、删除分类。-标签管理:用户可以查看系统的标签信息,根据特定列进行排序,并可以输入标签名称等信息进行搜索,可以添加新的标签、修改标签信息、删除标签。-评论管理:用户可以查看系统的评论信息,根据特定列进行排序,并可以输入日期范围等信息进行搜索,可以审核评论、回复评论、删除评论。-相册管理:用户可以查看系统的照片信息,根据特定列进行排序,并可以输入日期范围等信息进行搜索,可以添加新的照片、修改照片信息、删除照片。以下仅介登录模块的流程图,如图3.2.2-3:。图3.2.2-3后台管理结构功能图系统数据库设计数据库设计总体来说,包含以下几个阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段。需求分析即根据模块功能进行数据库表的设计这已在在3.1和3.2节说明,概念设计阶段会根据需求分析得到的结果得出独立于系统的概念模型,逻辑设计阶段是将概念模型转换成特定数据库的数据模型结构,最后物理设计阶段则是根据具体数据库语言设计存储结构,建立所相对应的数据库表。数据库表结构说明1.博文表:表3.1博文表字段名类型长度非空主键注释idbigint20√√IDtitlevarchar255标题summaryvarchar255摘要contentmediumtext0html内容text_contentmediumtext0markdown内容covervarchar255封面typetinyint2类型[1:原创,2:转载,3:翻译]viewsint11浏览量likesint11点赞量commentsint11评论量appreciablebit1开启赞赏commentablebit1开启评论topbit1开启置顶recommendbit1开启推荐publishedbit1是否发布sorttinyint2排序评分author_idbigint20作者IDcategory_idbigint20分类IDstatustinyint2审核状态[0:未过,1:等待审核,2:通过]create_timedatetime创建时间update_timedatetime更新时间2.标签表:字段名类型长度非空主键注释idbigint20√√IDnamevarchar255名称colorvarchar10颜色create_timedatetime创建时间update_timedatetime更新时间表3.2标签表3.分类表:字段名类型长度非空主键注释idbigint20√√IDnamevarchar255名称displaybit1是否前台显示colorvarchar10颜色create_timedatetime创建时间update_timedatetime更新时间表3.3分类表4.评论表:字段名类型长度非空主键注释idbigint20√√IDpidbigint20父级评论IDarticle_idbigint20文章IDvisitor_idbigint20访客IDuser_idbigint20用户IDcontenttext0内容statustinyint2审核状态[0:未过,1:等待审核,2:通过]create_timedatetime创建时间browservarchar255浏览器osvarchar255系统addressvarchar255IP来源request_ipvarchar255请求IPparent_nicknamevarchar255父级评论昵称表3.4评论表图片表:表3.5图片表字段名类型长度非空主键注释idbigint20√√IDurlvarchar255地址descriptionvarchar255描述sortsmallint4排序值displaybit1是否前台显示create_timedatetime创建时间update_timedatetime更新时间访客表:表3.6访客表 字段名类型长度非空主键注释idbigint20√√IDusernamevarchar255用户名passwordvarchar255密码nicknamevarchar255昵称avatarvarchar255头像emailvarchar255邮箱linkvarchar255网址statustinyint2启用状态[0:停用,1:启用]create_timedatetime创建时间update_timedatetime更新时间菜单表:表3.7菜单表字段名类型长度非空主键注释idbigint20√√IDtitlevarchar255标题hrefvarchar255链接pidbigint20父级菜单IDiconvarchar255图标authorityvarchar255权限标识符sortsmallint4排序值typetinyint2类型[1:目录,2:菜单,3:按钮]statusbit1是否显示remarkvarchar255备注访问/操作日志表(其表结构一致,表名称不同):表3.8访问/操作日志表字段名类型长度非空主键注释idbigint20√√IDcreate_timedatetime创建时间descriptionvarchar255描述exception_detailtext异常详情log_typevarchar255日志类型[info,error...]methodvarchar255执行方法名称paramstext0参数名称request_ipvarchar255请求IPtimebigint20请求耗时usernamevarchar255用户名browservarchar255浏览器addressvarchar255IP来源statustinyint4请求结果[0:失败,1:成功]角色表:表3.9角色表字段名类型长度非空主键注释idbigint20√√IDrole_namevarchar255名称descriptionvarchar255描述ranksmallint4级别colorvarchar10颜色statustinyint2启用状态[0:停用,1:启用]create_timedatetime0创建时间update_timedatetime0更新时间用户表:表3.10用户表字段名类型长度非空主键注释idbigint20√√IDusernamevarchar255用户名passwordvarchar255密码nicknamevarchar255昵称avatarvarchar255头像emailvarchar255邮箱sexbit1性别[0:女,1:男]phonevarchar255手机号码statustinyint2启用状态[0:停用,1:启用]create_timedatetime0创建时间update_timedatetime0更新时间角色-用户关联表:表3.11角色-用户关联表字段名类型长度非空主键注释role_idbigint20√角色IDuser_idbigint20√用户ID角色-菜单关联表:表3.11角色-菜单关联表字段名类型长度非空主键注释role_idbigint20√角色IDMenu_idbigint20√菜单ID系统安全设计根据系统安全需求分析,系统做了总体的安全设计:(1)系统采用MVC设计结构,从而能保证每一层仅能与当前层或与上一层进行直接交互,意味着在三层结构中表示层不能直接操作数据访问层,即无法直接通过修改用户提交表单来操作数据库数据;(2)通过SpringSecurity标签配置和@PreAuthorize权限注解实现前后端的操作权限一致,在后端对提交的数据进行检查,以及其他业务逻辑检查,如用户身份的验证等;(3)系统为用户密码加密,将采用随机盐+SHA-256+密钥对密码进行加密,此过程是不可逆的过程,所以原始信息无法根据加密后得到的结果被推导出来,从而保障了密码的安全传输;(4)系统严格控制用户访问资源,通过在访问资源之前进行用户身份和操作权限对比等相关验证操作来防止用户直接通过修改提交表单以绕过权限检查,直接进行越权操作。权限系统设计该博客系统对于后台权限的管理采用了RBAC模型,RBAC是基于角色的访问控制(Role-BasedAccessControl)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户。模型图如3.6-1所示。图3.6-1RBAC模型图在数据库表的设计中,用户表、菜单表、角色表、角色-用户关联表、角色-菜单关联表这5张表的关系很好的反映了这个模型的构建。其对应数据库关系图如3.5-2所示。图3.6-2RABC数据库关系图本章小结本章设计了系统的整体功能结构;对系统的功能模块进行了详细设计,包括对系统的功能进行说明,绘制功能结构图以及系统流程图等;最后分别对系统的数据库和安全性进行了设计,设计了基于MySQL数据库的Blog数据库;通过系统的结构设计、用户密码加密、系统权限管理等操作保证了该博客系统的安全性。系统实现与测试本章将对个人博客系统的实现和测试过程进行详细介绍。本章将从系统实现的开发环境、个人博客系统的部分功能具体实现、系统的安全实现、博客的部分功能界面以以及功能的测试等方面进行具体介绍。系统开发环境系统的开发实现环境包括以下几个方面:(1)采用Inter(R)Core(TM)i7-6700hq的CPU、2.6GHz的主频以及16G内存、1TB硬盘的硬件环境;(2)采用Java面向对象编程语言作为开发语言;(3)采用IDEA2020.3.3作为开发平台,配置JDK1.8保证Java运行环境,配置Tomcat9.0.8作为Web服务器,选择Maven的项目结构方便进行项目构建,依赖管理以及仓库管理等工作;采用Linux的Cent7OS系统做为服务器,搭建工具为VMware15.5Pro,在其中构建MySQL数据库、Redis中间件、ElasticSearch分词搜索引擎和对ElasticSearch可视化应用程序Kibana。。(4)采用MySQL5.7.4作为数据库存储数据,并采用NavicatPremium15.0.11作为管理数据库,并通过界面来操作数据库的工具,以达到改善工作流程并提高工作效率的目的;(5)ElasticSearch6.8.7作为分词搜索工具,配合其数据可视化工具kibana6.8.7完成对存储数据的操作;(6)采用Redis5.0.7作为缓存中间件,提高页面的加载速度,优化用户体验;(7)采用ProcessOn绘制体统的各类分析图,如流程图,结构图。(8)采用SpringBoot2.2.6+Mybatis-plus3.3.1(包含了Mybatis)的系统框架进行开发,在pom文件中引入相关依赖包;(9)采用操作系统Windows10以及浏览器IE7/8、Chrome、MicrosoftEdge等。系统功能模块实现从3.2系统功能模块设计的小节中可以得到个人博客系统分为前台展示和后台管理模块,两个大模块下还有不同的功能模块,本小节将先就系统的文件结构进行说明,后针对模块中的重要功能介绍其功能实现。其部分实现代码见附录。系统文件结构说明系统的文件结构大致包含以下几个包:config包:用于放置系统以及系统相关组件的配置类。security包:用于放置系统安全配置类aspect包:用于放置切面类。common包:用于放置以统一格式返回结果到前台的类。exception包:用于放置异常类。model包:用于放置与数据库中的表相映射的实体类对象。vo包:用于放置在商业逻辑层和表示层传递数据的类controller包:用于放置XXController类,负责前端与后台的交互。service包:用于放置XXService接口和它对应的XXServiceImpl实现类,负责业务逻辑。dao包:用于放置XXMapper接口,负责于数据库交互。博客系统采用thymeleaf模板渲染作为view部分,采用thymeleaf作为模板语言.用来接收后台响应的模板数据。view到controller的连接需要在pom文件中引入相关依赖,在配置文件中添加相关配置,在模板中加入标签库,编辑模板视图。博客系统使用了大量注解来进行敏捷式开发,为controller类采用@Controller注解,为service类采用@Service注解.为dao类采用@Mapper注解。在.controller层还采用@RequestMapping等相关注解定义请求路径和参数等数据,采用@RequestBody或@ResponseBody将数据以固定格式〈json格式)的获取或返回,采用@PreAuthorize等限制访问接口的用户权限。在service层还可以采用@Transactional进行事务管理。在dao层也可采用@Select、@Insert、@Update或Delete等注解直接在对应接口上定义sql语句,但本系统采用mybatisplus配合mapper.xml的形式定义数据库操作。对于mybatis数据持久层框架和MySQL数据库﹐采用sql语句的形式定义数据库中数据的CRUD操作。配置方面需在pom中引入相关依赖,需进行数据源配置以及mybatis的基本配置,统一采用dao对应的mapper.xml来编写SQL语句,并进行相关mapperScanner和mapping的配置来实现dao和mapper.xml对应关系。对于日志一类具有“横向”特性的功能,则利用spring的AOP(面向切面编程的特性)的注解@Aspect、@Pointcut等定义相关日志操作。前台展示模块前台展示模块主要涉及到的功能有首页展示、博文查看、查看分类、查看标签、查看归档、查看关于我以及全局搜索功能。以下介绍首页展示、标签页查看、全局搜索功能。首页展示首页展示的controller代码存在于HomeController中的home方法,无入参;articles方法,入参为Integer类型的current和size,即分页所需的页数和每页条数。home方法主要去数据库查询置顶的文章(包含图片)列表、标记为推荐的文章列表和设置文章分页;articles方法是去数据库查询所有的文章并根据入参进行分页。通过统一出参ResponseEntity这个类返回到前台。首页部分展示如图4.2.2-1所示。图4.2.2-1首页展示图标签页查看标签页查看的controller代码存在于TagsController。有tags(查询标签页),无入参、tagArticles(查询对应标签文章),有对应Long类型的tagId、Integer类型的current和size3个入参,两个方法。tags方法是去数据库标签表查询所有的标签。tagArticles方法是根据入参去数据库查找所有符合这个tagId的所有文章根据入参进行分页。通过统一出参ResponseEntity这个类返回到前台。标签页展示如图4.2.2-2所示。图4.2.2-2标签页展示图全局搜索功能全局搜索所用到的技术为ElasticSearch。是目前运用广泛的分词搜索引擎之一。实现使用Java代码完成ElasticSearch配置并进行搜索的主要步骤为:创建索引:通过注入依赖ElasticSearch中的ElasticsearchOperationscreateIndex类来使用createIndex(Class<T>aClass)接口创建索引,会根据Item类的@Document注解信息来创建,该方法中使用的item类是ArticleDocument.class。配置映射:通过注入依赖ElasticSearch中的ElasticsearchOperationscreateIndex类来使用putMapping(Class<T>aClass)接口配置映射会根据Item类中的id、Field等字段来自动完成映射,该方法中使用的item类是ArticleDocument.class。此外需要在ArticleDocument.class中对需要分词的字段使用@Field注解进行标识,选择的分析类型为ik_max_word,本次标识的数据为文章标题、概述、内容。保存数据到ElasticSearch:首先通过查询数据库将所有文章查询出后放到集合中,根据引索映射字段重新set赋值后创建索引:通过注入依赖ElasticSearch中的ElasticsearchOperationscreateIndex类来使用saveAll(Iterable<S>iterable)来将数据上传到ElasticSearch。完成以上的三步就可以将数据库的文章存储到ElasticSearch中,接下来就是如何调用方法完成分词搜索与实现关键词高亮:调用的方法存在于HomeController中的search方法入参为String类型的keyword,随后调用service层,service层调用utils包中ElasticSearchUtil的listByKeyword方法来实现匹配查询、高亮、执行搜索、解析结果、解析高亮字段等。实现代码见附录。本系统使用的ElasticSearch、可视化工具kibana版本图、搜索实现展示如下图4.2.2-1、4.2.2-2所示。图4.2.2-1ElasticSearch版本图图4.2.2-2分词搜索结果图后台管理模块后台管理模块主要涉及到的功能有后台系统管理、博客管理。后台系统管理中又划分为用户、角色、菜单、访客管理;访问、操作日志。以下介绍用户管理的新增用户;访问日志查看实现以及文章管理。用户管理-新增用户代码存在于controller.admin.UserController文件,实现该功能主要涉及到的对象有User、UserController及save方法主要流程为前端点击添加用户后跳出填写新用户个人信息的弹窗,填写完用户名、昵称、性别、手机、邮箱、状态、角色并按下保存按钮后通过Post请求找到对应的save方法,使用含有表单对应字段的User实体类对象接收表单数据作为入参,而后调用service层、dao层完成新用户在数据库的插入。添加用户界面如图4.2.3-1。图4.2.3-1用户添加界面图访问日志访问日志的实现是基于Spring的核心之一SpringAOP(AspectOrientedProgramming)面向切面编程技术,博客系统通过自定义注解并配置切面,定义切入点(Pointcut)方法,并采用环绕通知配合数据库插入来实现。而环绕通知的实现是引入了org.aspectj.lang.ProceedingJoinPoint这个类,他的父类是JoinPoint,JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪和记录应用信息。其中切点通过选取joinpoint来收集这些point的上下文信息,切点通常包含了一系列的JointPoint,我们可以通过切点来同时操作jointpoint。单从概念上,可以把切点当做jointpoint的集合。Proceedingjoinpoint继承了JoinPoint。是在JoinPoint的基础上暴露出proceed这个方法。而proceed方法就是用于启动目标方法执行的。所以环绕通知的结构相当于:[前置+目标方法执行+后置通知(目标方法通过暴露的joinPceed()方法执行)]配置完切点后,切面就可以较快的完成,通过比较每个访问方法前后的系统时间,即可或取到该请求耗时;通过请求中的session获取username;通过StringUtils工具类来实现获取ip、浏览器等信息;通过joinPoint获取方法路径、方法名等等属性。最后在每次AOP结束前将该次的日志信息插入数据库即可。日志展示界面如图4.2.3-2。图4.2.3-2访问日志图文章管理文章管理模块具有查找(listTableByPage方法)、审核(audit方法)、新增(save方法)、更新(update方法)、删除(remove方法)等功能。下面以新增(save方法)为例。实现该功能主要涉及到的对象有Article、ArticleController及save方法主要流程为前端点击文章发布菜单后跳出博文编辑窗口,编辑窗口内嵌了Markdowm编辑器且支持实时预览,文章支持放置图片(封面图)URL,可以设置分类、标签等属性。按下保存按钮后通过Post请求找到对应的save方法,使用含有表单对应字段的User实体类对象接收表单数据作为入参,而后调用service层、dao层完成新用户在数据库的插入。博文编辑界面如图4.2.3-3。图4.2.3-3博文编辑界面系统安全实现首先,用户的密码加密引用了SpringSecurity安全框架中的BCryptPasswordEncoder类,该类实现了PasswordEncoder接口。其中Bcrypt是一种单向Hash加密算法,由NielsProvos以及DavidMazières根据Blowfish加密算法所设计的密码散列函数,于1999年在USENIX中展示。实现中Bcrypt会使用一个加盐的流程以防御彩虹表攻击,同时Bcrypt还是适应性函数,它可以借由增加迭代之次数来抵御日益增进的计算机运算能力透过暴力法破解。BCryptPasswordEncoder方法方法采用随机盐+SHA-256+密钥对密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。图4.3.1-2为BCryptPasswordEncoder的部分源码。加密方法(encode):注册用户时,使用随机盐+SHA-256+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。加密后的秘文格式如下图4.3.1-1所示:图4.3.1-1密文格式图(2)密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同,说明用户输入的密码正确。图4.3.1-2BCryptPasswordEncoder源码其次在权限安全在后端代码的实现上,引用了SpringSecurity安全框架中的UserDetailsService接口中的UserDetails接口。其UserDetails默认提供了以下属性:1.用户的权限集,默认需要添加ROLE_前缀2.用户的加密后的密码,不加密会使用{noop}前缀3.应用内唯一的用户名4.账户是否过期5.账户是否锁定6.凭证是否过期7.用户是否可用在数据库将菜单、角色对应权限、管理员对应角色(默认所有权限)配置好后,前台登录请求会先经过SpringSecurity安全框架,这时调用方法去数据库查找改用户对应的权限集合等用户数据,保存到SpringSecurity上下文环境中,提供用户在自己角色权限下的操作。从用户登录到完成认证的流程图如下图3.4.2-3所示:图3.4.2-3SpringSecurity用户认证流程图其中在后台如何判断该用户是否具有权限去调用一个方法是采用了SpringSecurity安全框架中的@PreAuthorize注解,该注解的注释如下图3.4.2-4:图3.4.2-3@PreAuthorize注解源码通过注解后跟随的权限参数去找到SpringSecurity上下文环境里UserDetails中的权限集合判断该用户是否具有调用方法的权限。系统测试系统测试主要通过大量的测试用例对系统的功能点进行逐个检测,大致通过三个方面去检测系统是否达到预期的要求:检测该实现的功能是否及时执行,该提示的错误信息是否正常显示,该应对的安全防御是否正确执行。功能测试功能测试的反馈结果应当包含三个方面:有效输入的正常反馈;无效输入的异常反馈;错误输入的提示反馈。正常反馈的测试用例的部分用例如表4.4.1-1所示。表4.4.1-1正常反馈测试用例表序号测试内容操作输入结果001用户登录通过浏览器输入系统服务器地址访问后台主页正确输入用名,密码,验证码1.跳转到登录界面2.提示“登陆成功”3.跳转到后台主页002发布博客登录完成后点击博客管理-文章发布1.正确填写博文信息2.点击发布1.进入博文编辑2.提示发布成功3.跳转到文章管理003审核博客登录完成后点击博客管理-文章管理点击审核按钮并通过审核显示审核成功004修改博客登录完成后点击博客管理-文章管理1.点击编辑按钮2.编辑完成后点击保存草稿1.进入博文编辑,含有原文2.提示保存成功3.状态变为草稿005删除博客登录完成后点击博客管理-文章管理点击删除按钮并确认删除提示删除成功006博客评论进入详情页进行评论点击评论1.提示访客登录,无账号可注册2.登录完成后进行评论表4.4.1-1正常反馈测试用例表异常反馈的测试用例的部分用例如表4.4.1-2所示。表4.4.1-2异常反馈测试用例表序号测试内容操作输入结果001异常新增用户输入含有特殊符号的昵称!@#¥%……&提示用户名不能有特殊字符输入过长的昵称1231...1213提示昵称长度为3-16位输入已存在的用户名admin提示该用户名已存在输入不正确的手机号123提示请输入正确的手机号输入格式不正确的邮箱asdf@提示邮箱格式不正确002异常用户登录输入错误的用户名/密码提示用户名/密码错误用户名/密码为空提示用户名/密码不能为空验证码为空或输错提示必填项不能为空/验证码输入错误003异常发布博客不输入标题提示文章标题不能为空输入过长的标题1234...1234提示文章标题不能超过100个字符不输入博文内容提示文章内容不能为空系统安全的测试用例的部分用例如表4.4.1-3所示。表4.4.1-3系统安全反馈测试用例表序号测试内容操作输入结果001权限未登录,直接通过url访问新增用户界面http://localhost:8889/admin#//admin/page/user/user-list跳转到登录界面002小权限登录,url进入权限之外的页面http://localhost:8889/admin#//admin/page/user/user-list提示接口调用异常003注入在编辑博文页面输入onclick="alert("test");returnfalse;作为字符串存储结论系统根据测试用例进行了为期3天的测试,基本测试均已通过,少数用例出现了问题,如保存博客为草稿后状态依然为已发布,少数页面的方法路径可直接通过url访问等。根据测试结果经过了相应修正后,解决了大部分问题,能够保证系统的基本运行。本章小结本章阐述了个人博客系统的功能实现与系统测试,简单介绍了系统的开发环境,开发时用到的工具、组件等;然后展示了系统代码结构层次,系统函数的调用情况,以文字的方式代替源码,较为清晰的揭示了如何实现各个各个模块的一些功能,并展示了部分功能显示界面;接着,为了实现系统的安全性,采用SpringSecurity的安全框架,介绍了SpringSecurity对于密码的加密与权限管理最后根据系统功能、安全性制定相应的测试用例,并对系统进行了测试。总结与展望总结围绕主题―—基于SpringBoot的个人博客系统的设计与实现,进行了三大核心问题的学习与研究:“是什么”,“为什么”,以及“怎么做”。这三个问题贯穿始终:从整体来说,论文的大体结构则是系统的核心内容是什么,为什么要设计这样的系统,以及系统应该怎么做;从部分来说,从某一个点来说,以SpringSecurity技术为例:SpringSecurity是什么,为什么要用SpringSecurity,怎么通过SpringSecurity来达到最终目的?本文在绪论章节中通过对个人博客系统的研究背景与意义的阐述,国内外研究情况等大致回答了系统是什么,为什么要设计此系统问题以及他出现的背景和带来的象征意义;在关键技术研究章节中通过介绍技术的发展与运用回答了系统将使用的技术是什么,为什么采用这种技术去实现问题;而系统功能设计以及系统实现和测试章节重点描述了校园轻博客系统的“怎么做”过程,也是系统开发过程的几大重要步骤:对系统的功能进行规划,通过需求分析,规划系统的整体结构、数据库、以及安全性。对系统的体系结构,以及功能结构进行设计,得到系统的两大模块:前端展示与后端管理,大模块之下各自含有自己的功能模块。借助工具ProcessOn绘制功能结构图,进一步清晰系统功能;并且通过对系统的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026新疆吐鲁番市高昌区林业和草原局招聘第二批国家级公益林管护人员2人考试备考试题及答案详解
- 2026江西明月山旅游集团有限公司招聘9人笔试备考试题及答案详解
- 2026广西桂林市叠彩区招聘劳务派遣人员3人笔试参考题库及答案详解
- 2026年成都市成华区网格员招聘考试备考试题及答案详解
- 2026年广西壮族自治区贺州市社区工作者招聘笔试备考试题及答案详解
- 社交网络谣言传播控制课程设计
- 2026年上海高考语文真题(1月)(教师版)
- 应急和安全知识竞赛题库及答案
- 九年级英语上册主谓一致课|单复数统一
- 《英语说明文写作|定义分类与过程描述》
- 2026年上海市中考数学试题【含答案解析】
- 2025国家电力投资集团有限公司产业审计中心主任选聘2人笔试历年常考点试题专练附带答案详解
- 2026年高考(江西卷)政治试题及答案
- 2026年国开电大机械CAD-CAM形考试卷含完整答案详解【夺冠系列】
- 母婴护理员月嫂培训完整版课件
- 企业伦理与社会责任实践案例
- 中建群塔作业施工方案群塔安全方案
- GB/T 9768-2008轮胎使用与保养规程
- GB/T 17573-1998半导体器件分立器件和集成电路第1部分:总则
- GB/T 17431.2-2010轻集料及其试验方法第2部分:轻集料试验方法
- GB/T 13389-2014掺硼掺磷掺砷硅单晶电阻率与掺杂剂浓度换算规程
评论
0/150
提交评论