基于Java+SpringMvc+Vue技术的在线学习交流平台的设计与实现---60页论文参考

 博主介绍:硕士研究生,专注于Java技术领域开发与管理,以及毕业项目实战✌

       从事基于java BS架构、CS架构、c/c++ 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。

       先后担任过技术总监、部门经理、项目经理、开发组长、java高级工程师及c++工程师等职位,在工业互联网、国家标识解析体系、物联网、分布式集群架构、大数据通道处理、接口开发、远程教育、办公OA、财务软件(工资、记账、决策、分析、报表统计等方面)、企业内部管理软件(ERP、CRM等)、arggis地图等信息化建设领域有较丰富的实战工作经验;拥有BS分布式架构集群、数据库负载集群架构、大数据存储集群架构,以及高并发分布式集群架构的设计、开发和部署实战经验;拥有大并发访问、大数据存储、即时消息等瓶颈解决方案和实战经验。

       拥有产品研发和发明专利申请相关工作经验,完成发明专利构思、设计、编写、申请等工作,并获得发明专利1枚。

      大家在毕设选题、项目升级、论文写作,就业毕业等相关问题都可以给我留言咨询,非常乐意帮助更多的人或加w 908925859。

相关博客地址:

csdn专业技术博客:https://blog.csdn.net/mr_lili_1986?type=blog

Iteye博客:        https://www.iteye.com/blog/user/mr-lili-1986-163-com
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/mr_lili_111/article/details/139928121

基于Java+SpringMvc+Vue技术的在线学习交流平台设计与实现

目录

第一章 绪论

1.1 研究背景

1.2 研究现状

1.3 研究内容

第二章 相关技术介绍

2.1  Java语言

2.2 HTML网页技术

2.3 MySQL数据库

2.4 Springboot 框架介绍

2.5 VueJS介绍

2.6 ElementUI介绍

第三章 系统分析

3.1 可行性分析

3.2 系统性能分析

3.3 系统功能分析

3.4 系统流程分析

第四章 系统设计

4.1 系统概要设计

4.2 系统结构设计

4.3 系统顺序图设计

4.4 系统关系图设计

4.5 数据库设计

第五章  系统详细设计

5.1 在线学习交流网站

5.2后台管理

第六章  部分代码实现

6.1  Spring boot  配置代码

6.2 用户管理及登录登出代码

6.3 Md5 加密算法代码

6.4  部分数据库代码

第七章 系统测试

7.1 测试定义

7.2 测试目的

7.3 测试方案

7.4 测试结论

第八章 结 论

致谢

附一、论文参考:

附二、其他案例: 


第一章 绪论

1.1 研究背景

       在线学习平台为广大学习者提供了便捷、灵活的学习方式,涵盖了从基础教育到高等教育的各个阶段,以及职业技能、兴趣爱好等多个领域。

       随着信息技术与互联网的快速发展,人们对教育方式和学习方式的需求不断提升,越来越多的人倾向于利用碎片时间进行在线学习。
据数据显示,在线教育用户规模持续增长。例如,有数据显示2018年在线教育用户已达到1.07亿人,占互联网用户总量的34.9%,而到了更近的时期,用户规模更是达到了数亿人。
除了传统的学术课程外,职业培训、兴趣爱好等领域的课程需求也在不断增加,为在线教育平台提供了广阔的发展空间。
       自2010年以来,中国政府多次出台相关政策支持在线教育的发展。例如,《国家中长期教育改革和发展规划纲要(2010-2020年)》中明确提出要加强教育信息化建设,推动信息技术与教育教学的深度融合。如教育部等五部门联合下发的《构建利用信息化手段扩大优质教育资源覆盖面有效机制的实施方案》,以及《关于促进在线教育健康发展的指导意见》等文件,均对在线教育的发展提出了明确要求和支持措施。这些政策的实施有效推动了在线教育平台的建设和发展。

1.2 研究现状

一、市场需求与用户规模
1、用户规模持续增长:近年来,随着互联网技术的普及和在线教育市场的快速发展,在线学习交流平台的用户规模持续增长。大量用户选择在线学习作为获取知识、提升技能的主要途径。


2、学习需求多样化:用户的学习需求不再局限于传统的学术课程,而是涵盖了职业培训、兴趣爱好、语言学习等多个领域。这种多样化的学习需求促使在线学习交流平台不断丰富课程资源,提供更加个性化的学习服务。

二、挑战与机遇并存
1、技术安全与隐私保护:在线交流平台面临着技术安全和隐私保护的挑战。平台需要采取有效的技术手段和措施来保障用户数据的安全和隐私,防止信息泄露和滥用。

2、内容监管与合规性:随着法律法规的不断完善,在线交流平台需要加强对用户发布内容的监管和审核,确保平台内容的合法性和合规性。同时,平台还需要积极响应政府部门的监管要求,履行社会责任。

3、发展机遇广阔:尽管面临诸多挑战,但在线交流平台仍然具有广阔的发展机遇。随着5G、物联网等新技术的普及和应用,在线交流平台将迎来更多的创新和发展机会。同时,随着全球化和数字化的加速推进,在线交流平台将成为连接不同国家和地区、促进文化交流和经济合作的重要桥梁。

1.3 研究内容


      本系统的开发和设计施根据用户的实际情况出发,对系统的需求进行了详细的分析,然后进行系统的整体设计,最后通过测试使得系统设计的更加完整,可以实现系统中所有的功能,在开始编写论文之前每天到图书馆借阅相关书籍, 包括java入门到精通、javaee编程、mysql数据库书籍等编程书籍,然后针对开发管理系统,去网上查找了其他别人做好的类似系统,参照他们的设计结果,来对自己的系统进行更加详细的系统的设计,将系统中所有的功能结果一一列举出来,然后进行需求分析,最后对所有的功能模块进行编码,最后完成系统的整体测试,实现系统的正常运行。

这次编写的论文包含了8个部分的内容,具体内容如下:

第一部分  绪论:文章主要从课题背景以及研究现状综合阐述了开发此系统的必要性。

第二部分  相关技术介绍:系统开发用到的各种技术都大致做出了简介。

第三部分  系统分析:对系统的可行性分析以及对所有功能需求进行分析,来查看该系统是否具有开发的可能。

第四部分  系统设计:对系统的架构、结构、功能、模板、模板关系、数据库进行设计。

第五部分  系统详细设计与实现:对系统的功能模块设计和数据库设计进行详细设计,并设计出系统界面图形展示,描述本系统功能。

第六部分  部分系统代码实现:对系统核心代码进行简要描述。

第七部分  系统测试:测试系统的每一个功能是否能够正常运行,是否可以满足人们的需求。

第八部分  结论:对本论文系统设计与实现进行总结。

      本项目开发设计主要基于java语言springboot后端框架vueJS前端框架技术以及mysql数据库进行设计,来开发出一款方便实用、易维护的前后端分享的在线求职招聘系系统,并且设计的程序具有界面整洁、功能强大等特性,从全局来说,在线学习交流平台的设计解决了信息零散、信息不通、学习交流等问题,该系统的实现,可以投入到真实环境中,这样不仅能解决以上提及的问题,让信息管理更准则。 

第二章 相关技术介绍


2.1  Java语言


Java是一种面向对象的编程语言,目前由美国Oracle公司开发。自1995年上线以来,已经广泛应用于Web开发、桌面应用开发等多个领域。Java语言的特点包括:

1、面向对象:Java提供了类、接口和继承等面向对象的特性,支持单继承和多接口继承,以及动态绑定。

2、分布式:Java支持Internet应用的开发,提供了网络应用编程接口(java.net),支持RMI(远程方法激活)机制,适合开发分布式应用。

3、健壮性:Java的强类型机制、异常处理、垃圾自动收集等特性保证了程序的健壮性。Java的安全检查机制也增强了其健壮性。

4、安全性:Java提供了安全机制以防恶意代码的攻击,包括类加载器的安全防范机制和安全管理机制。

5、体系结构中立:Java程序编译为体系结构中立的字节码格式,可以在任何实现Java平台的系统中运行,适合异构网络环境和软件分发。

6、可移植性:Java的体系结构中立性和严格规定的基本数据类型长度保证了其可移植性。Java编译器和运行环境也是用Java实现的,进一步增强了其可移植性。

7、解释型:Java代码首先被编译为字节码,然后由Java虚拟机(JVM)解释执行。JVM适用于大多数软件和硬件平台,实现了Java代码的高可移植性。

Java的发展历程中,它最初是为了解决硬件领域的单片式计算机系统的智能化问题而开发的。随着技术的发展,Java已经成为了全球最大的开发者专业社群之一,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等多个领域。

2.2 HTML网页技术


HTML的全称超文本标记语言,于1990年创立的一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,自1990年以来,HTML就一直被用作万维网的信息表示语言,使用HTML描述的文件需要通过web浏览器显示出效果。HTML是一种建立网页文件的语言,通过标记式的指令(Tag),将文字,图形、动画、声音、表格、链接、影像等内容显示出来。。

2.3 MySQL数据库


Mysql 经过多次的更新,功能层面已经非常的丰富和完善了,从Mysql4版本到5版本进行了比较大的更新,在商业的实际使用中取得了很好的实际应用效果。最新版本的Mysql支持对信息的压缩,同时还能进行加密能更好的满足对信息安全性的需求。同时经过系统的多次更新,数据库自身的镜像功能也得到了很大的增强,运行的流畅度和易用性方面有了不小的进步,驱动的使用和创建也更加的高效快捷。最大的变动还是进行了空间信息的显示优化,能更加方便的在应用地图上进行坐标的标注和运算。强大的备份功能也保证了用户使用的过程会更加安心,同时支持的Office特性还支持用户的自行安装和使用。在信息的显示形式上也进行了不小的更新,增加了两个非常使用的显示区,一个是信息区,对表格和文字进行了分类处理,界面的显示更加清爽和具体。第二是仪表的信息控件,能在仪表信息区进行信息的显示,同时还能进行多个信息的比对,为用户的实际使用带来了很大的便捷。

2.4 Springboot 框架介绍


Spring  Boot是由Pivotal团队2013年开发提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等。

SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。 [1]

SpringBoot所具备的特征有:

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;

(2)内嵌Tomcat或Jetty等Servlet容器;

