@TOC
springboot626学生信息管理系统_06bg9--论文
第一章 绪 论
1.1研究背景
随着社会和经济的快速发展,信息技术已经迈入了新一代人工智能时代,人类的生活水平也随之水涨船高。随着计算机和互联网的广泛应用,人类对于使用智能技术进行信息管理的能力也越来越强。纵观全球,目前各大企事业单位逐步引入了多计算机技术。因工作种类繁多,工作繁杂,要确保各层次工作能顺利、有条不紊地进行,必须要建立一个管理制度。为了使这一问题得到更好的解决,一个功能强大、使用方便、操作简便、人性化的学生信息管理系统应运而生。随着网络的快速普及,使得学生信息管理系统可以被全面、广泛的运用。它使得传统的管理系统向电子化、智能化、综合化方向发展,实现集中管理、分散操作、共享信息。
随着信息化的不断发展,科技的进步也越来越大。软件编程是一个不断发展的行业,每个行业都必须进行适合自身特点的系统开发,才能在机构中生存和发展。当前,随着学生规模的不断扩大,学生信息数量不断增多,学生信息在管理和维护上都遇到了巨大的困难。因此,学生信息管理的工作是一个重要内容。同时,对学生信息进行有效地管理和维护,可以降低管理者的工作负担、提高工作效率。因此,要根据我国的国情,建立适合我国国情的学生信息管理制度。
在我国,随着时代的发展,各个地区都在积极探索与实践,并取得了一定的成效。当前,在借鉴国外先进的信息管理方式后,根据自己的实际情况,进行了一系列的现代化管理。
比如,学生信息管理制度。从我国现阶段的信息化建设来看,当前的用户信息保存和更新仍有很多问题。由于计算机网络形态多样,分布不均,容易受到病毒、黑客等攻击。所以,加强对学生信息管理体系的维护是非常必要的。
1.2研究目的及意义
传统的学生信息管理,都是依靠人力来完成的,比如更改联系方式、更改个人信息、课程信息等输入和查询,这些都是由管理员手工完成的。每天要处理的学生信息数不胜数,海量的信息资料都是以传统的纸质文件形式存在的,既浪费了大量的人力、物力、空间,又给管理员,用户和学生信息带来了极大的不便。海量的信息资料、分类、工作考察的详细程度,都在不断地推动着一种更加快速、高效的信息管理方法。
通过对计算机和互联网的综合化管理,实现了一个统一管理、独立操作、共享平台的智能化管理系统,相较于人工操作,学生信息管理系统不但可以保证数据的完整性和可读性,还可以防止人为失误操作造成的信息丢失,同时,合理地设定系统的权限,管理员要处理的信息也越来越多,这就给管理员的工作带来了很大的难度。学生的数量越来越多,学生信息的分类也越来越精细,若不引入智能化的资讯管理,会耗费大量的人力、时间、金钱,并会造成整体的工作效率下降。
纵观当今社会,大部分产业都是通过资讯科技与网络来发展,这不单单符合现代人的生活节奏,更是促进了全球资讯的即时互动,让人类的眼界从宽度、广度上,都得到了极大的提升。随着这一系统在学生信息的广泛应用和推广,必将大大提高学生信息管理的效率。用户资料在电脑或手机上均可查阅,并能充分保障资讯的时效性与效率。对管理者来说,利用该系统可以使他们的工作更加方便、快捷、高效。对用户而言,通过即时获得学生信息,可以更好地促进他们的自主性和自觉性。电子化的环境办公在高校迅速推广,反映了学界积极响应国家号召与国际接轨的现状。
1.3研究方法
该系统能有效地管理学生信息,包括基本信息的输入、添加、修改、删除、查询、打印等。本文从理论上对学生信息人力资源进行了优化,并对其进行了科学地管理。目前的问题主要有:一是发展的难点在于开发流程的不熟练;二是程序代码太多,无法准确地表述;三是在调试中,存在着一定的误差。解决方法就是在参考文献和网络资源的基础上,完善该系统的开发流程;还有多与老师沟通,并在老师的协助下纠正错误[4]。
第二章 开发平台及环境简介
2.1java技术
Java是一种面向对象的静态式编程语言。Java编程语言具有多线程和对象定向的特点。其特点是根据方案的属性将方案分为几个不同的模块,这些模块是封闭的和多样化的,在申请过程中具有很强的独立性。Java语言在计算机软件开发过程中的运用可以达到交互操作的目的,通过各种形式的交换,可以有效地处理所需的数据,从而确保计算机软件开发的可控性和可见性。开发Java语言时,保留了网络接口,Java保留的缺省网络接口可以与web应用程序编程所依赖的类别库相匹配。为了使Java开发的应用程序更加稳定和强健,Java会自动收集程序中的垃圾,并处理程序中存在的异常。Java语言是日常开发过程中广泛使用的通用基本语言。其中Java语言课程库、句子、语法规则和关键字经常用于计算机软件的开发和编程。
2.2 SpringBoot框架
Spring Boot是由Pivotal团队提供的轻量级框架,其“开箱即用”及“约定优于配置”的策略可以使开发者全身心的投入到业务逻辑代码的编写中,极大地提高了软件开发项目的效率。相比于Spring框架而言,Spring Boot框架更加能够节省程序员配置XML的时间,Spring Boot项目允许开发者使用它的所有模块和开发功能,此外, Spring Boot内置了服务器,简化了开发者启用服务器的整体流程,Spring Boot还可以自动适配不同类型的数据库以满足用户快速连接后台数据库管理的需求,这极大地方便了用户快速搭建应用程序的实现过程。 2014年4月,Spring Boot 1.0.0发布,截止到2022年2月,发布的Spring Boot版本为Spring Boot 3.0.0-M1。在系统的设计与开发中,为了能够快速搭建软件后台服务的开发环境,从技术实现的难度以及平台开发的成本两个方面考虑,Spring Boot框架能够使开发者更关注平台功能的业务逻辑代码实现,可采用Spring Boot框架搭建系统为前端电子商城App提供数据服务。因此,本案例项目后台开发选择Spring Boot框架。
2.3 MySQL数据库
MySQL是一个小型,廉价,快速的开源数据库。本系统对大量的数据进行了全面的支持,可以同时处理数百万的数据,在调试、管理、优化等方面都有较大的优势。它支持 SQL语句的通用规格,使用非常灵活和安全的授权和口令。虽然 Sql服务器易于使用,并且可以存储大量的数据,但是它比 MS Sql服务器要好得多。但是在网络连接的速度上,无法实现实时、高效的目的。因此,尽管 MySql有很大的缺陷,但是它的可移植性,支持多线程,优化查询算法,这使得 MySql在个人和中小型企业中非常流行[8]。
2.4 B/S体系结构介绍
B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器,如Chrome、Safari、Microsoft Edge、Netscape Navigator或Internet Explorer,服务器安装SQL Server、Oracle、MYSQL等数据库。浏览器通过Web Server同数据库进行数据交互。
第三章 系统分析
3.1可行性分析
3.1.1技术可行性
由于整个系统都是以网页形式呈现在使用者面前,因此必须要有一个安全的网络环境。本系统基于目前大学校园网络的快速发展与普及,为学生在有限的条件下,提供了便捷、快速的资源查询服务。采用java技术实现了用户与用户之间的动态互动, MySQL支持多种用户使用权限,满足了中、高数据需求。
因此,从技术上讲,本系统是可行的。
3.1.2经济可行性
现在计算机的性能有了很大的提高,而且它的平均售价已经很低了。从学校的经济情况和投资回报来看,通过比较硬件设施和运行费用,可以从更长期的角度来衡量。主要体现在:一是节省人力、物力;第二,减少人力资源管理中可能存在的错误;第三,全面提高了用户的工作效率;第四,方便个人查询、更改信息。
因而,本系统具有一定的经济性。
3.1.3操作可行性
该系统具有体积小、占地少、能耗低等特点。学校电脑和校园网络均能满足需求。该系统具有操作简便、直观、易于操作的特点。操作简单,快速,只要经过简单的训练,就能让管理者使用。
因此,该系统不仅在操作上可行,而且在实际应用中也是可行的。
3.2需求分析
在项目开发中,需求分析是进行项目设计和实施的先决条件也是基础。开发者应全面理解和全面分析,并按照使用者的要求,对其进行细致的工作,并具体说明需要完成的工作。在此阶段,系统如何完成工作是不重要的,你只需确认系统正在执行什么工作就可以了。
只要确定该工作是什么,就可以知道该系统是怎么工作的。学生信息管理系统的用户是管理员、教师和学生三个角色,为了满足现代社会对环保和节约的需要,将传统的纸质文档通过计算机输入计算机并以电子文档的方式显示出来。管理员要负责许多方面的工作,因此,要建立一个简单、直观的查询渠道,并设定特定的存取权限,以保证学生信息工作的顺畅和高效。此外,要实现对用户的直接管理,便于用户的个人信息的集中存储与管理。
用户个人资料的查询和修改,将会对所有用户的个人资料进行增、删、改、查:第一,使用者输入使用者的用户名、密码,将会进行存在性与及耦合性检查,并于使用者登入系统时,进行身份验证,以避免因非使用者操作或其它违规行为而造成的非法登录行为;第二,进入该界面后,可以查询、更改自己的信息。
管理员功能:第一、在网站的后台,管理员可以对教师和学生的个人资料进行全面的管理,如增添、修改、删除、查询等。
系统的运行过程:通过对学生信息管理体系的分析和对比,并结合实际情况提出了一些建议。
采用面向对象的思维方式,以符合实际的功能与性能要求,并进行了创新。为了提升学生信息管理的自动化和友善性的学生信息管理系统。
本文提出了一种基于面向对象的思想方法,以适应系统的实际功能与性能要求。为了使学生信息管理更具自动化和亲和力,在对学生信息进行简单的需求分析之后,将其分为三大功能模块,分别为管理员、教师和学生。其用例如下:
图3-1 管理员用例图
图3-2 教师用例图
图3-3 学生用例图
3.3系统流程的分析
3.3.1 登录流程
登录流程如图3-4所示:
图3-4 登录流程
3.3.2系统操作流程
系统操作流程如图3-5所示:
图3-5 系统操作流程图
第四章 系统设计
4.1总体功能设计
根据上文中对用户需求的一系列综合细致的分析,针对本学生信息管理系统,得到一个如图4-1所示的宏观的总体功能结构图。
图4-1 系统功能结构图
4.2 数据库E-R图设计
ER图是由实体及其关系构成的图,通过E/R图可以清楚地描述系统涉及到的实体之间的相互关系。在系统中对一些主要的几个关键实体如下图:
1、公告通知实体图如图4-2所示:
图4-2:公告通知实体图
2、选课信息实体图如图4-3所示:
图4-3选课信息实体图
3、毕业信息实体图如图4-4所示:
图4-4毕业信息实体图
4、课程信息实体图如图4-5所示:
图4-5课程信息实体图
4.3数据库的表的设计与开发
在现有的软件工程运行环境中,数据库与数据表的设计都是为了构建最适合最优秀的数据存储框架。建立一个优秀的数据库,必须保证数据的完整、准确,并尽量满足用户对数据存储的需求。那么,数据库中的信息和网络应用程序之间的链接就必须得到保障。在已有的条件下,尽可能地降低占用的数据库的空间资源消耗,使得整个学生信息管理系统能够迅速地做出反应。根据上述原则并结合实际需要,本文采用MySql进行设计。现列出如下几张表。
表4-1:教师
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
gonghao | varchar | 200 | 工号 | ||
mima | varchar | 200 | 密码 | ||
jiaoshixingming | varchar | 200 | 教师姓名 | ||
xingbie | varchar | 200 | 性别 | ||
touxiang | longtext | 4294967295 | 头像 | ||
xueyuan | varchar | 200 | 学院 | ||
zhicheng | varchar | 200 | 职称 | ||
dianhua | varchar | 200 | 电话 | ||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-2:公告通知
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
biaoti | varchar | 200 | 标题 | ||
leixing | varchar | 200 | 类型 | ||
tupian | longtext | 4294967295 | 图片 | ||
gonggaoneirong | longtext | 4294967295 | 公告内容 | ||
fabushijian | datetime | 发布时间 |
表4-3:考试记录表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 用户id | |||
username | varchar | 200 | 用户名 | ||
paperid | bigint | 试卷id(外键) | |||
papername | varchar | 200 | 试卷名称 | ||
questionid | bigint | 试题id(外键) | |||
questionname | varchar | 200 | 试题名称 | ||
options | longtext | 4294967295 | 选项,json字符串 | ||
score | bigint | 分值 | 0 | ||
answer | varchar | 200 | 正确答案 | ||
analysis | longtext | 4294967295 | 答案解析 | ||
myscore | bigint | 试题得分 | 0 | ||
myanswer | varchar | 200 | 考生答案 |
表4-4:试题表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
paperid | bigint | 所属试卷id(外键) | |||
papername | varchar | 200 | 试卷名称 | ||
questionname | varchar | 200 | 试题名称 | ||
options | longtext | 4294967295 | 选项,json字符串 | ||
score | bigint | 分值 | 0 | ||
answer | varchar | 200 | 正确答案 | ||
analysis | longtext | 4294967295 | 答案解析 | ||
type | bigint | 试题类型,0:单选题 1:多选题 2:判断题 3:填空题(暂不考虑多项填空) | 0 | ||
sequence | bigint | 试题排序,值越大排越前面 | 100 |
表4-5:学生
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
xuehao | varchar | 200 | 学号 | ||
mima | varchar | 200 | 密码 | ||
xingming | varchar | 200 | 姓名 | ||
xingbie | varchar | 200 | 性别 | ||
touxiang | longtext | 4294967295 | 头像 | ||
xueyuan | varchar | 200 | 学院 | ||
zhuanye | varchar | 200 | 专业 | ||
banji | varchar | 200 | 班级 | ||
shouji | varchar | 200 | 手机 |
表4-6:试卷表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
name | varchar | 200 | 试卷名称 | ||
time | int | 考试时长(分钟) | |||
status | int | 试卷状态 | 0 |
表4-7:选课信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
kechengmingcheng | varchar | 200 | 课程名称 | ||
kechengleixing | varchar | 200 | 课程类型 | ||
xuankeshuoming | longtext | 4294967295 | 选课说明 | ||
gonghao | varchar | 200 | 工号 | ||
kexuanrenshu | int | 选课人数 | |||
xuankeshijian | date | 选课时间 | |||
xuehao | varchar | 200 | 学号 | ||
xingming | varchar | 200 | 姓名 | ||
xueyuan | varchar | 200 | 学院 | ||
banji | varchar | 200 | 班级 | ||
crossuserid | bigint | 跨表用户id | |||
crossrefid | bigint | 跨表主键id |
表4-8:毕业信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
jiuyeqiye | varchar | 200 | 就业企业 | ||
jiuyedidian | varchar | 200 | 就业地点 | ||
gonghao | varchar | 200 | 工号 | ||
jiaoshixingming | varchar | 200 | 教师姓名 | ||
jiuyeshijian | varchar | 200 | 就业时间 | ||
jiuyefangxiang | varchar | 200 | 就业方向 | ||
lixiaoshijian | varchar | 200 | 离校时间 | ||
xinxibeizhu | longtext | 4294967295 | 信息备注 | ||
xuehao | varchar | 200 | 学号 | ||
xingming | varchar | 200 | 姓名 | ||
shouji | varchar | 200 | 手机 |
表4-9:token表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
userid | bigint | 用户id | |||
username | varchar | 100 | 用户名 | ||
tablename | varchar | 100 | 表名 | ||
role | varchar | 100 | 角色 | ||
token | varchar | 200 | 密码 | ||
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP | ||
expiratedtime | timestamp | 过期时间 | CURRENT_TIMESTAMP |
表4-10:课程信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
kechengmingcheng | varchar | 200 | 课程名称 | ||
kechengleixing | varchar | 200 | 课程类型 | ||
shangkeshijian | date | 上课时间 | |||
shangkedidian | varchar | 200 | 上课地点 | ||
renkejiaoshi | varchar | 200 | 任课教师 | ||
kexuanrenshu | int | 可选人数 | |||
kechengjieshao | longtext | 4294967295 | 课程介绍 | ||
gonghao | varchar | 200 | 工号 |
表4-11:综合素质
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
xuehao | varchar | 200 | 学号 | ||
xingming | varchar | 200 | 姓名 | ||
xueyuan | varchar | 200 | 学院 | ||
banji | varchar | 200 | 班级 | ||
xuexinengli | varchar | 200 | 学习能力 | ||
sixiangpinde | varchar | 200 | 思想品德 | ||
yundongjiankang | varchar | 200 | 运动健康 | ||
xinlisuzhi | varchar | 200 | 心理素质 | ||
laoshipingjia | longtext | 4294967295 | 老师评价 | ||
pingjiariqi | date | 评价日期 | |||
gonghao | varchar | 200 | 工号 | ||
jiaoshixingming | varchar | 200 | 教师姓名 |
表4-12:课程类型
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
kechengleixing | varchar | 200 | 课程类型 |
表4-13:学生考勤
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
mingcheng | varchar | 200 | 名称 | ||
kaoqinriqi | date | 考勤日期 | |||
xuehao | varchar | 200 | 学号 | ||
xingming | varchar | 200 | 姓名 | ||
kaoqinzhuangkuang | varchar | 200 | 考勤状况 | ||
kaoqinshuoming | longtext | 4294967295 | 考勤说明 | ||
gonghao | varchar | 200 | 工号 | ||
jiaoshixingming | varchar | 200 | 教师姓名 |
表4-14:课程成绩
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
kechengmingcheng | varchar | 200 | 课程名称 | ||
xuehao | varchar | 200 | 学号 | ||
xingming | varchar | 200 | 姓名 | ||
banji | varchar | 200 | 班级 | ||
fenshu | float | 分数 | |||
chengji | varchar | 200 | 成绩 | ||
fabushijian | datetime | 发布时间 | |||
gonghao | varchar | 200 | 工号 | ||
jiaoshixingming | varchar | 200 | 教师姓名 | ||
crossuserid | bigint | 跨表用户id | |||
crossrefid | bigint | 跨表主键id |
第五章 系统运行
5.1系统登录实现
系统登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-1所示。
图5-1 系统登录界面
系统注册:在系统注册页面的输入栏中输入用户注册信息进行注册操作,系统注册页面如图5-2所示:
图5-2系统注册页面
5.2管理员模块实现
管理员进入主页面,主要功能包括对系统首页、个人中心、学生管理、教师管理、公告通知管理、课程类型管理、课程信息管理、选课信息管理、课程成绩管理、毕业信息管理、学生考勤管理、综合素质管理等进行操作。管理员主页面如图5-3所示:
图5-3 管理员主界面
管理员点击学生管理。在学生页面输入学号、姓名、学院和专业进行查询、新增或删除学生列表,并根据需要对学生详情信息进行详情、修改或删除操作;如图5-4所示:
图5-4学生管理界面
管理员点击教师管理。在教师页面输入工号、教师姓名、选择性别和是否通过进行查询、新增或删除学生列表,并根据需要对学生详情信息进行详情、修改或删除操作;如图5-5所示:
图5-5教师管理界面
管理员点击公告通知管理。在公告通知页面输入标题和类型进行查询、新增或删除公告通知列表,并根据需要对公告通知详情信息进行详情、修改或删除操作;如图5-6所示:
图5-6公告通知管理界面
管理员点击课程成绩管理。在课程成绩页面输入课程名称、姓名和成绩进行查询、导出、打印或删除课程成绩列表,并根据需要对课程成绩详情信息进行详情、修改或删除操作;如图5-7所示:
图5-7课程成绩管理界面
管理员点击学生考勤管理。在学生考勤页面输入名称、姓名和选择考勤状况进行查询、新增或删除学生考勤列表,并根据需要对学生考勤详情信息进行详情、修改或删除操作;如图5-8所示:
图5-8学生考勤管理界面
5.3学生管理实现
学生进入系统可以对系统首页、个人中心、公告通知管理、课程信息管理、选课信息管理、课程成绩管理、毕业信息管理、学生考勤管理、综合素质管理、考试管理等功能进行操作。学生主页面如图5-9所示:
图5-9 学生主界面
学生点击毕业信息管理。在毕业信息页面输入就业企业、就业地点、学号和姓名进行查询、新增或删除毕业信息列表,并根据需要对毕业详情信息进行详情、修改或删除操作;如图5-10所示:
图5-10毕业信息管理界面
5.4教师管理实现
教师进入系统可以对系统首页、个人中心、公告通知管理、课程信息管理、选课信息管理、课程成绩管理、毕业信息管理、学生考勤管理、综合素质管理、试卷管理、试题管理等功能进行操作。教师主页面如图5-11所示:
图5-11 教师主界面
教师点击课程信息管理。在课程信息页面输入课程名称、任课教师和选择课程类型进行查询、新增或删除课程信息列表,并根据需要对课程详情信息进行详情、修改或删除操作;如图5-12所示:
图5-12课程信息管理界面
教师点击学生考勤管理。在学生考勤页面输入名称、姓名和选择考勤状况进行查询、新增或删除学生考勤列表,并根据需要对学生考勤详情信息进行详情、修改或删除操作;如图5-13所示:
图5-13学生考勤管理界面
教师点击综合素质管理。在综合素质页面输入姓名和班级进行查询、新增或删除综合素质列表,并根据需要对综合素质详情信息进行详情、修改或删除操作;如图5-14所示:
图5-14综合素质管理界面
教师点击试卷管理。在试卷页面输入试卷名称进行查询、新增或删除试卷列表,并根据需要对试卷详情信息进行详情、修改或删除操作;如图5-15所示:
图5-15试卷管理界面
CommonUtil.java
package com.utils;
import java.util.Random;
import java.util.ArrayList;
import org.springframework.stereotype.Component;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import org.apache.poi.ss.usermodel.DateUtil;
import java.util.Objects;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
@Component
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();
}
/**
* 获取随机验证码
*
* @param num
* @return
*/
public static String getRandomNumber(Integer num) {
String base = "0123456789";
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();
}
public static String getCellValue(Cell cell) {
String resultValue = "";
// 判空
if (Objects.isNull(cell)) {
return resultValue;
}
// 拿到单元格类型
int cellType = cell.getCellType();
switch (cellType) {
// 字符串类型
case Cell.CELL_TYPE_STRING:
resultValue = StringUtils.isEmpty(cell.getStringCellValue()) ? "" : cell.getStringCellValue().trim();
break;
// 布尔类型
case Cell.CELL_TYPE_BOOLEAN:
resultValue = String.valueOf(cell.getBooleanCellValue());
break;
// 数值类型
case Cell.CELL_TYPE_NUMERIC:
/**
* format 的值可能为以下这些 yyyyMMddHHmmss
* yyyy-MM-dd----- 14
* yyyy年m月d日----- 31
* yyyy年m月--------57
* m月d日 -----------58
* HH:mm-----------20
* h时mm分 --------- 32
*/
Object val = cell.getNumericCellValue();
// POI Excel 日期格式转换
String formatDate = "";
switch (cell.getCellStyle().getDataFormat()){
case 14:
formatDate = "yyyy-MM-dd";
break;
case 20:
formatDate = "HH:mm";
break;
case 21:
formatDate = "HH:mm:ss";
break;
case 31:
formatDate = "yyyy年MM月dd日";
break;
case 32:
formatDate = "HH时mm分";
break;
case 33:
formatDate = "HH时mm分mm秒";
break;
case 57:
formatDate = "yyyy年MM月";
break;
case 58:
formatDate = "MM月dd日";
break;
case 176:
formatDate = "yyyy-MM-dd HH:mm:ss";
break;
}
if(!"".equals(formatDate)){
resultValue = new SimpleDateFormat(formatDate).format(DateUtil.getJavaDate((Double) val));
}else{
resultValue = new DecimalFormat("#.######").format(cell.getNumericCellValue());
}
break;
// 取空串
default:
break;
}
return resultValue;
}
}
TokenServiceImpl.java
package com.service.impl;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.TokenDao;
import com.entity.TokenEntity;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.CommonUtil;
import com.utils.PageUtils;
import com.utils.Query;
/**
* token
*/
@Service("tokenService")
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<TokenEntity> page = this.selectPage(
new Query<TokenEntity>(params).getPage(),
new EntityWrapper<TokenEntity>()
);
return new PageUtils(page);
}
@Override
public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public PageUtils queryPage(Map<String, Object> params,
Wrapper<TokenEntity> wrapper) {
Page<TokenEntity> page =new Query<TokenEntity>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public String generateToken(Long userid,String username, String tableName, String role) {
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
String token = CommonUtil.getRandomString(32);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.HOUR_OF_DAY, 1);
if(tokenEntity!=null) {
tokenEntity.setToken(token);
tokenEntity.setExpiratedtime(cal.getTime());
this.updateById(tokenEntity);
} else {
this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
}
return token;
}
@Override
public TokenEntity getTokenEntity(String token) {
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
if(tokenEntity == null || tokenEntity.getExpiratedtime().getTime()<new Date().getTime()) {
return null;
}
return tokenEntity;
}
}
JiaoshiController.java
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.JiaoshiEntity;
import com.entity.view.JiaoshiView;
import com.service.JiaoshiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 教师
* 后端接口
* @author
* @email
* @date 2023-02-24 21:32:40
*/
@RestController
@RequestMapping("/jiaoshi")
public class JiaoshiController {
@Autowired
private JiaoshiService jiaoshiService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
JiaoshiEntity u = jiaoshiService.selectOne(new EntityWrapper<JiaoshiEntity>().eq("gonghao", username));
if(u==null || !u.getMima().equals(MD5Util.md5(password))) {
return R.error("账号或密码不正确");
}
if(!"是".equals(u.getSfsh())) return R.error("账号已锁定,请联系管理员审核。");
String token = tokenService.generateToken(u.getId(), username,"jiaoshi", "管理员" );
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@RequestMapping("/register")
public R register(@RequestBody JiaoshiEntity jiaoshi){
//ValidatorUtils.validateEntity(jiaoshi);
JiaoshiEntity u = jiaoshiService.selectOne(new EntityWrapper<JiaoshiEntity>().eq("gonghao", jiaoshi.getGonghao()));
if(u!=null) {
return R.error("注册用户已存在");
}
Long uId = new Date().getTime();
jiaoshi.setId(uId);
jiaoshi.setMima(MD5Util.md5(jiaoshi.getMima()));
jiaoshiService.insert(jiaoshi);
return R.ok();
}
/**
* 退出
*/
@RequestMapping("/logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
JiaoshiEntity u = jiaoshiService.selectById(id);
return R.ok().put("data", u);
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
JiaoshiEntity u = jiaoshiService.selectOne(new EntityWrapper<JiaoshiEntity>().eq("gonghao", username));
if(u==null) {
return R.error("账号不存在");
}
u.setMima(MD5Util.md5("123456"));
jiaoshiService.updateById(u);
return R.ok("密码已重置为:123456");
}
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,JiaoshiEntity jiaoshi,
HttpServletRequest request){
EntityWrapper<JiaoshiEntity> ew = new EntityWrapper<JiaoshiEntity>();
PageUtils page = jiaoshiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jiaoshi), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,JiaoshiEntity jiaoshi,
HttpServletRequest request){
EntityWrapper<JiaoshiEntity> ew = new EntityWrapper<JiaoshiEntity>();
PageUtils page = jiaoshiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jiaoshi), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( JiaoshiEntity jiaoshi){
EntityWrapper<JiaoshiEntity> ew = new EntityWrapper<JiaoshiEntity>();
ew.allEq(MPUtil.allEQMapPre( jiaoshi, "jiaoshi"));
return R.ok().put("data", jiaoshiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(JiaoshiEntity jiaoshi){
EntityWrapper< JiaoshiEntity> ew = new EntityWrapper< JiaoshiEntity>();
ew.allEq(MPUtil.allEQMapPre( jiaoshi, "jiaoshi"));
JiaoshiView jiaoshiView = jiaoshiService.selectView(ew);
return R.ok("查询教师成功").put("data", jiaoshiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
JiaoshiEntity jiaoshi = jiaoshiService.selectById(id);
return R.ok().put("data", jiaoshi);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
JiaoshiEntity jiaoshi = jiaoshiService.selectById(id);
return R.ok().put("data", jiaoshi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody JiaoshiEntity jiaoshi, HttpServletRequest request){
jiaoshi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(jiaoshi);
JiaoshiEntity u = jiaoshiService.selectOne(new EntityWrapper<JiaoshiEntity>().eq("gonghao", jiaoshi.getGonghao()));
if(u!=null) {
return R.error("用户已存在");
}
jiaoshi.setId(new Date().getTime());
jiaoshi.setMima(MD5Util.md5(jiaoshi.getMima()));
jiaoshiService.insert(jiaoshi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody JiaoshiEntity jiaoshi, HttpServletRequest request){
jiaoshi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(jiaoshi);
JiaoshiEntity u = jiaoshiService.selectOne(new EntityWrapper<JiaoshiEntity>().eq("gonghao", jiaoshi.getGonghao()));
if(u!=null) {
return R.error("用户已存在");
}
jiaoshi.setId(new Date().getTime());
jiaoshi.setMima(MD5Util.md5(jiaoshi.getMima()));
jiaoshiService.insert(jiaoshi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody JiaoshiEntity jiaoshi, HttpServletRequest request){
//ValidatorUtils.validateEntity(jiaoshi);
JiaoshiEntity jiaoshiEntity = jiaoshiService.selectById(jiaoshi.getId());
if(StringUtils.isNotBlank(jiaoshi.getMima()) && !jiaoshi.getMima().equals(jiaoshiEntity.getMima())) {
jiaoshi.setMima(MD5Util.md5(jiaoshi.getMima()));
}
jiaoshiService.updateById(jiaoshi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
jiaoshiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<JiaoshiEntity> wrapper = new EntityWrapper<JiaoshiEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = jiaoshiService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
validate.js
/**
* 邮箱
* @param {*} s
*/
export function isEmail (s) {
return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
}
/**
* 手机号码
* @param {*} s
*/
export function isMobile (s) {
return /^1[0-9]{10}$/.test(s)
}
/**
* 电话号码
* @param {*} s
*/
export function isPhone (s) {
return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
}
/**
* URL地址
* @param {*} s
*/
export function isURL (s) {
return /^http[s]?:\/\/.*/.test(s)
}
/**
* 匹配数字,可以是小数,不可以是负数,可以为空
* @param {*} s
*/
export function isNumber(s){
return /(^-?[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?$)|(^$)/.test(s);
}
/**
* 匹配整数,可以为空
* @param {*} s
*/
export function isIntNumer(s){
return /(^-?\d+$)|(^$)/.test(s);
}
/**
* 身份证校验
*/
export function checkIdCard(idcard) {
const regIdCard = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
if (!regIdCard.test(idcard)) {
return false;
} else {
return true;
}
}