在实际的利用效果中,在线学习系统的意义如下:
第一点:在线学习系统的涌现,便是为了提高事情职员的效率,能够在规定韶光完成事情任务。
第二点:操作页面符合人体工程美学,符合日常人为操作习气,利用友好。

第三点:差异于传统用纸张记录,提高了信息化水平。
第四点:在信息处理方面,极大的降落了人工处理本钱。 ## 1.3 研究内容 本文对系统的描述过程将按照绪论,系统开拓技能,剖析,设计,实现,测试等环节进行展开先容。
绪论:本节内容紧张展示研究该系统的背景和意义。
系统开拓技能:本节内容紧张展示该系统开拓中须要利用的技能和搭建的开拓环境。
系统剖析:本节内容紧张便是剖析系统,包括性能,功能上的数据剖析,也包括可行性剖析等内容。
系统设计:本节内容紧张便是根据系统剖析的结果进行设计,紧张包括功能和数据库的设计。
系统实现:本节内容紧张便是通过程序编码对系统的功能进行实现,同时也对须要先容的功能进行界面运行效果的展示。
系统测试:本节内容紧张便是对系统的功能实现部分进行检测,创造系统的缺点并及时纠正,让系统能够担保运行无误。 # 2 系统开拓技能 对系统的开拓须要做好准备事情,个中安装开拓的工具以及学习开拓中须要利用的技能都是须要提提高行的,本节内容就对开拓中利用的工具还有技能进行阐述。 ## 2.1 MySQL数据库 本设计用到的数据库便是MySQL数据库,之以是用到这个数据库的缘故原由很多。首先,从知足功能需求上面来讲,MySQL是符合的;其次,从学习程度来讲,MySQL比较其他数据库不管是从安装还是利用上面来讲,都比较大略,最主要的是学习起来相称便捷,比较随意马虎入手;再次,MySQL数据库对电脑哀求不高,不管是什么样的电脑都可以安装MySQL数据库,并且并不会对电脑性能造成过多的影响。以是,就平常通俗俗通的电脑就可以作为开拓用的电脑,不须要进行额外的电脑升级。虽然自从MySQL数据库被Oracle数据库收购后,有了一些闭源的风险,但是利用者还是很多,MySQL数据库目前的开拓职员已经超过五百人了,对数据库开拓者来讲已经是一个很大的开拓团队了。MySQL在利用上面来讲,普通的增编削查操作已经可以知足大部分业务需求,像一些数据导出导入,以及一些函数,都可以知足一些不同的需求,最主要的是MySQL数据库可以创建索引,可以大大的提高数据的查询效率,当然,物极必反,如果由于索引好用而滥用,索引弄得比数据库表还要多,这样会造成MySQL数据库更新表数据时候的运行效率。总而言之,MySQL数据库在本次设计的利用上,是完备符合利用哀求的。 ## 2.2 IDEA简介 IDEA的出身在Java集成开拓工具行业正所谓平地起雷,瞬间震撼了全体Java开拓行业。真的是每个人用过的都说好。IDEA之以是比较于其他比如MyEclipse或者Eclipse之类的Java开拓工具来讲比较好,缘故原由首先在于设计方面。IDEA采取了所谓的人体工程学设计事理,让利用IDEA的职员用了就忘却不了。软件打开首先要设置主题,可以选择常规的白色或者暗色系列,永劫光的白色或者永劫光的暗色会让开发职员的眼睛疲倦加重,首先从这个细节就让程序开拓职员备受青睐,让程序员看着舒畅;然后再对一些常用性插件进行归类,让程序的开拓看重于提升生产效率,而不是一味的让开发者找各种插件,有时候插件之间的版本还会存在不兼容,IDEA就把兼容的插件双手呈现,如此知心的IDEA怎么能让人不喜好。以是选择IDEA用来开拓本项目就天经地义的了。 ## 2.3 SSM框架 最近几年盛行的SSM框架是之前的SSH框架的一种替代品,取代了原有的SSH框架的那种臃肿的配置,以及各种Bug,并且在开拓模式以及运行效率上面来讲,都是有了很大的提高。Spring是掌握层,Spring MVC是视图层,MyBatis是持久层。
在事理上面,SSM框架继续了SSH框架的那种框架以及代码分层设计,首先理解起来比较符合人类的正常理解,视图是卖力视图的掌握和显示,掌握层可以吸收和通报视图提交过来的信息,也可以吸收和通报持久层的数据信息,而持久层只须要对数据工具进行自动化的转换,给掌握层的数据是Java工具,到数据库则转换为相应的数据类型。
利用框架可以有效的办理各种代码写作过程中数据类型的转换问题,把数据类型转换让框架自己转换,写作很方便。 ## 2.4 Vue框架 Vue框架的开拓者是一个中国人,差异于其他框架的最核心的观点便是渐进式框架,Vue的涌现,让网页前真个开拓变成了一种纯前端职业,不须要在考虑后台数据类型以及业务逻辑,只须要进行数据绑定即可,大大的减少了前端开拓工程师的学习难度。Vue是当前世界上最火的一种前段框架,学习本钱比较低,只须要熟习最基本的网页知识就可以理解干系知识,并且有很好的免费教程进行学习,有各个国家措辞的教程,尤其是由于是中国人开拓的框架,让中国的高等程序开拓职员做了汉语教程。Vue框架发展之初便是高于IE8版本的,以是说只假如当前的主流浏览器都支持Vue框架,如果是很旧的那种电脑是不支持的,必须安装支持HTML5的浏览器才可以访问用Vue发布的站点。 # 3 系统剖析 对付在线学习系统开拓设计到的流程有,剖析系统的功能,设计系统的构造,设计数据库,编码以及测试,个中,在系统剖析中,所做的事情包括功能的确定,性能的剖析等。 ## 3.1 可行性研究 在线学习系统开拓实现剖析须要从不同的角度来进行剖析可行性,比如从韶光角度,经济角度,乃至操作角度。从不同的角度剖析可行性会让在线学习系统开拓详细化,进而达到辩证开拓的精确性。 ### 3.1.1 经济可行性 从经济方面剖析是第一要素,没有经济的支持,任何项目都如水中捞月,无法实现。实现在线学习系统,开拓过程不须要额外的经济条件,用本人现有的打算机就可以实现,这方面不须要额外的支出。 ### 3.1.2 韶光可行性 在线学习系统设计紧张作为毕业设计,在题目确定之后,答辩之前利用的项目,对不同的开拓进度上面都有韶光的哀求,总不至于答辩完成后才能实现功能,这个肯定弗成,以是从韶光上来剖析项目的事情量,创造是可行的,符合正常开拓韶光。 ### 3.1.3 操作可行性 操作必须符合正凡人的思维模式,市情上有很多符合哀求的程序正在利用中,可以借鉴其他程序的操作流程,变成符合本设计的操作流程,在操作上面进行无缝衔接,让利用者操作过程中不会感到迷茫。
从上面的角度来剖析,后续事情可以连续进展。 ## 3.2 系统性能剖析 性能剖析是软件开拓过程中必不可少的一个环节,紧张是为了降落软件在利用的过程中的容错率。常日来讲,剖析软件系统的性能一样平常从以下几个方面进行剖析。 ### 3.2.1 系统的安全性 系统开拓出来便是让正常利用的,那么在如今的互联网时期,首先考虑的便是安全性的问题。如果系统的安全性不足,那么利用代价就会降落。如果涌现利用过程中丢失数据,那么用户就不再相信,以是系统的安全性是第一要位,只有安全性存在了,才能考虑利用的问题,总不至于本日用户注册,来日诰日用户账号透露,这些都是不友好的。以是账号一样平常在数据库里存储会通过MD5进行加密,这样关键数据加密可以担保系统的安全性。 ### 3.2.2 系统的易用性 安全性剖析处理完毕,才考虑易用性。一个软件设计得符合操作规范,符合正凡人类的理解逻辑,那么在利用上面就会很舒畅,如果违背了这条原则,安全性再高的软件也是设计失落败的,毕竟软件开拓出来便是让人利用的,这一点尤为主要。 ### 3.2.3 系统的健壮性 系统设计易用不代表没有规则,那么系统设计利用方面必须健壮,必须符合软件处理逻辑。比如设计一个价格类的输入框,用户须要输入价格,那么可以设定输入框最多两位小数的纯数字输入,如果用户欠妥心输入了其他字符,那么就会友好的提示让用户修正精确,只有输入符合规范的数据,才能进行提交,并且存储到数据库里。系统的健壮性便是这样,越是规范,越是健壮,有助于用户理解,还有助于程序利用。 ## 3.3 系统流程剖析 系统设计不是胡乱的设计,必须符合软件设计思想,详细的流程参考下图。系统设计的前期便是做各种剖析,功能的设计,数据库的设计等,等统统都设计好了,逻辑上没有问题,符合设计流程和设计规范,才可以连续编码环节,编码只是实现设计的一个环节而已。
图3.1系统开拓流程图
用户是统统运用的根本,只要牵扯到用户,那么肯定须要用户进行注册,只有这样才能让注册的用户进行利用。如果用户没有注册,只能算是游客,那么只能访问一些大众用户可以浏览的信息,如果须要用户操作的部分是不许可访问的,这样能极大的担保用户的权利。用户注册流程用下面的图来表示,紧张是先判断用户名,只有用户名能用了才可以进行后面的信息注册。
图3.2 注册流程图
当须要用户登录的时候,肯定是要验证的,只有验证通过的用户才可以进行下一步操作,用户登录成功代表着用户模块的功能对登任命户进行了开放。流程便是如下面的图所示。
图3.3 登录流程图 ## 3.4 系统功能剖析 在对设计的总体哀求理解了之后,就要把哀求给详细化,也便是功能化,要只管即便的把每个功能模块和模块之前的关系理清楚,必须符合正凡人的行为逻辑才可以,并且只管即便研究同类型的项目,这样能避免走弯路,终极才能得到设计的详细功能。
在线学习系统把操作该系统的用户群分为三类,即管理员,西席,学生。
管理员对付在线学习系统操作的功能包括对西席,学生回答信息,教案信息,公告,作业,关照信息等信息进行管理。其用例图如图3.4所示:
图3.4 管理员用例图
西席对付在线学习系统操作的功能包括增编削查教案,关照信息,查看学生,管理作业,批改学生的作业回答信息,管理论坛等。其用例图如图3.5所示:
图3.5 西席用例图
学生对付在线学习系统操作的功能包括下载教案文件,查看公告和关照信息,下载作业,上传作业回答信息,查看作业回答批改信息等。其用例图如图3.6所示:
图3.6 学生用例图 # 4 系统设计 系统在设计的过程中,一定要遵照一定的原则才可以,胡乱设计是不可取的。首先用户在利用过程中,能够直不雅观感想熏染到功能操作的便利性,符合正常思维逻辑的操作,这才是系统好用的一个开端,给利用者第一印象便是这个别系设计的相称不错。 ## 4.1 系统设计原则 系统遵照设计原则进行开拓,会有很多可以预见到的好处,只要遵照了设计原则,那么开拓出来的系统一定是有质量担保的。
首先第一条原则便是安全性原则:程序必须设定角色管理,不同的角色有不同的功能模块,不同的角色登录都须要输入相对应的账号和密码,否则不许可进行操作相对应的权限。每个用户登录只能修正自己的密码,不须要对别的账号进行密码或者其他资料的修正,否则就违背了安全性原则的设定。
其次第二条原则便是易用性原则:符合安全性只是功能的符合,不代表操作就符合,以是要设定易用性原则。易用性原则便是规定程序符合操作流程,正凡人的思维定向为根本,在不违背程序运行逻辑定义的情形下,必须利用大略,操作规范,让每个用户利用起来都能看到页面,就能感知功能模块的浸染,短韶光的就能利用程序,达到易用效果。
再次第三条原则便是实用性原则:实用性代表着花里胡哨的功能必须抛弃,只管即便符合数据处理的简洁性,不仅须要这样进行设定,还须要有预知性,系统后期可能会涌现的功能模块只管即便要解耦,与程序设定要模块化表示,这样才能达到扩展性。
第四条原则便是准确性原则:准确性原则的唯一定义便是准确,包含数据输入格式的准确,数据处理的准确,以及数据存储的准确。程序里面关于数据准确才有存在的意义,如果一堆不相关的数据存在是没有任何用途的,乃至会产生各种问题,以是必须要担保数据的准确性。
第五条原则是易掩护原则:易掩护代表着程序运行必须是可控的状态,如果不可控涌现各种问题,那么所有的事情都是空谈。程序开拓中对付各种程序剖断非常,必须有统一的处理模式,非常是程序开拓中不可避免的,但是可以对涌现的非常进行抛出,有助于程序非常处理的复盘,只要每个非常都能定位准确,那么代表程序设计是趋于完美的,掩护起来会更加的方便,只要有助于程序掩护的都必须给予支持。 ## 4.2 功能模块设计 对管理员详细功能的设计结果将以图4.1所示的管理员功能构造图来进行表示。管理员对付在线学习系统操作的功能包括对西席,学生回答信息,教案信息,公告,作业,关照信息等信息进行管理。
图4.1 管理员功能构造图
对西席详细功能的设计结果将以图4.2所示的西席功能构造图来进行表示。西席对付在线学习系统操作的功能包括增编削查教案,关照信息,查看学生,管理作业,批改学生的作业回答信息,管理论坛等。
图4.2 西席功能构造图
对学生详细功能的设计结果将以图4.3所示的学生功能构造图来进行表示。学生对付在线学习系统操作的功能包括下载教案文件,查看公告和关照信息,下载作业,上传作业回答信息,查看作业回答批改信息等。
图4.3 学生功能构造图 ## 4.3 数据库设计 用户通过系统的功能操作来进行数据交互,包括数据的添加,数据的更新,数据的删除,数据的查询等基本功能操作,表面上虽然是操作系统界面供应的功能,但是实际上系统的这些数据是在数据库当中进行访问与操作的。目前市场上可供选择的存储数据的数据库有很多,除了大略版的Access之外,还有SQL Server,DB2,Informix,MySQL等关系型数据库可供选择,由于关系型数据库具有固定的表构造,以及对数据同等性哀求比较强,以是比较没有固定表构造以及具有灵巧的数据格式的非关系型数据库而言,在程序配套数据库的选择中,关系型数据库的利用率更高。本系统选择MySQL来存放数据,其干系理论以及技能在经由了很永劫光的发展之后,变得非常成熟,各大网络平台都公开分享其开拓源码,而且其对打算机的配置哀求很低,不须要过多内存进行安装,很符合本系统对付数据库的选择要求。 ### 4.3.1 数据库E-R图 本节须要对系统中存放在数据库中的数据进行充分剖析,对数据的实体,实体特色,联系等进行确定,然后通过观点模型的表示方法即E-R图进行表达,在E-R图绘制工具中,选择椭圆,菱形框,矩形等形状表达实体属性,实体间联系,实体这些信息,利用实线段将这些形状进行连接即可。初步完成E-R图之后,须要进行检讨,及时进行有误数据的变动,删除实体间存在的冗余联系,删除E-R图中冗余的数据,终极要展示一个内容准确的E-R图。
(1)教案包括的属性有教案名称,教案照片等。其属性图如下。
图4.4 教案实体属性图
(2)学生包括的属性有学生姓名,性别,班级等。其属性图如下。
图4.5 学生实体属性图
(3)作业包括的属性有作业名称,作业文件等。其属性图如下。
图4.6 作业实体属性图
(4)西席包括的属性有西席姓名,西席头像等。其属性图如下。
图4.7 西席实体属性图
(5)设计的各实体间关系E-R图如下。
图4.8 实体间关系E-R图 ### 4.3.2 数据库表构造 在指定的数据库里面对数据表进行创建命名,然后设计各个数据表的存储构造,须要对该数据库的操作非常熟习,并且还须要学习并节制一定的数据表设计方面的知识,比如数据命名,作为系统的开拓职员,为了避免程序运行产生乱码征象以及为了确保系统的正常运行,在对数据表进行命名时,一样平常都是采取英文名称,同时在对数据表的字段进行编辑时,也是采取英文的办法进行,为了方便今后对数据表的设计内容进行变动或查看,对一些比较主要的字段都会进行中文备注,或者是利用中文进行字段描述。设计期间,也须要对各个字段选择得当的数据类型以及设置匹配的取值范围,当一张数据表设计完成之后,还要对该表的主键进行标注,便是为了确保该数据表的唯一性与独立性。
表4.1 论坛表
字段
注释
类型
空
id (主键)
主键
int(11)
否
forum_name
帖子标题
varchar(200)
是
xuesheng_id
学生
int(11)
是
jiaoshi_id
西席
int(11)
是
users_id
管理员
int(11)
是
forum_content
发布内容
text
是
super_ids
父id
int(11)
是
forum_state_types
帖子状态
int(11)
是
insert_time
发帖韶光
timestamp
是
update_time
修正韶光
timestamp
是
create_time
创建韶光
timestamp
是
表4.2 回答表
字段
注释
类型
空
id (主键)
主键
int(11)
否
zuoye_id
作业
int(11)
是
xuesheng_id
学生
int(11)
是
huifu_file
回答文件
varchar(200)
是
huida_types
批改状态
int(11)
是
create_time
创建韶光
timestamp
是
表4.3 西席表
字段
注释
类型
空
id (主键)
主键
int(11)
否
username
账户
varchar(200)
是
password
密码
varchar(200)
是
jiaoshi_name
西席姓名
varchar(200)
是
jiaoshi_phone
西席手机号
varchar(200)
是
jiaoshi_photo
西席头像
varchar(200)
是
sex_types
性别
int(11)
是
jiaoshi_email
电子邮箱
varchar(200)
是
create_time
创建韶光
timestamp
是
表4.4 教案表
字段
注释
类型
空
id (主键)
主键
int(11)
否
jiaoshi_id
西席
int(11)
是
kecheng_name
教案名称
varchar(200)
是
kecheng_photo
教案照片
varchar(200)
是
kecheng_file
教案
varchar(200)
是
kecheng_types
教案类型
int(11)
是
kecheng_clicknum
点击次数
int(11)
是
kecheng_delete
逻辑删除
int(11)
是
kecheng_content
教案先容
text
是
create_time
创建韶光
timestamp
是
表4.5 公告信息表
字段
注释
类型
空
id (主键)
主键
int(11)
否
news_name
公告标题
varchar(200)
是
news_types
公告类型
int(11)
是
news_photo
公告图片
varchar(200)
是
insert_time
添加韶光
timestamp
是
news_content
公告详情
text
是
create_time
创建韶光
timestamp
是
表4.6 关照信息表
字段
注释
类型
空
id (主键)
主键
int(11)
否
jiaoshi_id
西席
int(11)
是
tongzhi_name
关照标题
varchar(200)
是
tongzhi_types
关照类型
int(11)
是
tongzhi_photo
关照图片
varchar(200)
是
insert_time
添加韶光
timestamp
是
tongzhi_content
关照详情
text
是
create_time
创建韶光
timestamp
是
表4.7 管理员表
字段
注释
类型
空
id (主键)
主键
bigint(20)
否
username
用户名
varchar(100)
否
password
密码
varchar(100)
否
role
角色
varchar(100)
是
addtime
新增韶光
timestamp
否
表4.8 学生表
字段
注释
类型
空
id (主键)
主键
int(11)
否
username
账户
varchar(200)
是
password
密码
varchar(200)
是
xuesheng_name
学生姓名
varchar(200)
是
xuesheng_phone
学生手机号
varchar(200)
是
xuesheng_id_number
学生身份证号
varchar(200)
是
xuesheng_photo
学生头像
varchar(200)
是
banji_types
班级
int(11)
是
sex_types
性别
int(11)
是
xuesheng_email
电子邮箱
varchar(200)
是
create_time
创建韶光
timestamp
是
表4.9 作业表
字段
注释
类型
空
id (主键)
主键
int(11)
否
jiaoshi_id
西席
int(11)
是
banji_types
班级
int(11)
是
zuoye_uuid_number
作业唯一编号
varchar(200)
是
zuoye_name
作业名称
varchar(200)
是
zuoye_types
作业类型
int(11)
否
insert_time
作业发布韶光
timestamp
是
zuoye_file
作业文件
varchar(200)
是
zuoye_content
作业详情
text
是
create_time
创建韶光
timestamp
是
打开新的 phpMyAdmin 窗口
5 系统实现下面紧张是通过功能实现界面截图的形式,并且利用笔墨来描述功能实现界面的内容。 ## 5.1 管理员功能实现 ### 5.1.1 西席管理 该功能紧张用于实现对西席基本信息的管理,西席管理界面的运行效果见图5.1。在此界面,管理员添加或修正西席的姓名,性别,西席手机号等信息,可以对指定西席的账户重置密码。
图5.1 西席管理界面 ### 5.1.2 论坛管理 该功能紧张用于实现对论坛基本信息的管理,论坛管理界面的运行效果见图5.2。在此界面,在此界面,管理员可以查看论坛帖子的标题和论坛帖子的内容,可以删除传播不良信息的论坛帖子,可以通过论坛回答功能及时跟踪论坛回帖信息以及及时删除传播不良信息的回帖数据。
图5.2 论坛管理界面 ### 5.1.3 公告信息管理 该功能紧张用于实现对公告基本信息的管理,公告信息管理界面的运行效果见图5.3。在此界面,管理员参与公告的发布与掩护,而公告信息让西席和学生查看。
图5.3 公告信息管理界面 ## 5.2 西席功能实现 ### 5.2.1 回答管理 回答管理界面的运行效果见图5.4。在此界面,西席下载学生的回答文件,并对未批改的回答信息进行批改,已经批改的回答信息可以查看其详情。
图5.4 回答管理界面 ### 5.2.2 作业管理 该功能紧张用于实现对作业基本信息的管理,作业管理界面的运行效果见图5.5。在此界面,西席上传作业文件,登记作业信息。已发布的作业信息支持西席下载文件以及查看详情。
图5.5 作业管理界面 ### 5.2.3 教案管理 该功能紧张用于实现对教案基本信息的管理,教案管理界面的运行效果见图5.6。在此界面,西席上传教案文件,登记教案基本信息,包括教案照片,教案类型,教案名称等信息。创造有缺点数据的教案信息可以及时修正,以及对须要删除的教案及时删除。
图5.6 教案管理界面 ### 5.2.4 关照信息管理 关照信息管理界面的运行效果见图5.7。在此界面,西席新增关照信息,以及对须要变动的关照信息,包括关照图片,关照标题等进行修正。
图5.7 关照信息管理界面 ## 5.3 学生功能实现 ### 5.3.1 在线论坛 在线论坛界面的运行效果见图5.8。在此界面,学生查看在线论坛界面展示的所有的帖子内容,每当学生查看完帖子内容之后,学生可以评论帖子。
图5.8 在线论坛界面 ### 5.3.2 教案信息 教案信息界面的运行效果见图5.9。在此界面,学生查看教案的先容信息,学生点击教案下载链接就可以下载教案文件。
图5.9 教案信息界面
5.3.3 作业管理作业管理界面的运行效果见图5.10。在此界面,学生查询作业,查询作业须要选择查询办法查询,如果选择根据作业名称查询,学生须要在作业名称阁下的查询编辑框中登记作业名称,然后点击查询按钮进行查询,学生也能下载作业文件。
图5.10 作业管理界面 ### 5.3.4 回答管理 回答管理界面的运行效果见图5.11。在此界面,学生紧张是上传作业的回答文件,学生上传回答文件之后,就可以等待西席批改作业。学生也须要在此界面查看西席是否批改学生的作业回答信息。
图5.11 回答管理界面 # 系统
MPUtil.javapackage com.utils;import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.apache.commons.lang3.StringUtils;import cn.hutool.core.bean.BeanUtil;import com.baomidou.mybatisplus.mapper.Wrapper;/ Mybatis-Plus工具类 /public class MPUtil { public static final char UNDERLINE = '_'; //mybatis plus allEQ 表达式转换 public static Map allEQMapPre(Object bean,String pre) { Map<String, Object> map =BeanUtil.beanToMap(bean); return camelToUnderlineMap(map,pre); } //mybatis plus allEQ 表达式转换 public static Map allEQMap(Object bean) { Map<String, Object> map =BeanUtil.beanToMap(bean); return camelToUnderlineMap(map,""); } public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) { Map<String, Object> map =BeanUtil.beanToMap(bean); Map result = camelToUnderlineMap(map,pre); return genLike(wrapper,result); } public static Wrapper allLike(Wrapper wrapper,Object bean) { Map result = BeanUtil.beanToMap(bean, true, true); return genLike(wrapper,result); } public static Wrapper genLike( Wrapper wrapper,Map param) { Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); int i=0; while (it.hasNext()) { if(i>0) wrapper.and(); Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); String value = (String) entry.getValue(); wrapper.like(key, value); i++; } return wrapper; } public static Wrapper likeOrEq(Wrapper wrapper,Object bean) { Map result = BeanUtil.beanToMap(bean, true, true); return genLikeOrEq(wrapper,result); } public static Wrapper genLikeOrEq( Wrapper wrapper,Map param) { Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); int i=0; while (it.hasNext()) { if(i>0) wrapper.and(); Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); if(entry.getValue().toString().contains("%")) { wrapper.like(key, entry.getValue().toString().replace("%", "")); } else { wrapper.eq(key, entry.getValue()); } i++; } return wrapper; } public static Wrapper allEq(Wrapper wrapper,Object bean) { Map result = BeanUtil.beanToMap(bean, true, true); return genEq(wrapper,result); } public static Wrapper genEq( Wrapper wrapper,Map param) { Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); int i=0; while (it.hasNext()) { if(i>0) wrapper.and(); Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); wrapper.eq(key, entry.getValue()); i++; } return wrapper; } public static Wrapper between(Wrapper wrapper,Map<String, Object> params) { for(String key : params.keySet()) { String columnName = ""; if(key.endsWith("_start")) { columnName = key.substring(0, key.indexOf("_start")); if(StringUtils.isNotBlank(params.get(key).toString())) { wrapper.ge(columnName, params.get(key)); } } if(key.endsWith("_end")) { columnName = key.substring(0, key.indexOf("_end")); if(StringUtils.isNotBlank(params.get(key).toString())) { wrapper.le(columnName, params.get(key)); } } } return wrapper; } public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) { String order = ""; if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) { order = params.get("order").toString(); } if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) { if(order.equalsIgnoreCase("desc")) { wrapper.orderDesc(Arrays.asList(params.get("sort"))); } else { wrapper.orderAsc(Arrays.asList(params.get("sort"))); } } return wrapper; } / 驼峰格式字符串转换为下划线格式字符串 @param param @return / public static String camelToUnderline(String param) { if (param == null || "".equals(param.trim())) { return ""; } int len = param.length(); StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len; i++) { char c = param.charAt(i); if (Character.isUpperCase(c)) { sb.append(UNDERLINE); sb.append(Character.toLowerCase(c)); } else { sb.append(c); } } return sb.toString(); } public static void main(String[] ages) { System.out.println(camelToUnderline("ABCddfANM")); } public static Map camelToUnderlineMap(Map param, String pre) { Map<String, Object> newMap = new HashMap<String, Object>(); Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); String newKey = camelToUnderline(key); if (pre.endsWith(".")) { newMap.put(pre + newKey, entry.getValue()); } else if (StringUtils.isEmpty(pre)) { newMap.put(newKey, entry.getValue()); } else { newMap.put(pre + "." + newKey, entry.getValue()); } } return newMap; }}
NewsController.java
package com.controller;import java.io.File;import java.math.BigDecimal;import java.net.URL;import java.text.SimpleDateFormat;import com.alibaba.fastjson.JSONObject;import java.util.;import org.springframework.beans.BeanUtils;import javax.servlet.http.HttpServletRequest;import org.springframework.web.context.ContextLoader;import javax.servlet.ServletContext;import com.service.TokenService;import com.utils.;import java.lang.reflect.InvocationTargetException;import com.service.DictionaryService;import org.apache.commons.lang3.StringUtils;import com.annotation.IgnoreAuth;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.;import com.baomidou.mybatisplus.mapper.EntityWrapper;import com.baomidou.mybatisplus.mapper.Wrapper;import com.entity.;import com.entity.view.;import com.service.;import com.utils.PageUtils;import com.utils.R;import com.alibaba.fastjson.;/ 公告信息 后端接口 @author @email/@RestController@Controller@RequestMapping("/news")public class NewsController { private static final Logger logger = LoggerFactory.getLogger(NewsController.class); @Autowired private NewsService newsService; @Autowired private TokenService tokenService; @Autowired private DictionaryService dictionaryService; //级联表service @Autowired private XueshengService xueshengService; @Autowired private JiaoshiService jiaoshiService; / 后端列表 / @RequestMapping("/page") public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永不会进入"); else if("学生".equals(role)) params.put("xueshengId",request.getSession().getAttribute("userId")); else if("西席".equals(role)) params.put("jiaoshiId",request.getSession().getAttribute("userId")); if(params.get("orderBy")==null || params.get("orderBy")==""){ params.put("orderBy","id"); } PageUtils page = newsService.queryPage(params); //字典表数据转换 List<NewsView> list =(List<NewsView>)page.getList(); for(NewsView c:list){ //修正对应字典表字段 dictionaryService.dictionaryConvert(c, request); } return R.ok().put("data", page); } / 后端详情 / @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id, HttpServletRequest request){ logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); NewsEntity news = newsService.selectById(id); if(news !=null){ //entity转view NewsView view = new NewsView(); BeanUtils.copyProperties( news , view );//把实体数据重构到view中 //修正对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } / 后端保存 / @RequestMapping("/save") public R save(@RequestBody NewsEntity news, HttpServletRequest request){ logger.debug("save方法:,,Controller:{},,news:{}",this.getClass().getName(),news.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永久不会进入"); Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>() .eq("news_name", news.getNewsName()) .eq("news_types", news.getNewsTypes()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); NewsEntity newsEntity = newsService.selectOne(queryWrapper); if(newsEntity==null){ news.setInsertTime(new Date()); news.setCreateTime(new Date()); newsService.insert(news); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } / 后端修正 / @RequestMapping("/update") public R update(@RequestBody NewsEntity news, HttpServletRequest request){ logger.debug("update方法:,,Controller:{},,news:{}",this.getClass().getName(),news.toString()); String role = String.valueOf(request.getSession().getAttribute("role"));// if(false)// return R.error(511,"永久不会进入"); //根据字段查询是否有相同数据 Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>() .notIn("id",news.getId()) .andNew() .eq("news_name", news.getNewsName()) .eq("news_types", news.getNewsTypes()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); NewsEntity newsEntity = newsService.selectOne(queryWrapper); if("".equals(news.getNewsPhoto()) || "null".equals(news.getNewsPhoto())){ news.setNewsPhoto(null); } if(newsEntity==null){ newsService.updateById(news);//根据id更新 return R.ok(); }else { return R.error(511,"表中有相同数据"); } } / 删除 / @RequestMapping("/delete") public R delete(@RequestBody Integer[] ids){ logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString()); newsService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); } / 批量上传 / @RequestMapping("/batchInsert") public R save( String fileName, HttpServletRequest request){ logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { List<NewsEntity> newsList = new ArrayList<>();//上传的东西 Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 Date date = new Date(); int lastIndexOf = fileName.lastIndexOf("."); if(lastIndexOf == -1){ return R.error(511,"该文件没有后缀"); }else{ String suffix = fileName.substring(lastIndexOf); if(!".xls".equals(suffix)){ return R.error(511,"只支持后缀为xls的excel文件"); }else{ URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径 File file = new File(resource.getFile()); if(!file.exists()){ return R.error(511,"找不到上传文件,请联系管理员"); }else{ List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 dataList.remove(0);//删除第一行,由于第一行是提示 for(List<String> data:dataList){ //循环 NewsEntity newsEntity = new NewsEntity();// newsEntity.setNewsName(data.get(0)); //公告标题 要改的// newsEntity.setNewsTypes(Integer.valueOf(data.get(0))); //公告类型 要改的// newsEntity.setNewsPhoto("");//详情和图片// newsEntity.setInsertTime(date);//韶光// newsEntity.setNewsContent("");//详情和图片// newsEntity.setCreateTime(date);//韶光 newsList.add(newsEntity); //把要查询是否重复的字段放入map中 } //查询是否重复 newsService.insertBatch(newsList); return R.ok(); } } } }catch (Exception e){ e.printStackTrace(); return R.error(511,"批量插入数据非常,请联系管理员"); } } / 前端列表 / @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){ logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 没有指定排序字段就默认id倒序 if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){ params.put("orderBy","id"); } PageUtils page = newsService.queryPage(params); //字典表数据转换 List<NewsView> list =(List<NewsView>)page.getList(); for(NewsView c:list) dictionaryService.dictionaryConvert(c, request); //修正对应字典表字段 return R.ok().put("data", page); } / 前端详情 / @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") Long id, HttpServletRequest request){ logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); NewsEntity news = newsService.selectById(id); if(news !=null){ //entity转view NewsView view = new NewsView(); BeanUtils.copyProperties( news , view );//把实体数据重构到view中 //修正对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } / 前端保存 / @RequestMapping("/add") public R add(@RequestBody NewsEntity news, HttpServletRequest request){ logger.debug("add方法:,,Controller:{},,news:{}",this.getClass().getName(),news.toString()); Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>() .eq("news_name", news.getNewsName()) .eq("news_types", news.getNewsTypes()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); NewsEntity newsEntity = newsService.selectOne(queryWrapper); if(newsEntity==null){ news.setInsertTime(new Date()); news.setCreateTime(new Date()); newsService.insert(news); return R.ok(); }else { return R.error(511,"表中有相同数据"); } }}
CommonUtil.java
package com.utils;import java.util.Random;public class CommonUtil { / 获取随机字符串 @param num @return / public static String getRandomString(Integer num) { String base = "abcdefghijklmnopqrstuvwxyz0123456789"; Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < num; i++) { int number = random.nextInt(base.length()); sb.append(base.charAt(number)); } return sb.toString(); }}
store.js
声明
本博客适用于广泛的学术和教诲用场,包括但不限于个人学习、开拓设计,产品设计。仅供学习参考,旨在为读者供应深入理解和学术研究的材料。
java系统设计,毕设辅导