(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;

(4)尽可能自动配置Spring容器;

(5)提供准备好的特性,如指标、健康检查和外部化配置;

(6)绝对没有代码生成,不需要XML配置。

2.5 VueJS介绍


Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,可以高效地开发用户界面。Vue.js是一套构建用户界面的渐进式框架,采用自底向上增量开发的设计,核心库只关注视图层。另一方面,Vue完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。

Vue.js 的主要特点

1、响应式数据绑定系统。这意味着当应用程序中的数据发生变化时,页面上相关的部分会自动更新。这种机制使得开发者可以轻松地管理和维护复杂的应用程序状态。

2、组件化开发。Vue.js 允许开发者将页面拆分为独立的组件,每个组件具有自己的数据和逻辑。这种模块化的开发方式使得代码复用和维护更加容易,并且能够提高开发效率。

3、Vue.js 也提供了一套强大的指令系统,用于处理 DOM 操作和页面交互。通过使用这些指令,开发者可以轻松地实现诸如条件渲染、循环渲染、事件处理等功能。

4、丰富的插件生态系统。开发者可以使用各种插件来扩展 Vue.js 的功能,例如路由、状态管理、表单验证等。这使得开发者可以根据自己的需求选择合适的插件,从而更好地满足项目的要求。

2.6 ElementUI介绍


Element-UI 是由饿了么前端团队推出的一款基于 Vue.js 2.0 的桌面端 UI 组件库。它为开发者提供了一套完整、易用、美观的组件解决方案,极大地提升了前端开发的效率和质量。本文将详细介绍 Element-UI 的特点、安装使用、核心组件及其应用场景。

一、Element-UI的特点

1. 完整性

Element-UI 提供了从基础控件到复杂组件的一整套 UI 解决方案,包括表单、表格、对话框、消息提示等。这些组件覆盖了常见的 UI 场景,开发者可以直接使用,减少了重复造轮子的工作。

2. 易用性

Element-UI 的 API 设计简单直观,文档详细丰富,开发者可以很快上手。它与 Vue.js 无缝结合,利用 Vue 的特性(如数据绑定、组件化)使开发更加便捷。

3. 美观性

Element-UI 的设计风格简洁优雅,符合现代 UI 设计趋势。它提供了多种主题配置,开发者可以根据项目需求进行定制。

4. 可扩展性

Element-UI 提供了丰富的钩子函数和事件,可以方便地进行二次开发和扩展。开发者可以基于 Element-UI 的组件进行自定义开发,满足特定业务需求。

针对本文中设计的在线求职招聘系统在实际的实现过程中,最终选择Mysql数据库的主要原因在于在企业的应用系统应用及开发的过程中会存在大量的数据库比较频繁的操作,而且数据的安全性要求也是非常的高,最重要的是Mysql5.8为开源免费的数据库,在行业中应用比较广泛。综合这些因素,最终选择安全性系数比较高的Mysql来对个人博客管理系统后台数据进行存储操作[。

第三章 系统分析


3.1 可行性分析


    在系统开发之初要进行系统可行分析,这样做的目的就是使用最小成本解决最大问题,一旦程序开发满足用户需要,带来的好处也是很多的。下面我们将从技术上、操作上、经济上等方面来考虑这个系统到底值不值得开发。

3.1.1 技术可行性


      本系统基于JAVA编程语言,采用springboot后端框架、vueJS前端框架技术,以及对mysql数据库进行开发设计,作为计算机专业学生,在学校期间就接触到许多关于编程方面的知识,当然也包括各种编程软件,对他们的了解度也比较系统,所以技术开发上面还是有一定熟悉和把握。

3.1.2 经济可行性
    我在设计该系统的时候主要是从节约成本出发,然后进行具体的系统的设计,在系统的设计过程中由于采用的所有工具以及技术支持全部都是免费的,因此不需要有任何的成本就可以进行该系统的设计。所用到的所有资源都是免费的,只要有网络就可以进行下载使用,不需要支付相应的费用,因此该项目在经济方面是完全可以实行的。

3.1.3 操作可行性
      本人自己就是学生,程序开发经验不足,在界面设计上面不会设计太复杂,要讲究简单好看,操作上要方便,不能让用户觉得不流畅。用户一旦进入操作界面,界面上就会有相应提示,跟着操作提示就可以找到对应的功能操作模块,对于用户来说免培训就能使用。

从上面几个部分的可行性分析得出,这次开发的在线学习交流平台在开发上面没有什么大问题,值得开发。

3.2 系统性能分析


(1)系统响应效率:页面响应时问应该在3秒以内,最长不能超过4秒,并支持至少10000人同时在线所有系统。

(2)界面简洁清晰:系统界面要求简单明了,容易操作,符合用户操作习惯。

(3)储存性高:因为本系统中有很多的信息需要存储,因此对于系统的存储量有很大的要求,需要有一个强大的数据库的支持才能确保所有的信息都能安全稳定的进行存储。

(4)易学性:该系统在操作上必须简单好上手,没有很多复杂的操作,只需要简单的进行学习就能操作该系统。

(5)稳定性需求:开发的在线求职招聘系统要求运行稳定,运行过程中无界面不清楚、字体模糊、不能正常操作等现象。

3.3 系统功能分析


        在线学习交流平台主要包括以下几大功能模块,即用户管理、菜单管理、权限管理、首页、文章管理、文章分类管理、标签管理、评论管理、评论审核、个人中心、后台管理等功能模板。

其中,

(1)用户管理模块:包括系统管理员和一般用户。系统中的核心用户是系统管理员,管理员登录后,通过管理员菜单来管理系统。其中,系统管理员可以对本系统所有功能进行动态管理。一般用户登录后可以对个人信息进行修改,管理自己的招聘信息、应聘信息、留言等。

(2)菜单管理:对本系统的所有菜单进行动态管理,实现系统的低偶合设计。

(3)权限管理:通过角色管理、角色权限动态分配等操作实现本系统用户的权限动态控制,实现不同用户、不同角色、不同权限。同时,个人只能管理自己的相应信息。从而保障本系统的安全、本系统的用户数据安全,提供系统健壮性。

(4)文章管理模块:对文章进行管理,每个人只能管理自己的文章,管理员可以对所有文章进行管理。

(5)文章分类管理:对文章的分类进行管理,由管理员统一对文章分类进行管理。

(6)标签管理模块:文章可以添加标签,由管理员统一对文章标签进行管理。

(7)评论管理模块:增加用户可以对文章进行评论、点赞、打赏等功能。

(8)评论审核管理模块:对评论进行手动或自动过滤审核功能。当设置为自动审核时,平台对敏感词进行做加*处理。

3.4 系统流程分析

3.4.1 登录流程

登录模块主要满足管理员以及用户的权限登录,用户登录流程图如图3-5所示。

 ​

图3-5 登录流程图

3.4.2 注册流程
    未有账号的用户可进入注册界面进行注册操作,用户注册流程图如图3-6所示。

 ​

图3-6 注册流程图

3.4.3 添加信息流程
    用户在添加信息时,信息编号自动生成,系统会对添加的信息进行验证,验证通过则添加至数据库,添加信息成功,反之添加失败。添加信息流程如图3-7所示。

 ​

图3-7 添加信息流程图

3.4.4 删除信息流程
    用户可选择要删除的信息进行信息删除操作,在删除信息时系统提示是否确定删除信息,是则删除信息成功,系统数据库将信息进行删除。删除信息流程图如图3-8所示。

 ​

图3-8删除信息流程图

第四章 系统设计


4.1 系统概要设计


     系统采用B/S架构,通过Web浏览器进行访问和操作。系统包括前台和后台两个主要部分:

1、交流网站:为大家提供用户学习、交流界面,实现文章搜索、查看、评论交流、点赞、打赏等功能。

2、后台:为管理员提供管理界面,实现用户管理、文章管理、评论管理、数据统计等功能。。

4.2 系统结构设计


    整个系统是由多个功能模块组合而成的,要将所有的功能模块都一一列举出来,然后进行逐个的功能设计,使得每一个模块都有相对应的功能设计,然后进行系统整体的设计。

本系统结构图如图4-2所示。 

4.3 系统顺序图设计

4.3.1 登录模块顺序图

    登录模块主要满足了管理员以及用户的权限登录,登录模块顺序图如图4-3所示。

4.3.2 添加信息模块顺序图

    管理员以及用户登录后均可进行添加信息操作,添加信息模块顺序图如图4-4所示。

4.4 系统关系图设计

本系统各类之间关系图如图4-2所示。

4.5 数据库设计

       一个好的数据库可以关系到程序开发的优劣,数据库设计离不开表结构的设计,还有表与表之间的联系,以及系统开发需要设计的数据表内容等信息。在进行数据库设计期间,要结合实际情况来对数据库进行针对性的开发设计[12]。

4.4.1 数据库E-R图设计
本系统采用的是mysql数据库,数据存储快,因为个人博客管理系统,主要的就是对信息的管理,信息内容比较多,这就需要好好的设计一个好的数据库,分类要清楚,不能添加信息的时候,造成信息太过混乱,设计好的数据库首先就需要先把各个实体之间的关系表达明确,系统的E-R图如下图所示: 

4.4.2 逻辑结构设计
       逻辑结构设计是把概念结构设计阶段画好的数据库ER图转换为关系模型。该系统的关系模型的逻辑结构是由主要一下关系模式组成,具体的关系模式如下:

(1)用户信息(主键id、用户id、用户姓名、表名、角色id、角色名、密码、新增时间、过期时间)

(2)角色信息(主键id、角色名称、角色描述、新增时间、过期时间)

(3)角色权限信息(主键id、角色id、角色名称、关联的菜单id、关联的菜单名、新增时间、过期时间)

(4)菜单信息(主键id、菜单名称、菜单访问路径、菜单描述、上级菜单id、新增时间、过期时间)

(5)文章信息(主键id、创建日期、文章名称、文章内容描述、文章类型、文章标签、文章点赞数、文章访问数、父节点id、上传用户id、上传用户姓名、状态、文章审核状态、审核人id、审核人)

(6)评论信息(主键id、创建日期、文章id、文章名、评论人id、评论人姓名、评论内容、是否审核、评论时间等)

第五章  系统详细设计

5.1 在线学习交流网站

5.1.1用户登录注册模块:

用户填写登录信息进行登录

5.1.2 首页:

展示网站的所有功能,包括 文章、文章分类 、推荐、最新文章 等

5.1.3  文章查看

5.1.4  文章交流评论、点赞、打赏

5.1.4  留言

5.1.5 用户中心--修改密码:

5.1.6 用户中心--首页:

5.1.7 用户中心--发布文章:

5.1.8 用户中心--文章列表:

5.1.9 用户中心--评论交流列表:

5.2后台管理

5.2.1用户登录注册模块:

用户填写登录信息进行登录

5.1.2 后台首页:

包括 文章管理、菜单管理、权限管理、网站管理、系统管理

5.1.3 文章管理:

5.1.4 文章分类管理:

5.1.5 文章标签管理:

5.1.5 交流评论管理:

包含自动敏感词过滤和自动/人工审核

5.1.6 用户管理:

5.1.7 菜单管理:

5.1.7 角色管理:

5.1.8 角色权限管理:

5.1.9 日志管理:

第六章  部分代码实现

6.1  Spring boot  配置代码

# Tomcat
server:
    tomcat:
        uri-encoding: UTF-8
    port: 8080
    servlet:
        context-path: /springboot0t8ql
 
spring:
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springboot0t8ql?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
        username: root
        password: 123456
 
#        driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
#        url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=springboot0t8ql
#        username: sa
#        password: 123456
 
    servlet:
      multipart:
        max-file-size: 10MB
        max-request-size: 10MB
    resources:
      static-locations: classpath:/testStatic/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
 
#mybatis
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper 调试神器
    refresh-mapper: true
    #逻辑删除配置
    logic-delete-value: -1
    logic-not-delete-value: 0
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    #springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)
jdbc-type-for-null: 'null'

6.2 用户管理及登录登出代码

/**
 * 用户账户:用于保存用户登录信息(User)表控制层
 */
@Slf4j
@RestController
@RequestMapping("user")
public class UserController extends BaseController<User, UserService> {
    /**
     * 服务对象
     */
    @Autowired
    public UserController(UserService service) {
        setService(service);
    }
 
    /**
     * Token服务
     */
    @Autowired
    private AccessTokenService tokenService;
 
    @Autowired
    private UserGroupService userGroupService;
 
    /**
     * 注册
     * @param user
     * @return
     */
    @PostMapping("register")
    public Map<String, Object> signUp(@RequestBody User user) {
        // 查询用户
        Map<String, String> query = new HashMap<>();
        query.put("username",user.getUsername());
        List list = service.select(query, new HashMap<>()).getResultList();
        if (list.size()>0){
            return error(30000, "用户已存在");
        }
        user.setUserId(null);
        user.setPassword(service.encryption(user.getPassword()));
        service.save(user);
        return success(1);
    }
 
    /**
     * 找回密码
     * @param form
     * @return
     */
    @PostMapping("forget_password")
    public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {
        JSONObject ret = new JSONObject();
        String username = form.getUsername();
        String code = form.getCode();
        String password = form.getPassword();
        // 判断条件
        if(code == null || code.length() == 0){
            return error(30000, "验证码不能为空");
        }
        if(username == null || username.length() == 0){
            return error(30000, "用户名不能为空");
        }
        if(password == null || password.length() == 0){
            return error(30000, "密码不能为空");
        }
 
        // 查询用户
        Map<String, String> query = new HashMap<>();
        query.put("username",username);
        Query select = service.select(query, service.readConfig(request));
        List list = select.getResultList();
        if (list.size() > 0) {
            User o = (User) list.get(0);
            JSONObject query2 = new JSONObject();
            JSONObject form2 = new JSONObject();
            // 修改用户密码
            query2.put("user_id",o.getUserId());
            form2.put("password",service.encryption(password));
            service.update(query, service.readConfig(request), form2);
            return success(1);
        }
        return error(70000,"用户不存在");
    }
 
    /**
     * 登录
     * @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.select(map, new HashMap<>()).getResultList();
        }
        else if(email != null && "".equals(email) == false){
            map.put("email", email);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }
        else if(phone != null && "".equals(phone) == false){
            map.put("phone", phone);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }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.select(groupMap, new HashMap<>()).getResultList();
        if (groupList.size()<1){
            return error(30000,"用户组不存在");
        }
 
        UserGroup userGroup = (UserGroup) groupList.get(0);
 
        //查询用户审核状态
        if (!StringUtils.isEmpty(userGroup.getSourceTable())){
            String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
            String res = String.valueOf(service.runCountSql(sql).getSingleResult());
            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());
            tokenService.save(accessToken);
 
            // 返回用户信息
            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, "账号或密码不正确");
        }
    }
 
    /**
     * 修改密码
     * @param data
     * @param request
     * @return
     */
    @PostMapping("change_password")
    public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
        // 根据Token获取UserId
        String token = request.getHeader("x-auth-token");
        Integer userId = tokenGetUserId(token);
        // 根据UserId和旧密码获取用户
        Map<String, String> query = new HashMap<>();
        String o_password = data.get("o_password");
        query.put("user_id" ,String.valueOf(userId));
        query.put("password" ,service.encryption(o_password));
        Query ret = service.count(query, service.readConfig(request));
        List list = ret.getResultList();
        Object s = list.get(0);
        int count = Integer.parseInt(list.get(0).toString());
        if(count > 0){
            // 修改密码
            Map<String,Object> form = new HashMap<>();
            form.put("password",service.encryption(data.get("password")));
            service.update(query,service.readConfig(request),form);
            return success(1);
        }
        return error(10000,"密码修改失败!");
    }
 
    /**
     * 登录态
     * @param request
     * @return
     */
    @GetMapping("state")
    public Map<String, Object> state(HttpServletRequest request) {
        JSONObject ret = new JSONObject();
        // 获取状态
        String token = request.getHeader("x-auth-token");
 
        // 根据登录态获取用户ID
        Integer userId = tokenGetUserId(token);
 
        log.info("[返回userId] {}",userId);
        if(userId == null || userId == 0){
            return error(10000,"用户未登录!");
        }
 
        // 根据用户ID获取用户
        Map<String,String> query = new HashMap<>();
        query.put("user_id" ,String.valueOf(userId));
 
        // 根据用户ID获取
        Query select = service.select(query,service.readConfig(request));
        List resultList = select.getResultList();
        if (resultList.size() > 0) {
            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(resultList.get(0)));
            user.put("token",token);
            ret.put("obj",user);
            return success(ret);
        } else {
            return error(10000,"用户未登录!");
        }
    }
 
    /**
     * 登录态
     * @param request
     * @return
     */
    @GetMapping("quit")
    public Map<String, Object> quit(HttpServletRequest request) {
        String token = request.getHeader("x-auth-token");
        JSONObject ret = new JSONObject();
        Map<String, String> query = new HashMap<>(16);
        query.put("token", token);
        try{
            tokenService.delete(query,service.readConfig(request));
        }catch (Exception e){
            e.printStackTrace();
        }
        return success("退出登录成功!");
    }
 
    /**
     * 获取登录用户ID
     * @param token
     * @return
     */
    public Integer tokenGetUserId(String token) {
        log.info("[获取的token] {}",token);
        // 根据登录态获取用户ID
        if(token == null || "".equals(token)){
            return 0;
        }
        Map<String, String> query = new HashMap<>(16);
        query.put("token", token);
        AccessToken byToken = tokenService.findOne(query);
        if(byToken == null){
            return 0;
        }
        return byToken.getUser_id();
    }
 
    /**
     * 重写add
     * @return
     */
    @PostMapping("/add")
    @Transactional
    public Map<String, Object> add(HttpServletRequest request) throws IOException {
        Map<String,Object> map = service.readBody(request.getReader());
        map.put("password",service.encryption(String.valueOf(map.get("password"))));
        service.insert(map);
        return success(1);
    }
 
}

