项目工程实践
请假系统设计与实现
学生姓名:学号:
系别:计算机系专业:计算机科学与技术
指导教师:
日期:2021年7月1日
目录
1. 系统总体设计 3
1.1. 请假系统用例分析 3
1.1.1. 系统参与者 3
1.1.2. 用例分析 3
1.2. 系统领域对象识别 5
1.3. 数据库设计 6
1.3.1. 数据库实体联系分析 6
1.3.2. 数据库E-R模型图 6
1.3.3. 数据库表详细设计 7
2. 系统详细设计及实现 11
2.1. 系统初始化模块设计与实现 11
2.2. 登录模块流程设计 12
2.3. 教师登录设计与实现 15
2.3.1. 用户名以及密码校验实现 15
2.3.2. 角色查找实现 15
2.3.3. 班主任角色查找实现 16
2.3.4. 权限查找实现 17
2.4. 学生登录实现 17
2.5. 系统设置模块设计与实现 18
2.5.1. 角色列表显示设计与实现 18
2.5.2. 添加功能设计与实现 19
2.5.3. 修改功能设计与实现 19
2.5.4. 详情功能设计与实现 20
2.5.5. 角色权限设置功能设计与实现 20
2.6. 学院管理设计与实现 22
2.6.1. 列表显示设计与实现 22
2.6.2. 添加功能设计与实现 22
2.6.3. 修改功能设计与实现 23
2.6.4. 详情功能设计与实现 24
2.7. 班级管理设计与实现 24
2.7.1. 列表显示与综合查询设计与实现 24
2.7.2. 分页显示设计与实现 26
2.7.3. 添加功能设计与实现 26
2.7.4. 修改功能设计与实现 27
2.7.5. 详情功能设计与实现 27
2.8. 教师管理设计与实现 28
2.8.1. 列表显示与综合查询功能实现 28
2.8.2. 添加功能设计与实现 29
2.8.3. 修改功能设计与实现 30
2.8.4. 详情页面设计与实现 31
2.8.5. 教师角色配置功能设计与实现 31
2.9. 学生管理模块设计与实现 32
2.9.1. 列表显示与综合查询功能实现 32
2.9.1.1. 学院、年级、班级的级联显示实现 34
2.9.2. 添加功能设计与实现 34
2.9.3. 修改功能设计与实现 35
2.9.4. 详情功能设计与实现 35
2.10. 请假申请模块实现 36
2.10.1. 列表显示与综合查询功能实现 36
2.10.2. 添加功能实现 37
2.10.3. 修改功能实现 38
2.10.4. 详情功能实现 38
2.11. 请假审批功能设计与实现 39
2.11.1. 班主任审批功能设计与实现 39
2.11.2. 辅导员、院领导审批功能设计与实现 41
2.12. 销假功能设计与实现 43
2.12.1. 学生销假设计与实现 43
2.12.2. 教师销假设计与实现 44
请假系统设计与实现
-
系统总体设计
-
请假系统用例分析
-
系统参与者
请假系统的用户包括:系统管理员、学生、班主任、辅导员、二级学院领导。
-
用例分析
- 系统管理员用例分析
-
-
图1.1 系统管理员用例图
- 学院信息管理
包括添加、修改、查询学院信息
- 班级信息管理
包括添加、修改、查询班级信息
- 学生信息管理
包括添加、修改、查询学生信息
- 教师信息管理
包括添加、修改、查询教师信息,指定教师角色(即班主任、辅导员、学院领导,一个教师可以有多个角色)
- 角色信息管理
包括添加、修改、查询角色基本信息。添加、修改、查询角色权限。
- 学生用例分析
图1.2 学生用例图
- 班主任用例分析
图1.3 班主任用例图
- 辅导员用例分析
图1.4 辅导员用例图
- 学院领导用例分析
图1.5 学院领导用例图
-
系统领域对象识别
本系统中参与的人员包括:
- 学生、教师
根据用例分析,本系统中的角色包括:
- 系统管理员、学生、班主任、辅导员、学院领导
组织包括:
- 学院、班级
物品包括:
- 菜单
时间包括:
- 请假申请、请假审批
规格说明:
- 菜单类型——1、模块 2、菜单项 3、按钮
- 审批状态——1、待审批 2、班主任审批通过 3、辅导员审批通过 4、审批通过5、审批未通过 6、结束
- 性别——1、男 2、女 3、未知
- 请假类型——1、一天以内 2、一天以外三天以内 3、三天以外 4、出恩施州
-
数据库设计
-
数据库实体联系分析
-
数据库表包括实体表以及实体之间的联系表,本系统中的实体即我们在系统领用对象识别中所分析的实体之间的联系包括1对1、1对多和多对多。只有在多对多的情况下才需要建立专门的联系表,本系统中的联系包括:
- 学院与班级——1对多
- 班级与学生——1对多
- 学院与教师——1对多
- 教师与角色——多对多(因此需要建立一张用户角色的联系表)
- 学生与角色——1对1(给学生一个默认角色,角色名叫学生)
- 请假申请与学生——1对多
- 请假申请与审批——1对多
- 请假审批与教师——1对多
- 请假审批与审批类型——1对1
-
数据库E-R模型图
根据1.3.1的分析,请假系统E-R模型图如下:
图1.6 请假系统E-R模型图
-
数据库表详细设计
- 请假状态表application_status
字段名 |
类型 |
说明 |
id |
tinyint |
记录id |
applicationResult |
varchar |
审批结果 |
表1.1 请假状态表application_status
- 同意类型表aprove_type
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
是否同意名称 |
表1.2 同意类型表aprove_type
- 班级表class
字段名 |
类型 |
说明 |
id |
int |
记录id |
num |
varchar |
班级编号 |
gradeId |
int |
年级ID |
belongToCollegeId |
int |
所属学院 |
banZhuRenId |
int |
班主任id |
表1.3班级表class
- 学院表college
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
学院名称 |
num |
char |
学院编号 |
tel |
varchar |
学院座机 |
表1.4 学院表college
- 年级表grade
字段名 |
类型 |
说明 |
id |
int |
记录id |
grade |
int |
年级 |
表1.5 年级表grade
- 请假记录表leave_application
字段名 |
类型 |
说明 |
id |
int |
记录id |
studentId |
int |
请假学生id |
type |
tinyint |
请假类型 |
path |
varchar |
路线 |
reason |
varchar |
请假事由 |
begintime |
datetime |
开始时间 |
endtime |
datetime |
结束时间 |
status |
tinyint |
申请状态 |
img |
varchar |
销假图片 |
表1.6 请假记录表leave_applicatio
- 审批表leave_application_shen_pi
字段名 |
类型 |
说明 |
id |
int |
记录id |
applicationId |
int |
请假申请id |
teacherId |
int |
审批教师id |
result |
tinyint |
审批结果 |
opinion |
varchar |
审批意见 |
表1.7 审批表leave_application_shen_pi
- 请假类型表leave_application_type
字段名 |
类型 |
说明 |
id |
tinyint |
记录id |
name |
varchar |
请假类型 |
表1.8 请假类型表leave_application_type
- 菜单表menu
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
菜单名 |
permission |
varchar |
权限字符串 |
pid |
int |
直接父菜单id |
pids |
varchar |
父菜单 |
表1.9 菜单表menu
- 菜单类型表menu_type
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
菜单类型名称 |
表1.10 菜单类型表menu_type
- 角色表role
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
角色名 |
remark |
varchar |
说明 |
eareType |
tinyint |
角色类型 |
表1.11 角色表role
- 角色菜单表role_menu
字段名 |
类型 |
说明 |
roleId |
int |
角色id |
menuId |
int |
菜单id |
表1.12 角色菜单表role_menu
- 角色类型表role_type
字段名 |
类型 |
说明 |
Id |
tinyint |
记录id |
name |
varchar |
角色名称 |
表1.13 角色类型表role_type
- 性别表sex_type
字段名 |
类型 |
说明 |
Id |
tinyint |
记录id |
name |
varchar |
性别类型 |
表1.14 性别表sex_type
- 学生表student
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
姓名 |
num |
varchar |
学号 |
password |
char |
密码 |
classId |
int |
班级id |
sex |
tinyint |
性别 |
表1.15 学生表student
- 教师表teacher
字段名 |
类型 |
说明 |
id |
int |
记录id |
name |
varchar |
教师名 |
num |
varchar |
学院编号 |
password |
char |
密码 |
collegeId |
int |
学院id |
phone |
varchar |
电话 |
表1.16 教师表teacher
- 用户角色表user_role
字段名 |
类型 |
说明 |
userid |
int |
用户id |
roleid |
int |
角色id |
表1.17 用户角色表user_role
-
系统详细设计及实现
-
系统初始化模块设计与实现
-
系统初始化的目的是,在系统实现时,对于系统中经常会使用的某些信息.比如本系统中的性别类别(1、男 2、女 3、未知)。请假申请类别(1、一天以内 2、一天以外三天以内 3、三天以外 4、出恩施)等数据)。这些数据的特点是数据量不大,但是在后台代码和页面中会频繁使用。因此在系统设计时,实现一个InitServlet,并在InitServlet的init方法中将这些数据加载到ServletContext中(在jsp页面中可以使用applicationScope来访问ServletContext中的数据)。
我们将性别类型、菜单类别、角色类别、申请类别、审批结果类别这五种数据在InitServlet中加载到ServletContext中。
系统初始化模块包括InitServlet、InitParamService、InitParamDAO三个实现类。
- 读取性别数据时序图:
图2.1 读取性别数据时序图
- 读取菜单类别时序图:
图2.2 读取菜单类别时序图
- 读取申请类别时序图:
图2.3 读取申请类别时序图
角色类别、审批结果时序图同上,调用的方法依次为:
getRoleType()
getLeaveApplicationResultType()
-
登录模块流程设计
登录模块,首先根据登录账号,判断是教师登录还是学生登录。然后分别执行教师登录和学生登录的流程。登录模块在用户名和密码校验成功后,需要查询用户角色以及权限以及其他信息。并定义一个保存这些信息的类。创建这个类的对象,将查询出来的信息保存到这个对象中,最后将这个对象保存到HttpSession中。
定义保存登录信息的类:QingjiaSession,代码如下:
/** * 请假session * 主要用于记录用户的登录信息,返回至jsp页面读取 * @author xcz */ public class QingjiaSession { //用户类型常量 public static int USER_TYPE_TEACHER = 1; public static int USER_TYPE_STUDENT = 2; //数据访问域常量 public static final int DATA_AREA_PERSON = 1; //个人 public static final int DATA_AREA_CLASS = 2; //班级 public static final int DATA_AREA_COLLEGE = 3; //学院 public static final int DATA_AREA_SYSTEM = 4; //系统 //请假session字符串 public static final String QINGJIA_SESSION = "qSession"; //权限 private Set<String> permissiones; //用户类型 1:教师 2:学生 private int userType; //学生信息 private Student student; //教师信息 private Teacher teacher; //用户角色 private List<Role> roles; //班主任管理的班级id private String manageClasse; //班主任管理的班级或学生所在班级 private List<Clazz> clazzes; //班主任所管理班级的年级 private List<Grade> grades; //学院id private int collegeId; //班级id private int classId; //学生所在班级 private Clazz clazz; //是否是班主任 private boolean isBanzhuren; //是否是辅导员 private boolean isFudaoyuan; //是否是领导 private boolean isXueyuanLingdao; //数据访问域范围(默认范围是个人) private int dataArea = DATA_AREA_PERSON; } |
在会话中保存这些数据的目的是,将用户的相关属性保存到会话中。例如:教师所属的学院id、教师是否是班主任(如果是,班主任管理的班级信息)、教师的角色、教师的权限.这些信息在系统后续的设计与实现中会起到至关重要的作用。例如、前台页面会根据学生的权限来判断页面上哪些菜单会显示、哪些按钮会显示。在查询数据是会对查询出来的数据进行限定。比如具有辅导员角色的用户登录时,会根据辅导员的学院id来查询请假申请记录,以便辅导员来进行审批。
作为教师角色,在会话中需要保存的信息包括:
权限(permissiones)、用户类型(userType)、教师信息(teacher)、用户角色(roles)、班主任管理的班级id(manageClasse)、班主任管理的班级或学生所在班级(clazzes)、班主任所管理班级的年级(grades)、是否是班主任(isBanzhuren)、是否是辅导员(isFudaoyuan)、是否是领导(isXueyuanLingdao)、数据访问域范围(dataArea)
作为学生角色,在会话中需要保存的信息包括:
权限(permissiones)、用户类型(userType)、学生信息(student)、用户角色(roles)、班级id(classId)、学生所在班级(clazz)、数据访问域范围(dataArea)
-
教师登录设计与实现
-
用户名以及密码校验实现
-
用户登录首先会对用户类型进行判断,如果在教室表中查询到该用户,则说明是教师,紧接着会查询该教师的密码是否与输入的密码匹配一直,如果一致则登录成功,反之登录失败。
图2.4 密码校验流程图
-
角色查找实现
角色查找主要是根据教师id来查询角色类型,查询时会先查询出教师对应的角色id,对应的SQL语句为:
select roleid from user_role where userid = ?
角色查找时序图:
图2.5 角色查找时序图
-
班主任角色查找实现
在角色查找的基础上,班主任角色查找是根据查询出来的角色id来匹配对应的角色,由于一个教师可能有多个角色,所以使用SQL语句的in方式查询,对应的SQL语句为:
SELECT * FROM role WHERE role.id in (?)
查询出来的角色后,如果发现该教师有班主任角色,则会查询对应的班级信息,将查询到的班级对象进行循环遍历,并生成一个由班级id组成的字符串,用于后期对该班级的查询,其代码为:
//循环读取班级id,并添加到字符串对象中 for (Clazz clazz : clazzs) { strClasses.append(clazz.getId());//将班级id添加到字符串对象中 strClasses.append(",");//添加一个逗号 strGrades.append(clazz.getGradeId());//将年级id添加到字符串中 strGrades.append(",");//添加一个逗号 } |
-
权限查找实现
权限查找根据教师id查询对应的菜单权限,并设置到session中,设计SQL语句如下:
SELECT
menu.permission
FROM
menu
WHERE
id IN (
SELECT
role_menu.menuId
FROM
role_menu
WHERE
roleId IN ( SELECT roleid FROM user_role WHERE userid = ? )
)
权限查找时序图:
图2.6 权限查找时序图
-
学生登录实现
学生登录首先会进行账号、密码想要数据校验,通过后会直接赋予学生身份,读取学生班级信息存放到班级集合中,并将学生的权限字符串保存到QingjiaSession中,而后跳转至主页面。
学生登录流程图:
图2.7 学生登录流程图
-
系统设置模块设计与实现
系统设置模块包括:角色列表显示、添加角色、修改角色、角色详情、角色权限设置五个功能。
-
角色列表显示设计与实现
角色列表显示首先需要创建角色的list.jsp页面,并设置好需要显示的值:编号、角色名、备注、管理域、操作等相关信息,调用RoleService的getAll方法将其全部角色信息进行查询并返回,保存到角色集合中roles。
角色列表效果图:
图2.8 修改权限流程图
RoleDao的getAll方法查询语句为:
SELECT * FROM role
-
添加功能设计与实现
用户点击添加按钮跳转至添加页面(add.jsp),并展示输入表单:
图2.9 添加角色
而后用户输入数据后点击确认保存,执行添加操作,RoleDao使用的SQL语句为:
INSERT into role VALUES(null,?,?,?)
添加操作时序图:
图2.10 添加角色时序图
-
修改功能设计与实现
当用户点击修改角色时,会根据用户点击的角色列表id查询对应的角色数据,并将其保存到request中,跳转至修改页面,随之修改页面会将传递过来的数据解析并填充到表单默认值,效果如下:
图2.11 修改角色
角色id,并不会显示在修改数据中,会作为隐藏控件存储到表单中。当用户输入修改后的数据并点击确认保存时,系统会读取当前用户所填写的数据并执行修改操作,具体的SQL代码为:
UPDATE role SET name=?,remark =?,eareType=? WHERE id=?
-
详情功能设计与实现
当用户点击对应记录的详情按钮后,会根据该记录的id跳转到RoleServlet类调用getById()方法查询角色信息后保存到request中,最后返回到详情页面进行显示,涉及到的SQL代码为:
SELECT * FROM role WHERE id=?
-
角色权限设置功能设计与实现
当用户点击对应的权限设置后,首先会得到需要被授权角色id,然后会查询当前系统中的全部权限,再根据角色id查询该角色已有的权限,最后将用户权限和所有权限保存request中,并跳转到授权页面:
图2.12 显示角色已有权限
随后用户可以根据需求对角色的每一个模块进行授权,没有权限则相应的控件不会显示。提交数据后会跳转至的RoleServlet类的doAuthorize()执行授权方法,使用request的getParameterValues来批量获取提交的权限数据,并将id与权限数组传递至updateRolePermissionById方法进行授权操作,在授权之前,需要先将该角色之前的权限全部删除,而后再循环遍历新权限数组,对每一个权限执行插入,保存到role_menu表中。由于两个操作可能会存在中断出错的现象,所以需要使用到事务,在语句执行之前需要将自动提交设置为假setAutoCommit(false),如果两次语句都执行成功才能使用commit提交,否则使用rollback回滚数据。
图2.13 查询角色权限时序图
修改角色权限流程图:
图2.14 修改权限流程图
删除原有权限:
//删除权限SQL语句 String sql="DELETE FROM role_menu WHERE roleId=?"; //初始化查询 psm=JdbcUtil.getPreparedStatement(conn, sql); //设置参数 psm.setInt(1,roleId); //执行 psm.execute(); |
添加新权限:
//循环遍历权限 for (String permission : permissiones) { //删除权限SQL语句 String sql="INSERT INTO role_menu(roleId,menuId) VALUES (?,?)"; //初始化查询 psm=JdbcUtil.getPreparedStatement(conn, sql); //设置参数 psm.setInt(1,roleId); psm.setString(2,permission); //获取执行结果 psm.execute(); } |
-
学院管理设计与实现
-
列表显示设计与实现
-
学院列表显示首先需要创建角色的list.jsp页面,并设置好需要显示的值:编号、学院编号、学院名称、操作等相关信息,调用CollegeService的getAll方法将其全部学院信息进行查询并返回,保存到学院集合中colleges。
学院列表效果图:
图2.15 修改权限流程图
CollegeDao的getAll方法查询语句为:
SELECT * FROM college
-
添加功能设计与实现
用户点击添加按钮跳转至添加页面(add.jsp),并展示输入表单:
图2.16 添加角色
而后用户输入数据后点击确认保存,执行添加操作,CollegeDao使用的SQL语句为:
INSERT into college VALUES(null,?,?,?)
添加操作时序图:
图2.17 添加学院时序图
-
修改功能设计与实现
当用户点击修改学院时,会根据用户点击的学院列表id查询对应的学院数据,并将其保存到request中,跳转至修改页面,随之修改页面会将传递过来的数据解析并填充到表单默认值,效果如下:
图2.18 修改学院
学院id并不会显示在修改数据中,会作为隐藏控件存储到表单中:
图2.19 学院id控件
当用户输入修改后的数据并点击确认保存时,系统会读取当前用户所填写的数据并执行修改操作,具体的SQL代码为:
UPDATE college SET name=?,num =?,tel=? WHERE id=?
-
详情功能设计与实现
当用户点击对应记录的详情按钮后,会根据该记录的id跳转到CollegeServlet类调用getById()方法查询学院信息后保存到request中,最后返回到详情页面进行显示,涉及到的SQL代码为:
SELECT * FROM college WHERE id=?
图2.20 学院详情
-
班级管理设计与实现
-
列表显示与综合查询设计与实现
-
班级列表显示首先需要创建角色的list.jsp页面,并设置好需要显示的值:编号、班级编号、所属年级、所属学院、所班主任、操作等相关信息,显示班级时,需要根据当前用户信息显示具体的班级,比如学生只能显示自己的班级信息,班主任则只能显示自己班的班级信息,而学院领导则只能显示本学院的班级信息。
首先进入查询班级页面需要对当前登录用户进行权限判断,这里需要调用getWhereClause()方法根据不同角色生成不同的查询语句,访问域为个人、班级、学院、系统所生成的SQL语句都不一样,查询时再将SQL语句传入DAO进行查询班级数据,关键代码如下:
//批量判断访问域 switch (dataArea) { case QingjiaSession.DATA_AREA_PERSON://个人访问域 { //判断是否是学生 if (qSession.getUserType()==QingjiaSession.USER_TYPE_STUDENT) { //得到学生信息 Student student=qSession.getStudent(); //生成SQL条件 whereClause.append("id="+student.getClassId()); }else if (qSession.getUserType()==QingjiaSession.USER_TYPE_TEACHER) {//判断是否是老师 //生成SQL条件 whereClause.append("belongToCollegeId="+qSession.getCollegeId()); } break; } case QingjiaSession.DATA_AREA_CLASS://班级访问域 { //生成SQL条件,班主任只能访问自己班的班级信息 whereClause.append("id in ("+qSession.getManageClasse()+")"); break; } case QingjiaSession.DATA_AREA_COLLEGE://学院访问域 { //生成SQL条件 whereClause.append("belongToCollegeId="+qSession.getCollegeId()); break; } case QingjiaSession.DATA_AREA_SYSTEM://系统访问域 { return null; } default: break; } |
班级列表效果图:
图2.21 班级列表效果图
显示班级列表时,需要根据用户权限显示不同的查询班级下拉框,会分别调用ClazzService的getGrade()方法和CollegeService的getAll()方法,对查询到的数据显示至查询下拉列表:
图2.22 查询班级效图
查询数据时,可能出现四种选择情况,所以需要对四种情况查询数据进行分开处理,并生成SQL语句进行查询,代码如下:
查询数据流程图:
-
分页显示设计与实现
考虑到数据较多的情况,实现分页功能可以提高用户体验,首先创建分页类Page拥有属性页面号(pageNo)、页面大小(pageSize)、总页面(totalPages)、总记录数(totalRecord)。并且创建页面拦截器类(PageFilter),该拦截器能够对用户请求URL解析,如果发现page字段,说明用户请求需要分页,再根据当前最大页和记录数计算总页面数。
拦截器运行流程图:
图2.23 拦截器运行流程图
-
添加功能设计与实现
用户点击添加按钮跳转至添加页面(add.jsp),并同时读取数据库中的年级和学院数据,分别调用ClazzService的getGrade()和CollegeService的getAll()方法来查询学院和年级信息保存到request中,并在jsp页面使用c:forEach遍历班级和学院信息展示至表单下拉列表:
图2.24 添加班级 |
图2.25 下拉列表 |
而后用户输入数据后点击确认保存,执行添加操作,CollegeDao使用的SQL语句为:
INSERT into class(num,gradeId,belongToCollegeId) VALUES(?,?,?)
添加操作时序图:
图2.26 添加班级时序图
-
修改功能设计与实现
当用户点击修改班级时,会根据用户点击的班级列表id查询对应的班级数据,并将其保存到request中,跳转至修改页面,随之修改页面会将传递过来的数据解析并填充到表单默认值,效果如下:
图2.27 修改班级
同理,班级id并不会显示在修改数据中,会作为隐藏控件存储到表单中。
当用户输入修改后的数据并点击确认保存时,系统会读取当前用户所填写的数据并执行修改操作,具体的SQL代码为:
UPDATE class SET num=?,gradeId =? ,belongToCollegeId=? WHERE id=?
-
详情功能设计与实现
由于班级详情不仅仅显示班级信息,当用户点击对应记录的详情按钮后,会根据该记录的id跳转到ClassServlet类调用getDetialById ()方法查询班级视图信息后保存到request中,最后返回到详情页面进行显示,涉及到的SQL代码为:
SELECT * FROM class_view WHERE id=?
班级详情视图的设计:
图2.28 班级详情视图设计
设计班级详情页面时,考虑到用户可能会根据班级查看学院详情,则学院信息使用a标签链接至学院详情页面,具体效果图:
图2.29 班级详情
-
教师管理设计与实现
-
列表显示与综合查询功能实现
-
教师列表显示首先需要创建教师的list.jsp页面,并设置好需要显示的值:编号、姓名、工号、所属学院、电话、操作等相关信息,其中根据需要,将所属学院使用a标签链接至详情页面,实现点击对应学院即可查看其教师所在学院详情。
教师列表效果图:
图2.30 教师列表效果图
显示教师列表时,需要动态显示学院的查询下拉框,会调用CollegeService的getAll()方法,对查询到的学院数据显示至查询下拉列表:
图2.31 查询教师效果图
查询数据时,可能出现四种选择情况,所以需要对四种情况查询数据进行分开处理,并生成SQL语句进行查询,流程图如下:
图2.32 查询教师SQL语句拼接流程图
-
添加功能设计与实现
用户点击添加按钮跳转至添加页面(add.jsp),并同时读取数据库中的学院数据,调用CollegeService的getAll()方法来年级信息保存到request中,并在jsp页面使用c:forEach遍历学院信息展示至表单下拉列表:
图2.33 添加教师 |
而后用户输入数据后点击确认保存,执行添加操作,结合实际操作考虑,新添加的教师密码默认为教师编号较为合理,故添加教师无须输入密码,默认使用教师编号设置为密码,TeacherDao使用的SQL语句为:
INSERT INTO teacher(`name`,num,`password`,collegeId,phone) VALUES(?,?,?,?,?)
-
修改功能设计与实现
当用户点击修改教师时,会根据用户点击教师列表id查询对应的教师数据,并将其保存到request中,跳转至修改页面,随之修改页面会将传递过来的数据解析并填充到表单默认值,效果如下:
图2.34 修改教师
同理,教师id并不会显示在修改数据中,会作为隐藏控件存储到表单中。
当用户输入修改后的数据并点击确认保存时,系统会读取当前用户所填写的数据并执行修改操作,具体的SQL代码为:
UPDATE teacher SET name=?,num =?,collegeId=?,phone=? WHERE id=?
-
详情页面设计与实现
当用户点击对应记录的详情按钮后,会根据该记录的id跳转到TeacherServlet类调用getById()方法查询学院信息后保存到request中,最后返回到详情页面进行显示,涉及到的SQL代码为:
SELECT * FROM teacher_view WHERE id=?
显示详情时,同时会查询教师所在的学院名称,为了方便展示,所以创建了Teacher_view视图,用于显示教师详情,班级详情视图的设计:
图2.35 教师详情视图设计
教师详情效果图:
图2.36 教师详情效果图
-
教师角色配置功能设计与实现
当用户点击对应教师的指定角色按钮时,程序首先会来到TeacherServlet的role方法,取出全部角色信息用于前台展示。
指定角色时序图:
图2.37 指定角色时序图
由于一个教师可能存在多个角色,所以使用多选框来展示角色信息:
图2.38 指定角色效果图
为教师指定角色时,需要先获取用户填写的角色数组,然后删除原有角色信息,再添加新的角色信息,所以此项操作涉及到事务。
指定角色流程图:
图2.39 指定角色流程图
-
学生管理模块设计与实现
-
列表显示与综合查询功能实现
-
学生列表显示首先需要创建学生的list.jsp页面,并设置好需要显示的值:编号、姓名、学号、班级、性别、操作等相关信息,其中根据需要,将所属班级使用a标签链接至详情页面,实现点击对应班级编号即可查看其学生所在班级详情。
学生列表效果图:
图2.40 学生列表效果图
由于查询学生较为特殊,涉及到的条件繁多,所以对应的SQL语句设计逻辑也就非常关键,所以需要对四种情况查询数据进行分开处理,并生成SQL语句进行查询,流程图如下:
图2.41 查询学生流程图
-
学院、年级、班级的级联显示实现
显示学生列表时,需要动态显示学院、年级、班级的查询下拉框,会依次调用CollegeService的getByRequest ()方法、ClazzService的getGrade()方法以及ClazzService的getByCollegeAndGrade()方法,其中查询班级只能显示当前学院和年级所约束的班级,这里需要通过ajax根据用户实时选择的数据动态查询班级信息并展示至前台页面,对查询到的数据显示至查询下拉列表:
图2.42 查询教师效果图
使用ajax动态查询班级:
$.ajax({ type:"POST", url:"ClassServlet", data:postData, success:function(msg){ //解析json字符串到对象 var $classes=jQuery.parseJSON(msg); //得到班级选择框 var $clazz=$("#clazz"); //先清空所有的子元素 $clazz.empty(); //设置初始标签 $("<option>",{ value:"0", text:"全部" }).appendTo($clazz) //循环遍历每个对象 $.each($classes,function(i,clazz){ //每次循环添加元素 $("<option>",{ value:clazz.id, text:clazz.num }).appendTo($clazz) }); } }); |
-
添加功能设计与实现
用户点击添加按钮跳转至添加页面(add.jsp),并同时读取数据库中的学院、年级数据,分别调用CollegeService的getAll()、ClazzService的getGrade()方法来将学院和年级信息保存到request中,并在jsp页面使用c:forEach遍历学院信息展示至表单下拉列表:
图2.43 添加学生效果图 |
图2.44 默认学院数据效果图 |
|
而后用户输入数据后点击确认保存,执行添加操作,结合实际操作考虑,新添加的学生密码默认为学生学号较为合理,故添加学生无须输入密码,默认使用学号设置为密码,StudentDao使用的SQL语句为:
INSERT INTO student(`name`,num,`password`,classId,sex) VALUES(?,?,?,?,?)
-
修改功能设计与实现
当用户点击修改学生时,会根据用户点击学生列表id查询对应的学生数据,并将其保存到request中,跳转至修改页面,随之修改页面会将传递过来的数据解析并填充到表单默认值,效果如下:
图2.45 修改学生
同理,学生id并不会显示在修改数据中,会作为隐藏控件存储到表单中。
当用户输入修改后的数据并点击确认保存时,系统会读取当前用户所填写的数据并执行修改操作,具体的SQL代码为:
UPDATE student SET name=?,num =?,classId=?,sex=? WHERE id=?
-
详情功能设计与实现
由于数据库存储的学生性别只是性别表的编号,所以查询学生详情时,需要使用联合查询,为了方便操作,特设计详情页面视图,详情视图不仅仅用作为显示详情页面,也可用作于后期查询学生数据,很大程度上减少了工作量。当用户点击对应记录的详情按钮后,会根据该记录的id跳转到StudentServlet类调用getById ()方法查询学生视图信息后保存到request中,最后返回到详情页面进行显示,涉及到的SQL代码为:
SELECT * FROM student_view WHERE id=?
学生详情视图的设计:
图2.46 学生详情视图设计
设计班级详情页面时,考虑到用户可能会根据班级编号查看班级详情,则班级信息使用a标签链接至班级详情页面,具体效果图:
图2.47 学生详情
-
请假申请模块实现
-
列表显示与综合查询功能实现
-
请假申请列表仅限学生身份登录才能查看,首先需要创建list.jsp页面,并设置好需要显示的值:编号、姓名、学号、出校日期、归校日期、状态、操作等相关信息,其中根据需要,将学生姓名使用a标签链接至详情页面,实现点击对应姓名即可查看其学生详情。
请假列表效果图:
图2.48 请假列表效果图
查询数据时,会根据当前登录的学生信息以及用户选择的申请状态来进行联合查询,所有接收数据后需要对两个数据进行处理后再根据情况生成SQL语句进行查询,流程如下:
图2.49 查询请假记录流程图
-
添加功能实现
用户点击添加按钮跳转至添加页面(add.jsp),并同时读取登录时用于初始化的InitServlet类获取的常量请假类型数据,由于请假涉及到了时间数据的处理,需要在表单中添加datetime-local类型控件,用于显示时间日期,且在后台处理中新建一个DateUtil类,用于处理日期时间与String类型的相互转换以及对网页格式的日期时间类型转换。添加请假信息效果图:
图2.50 添加请假效果图
而后用户输入数据后点击确认保存,执行添加操作,LeaveApplicationDao的add()方法使用的SQL语句为:
INSERT INTO leave_application (studentId, `type`, path, reason, begintime, endtime, `status`)
VALUES
(?,?,?,?,?,?,?)
-
修改功能实现
学生需要修改请假信息只能在该请假信息还没有被审批时才能修改,所以在设计修改请假时,需要根据当前请假信息状态来判断是否展示修改请假按钮。当用户点击修改请假信息时,会根据用户点击请假记录列表id查询对应的请假数据,并将其保存到request中,跳转至修改页面,随之修改页面会将传递过来的数据解析并填充到表单默认值,效果如下:
图2.51 修改请假
同理,该记录id不会显示在修改数据中,会作为隐藏控件存储到表单中。
当用户输入修改后的数据并点击确认保存时,系统会读取当前用户所填写的数据并执行修改操作,具体的SQL代码为:
UPDATE leave_application
SET `type`=?,path=?,reason=?,begintime=?,endtime=?
WHERE id=?
-
详情功能实现
由于请假详情不仅仅显示请假信息,还有学生信息、审批情况等,当用户点击对应记录的详情按钮后,会根据该记录的id跳转到LeaveApplicationService类调用getShenpiesById ()方法查询请假详情视图信息后保存到request中,最后返回到详情页面进行显示,涉及到的SQL代码为:
SELECT * FROM leave_application_shen_pi_view WHERE applicationId=?
请假详情视图的设计:
图2.52 请假详情视图设计
设计请假申请详情页面时,考虑到用户可能会根据学生或班主任姓名查看详情,则姓名信息使用a标签链接至学院详情页面,具体效果图:
图2.53 审批详情效果图
-
请假审批功能设计与实现
-
班主任审批功能设计与实现
-
班主任审批功能仅对具有班主任角色的教师开放,如不是则不显示班主任审批功能,当用户进入主界面时,需要对当前登录用户的角色进行识别。当用户点击进入审批页面后,会读取教师id并且通过该教师id判断是否为班主任,如果是则会查询该班主任所管理的班级学生的所有需要审批的数据,审批时序图如下:
图2.54 班主任审批时序图
审批效果图:
图2.55 审批效果图
图2.56 审批流程跨职能协作图
-
辅导员、院领导审批功能设计与实现
辅导员审批功能与班主任审批功能大体一致,区别在于查询学生数据范围不一样,班主任查询的是自己班级的学生,而辅导员和院领导所查询的是所属学院的学生请假记录,其时序图为:
图2.57 辅导员、院领导审批时序图
审批流程图如下:
图2.58审批流程图
-
销假功能设计与实现
-
学生销假设计与实现
-
当学生的请假记录为审批通过状态时,则可以销假,请假数据表中字段"img"用于存储该请假记录学生所上传的销假照片文件名。销假逻辑为学生归校后前往修远楼任意教室拍摄当前教室时钟显示时间的照片上传至服务器,等待教师审核。
该功能需要在服务器的tomcat配置虚拟目录,使其能够对服务器内容文件映射,显示至前台页面,具体操作:
打开tomcat的server.xml文件,并在其Host字段中添加如下配置:
<Context docBase="D:\临时\eclipse\image" path="/img" reloadable="true"/> |
其中docBase属性为需要映射的服务器文件夹绝对路径,path属性为映射后的URL地址。
由于涉及到文件上传功能,所以需要导入响应jar包,加快了功能实现进度。
学生上传照片页面设计:
图2.59审批流程图
当点击提交后,文件会以Post方式提交至服务器,当数据提交至服务器后,服务器对客户端传递过来的参数进行遍历,如果为文件字段会以当前请假记录id为名称,保存值服务器,并获取其请假记录id,将其文件名称写入数据库,等待教师审核。
图2.60 学生销假流程图
-
教师销假设计与实现
当教师进入审批页面后,系统会查询该教师所管理班级或学院的学生请假数据和审批数据,会将未处理的数据显示在审批列表,查询提交销假申请逻辑为:如果"img"字段内容不为空,且请假记录状态不会结束状态,则表名学生已上传销假照片,等待教师审批销假。
教师打开审批页面会查询需要审批或销假记录:
图2.61 教师销假列表
教师销假详情页:
图2.62 教师销假详情页
当教师点击同意销假后,会提交请假记录id至服务器,将请假状态设置为结束。至此,整个审批流程结束。
论文、源程序:https://xiaochengzi.lanzoui.com/iU2hLs2fhqd