6.3 Md5 加密算法代码

public class MD5Utils {
    private static final Logger logger = LoggerFactory.getLogger(MD5Utils.class);
 
    // 全局数组
    private final static String[] strDigits = {"0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
 
    /**
     * 16进制字符
     */
    private final static char hexdigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
            '9', 'a', 'b', 'c', 'd', 'e', 'f'};
 
 
    /**
     * 对文件全文生成MD5摘要
     *
     * @param file 要加密的文件
     * @return MD5摘要码
     */
    public static String getMD5ForFile(String filePath) {
        FileInputStream fis = null;
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
            File file = new File(filePath);
            if (!file.exists()) {
                return "";
            }
            fis = new FileInputStream(file);
            byte[] buffer = new byte[4096];
            int length = -1;
            while ((length = fis.read(buffer)) != -1) {
                md.update(buffer, 0, length);
            }
            byte[] b = md.digest();
            return byteToHexString(b);
        } catch (Exception ex) {
            logger.error("获取MD5信息发生异常!" + ex.toString());
            return null;
        } finally {
            try {
                if (null != fis) {
                    fis.close();
                }
            } catch (IOException e) {
                logger.error("获取MD5信息发生异常!" + e.toString());
            }
        }
    }
 
    /**
     * 把byte[]数组转换成十六进制字符串表示形式
     *
     * @param tmp 要转换的byte[]
     * @return 十六进制字符串表示形式
     */
    private static String byteToHexString(byte[] tmp) {
        String s;
        char str[] = new char[16 * 2];
        int k = 0;
        for (int i = 0; i < 16; i++) {
            byte byte0 = tmp[i];
            str[k++] = hexdigits[byte0 >>> 4 & 0xf];
            str[k++] = hexdigits[byte0 & 0xf];
        }
        s = new String(str);
        return s;
    }
 
    // 返回形式为数字跟字符串
    private static String byteToArrayString(byte bByte) {
        int iRet = bByte;
        // System.out.println("iRet="+iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        int iD1 = iRet / 16;
        int iD2 = iRet % 16;
        return strDigits[iD1] + strDigits[iD2];
    }
 
    // 返回形式只为数字
    private static String byteToNum(byte bByte) {
        int iRet = bByte;
        System.out.println("iRet1=" + iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        return String.valueOf(iRet);
    }
 
    // 转换字节数组为16进制字串
    private static String byteToString(byte[] bByte) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < bByte.length; i++) {
            sBuffer.append(byteToArrayString(bByte[i]));
        }
        return sBuffer.toString();
    }
 
    public static String GetMD5Code(String strObj) {
        if (StringUtils.isEmpty(strObj)) {
            return "";
        }
        String resultString = null;
        try {
            resultString = new String(strObj);
            MessageDigest md = MessageDigest.getInstance("MD5");
            // md.digest() 该函数返回值为存放哈希值结果的byte数组
            resultString = byteToString(md.digest(strObj.getBytes()));
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        return resultString;
    }
 
 
}

6.4  部分数据库代码

-- ----------------------------
-- Table structure for permission
-- ----------------------------
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `permission_id` varchar(32) NOT NULL COMMENT '权限id',
  `name` varchar(100) NOT NULL COMMENT '权限名称',
  `description` varchar(255) DEFAULT NULL COMMENT '权限描述',
  `url` varchar(255) DEFAULT NULL COMMENT '权限访问路径',
  `perms` varchar(255) DEFAULT NULL COMMENT '权限标识',
  `parent_id` int(11) DEFAULT NULL COMMENT '父级权限id',
  `type` int(1) DEFAULT NULL COMMENT '类型   0:目录   1:菜单   2:按钮',
  `order_num` int(3) DEFAULT '0' COMMENT '排序',
  `icon` varchar(50) DEFAULT NULL COMMENT '图标',
  `status` int(1) NOT NULL COMMENT '状态:1有效;2删除',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of permission
-- ----------------------------
BEGIN;
INSERT INTO `permission` VALUES (1, '1', '工作台', '工作台', '/workdest', 'workdest', 0, 1, 1, 'fas fa-home', 1, '2017-09-27 21:22:02', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (2, '2', '权限管理', '权限管理', NULL, NULL, 0, 0, 4, 'fas fa-user-cog', 1, '2017-07-13 15:04:42', '2020-04-19 19:09:22');
INSERT INTO `permission` VALUES (3, '201', '用户管理', '用户管理', '/users', 'users', 2, 1, 1, 'fas fa-chess-queen', 1, '2017-07-13 15:05:47', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (4, '20101', '列表查询', '用户列表查询', '/user/list', 'user:list', 3, 2, 0, NULL, 1, '2017-07-13 15:09:24', '2017-10-09 05:38:29');
INSERT INTO `permission` VALUES (5, '20102', '新增', '新增用户', '/user/add', 'user:add', 3, 2, 0, NULL, 1, '2017-07-13 15:06:50', '2018-02-28 17:58:46');
INSERT INTO `permission` VALUES (6, '20103', '编辑', '编辑用户', '/user/edit', 'user:edit', 3, 2, 0, NULL, 1, '2017-07-13 15:08:03', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (7, '20104', '删除', '删除用户', '/user/delete', 'user:delete', 3, 2, 0, NULL, 1, '2017-07-13 15:08:42', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (8, '20105', '批量删除', '批量删除用户', '/user/batch/delete', 'user:batchDelete', 3, 2, 0, '', 1, '2018-07-11 01:53:09', '2018-07-11 01:53:09');
INSERT INTO `permission` VALUES (9, '20106', '分配角色', '分配角色', '/user/assign/role', 'user:assignRole', 3, 2, 0, NULL, 1, '2017-07-13 15:09:24', '2017-10-09 05:38:29');
INSERT INTO `permission` VALUES (10, '202', '角色管理', '角色管理', '/roles', 'roles', 2, 1, 2, 'fas fa-chess-queen', 1, '2017-07-17 14:39:09', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (11, '20201', '列表查询', '角色列表查询', '/role/list', 'role:list', 10, 2, 0, NULL, 1, '2017-10-10 15:31:36', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (12, '20202', '新增', '新增角色', '/role/add', 'role:add', 10, 2, 0, NULL, 1, '2017-07-17 14:39:46', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (13, '20203', '编辑', '编辑角色', '/role/edit', 'role:edit', 10, 2, 0, NULL, 1, '2017-07-17 14:40:15', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (14, '20204', '删除', '删除角色', '/role/delete', 'role:delete', 10, 2, 0, NULL, 1, '2017-07-17 14:40:57', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (15, '20205', '批量删除', '批量删除角色', '/role/batch/delete', 'role:batchDelete', 10, 2, 0, '', 1, '2018-07-10 22:20:43', '2018-07-10 22:20:43');
INSERT INTO `permission` VALUES (16, '20206', '分配权限', '分配权限', '/role/assign/permission', 'role:assignPerms', 10, 2, 0, NULL, 1, '2017-09-26 07:33:05', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (17, '203', '资源管理', '资源管理', '/permissions', 'permissions', 2, 1, 3, 'fas fa-chess-queen', 1, '2017-09-26 07:33:51', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (18, '20301', '列表查询', '资源列表', '/permission/list', 'permission:list', 17, 2, 0, NULL, 1, '2018-07-12 16:25:28', '2018-07-12 16:25:33');
INSERT INTO `permission` VALUES (19, '20302', '新增', '新增资源', '/permission/add', 'permission:add', 17, 2, 0, NULL, 1, '2017-09-26 08:06:58', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (20, '20303', '编辑', '编辑资源', '/permission/edit', 'permission:edit', 17, 2, 0, NULL, 1, '2017-09-27 21:29:04', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (21, '20304', '删除', '删除资源', '/permission/delete', 'permission:delete', 17, 2, 0, NULL, 1, '2017-09-27 21:29:50', '2018-02-27 10:53:14');
INSERT INTO `permission` VALUES (22, '3', '运维管理', '运维管理', NULL, NULL, 0, 0, 7, 'fas fa-people-carry', 1, '2018-07-06 15:19:26', '2020-04-19 19:09:59');
INSERT INTO `permission` VALUES (23, '301', '数据监控', '数据监控', '/database/monitoring', 'database', 22, 1, 1, 'fas fa-chess-queen', 1, '2018-07-06 15:19:55', '2018-07-06 15:19:55');
INSERT INTO `permission` VALUES (24, '4', '系统管理', '系统管理', NULL, NULL, 0, 0, 5, 'fas fa-cog', 1, '2018-07-06 15:20:38', '2020-04-19 19:08:58');
INSERT INTO `permission` VALUES (25, '401', '在线用户', '在线用户', '/online/users', 'onlineUsers', 24, 1, 1, 'fas fa-chess-queen', 1, '2018-07-06 15:21:00', '2018-07-24 14:58:22');
INSERT INTO `permission` VALUES (32, '1000001992372345', '在线用户查询', '在线用户查询', '/online/user/list', 'onlineUser:list', 25, 2, 0, '', 1, '2018-07-24 15:02:23', '2018-07-24 15:02:23');
INSERT INTO `permission` VALUES (33, '1000002083579304', '踢出用户', '踢出用户', '/online/user/kickout', 'onlineUser:kickout', 25, 2, 0, '', 1, '2018-07-24 15:03:16', '2018-07-24 15:03:16');
INSERT INTO `permission` VALUES (34, '1000000171409776', '批量踢出', '批量踢出', '/online/user/batch/kickout', 'onlineUser:batchKickout', 25, 2, 0, '', 1, '2018-07-24 15:04:09', '2018-07-24 15:04:09');
INSERT INTO `permission` VALUES (35, '1000000863853891', '网站管理', '网站管理', NULL, NULL, 0, 0, 3, 'fas fa-columns', 1, '2018-07-24 15:44:23', '2020-04-19 19:08:46');
INSERT INTO `permission` VALUES (36, '1000001264798222', '基础信息', '基础设置', '/siteinfo', 'siteinfo', 35, 1, 1, 'fas fa-chess-queen', 1, '2018-07-24 15:48:13', '2018-07-24 17:43:39');
INSERT INTO `permission` VALUES (37, '1000000432183856', '保存', '基础设置-保存', '/siteinfo/save', 'siteinfo:save', 36, 2, 0, '', 1, '2018-07-24 15:49:12', '2018-07-24 15:49:12');
INSERT INTO `permission` VALUES (38, '1000001792841328', '系统公告', '系统公告', '/notifies', 'notifies', 35, 1, 2, 'fas fa-chess-queen', 0, '2018-07-24 23:40:45', '2018-09-13 12:34:18');
INSERT INTO `permission` VALUES (39, '1000001351219537', '查询', '系统公告-查询', '/notify/list', 'notify:list', 38, 2, 0, '', 0, '2018-07-24 23:41:30', '2018-09-13 12:33:19');
INSERT INTO `permission` VALUES (40, '1000000791685519', '新增', '系统公告-新增', '/notify/add', 'notify:add', 38, 2, 0, '', 0, '2018-07-24 23:42:20', '2018-09-13 12:33:26');
INSERT INTO `permission` VALUES (42, '1000001531648485', '编辑', '系统公告-编辑', '/notify/edit', 'notify:edit', 38, 2, 0, '', 0, '2018-07-24 23:44:39', '2018-09-13 12:33:52');
INSERT INTO `permission` VALUES (43, '1000001548165826', '删除', '系统公告-删除', '/notify/delete', 'notify:delete', 38, 2, 0, '', 0, '2018-07-24 23:45:27', '2018-09-13 12:33:57');
INSERT INTO `permission` VALUES (44, '1000001530229707', '批量删除', '批量删除公告', '/notify/batch/delete', 'notify:batchDelete', 38, 2, 0, '', 0, '2018-07-24 23:46:25', '2018-09-13 12:34:02');
INSERT INTO `permission` VALUES (45, '1000000237721285', '友链管理', '友情链接', '/links', 'links', 35, 1, 3, 'fas fa-chess-queen', 1, '2018-07-25 11:05:49', '2018-07-25 11:07:03');
INSERT INTO `permission` VALUES (46, '1000001238193773', '查询', '友链-查询', '/link/list', 'link:list', 45, 2, 0, '', 1, '2018-07-25 11:06:44', '2018-07-25 11:06:44');
INSERT INTO `permission` VALUES (47, '1000001305005793', '新增', '友链-新增', '/link/add', 'link:add', 45, 2, 0, '', 1, '2018-07-25 11:07:46', '2018-07-25 11:07:46');
INSERT INTO `permission` VALUES (48, '1000001679037501', '编辑', '友链-编辑', '/link/edit', 'link:edit', 45, 2, 0, '', 1, '2018-07-25 11:08:21', '2018-07-25 11:08:21');
INSERT INTO `permission` VALUES (49, '1000001011730177', '删除', '友链-删除', '/link/delete', 'link:delete', 45, 2, 0, '', 1, '2018-07-25 11:08:53', '2018-07-25 11:08:53');
INSERT INTO `permission` VALUES (50, '1000001312374743', '批量删除', '友链-批量删除', '/link/batch/delete', 'link:batchDelete', 45, 2, 0, '', 1, '2018-07-25 11:09:40', '2018-07-25 11:09:40');
INSERT INTO `permission` VALUES (51, '1000001507480127', '审核', '友链-审核', '/link/audit', 'link:audit', 45, 2, 0, '', 1, '2018-07-25 11:42:28', '2018-07-25 11:42:28');
INSERT INTO `permission` VALUES (52, '1000000602555213', '文章管理', '文章管理', NULL, NULL, 0, 0, 2, 'fas fa-newspaper', 1, '2018-07-25 17:43:12', '2020-04-19 19:04:49');
INSERT INTO `permission` VALUES (53, '1000001729104792', '分类管理', '分类管理', '/categories', 'categories', 52, 1, 3, 'fas fa-chess-queen', 1, '2018-07-25 17:43:50', '2020-04-19 20:33:27');
INSERT INTO `permission` VALUES (54, '1000000015836901', '新增', '新增分类', '/category/add', 'category:add', 53, 2, 0, '', 1, '2018-07-25 17:44:28', '2018-07-25 17:44:28');
INSERT INTO `permission` VALUES (55, '1000001439189167', '编辑', '编辑分类', '/category/edit', 'category:edit', 53, 2, 0, '', 1, '2018-07-25 17:44:52', '2018-07-25 17:44:52');
INSERT INTO `permission` VALUES (56, '1000001647995753', '删除', '删除分类', '/category/delete', 'category:delete', 53, 2, 0, '', 1, '2018-07-25 17:45:28', '2018-07-25 17:45:28');
INSERT INTO `permission` VALUES (58, '1000000841419865', '查询', '分类查询', '/category/list', 'category:list', 53, 2, 0, '', 1, '2018-07-25 17:49:43', '2018-07-25 17:49:43');
INSERT INTO `permission` VALUES (59, '1000000976625379', '标签管理', '标签管理', '/tags', 'tags', 52, 1, 4, 'fas fa-chess-queen', 1, '2018-07-25 18:50:47', '2020-04-19 20:33:35');
INSERT INTO `permission` VALUES (60, '1000002127467055', '查询', '查询标签列表', '/tag/list', 'tag:list', 59, 2, 0, '', 1, '2018-07-25 18:51:20', '2018-07-25 18:51:20');
INSERT INTO `permission` VALUES (61, '1000001458372033', '新增', '新增标签', '/tag/add', 'tag:add', 59, 2, 0, '', 1, '2018-07-25 18:51:42', '2018-07-25 18:51:42');
INSERT INTO `permission` VALUES (62, '1000001832967209', '编辑', '编辑标签', '/tag/edit', 'tag:edit', 59, 2, 0, '', 1, '2018-07-25 18:52:17', '2018-07-25 18:52:17');
INSERT INTO `permission` VALUES (63, '1000000754923037', '删除', '删除标签', '/tag/delete', 'tag:delete', 59, 2, 0, '', 1, '2018-07-25 18:52:40', '2018-07-25 18:52:40');
INSERT INTO `permission` VALUES (64, '1000000759248744', '批量删除', '批量删除标签', '/tag/batch/delete', 'tag:batchDelete', 59, 2, 0, '', 1, '2018-07-25 18:53:14', '2018-07-25 18:53:14');
INSERT INTO `permission` VALUES (65, '1000001038456544', '文章列表', '文章列表', '/articles', 'articles', 52, 1, 2, 'fas fa-chess-queen', 1, '2018-07-29 20:20:23', '2020-04-19 19:23:06');
INSERT INTO `permission` VALUES (66, '1000000686545782', '查询', '查询文章', '/article/list', 'article:list', 65, 2, 0, '', 1, '2018-07-29 20:20:54', '2018-07-29 20:20:54');
INSERT INTO `permission` VALUES (67, '1000001642272578', '新增', '新增文章', '/article/add', 'article:add', 65, 2, 0, '', 1, '2018-07-29 20:21:21', '2018-07-29 20:21:21');
INSERT INTO `permission` VALUES (68, '1000000804049447', '编辑', '编辑文章', '/article/edit', 'article:edit', 65, 2, 0, '', 1, '2018-07-29 20:21:50', '2018-07-29 20:21:50');
INSERT INTO `permission` VALUES (69, '1000000488864959', '删除', '删除文章', '/article/delete', 'article:delete', 65, 2, 0, '', 1, '2018-07-29 20:23:27', '2018-07-29 20:23:27');
INSERT INTO `permission` VALUES (70, '1000000512435306', '批量删除', '批量删除文章', '/article/batch/delete', 'article:batchDelete', 65, 2, 0, '', 1, '2018-07-29 20:23:49', '2018-07-29 20:23:49');
INSERT INTO `permission` VALUES (71, '1000000899091444', '发布文章', '写文章', '/article/add', 'article:add', 52, 1, 1, 'fas fa-chess-queen', 1, '2018-07-29 20:39:49', '2020-04-19 19:16:06');
INSERT INTO `permission` VALUES (72, '1000000224901858', '评论管理', '评论管理', '/comments', 'comments', 35, 1, 4, 'fas fa-chess-queen', 1, '2018-08-10 09:44:41', '2018-09-19 15:44:13');
INSERT INTO `permission` VALUES (73, '1000001579533936', '查询', '查询', '/comment/list', 'comment:list', 72, 2, 0, '', 1, '2018-08-10 09:46:54', '2018-08-10 09:46:54');
INSERT INTO `permission` VALUES (74, '1000000663968031', '审核', '审核评论', '/comment/audit', 'comment:audit', 72, 2, 0, '', 1, '2018-08-10 09:57:11', '2018-08-10 09:57:11');
INSERT INTO `permission` VALUES (75, '1000000322655547', '回复', '回复评论', '/comment/reply', 'comment:audit', 72, 2, 0, '', 1, '2018-08-10 10:04:28', '2018-08-10 10:04:28');
INSERT INTO `permission` VALUES (76, '1000001419287014', '删除', '删除评论', '/comment/delete', 'comment:delete', 72, 2, 0, '', 1, '2018-08-10 10:06:27', '2018-08-10 10:06:27');
INSERT INTO `permission` VALUES (77, '1000002075182223', '批量删除', '批量删除评论', '/comment/batch/delete', 'comment:batchDelete', 72, 2, 0, '', 1, '2018-08-10 10:07:57', '2018-08-10 10:07:57');
INSERT INTO `permission` VALUES (78, '1000000587822241', '上传管理', '上传管理', NULL, NULL, 0, 0, 6, 'fas fa-cloud-upload-alt', 1, '2018-09-12 17:08:41', '2020-04-19 19:09:35');
INSERT INTO `permission` VALUES (79, '1000000493635111', '云存储配置', '云存储配置', '/attachment/config', 'upload:config', 78, 1, 1, 'fas fa-chess-queen', 1, '2018-09-12 17:10:09', '2020-03-07 14:31:41');
INSERT INTO `permission` VALUES (80, '1000000318760332', '保存', '保存云存储配置', '/upload/saveConfig', 'upload:saveConfig', 79, 2, 0, '', 1, '2018-09-12 17:10:42', '2018-09-12 17:10:42');
INSERT INTO `permission` VALUES (81, '1000000919723998', '主题管理', '主题管理', '/themes', 'themes', 35, 1, 2, 'fas fa-chess-queen', 1, '2018-09-19 15:43:50', '2018-09-19 15:43:50');
INSERT INTO `permission` VALUES (82, '1000000784272506', '查询', '主题列表', '/theme/list', 'theme:list', 81, 2, 0, '', 1, '2018-09-19 15:44:50', '2018-09-19 15:44:50');
INSERT INTO `permission` VALUES (83, '1000000215201942', '新增', '新增主题', '/theme/add', 'theme:add', 81, 2, 0, '', 1, '2018-09-19 15:45:34', '2018-09-19 15:45:34');
INSERT INTO `permission` VALUES (84, '1000001065007557', '启用', '启用主题', '/theme/use', 'theme:use', 81, 2, 0, '', 1, '2018-09-19 15:46:28', '2018-09-19 15:46:28');
INSERT INTO `permission` VALUES (85, '1000000431577803', '删除', '删除主题', '/theme/delete', 'theme:delete', 81, 2, 0, '', 1, '2018-09-19 15:48:06', '2018-09-19 15:48:06');
INSERT INTO `permission` VALUES (86, '1000000207002458', '批量删除', '批量删除主题', 'theme/batch/delete', 'theme:batchDelete', 81, 2, 0, '', 1, '2018-09-19 15:48:39', '2018-09-19 15:48:39');
INSERT INTO `permission` VALUES (87, '1000002051091207', '编辑', '编辑主题', '/theme/edit', 'theme:edit', 81, 2, 0, '', 1, '2018-09-19 15:54:34', '2018-09-19 15:54:34');
INSERT INTO `permission` VALUES (88, '5011629010561508', '批量推送', '批量推送百度', '/article/batch/push', 'article:batchPush', 65, 2, 0, '', 1, '2018-10-28 15:15:00', '2018-10-28 15:15:00');

COMMIT;

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` varchar(20) NOT NULL COMMENT '角色id',
  `name` varchar(50) NOT NULL COMMENT '角色名称',
  `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
  `status` int(1) NOT NULL COMMENT '状态:1有效;2删除',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of role
-- ----------------------------
BEGIN;
INSERT INTO `role` VALUES (1, '1', '超级管理员', '超级管理员', 1, '2017-06-28 20:30:05', '2017-06-28 20:30:10');
INSERT INTO `role` VALUES (2, '2', '管理员', '管理员', 1, '2017-06-30 23:35:19', '2017-10-11 09:32:33');
INSERT INTO `role` VALUES (3, '3', '普通用户', '普通用户', 1, '2017-06-30 23:35:44', '2018-07-13 11:44:06');
INSERT INTO `role` VALUES (4, '4', '数据库管理员', '数据库管理员', 1, '2017-07-12 11:50:22', '2017-10-09 17:38:02');
COMMIT;

-- ----------------------------
-- Table structure for role_permission
-- ----------------------------
DROP TABLE IF EXISTS `role_permission`;
CREATE TABLE `role_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` varchar(20) NOT NULL COMMENT '角色id',
  `permission_id` varchar(20) NOT NULL COMMENT '权限id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1917 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of role_permission
-- ----------------------------
BEGIN;
INSERT INTO `role_permission` VALUES (1843, '1', '1');
INSERT INTO `role_permission` VALUES (1844, '1', '1000000602555213');
INSERT INTO `role_permission` VALUES (1845, '1', '1000000899091444');
INSERT INTO `role_permission` VALUES (1846, '1', '1000001038456544');
INSERT INTO `role_permission` VALUES (1847, '1', '1000000686545782');
INSERT INTO `role_permission` VALUES (1848, '1', '1000001642272578');
INSERT INTO `role_permission` VALUES (1849, '1', '1000000804049447');
INSERT INTO `role_permission` VALUES (1850, '1', '1000000488864959');
INSERT INTO `role_permission` VALUES (1851, '1', '1000000512435306');
INSERT INTO `role_permission` VALUES (1852, '1', '5.011629010561508e15');
INSERT INTO `role_permission` VALUES (1853, '1', '1000001729104792');
INSERT INTO `role_permission` VALUES (1854, '1', '1000000015836901');
INSERT INTO `role_permission` VALUES (1855, '1', '1000001439189167');
INSERT INTO `role_permission` VALUES (1856, '1', '1000001647995753');
INSERT INTO `role_permission` VALUES (1857, '1', '1000000841419865');
INSERT INTO `role_permission` VALUES (1858, '1', '1000000976625379');
INSERT INTO `role_permission` VALUES (1859, '1', '1000002127467055');
INSERT INTO `role_permission` VALUES (1860, '1', '1000001458372033');
INSERT INTO `role_permission` VALUES (1861, '1', '1000001832967209');
INSERT INTO `role_permission` VALUES (1862, '1', '1000000754923037');
INSERT INTO `role_permission` VALUES (1863, '1', '1000000759248744');
INSERT INTO `role_permission` VALUES (1864, '1', '1000000863853891');
INSERT INTO `role_permission` VALUES (1865, '1', '1000001264798222');
INSERT INTO `role_permission` VALUES (1866, '1', '1000000432183856');
INSERT INTO `role_permission` VALUES (1867, '1', '1000000919723998');
INSERT INTO `role_permission` VALUES (1868, '1', '1000000784272506');
INSERT INTO `role_permission` VALUES (1869, '1', '1000000215201942');
INSERT INTO `role_permission` VALUES (1870, '1', '1000001065007557');
INSERT INTO `role_permission` VALUES (1871, '1', '1000000431577803');
INSERT INTO `role_permission` VALUES (1872, '1', '1000000207002458');
INSERT INTO `role_permission` VALUES (1873, '1', '1000002051091207');
INSERT INTO `role_permission` VALUES (1874, '1', '1000000237721285');
INSERT INTO `role_permission` VALUES (1875, '1', '1000001238193773');
INSERT INTO `role_permission` VALUES (1876, '1', '1000001305005793');
INSERT INTO `role_permission` VALUES (1877, '1', '1000001679037501');
INSERT INTO `role_permission` VALUES (1878, '1', '1000001011730177');
INSERT INTO `role_permission` VALUES (1879, '1', '1000001312374743');
INSERT INTO `role_permission` VALUES (1880, '1', '1000001507480127');
INSERT INTO `role_permission` VALUES (1881, '1', '1000000224901858');
INSERT INTO `role_permission` VALUES (1882, '1', '1000001579533936');
INSERT INTO `role_permission` VALUES (1883, '1', '1000000663968031');
INSERT INTO `role_permission` VALUES (1884, '1', '1000000322655547');
INSERT INTO `role_permission` VALUES (1885, '1', '1000001419287014');
INSERT INTO `role_permission` VALUES (1886, '1', '1000002075182223');
INSERT INTO `role_permission` VALUES (1887, '1', '2');
INSERT INTO `role_permission` VALUES (1888, '1', '201');
INSERT INTO `role_permission` VALUES (1889, '1', '20101');
INSERT INTO `role_permission` VALUES (1890, '1', '20102');
INSERT INTO `role_permission` VALUES (1891, '1', '20103');
INSERT INTO `role_permission` VALUES (1892, '1', '20104');
INSERT INTO `role_permission` VALUES (1893, '1', '20105');
INSERT INTO `role_permission` VALUES (1894, '1', '20106');
INSERT INTO `role_permission` VALUES (1895, '1', '202');
INSERT INTO `role_permission` VALUES (1896, '1', '20201');
INSERT INTO `role_permission` VALUES (1897, '1', '20202');
INSERT INTO `role_permission` VALUES (1898, '1', '20203');
INSERT INTO `role_permission` VALUES (1899, '1', '20204');
INSERT INTO `role_permission` VALUES (1900, '1', '20205');
INSERT INTO `role_permission` VALUES (1901, '1', '20206');
INSERT INTO `role_permission` VALUES (1902, '1', '203');
INSERT INTO `role_permission` VALUES (1903, '1', '20301');
INSERT INTO `role_permission` VALUES (1904, '1', '20302');
INSERT INTO `role_permission` VALUES (1905, '1', '20303');
INSERT INTO `role_permission` VALUES (1906, '1', '20304');
INSERT INTO `role_permission` VALUES (1907, '1', '4');
INSERT INTO `role_permission` VALUES (1908, '1', '401');
INSERT INTO `role_permission` VALUES (1909, '1', '1000001992372345');
INSERT INTO `role_permission` VALUES (1910, '1', '1000002083579304');
INSERT INTO `role_permission` VALUES (1911, '1', '1000000171409776');
INSERT INTO `role_permission` VALUES (1912, '1', '1000000587822241');
INSERT INTO `role_permission` VALUES (1913, '1', '1000000493635111');
INSERT INTO `role_permission` VALUES (1914, '1', '1000000318760332');
INSERT INTO `role_permission` VALUES (1915, '1', '3');
INSERT INTO `role_permission` VALUES (1916, '1', '301');
COMMIT;

-- ----------------------------
-- Table structure for sys_config
-- ----------------------------
DROP TABLE IF EXISTS `sys_config`;
CREATE TABLE `sys_config` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sys_key` varchar(50) DEFAULT NULL COMMENT 'key',
  `sys_value` varchar(2000) DEFAULT NULL COMMENT 'value',
  `status` tinyint(4) DEFAULT '1' COMMENT '状态   0:隐藏   1:显示',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `key` (`sys_key`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='系统配置信息表';

-- ----------------------------
-- Records of sys_config
-- ----------------------------
BEGIN;
INSERT INTO `sys_config` VALUES (1, 'CLOUD_STORAGE_CONFIG', '{\"type\":1,\"qiniuDomain\":\"http://xxx.com\",\"qiniuPrefix\":\"img/blog\",\"qiniuAccessKey\":\"xxxAccessKey\",\"qiniuSecretKey\":\"xxxSecretKey\",\"qiniuBucketName\":\"blog\",\"aliyunDomain\":\"\",\"aliyunPrefix\":\"\",\"aliyunEndPoint\":\"\",\"aliyunAccessKeyId\":\"\",\"aliyunAccessKeySecret\":\"\",\"aliyunBucketName\":\"\",\"qcloudDomain\":\"\",\"qcloudPrefix\":\"\",\"qcloudSecretId\":\"\",\"qcloudSecretKey\":\"\",\"qcloudBucketName\":\"\",\"qcloudRegion\":\"\"}', 1, '云存储配置信息');
INSERT INTO `sys_config` VALUES (2, 'SITE_NAME', 'MC智能管理系統', 1, '网站名称');
INSERT INTO `sys_config` VALUES (3, 'SITE_KWD', 'Java JavaScript Spring SpringBoot Vue React', 1, '网站关键字');
INSERT INTO `sys_config` VALUES (4, 'SITE_DESC', '个人博客网站,技术交流,经验分享。', 1, '网站描述');
INSERT INTO `sys_config` VALUES (5, 'SITE_LOGO', 'http://localhost:8080/img/mc-cms-logo.jpg', 1, '站点logo');
INSERT INTO `sys_config` VALUES (6, 'SITE_PERSON_PIC', 'http://localhost:8080/img/mc-cms-logo.jpg', 1, '站长头像');
INSERT INTO `sys_config` VALUES (7, 'SITE_PERSON_NAME', 'MC智能管理系統', 1, '站长名称');
INSERT INTO `sys_config` VALUES (8, 'SITE_PERSON_DESC', 'MC智能管理系統,可以讓你智能管理機房/倉庫!', 1, '站长描述');
INSERT INTO `sys_config` VALUES (9, 'BAIDU_PUSH_URL', 'https://blog.csdn.net/mr_lili_1986?type=blog', 1, '博客地址');
COMMIT;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
create table user
(
    user_id         varchar(20)  not null comment '用户id',
    username        varchar(50)  not null comment '用户名',
    password        varchar(50)  not null,
    salt            varchar(128) null comment '加密盐值',
    nickname        varchar(50)  null comment '昵称',
    email           varchar(50)  null comment '邮箱',
    phone           varchar(50)  null comment '联系方式',
    sex             int(255)     null comment '年龄:1男2女',
    age             int(3)       null comment '年龄',
    img             varchar(255) null comment '头像地址',
    status          int(1)       not null comment '用户状态:1有效; 2删除',
    create_time     datetime     null comment '创建时间',
    update_time     datetime     null comment '更新时间',
    last_login_time datetime     null comment '最后登录时间',
    constraint user_user_id_uindex
        unique (user_id)
)
    charset = utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
BEGIN;
INSERT INTO `user` VALUES ('1', 'admin', '53911073f14abb1987905ff2ae66003d', '9524c5f3c8c886acd44ea01802121457', 'mc', '888@qq.com', '15666666666', 1, 22, 'http://localhost:8080/img/mc-cms-logo.jpg', 1, '2018-05-23 21:22:06', '2018-07-17 23:04:46', '2019-09-17 23:20:04');
COMMIT;

-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(20) NOT NULL COMMENT '用户id',
  `role_id` varchar(20) NOT NULL COMMENT '角色id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_role
-- ----------------------------
BEGIN;
INSERT INTO `user_role` VALUES (1, '1', '1');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

第七章 系统测试


一个系统设计好后,就会进入测试阶段,测试的目标是检验设计好的网站是否可以正常无误的运行,尽可能的发现网站的问题,已使后期网站投入使用后网站尽少出错。

7.1 测试定义


系统测试主要是判断系统是否可以正常运行,功能模块是否可以实现操作。程序代码中是否有错误出现。测试程序是开发过程中的一个主要问题。就算系统完成的再好,再进行程序测试时也会也会发现一个重来没有被发现的错误信息。

测试不仅是系统开发的开始,而且应该贯穿整个系统的整个生命周期。评估系统质量的方法不局限于系统编码和过程,应该与软件设计工作和历史需求分析密切相关。系统错误,不一定是代码错误,可能是阶段的设计摘要和设计细节存在问题,问题也可能出现在需求分析阶段[13]。从实际情况来看,最初的问题很可能是一个小错误,根据按钮的原理,按钮后的按钮位错将是所有位错。该系统的原因也同样适用,随着后续的开发工作,误差将越来越严重。因此就应该对系统进行测试,在一开始就发现系统中存在的问题,就能保证以后系统能够正常稳定的运行。在测试系统中,开发人员应该站在用户的角度来处理测试工作,而现在主要的测试方法是黑盒测试。测试的目的可以概括为以下几点:首先,用户界面和用户需求是一致的,设置界面和设计风格统一;第二,创新设计接口规范设计标准,具有独特的审美特征;最后,人类传统的接口以满足审美需求,不能盲目地追求一种独特的,合理的规划布局,符合审美标准。

7.2 测试目的


测试的目的在于要对系统的稳定和可操作性能进行对照检查。对于软件的开发利用最终的目的在最后的测试和试用,这是一个不可缺少的重要环节。对于软件开发者而言,在对每一个单独的功能进行编排时候,都要有单独的测试,并通过测试阶段才可以研发多个功能性软件,这样既缩短了研发时间,也可以在的单个的早期测试中发现问题,以免融合后的软件,在查找问题时就很难快速解决或者急速定位问题。

本系统开发设计完成后,需要对其进行系统测试,测试的主要目的就是发现并找出系统中存在的问题,并及时的进行解决,确保系统可以正常稳定的运行下去,在进行系统测试的时候,在一定要非常的认真、仔细,切记不能粗心,不能放过一个漏洞,测试时候一定不要着急,要按照之前指定好的测试步骤一步一步进行,并且将测试的结果进行详细的记录,我们在进行测试的时候做好选择自动化的测试,这样既可以节省时间而且也能确保测试的准确性,如果采用人工测试的方法就不会这么的方便,由于人工测试有很多不确定的因素,在测试过程中很可能会出现一些问题,用机器测试就不会出现任何的问题,而且机器不会疲惫会一直二等工作下去。在测试的时候一定要非常专注,时刻关注着测试的结果,一但发现异常及时进行修改,最后,测试完之后的文档应该保存下来,方便以后测试时用到。系统测试的方法有很多,对于本个人博客管理系统的测试,我们使用了测试用得最多的黑盒测试方法来对该系统进行测试。

7.3 测试方案


对测试计划的把握是测试方案的重中之重。所有的技术难点应该都被包含在这个测试计划之中。而且我们要保证能与目标形成一致性,以至于能够测试出一些主要存在的错误和一些错误的漏洞。可以完美解决这些问题就只有白盒测试或者黑盒测试[14]。

构造测试是白盒测试的另一个名字,了解与分析程序的结构以及性能功用的,从而我们可以得到最终想要的结果并且观察出是不是每一条程序都能得到。

性能测试是黑盒测试别称,程序本身的运作通过程序的进程来观察,主要是看一下程序是不是能够像我们预期的目标那样发展,看一看我们的程序最终能不能完整的得到我们最后想要的功能和储存想得到的数据,到最后看一下我们的这个程序完整性能不能达到要求。

(1)模块测试

单元测试就是模块测试,顾名思义就是测试每个模块所承担的功能是否能够实现,这个测试就是为了找出代码在实际的设计运转中某一些小的程序所出现的偏差,很好地改正这些错误,就说明我们模块测试进行很成功过。

(2)集成测试:

集成测试就是对系统的测试以及对他子系统的一些性能测试,他检查的事系统的包装程序信息。找出其中的问题。他的优势主要有以下这几点:

软件耗费较少。

可以提前发现端口的错误。

更好的地位系统中错误的位置。

从底部往上面进行的方案针对于偏下层的结构,而中间的结构就采用折中的方法。

(3)验收测试:

终于到了结尾性的工作了。就是为了给用户看一下我们的系统功能是否达到了预期的效果。我采用了性能测试也就是黑盒测试对系统进行测试。

其结果是分别是:

有一定的差异在用户的需求。

再者就是结果与之差不了多少。

到了最后了,我们发现的问题都是与用户的需求存在一定的关联。

1、登录测试

测试点:登录

测试的目标:输入账号密码以及验证码后系统会自动进行验证是否正确。

所用的环境:Windows10和IE浏览器。

输入信息:用户名、密码。

步骤:

(1)首先我们打来浏览器,进入该系统的登录界面。

(2)在进入页面登录部分以后可以进行对用户名、密码进行测试,具体测试输入情况如下表6.1所示。

表6.1 登录测试 

序号用户名输入密码输入期望结果
1155462192251244566提示“用户名或者密码错误,或账号未经审核”
2aaaaa123456提示“用户名或密码错误,或者账号未经审核”
315546219225hangguowei登陆成功

7.4 测试结论


在线学习交流平台按设计要求基本都可以达到,此系统具有完整的软件功能,良好的用户界面,能够正确的处理错误信息,而且能够准确的提出错误的种类。但是系统测试时也出现了一些系统的不足和缺陷,所以在今后的日子里我会对其视觉上的不足作出修改,其次系统的代码和数据库出现了非常多的冗余现象,都是因为对编程技术的应用不够熟练,在日后我会加强自己的自身学习和能力,减少这样的冗余现象。

经过对上述的测试结果分析,本系统无论是在技术方面,还是操作方面,还是经济方面都是完全可以实行的,并且经过测试,该系统操作简单,所有的功能都可以实现,因此该系统可以满足人们的使用需求,值得被推广。

总体说来,软件通过测试。 

第八章 结 论

本文研究了在线学习交流平台系统的设计与实现,在文章开端首先对个研究背景、研究现状和研究内容作了简单的介绍,然后通过系统分析,引申出本系统研究的主要内容。

通过对java语言、springboot框架和mysql数据库的简介,系统的说明了在线学习交流平台的设计与实现的可行性,本文结论及研究成果如下:实现了java与mysql相结合构建的在线学习交流平台,通过本次对在线学习交流平台的设计与实现的研究与实现,我感触到学习一门新技术,最重要的是实践,只有多动手才能尽快掌握它,一个系统的开发,经验是最重要的,经验不足,就难免会有许多考虑不周之处。要想吸引更多的用户,系统的界面必须要美观、有特色、友好,功能要健全。

由于在此之前对于java知识并不了解,所以从一开始就碰到许多困难,例如一开始的页面显示不规范、数据库连接有问题已经无法实现参数的传递等等,不过通过我不断的查阅相关的资料,以及向老师同学请教,最后出现的所有的问题都得到了解决,通过这次的系统开发,我学到了很多的知识,也明白了自己在哪些方面有不足的地方,尤其是学会如何从大量的信息中筛选出所需有用的信息,同时我更加深刻的体会到了,虽然书本上的大部分知识都是有价值,正确的,但实际上每个人编程的思路和对数据处理的方法、思想都是不同的,这就要求我们一定要通过实践才能找到解决问题的方案。在此次毕业设计活动中,我不断的提高了自己,也得到了宝贵的经验,我相信这些对我以后的发展都会有很大帮助。

通过这次对在线学习交流平台的开发,让我学到了更多的知识,同时通过这次系统的设计也让我明白了自己在哪方面有不足,以后加以学习争取可以开发住更多有用的适用的系统软件,本次系统的设计提高了我的编程水平,为了我今后系统的开发打下了结实的基础。 

参考文献
[1] 高永强.基于深度学习的个性化推荐研究[J].工业控制计算机,2021,34(10):90-92.
[2] 张安淇,李元旭.互联网知识共享平台信息过载效应与弱化机制——基于知乎的案例研究[J].
情报科学,2020,38(01):24-29+41.DOI:10.13833/j.issn.1007-7634.2020.01.004.
[3] Xiaoqin Shelley Zhang,Xiaojie Zhang,Pavan Kaparthi. Combat Information Overload Problem in
Social Networks With Intelligent Information-Sharing and Response Mechanisms[J]. IEEE
Transactions on Computational Social Systems,2020.
[4] 刘馨蔚.“它经济”升温 宠物吸金强劲[J].中国对外贸易,2021(04):54-55.
[5] 狗民网.2020 年中国宠物行业白皮书.
[6] Lou Feng,Ning Xin. E-Commerce Recommendation Technology Based on Collaborative
Filtering Algorithm and Mobile Cloud Computing[J]. Wireless Communications and Mobile
Computing,2022,2022.
[7] Goldberg D, Nichols D.A, Oki B.M, et al. Using collaborative filtering to weave an information
tapestry[J]. Communications of The ACM, 1992, 35(12): 61-70.
[8] Konstan J.A, Miller B.N, Maltz D.A, et al. GroupLens: Applying collaborative filtering to
Usenet news[J]. Communications of The ACM, 1997, 40(3): 77-87.
[9] Venture Beat [EB/OB]. htp:/venturebeat.comn/ [2009-04].
[10] He X, Deng K, Wang X, et al. LightGCN: Simplifying and Powering Graph Convolution
Network for Recommendation[C]. In ACM 2020.
[11] Wang Hulong,Shen Zesheng,Jiang Shuzhen,Sun Guang,Zhang Ren Jie. User-based
Collaborative Filtering Algorithm Design and Implementation[J]. Journal of Physics: Conference
Series,2021,1757(1).0
[12] 邓园园,吴美香,潘家辉.基于物品的改进协同过滤算法及应用[].计算机系统应用,
2019,28(01):184-189.
[13] Jena, Kalyan Kumar,Bhoi, Sourav Kumar,Mallick, Chittaranjan,Jena, Soumya Ranjan,Kumar,
Raghvendra,Long, Hoang Viet,Son, Nguyen Thi Kim. Neural model based collaborative filtering for
movie recommendation system[J]. International Journal of Information
Technology,2022(prepublish).
[14] Zhang Kaihan,Wang Zhiqiang,Liang Jiye,Zhao Xingwang. A Bayesian matrix factorization
model for dynamic user embedding in recommender system[J]. Frontiers of Computer
Science,2022,16(5).
[15] 吴青洋,程旭,邓程鹏,丁浩轩,张宏,林胜海.基于聚类和奖惩用户模型的协同过滤算法[J].计
算机系统应用,2020,29(08):135-143.DOI:10.15888/j.cnki.csa.007491.
[16] 陆文超,崔海朋.一种基于融合自编码与神经网络的协同过滤算法[J].中国水运(下半
月),2022,22(03):18-20.
[17] 王宁,沈正一,崔德龙,刘晴瑞.结合协同过滤与隐语义模型的视频推荐策略[J].湖南工程学院
学报(自然科学版),2021,31(04):40-43.DOI:10.15987/j.cnki.hgbjbz.2021.04.007.
[18] Thomas N. Kipf and Max Welling. Semi-Supervised Classification with Graph Convolutional
Networks. In ICLR.2017
[19] 张术梅.MVC架构下网站的设计与实现思考[J].信息记录材
料,2022,23(01):92-94.DOI:10.16009/j.cnki.cn13-1295/tq.2022.01.036.
[20] R.Karthik,T.S.Sridhar,R.Sriram. Digital Food ordering system based on Spring Framework[J].
International Journal of Recent Technology and Engineering (IJRTE),2020,8(6).
[21] 曹华山.SSM 框架在 Web 应用开发中的设计与实现[J].无线互联科技,2021,18(11):108-109.
[22] 胡世洋,赖森林.浅论SSM框架在构建“微农”信息服务中的应用[J].电脑知识与技
术,2021,17(34):4-6.DOI:10.14004/j.cnki.ckt.2021.3589.
[23] Di Lu,Yuping Qiu,Chun Qian,Xi Wang,Wei Tan. Design of Campus Resource Sharing
Platform based on SSM Framework[J]. IOP Conference Series: Materials Science and
Engineering,2019,490(6).
[24] Xiaojie Guo,Tingmei Wang*. Design and Implementation of Graduate Information
Management System Based on SSM Framework[J]. Journal of Simulation,2020,8(2).
[25] Feng Leijie,Mu Zehui. Research on Mobile Point Exchange System Based on Collaborative
Filtering Recommendation Algorithm[J]. International Journal of Advanced Network, Monitoring
and Controls,2021,6(2).
[26] 赖佳星.基于Bootstrap和JavaScript技术设计与实现简易Web计算器[J].科技资
讯,2022,20(01):13-16.DOI:10.16661/j.cnki.1672-3791.2110-5042-2874.
[27] Haokun Qi, Qingyang Feng , Junyan Zhang. Technology and analysis of JSP-based
merchandising system[J]. Scientific Journal of Intelligent Systems Research,2022,4(2).
[28] 周公平.基于jQuery框架的Web前端开发设计方法研究[J].信息与电脑(理论
版),2022,34(05):128-130.
[29] Liu Hongqing,Liu Yan. Research on Personalized Blog Customization System Based on
AJAX[C]//.Proceedings of 2018 5th International Conference on Electrical & Electronics
Engineering and Computer Science(ICEEECS 2018).,2018:136-139.
[30] 朱克武.Ajax技术在就业网站用户信息管理中的应用[J].电脑知识与技
术,2021,17(33):9-11.DOI:10.14004/j.cnki.ckt.2021.3303. 

致谢


在毕业设计的过程中,通过对在线学习交流平台的设计,我受益匪浅。在这段时间里,大学四年所学的知识得到了综合的运用,掌握了软件开发的基本方法,了解了当今软件开发的一些新技术。

本设计是在A老师的悉心指导和热情帮助下完成的。无论在理论上还是在实践中,老师都给予我很大的帮助,每当遇到困难时,老师总是耐心的给我讲解,老师认真负责的工作态度,让我敬佩。值此论文完成之际,特别向指导老师表示衷心的感谢和崇高的敬意,谢谢他细心而又耐心地辅导,使得我得以顺利的完成毕业设计开发工作,同时也要感谢其他帮助过我的老师和同学,他们在我完成设计过程中给予我很大的帮助,在此一并表示感谢。

在论文编写过程中,虽然反复推敲核证,但由于本人水平有限,加上时间紧促,本文一定有不少缺点和不足,恳请各位老师给予帮助和指正。

------------------------------------------------------------------ 

附一、论文参考:

附二、其他案例: 

 

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/782377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PB案例学习笔记】-29制作一个调用帮助文档的小功能

写在前面 这是PB案例学习笔记系列文章的第29篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

【Spring Boot】关系映射开发(三):多对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

Java_网络编程

网络通信的关键三要素 IP、端口号、协议 IP地址 IP地址&#xff08;Internet Protocol&#xff09;&#xff1a;全程“互联网协议地址”&#xff0c;是分配给上网设备的唯一标志。 IP地址有两种形式&#xff1a;IPv4、IPv6 InetAddress 代表IP地址 InetAddress 的常用方法…

【算法训练记录——Day42】

Day42——动态规划Ⅳ 1.leetcode_1049最后一块石头的重量II2.leetcode_494目标和3.leetcode_474一和零 1.leetcode_1049最后一块石头的重量II 思路&#xff1a;石头只能用一次。。。怎么才能让碰撞后重量最小呢&#xff0c;还要转换成动态规划&#xff0c;难以理解。。 看题解&…

J024_打印电影的全部信息

一、需求描述 展示多部电影的信息。 电影信息包括&#xff1a;电影名称、电影得分、电影票价格。 二、代码实现 2.1 Movie类 package com.itheima.collection;public class Movie {//电影名称private String name;//电影得分private int score;//电影票价格private double…

【Excel】输入内容自动添加边框线

1. 选中表格区域 → 新建条件规则 2. 设置公式 3. 设置格式 测试生效

[吃瓜教程]南瓜书第6章支持向量机

0.补充知识 0.1 超平面 定义&#xff1a; 超平面是指在&#x1d45b;维空间中&#xff0c;维度为 &#x1d45b;−1的子空间。它是分割空间的一个平面。 性质&#xff1a; n维空间的超平面 ( w T x b 0 , 其中 w , x ∈ R n ) (w^Tx_b0,其中w,x\in \mathbb R^n) (wTxb​0,其…

C++的set / multiset容器

一、介绍 C的set容器又被称为集合&#xff0c;所有元素在被插入后都会自动排序。 二、数据结构 set / multiset属于关联式容器&#xff0c;底层数据结构是用二叉树实现的。 其余的容器比如vector、deque和list等为序列式容器&#xff0c;因为他们底层使用线性序列结构&#xf…

Windows环境安装Redis和Redis Desktop Manager图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Redis概述 Redis是一个开源的高性能键值对数据库&#xff0c;以其卓越的读写速度而著称&#xff0c;广泛用于数据库、缓存和消息代理。它主要将数据存储在内存中&#xff0…

CISC和RISC指令集

文章目录 1. 指令集 2. CISC&#xff08;复杂指令集计算&#xff09; 3. RISC&#xff08;精简指令集计算&#xff09; 4. RISC的设计初衷 5. CISC和RISC流程对比 CISC&#xff08;复杂指令集计算&#xff09;的实现 RISC&#xff08;精简指令集计算&#xff09;的实现 …

【高中数学之函数】四种幂函数图线(二次、三次、开方、开立方)

【图像】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>UNASSIGNED</title><style type"text/css">.c…

【智能算法应用】灰狼算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#xff0c;可通…

基于pi控制的数字锁相环simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

基于MATLAB的PEF湍流风场生成器模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MATLAB的PEF湍流风场生成器模拟与仿真。PEF&#xff08;Primitive Equations Formulation&#xff09;湍流风场模型&#xff0c;是大气科学和气象学中用来描述大气流动和气…

咬文嚼字:词元是当今生成式人工智能失败的一个重要原因

生成式人工智能模型处理文本的方式与人类不同。了解它们基于"标记"的内部环境可能有助于解释它们的一些奇怪行为和顽固的局限性。从 Gemma 这样的小型设备上模型到 OpenAI 业界领先的 GPT-4o 模型&#xff0c;大多数模型都建立在一种称为转换器的架构上。由于转换器在…

subset使用

在R语言中&#xff0c;subset()函数用于从数据框中选择满足特定条件的观测。其语法如下&#xff1a; subset(x, subset, select, drop FALSE) 参数说明&#xff1a; x&#xff1a;数据框或矩阵。 subset&#xff1a;逻辑条件&#xff0c;用于筛选满足特定条件的行。 select…

Linux Bridge - Part 2

概览 在前一篇文章中&#xff0c;我描述了Linux 网桥&#xff08;bridge&#xff09;的配置&#xff0c;并展示了一个实验&#xff0c;其中使用Wireshark来分析流量。在本文中&#xff0c;我将讨论当创建一个网桥时会发生什么&#xff0c;以及Linux 网桥&#xff08;bridge&am…

给您介绍工控CAN总线

CAN是什么 CAN&#xff0c;全称Controller Area Network&#xff0c;即控制器局域网&#xff0c;是一种由Bosch公司在1983年开发的通信协议。它主要用于汽车和工业环境中的电子设备之间的通信。CAN协议定义了物理层和数据链路层的通信机制&#xff0c;使得不同的设备能够通过CA…

数据驱动的内容优化:Kompas.ai如何提升内容表现

在数字化营销时代&#xff0c;内容是企业与用户沟通的重要桥梁。然而&#xff0c;随着信息量的爆炸性增长&#xff0c;如何让内容在激烈的竞争中脱颖而出&#xff0c;成为每个营销人员面临的问题。数据驱动的内容优化策略&#xff0c;通过精准分析和科学决策&#xff0c;帮助品…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…