一、面向对象开发工具介绍
1)Intellij IDEA的安装与使用:
1、在官网下载Intellij IDEA
2、按照不走安装即可,最后可以选择免费试用
3、新建空项目
即可开始Intellij IDEA的使用。
2) 代码编辑、编译、运行的基本操作;
代码编辑:直接在代码框上输入/删除即可。
编译:点击右上角的“构建项目”键即可。
运行:点击右上角的“运行”键即可。
二、需求分析与设计
1) 教师端签到应用软件的需求分析
通过对高校实际需求的研究,将班级考勤管理系统的功能模块分为系统基础支持模块、班级学生教师档案支持模块、考勤签到支持模块、学生请假支持模块,在使用场景上分为浏览器PC端和微信小程序端。
(2)系统基础支持模块
系统基础支持模块包括支撑班级考勤管理系统运行的管理模块。比如系统的菜单管理,维护了菜单的名称、前端路由、前端组件信息,是支撑系统运行的基础内容。比如日志模块,用于基础学生的登陆、打卡、请假操作,用于留档。
(3)班级学生教师支持模块
班级档案、学生档案、教师档案是班级考勤管理系统的基础档案信息。班级是学生的承载体,班级和学生是一对多的关系。
班级档案包括各个年级段行政班级的档案,包含了班级名称、班级代码、年级、班主任、学生数量、学习委员等,可以通过此模块进行班级基础数据的维护。
学生档案管理是对班级内学生的信息进行管理,其中包括各个班级下学生的档案,包含了学生姓名、性别、手机号、年龄等信息,可以通过此模块进行学生基础数据的维护。
教师档案管理是对高校在职教师的信息进行管理,其中包括各分院在职教师的档案,包含了教师姓名、学历、职称、开始工作时间等,可以通过此模块进行教师基础数据的维护。
(4)考勤签到管理
考勤签到管理模块,录入了教师发起的考勤信息,包括考勤的开始时间、结束时间、考勤缘由、参与班级等,可以通过此模块来发起考勤、操作考勤补录、查询考勤报表。
(5)学生请假管理
高校学生可以在此模块中发起请假,该学生所属班级的班主任可以对请假单进行审批,学习委员可以查看班级学生的请假情况,班级考勤系统所有关于请假的功能,都在学生请假管理下。
三、数据库
1、用户配置表
字段名称 | 数据类型 | 长度 | 字段含义 | 备注 |
nickname | Varchar | 255 | 用户姓名 | 非空 |
Username | Varchar | 255 | 登陆账号 | 非空 |
Password | Varchar | 255 | 登陆密码 | 非空 |
Mobile | Varchar | 255 | 手机号 | 非空 |
| Varchar | 255 | 邮箱 | 非空 |
Age | Int | 10 | 年龄 | |
departmentId | Varchar | 255 | 部门ID | 部门表外键 |
2、学生档案表
字段名称 | 数据类型 | 长度 | 字段含义 | 备注 |
Id | Varchar | 255 | 学生编号 | 非空 |
userNa | Varchar | 255 | 学生姓名 | 非空 |
studyNumber | Varchar | 255 | 学生学号 | 非空 |
sex | Varchar | 255 | 学生性别 | 非空 |
mobile | Varchar | 255 | 学生电话 | 非空 |
Classid | Varchar | 255 | 学生班级ID | 班级档案表外键 |
Remark | Varchar | 255 | 备注 | |
userId | Varchar | 255 | 用户ID | 用户档案表外键 |
3、教师档案表
字段名称 | 数据类型 | 长度 | 字段含义 | 备注 |
userName | Varchar | 255 | 教师姓名 | 非空 |
workNumber | Varchar | 255 | 教师工号 | 非空 |
Mobile | Varchar | 255 | 教师手机号 | 非空 |
Remark | Varchar | 255 | 备注 | |
userId | Varchar | 255 | 用户ID | 用户档案表外键 |
ClassId | Varchar | 255 | 班主任班级 | 班级档案表外键 |
Id | Varchar | 255 | 教师ID | 主键 |
4、学生请假表:
字段名称 | 数据类型 | 长度 | 字段含义 | 备注 |
Id | Varchar | 255 | 请假编号 | 主键 |
Type | Varchar | 255 | 请假类型 | 非空 |
startTime | Varchar | 255 | 请假开始时间 | 非空 |
EndTime | Varchar | 255 | 请假结束时间 | 非空 |
Status | Varchar | 255 | 请假状态 | 非空 |
Reason | Varchar | 255 | 请假理由 | 非空 |
studentId | Varchar | 255 | 学生ID | 学生表外键 |
Remark | Varchar | 255 | 备注 |
5、考勤档案表:
字段名称 | 数据类型 | 长度 | 字段含义 | 备注 |
Id | Varchar | 255 | 考勤编号 | 主键 |
teacherId | Varchar | 255 | 发起教师ID | 教师表外键 |
Title | Varchar | 255 | 考勤名称 | 非空 |
Date | Varchar | 255 | 发起日期 | 非空 |
classId | Varchar | 255 | 班级ID | 班级表外键 |
startTime | Varchar | 255 | 开始时间 | 非空 |
endTime | Varchar | 255 | 结束时间 | 非空 |
Type | Varchar | 255 | 考勤类型 | 非空 |
number | Varchar | 255 | 签到答案 | 非空 |
Remark | Varchar | 255 | 考勤备注 | |
Status | Varchar | 255 | 考勤状态 | 非空 |
四、界面设计与实现
我们的班级管理系统使用了Iview组件库,该组件库封装了大量的前端组件,只需要复制已有的组件代码,再进行简单的修改即可搭建优美且实用的前端界面。
下图为登录界面,师生可以输入账号+密码的方式进行登录,为保证安全设置了图形验证码验证,以保护系统不被频繁请求。
下图为首页界面,高校管理员、教师、学生都可以进入系统,分别拥有不同的菜单权限,分别可以执行不同身份需要的操作。
五、教师类设计与实现
TeacherArchivesController:
这段代码是一个Java Spring Boot框架下的教师档案管理接口的控制器类。下面是代码的主要内容:
- 导入了所需的类和包,包括基础工具类、实体类、服务类等。
- 使用@RestController注解将该类声明为控制器,并使用@RequestMapping注解指定了该控制器的基本路径。
- 通过@Autowired注解注入了IClassArchivesService和ITeacherArchivesService两个服务类的实例。
- 定义了多个处理HTTP请求的接口方法,使用@RequestMapping注解指定了请求路径和请求方法,并使用@ApiOperation注解提供了接口说明。
- 实现了查询单个教师档案、查询所有教师档案、分页查询教师档案、新增或修改教师档案、删除教师档案等功能。
- 在查询教师档案的接口方法中,根据传入的条件进行查询,并使用iClassArchivesService查询关联的班级档案信息。然后将查询结果封装到ResultUtil中返回。
- 在设置班主任的接口方法中,根据传入的班级ID和教师ID,查询班级档案和教师档案,并进行相应的处理和更新。
TeacherArchives:
- 这段代码定义了一个名为TeacherArchives的教师档案实体类。下面是代码的主要内容:
- 导入了所需的类和包,包括基础类、注解、实体类等。
- 使用@Data注解,自动生成了类的Getter、Setter、equals、hashCode和toString方法。
- 使用@Entity注解,指示该类是一个JPA实体类。
- 使用@DynamicInsert和@DynamicUpdate注解,表示在插入和更新数据时,只插入和更新非null字段。
- 使用@Table注解,指定了数据库表的名称。
- 使用@TableName注解,指定了对应的MyBatis-Plus的表名。
- 使用@ApiModel注解,提供了对该实体类的说明。
- 继承了ZwzBaseEntity类,该类是一个基础实体类,可能包含了一些共有的字段和方法。
- 定义了教师档案的属性,包括教师姓名(userName)、教师工号(workNumber)、教师手机(mobile)、备注(remark)和用户ID(userId)。
- 使用@Transient注解,表示该属性不会映射到数据库表中。
- 使用@TableField注解,设置了在数据库表中对应的字段名。
- 使用@ApiModelProperty注解,提供了对属性的说明。
TeacherArchivesMapper:
这段代码定义了一个教师档案的Mapper接口,用于实现与数据库的交互操作。下面是代码的主要内容:
- 导入了所需的类和包,包括教师档案实体类和MyBatis-Plus的BaseMapper接口。
- 定义了TeacherArchivesMapper接口,并继承了BaseMapper<TeacherArchives>接口。
- 泛型参数指定为TeacherArchives,表示该Mapper接口操作的是TeacherArchives实体类。
- 通过继承BaseMapper接口,该接口已经包含了许多基本的数据库操作方法,如插入、更新、删除、查询等。
- 由于继承了BaseMapper接口,无需再在该接口中编写具体的SQL语句,MyBatis-Plus会根据接口的方法名和实体类的属性进行自动生成SQL语句。
ITeacherArchivesService:
这段代码定义了一个教师档案的服务接口,用于定义教师档案相关的业务方法。下面是代码的主要内容:
- 导入了所需的类和包,包括教师档案实体类和MyBatis-Plus的IService接口。
- 定义了ITeacherArchivesService接口,并继承了IService<TeacherArchives>接口。
- 泛型参数指定为TeacherArchives,表示该服务接口操作的是TeacherArchives实体类。
- 通过继承IService接口,该接口已经包含了常用的数据库操作方法,如插入、更新、删除、查询等。
- 由于继承了IService接口,该接口可以通过调用相应的方法来实现对教师档案的管理和操作。
ITeacherArchivesServiceImpl:
这段代码是教师档案服务的实现类,实现了ITeacherArchivesService接口。下面是代码的主要内容:
- 导入了所需的类和包,包括教师档案实体类、教师档案Mapper接口、MyBatis-Plus的ServiceImpl类等。
- 使用@Service注解将该类声明为Spring的服务类。
- 使用@Transactional注解表示该类中的方法需要进行事务管理。
- 定义了ITeacherArchivesServiceImpl类,并继承了ServiceImpl<TeacherArchivesMapper, TeacherArchives>类,同时实现了ITeacherArchivesService接口。
- 泛型参数指定为TeacherArchivesMapper和TeacherArchives,表示该服务实现类操作的是TeacherArchives实体类,并使用TeacherArchivesMapper进行数据访问。
- 通过继承ServiceImpl类,该类已经实现了ITeacherArchivesService接口中定义的方法,并提供了一些常用的数据库操作,如插入、更新、删除、查询等。
TeacherController:
这段代码是一个教师管理的控制器类,用于处理与教师相关的请求。下面是代码的主要内容:
- 导入了所需的类和包,包括日志记录相关的类、工具类、实体类、服务类等。
- 使用@RestController注解将该类声明为Spring的REST控制器。
- 使用@Api注解对该控制器进行标记,表示该控制器是教师管理接口。
- 使用@RequestMapping注解指定了请求的基础路径为/zwz/teacher。
- 使用@Autowired注解将ITeacherService接口的实现类注入到该控制器中。
- 定义了多个处理HTTP请求的方法,每个方法都使用相应的注解进行标记,如@ApiOperation、@RequestMapping等。
- 每个方法对应一个具体的教师管理操作,如查询单条教师、查询全部教师个数、查询全部教师等。
- 方法中通过调用ITeacherService接口的方法来处理具体的业务逻辑,如查询、新增、编辑、删除教师等操作。
- 在一些方法上使用了@SystemLog注解,用于记录日志信息。
- 还有一个方法用于查询图表数据,根据教师的工资信息生成一个包含标题、类型和值的AntvVo对象列表,并返回给客户端。
Teacher:
这段代码是一个教师实体类,表示教师对象的属性和方法。下面是代码的主要内容:
- 导入了所需的类和包,包括基础类、注解类、数据类型类等。
- 使用@Data注解,该注解是Lombok库提供的注解,用于自动生成属性的getter、setter、toString、equals等方法。
- 使用@Entity注解,表示该类是一个实体类,用于持久化操作。
- 使用@DynamicInsert和@DynamicUpdate注解,表示在执行插入和更新操作时,动态生成相应的SQL语句,只插入或更新非空字段。
- 使用@Table注解指定数据库中对应的表名为a_teacher。
- 使用@TableName注解指定MyBatis-Plus框架中对应的表名为a_teacher。
- 使用@ApiModel注解对该实体类进行标记,表示该类是一个API模型类。
- 继承了ZwzBaseEntity类,该类是基础实体类,可能包含一些公共的属性和方法。
- 定义了多个属性,表示教师的姓名、学历、年龄、毕业院校、工资、在职状态、签名、个人简历、备注等信息。
- 每个属性上使用了@ApiModelProperty注解,用于在Swagger文档中对属性进行描述。
TeacherMapper:
这段代码是一个教师Mapper接口,用于定义与教师数据库表相关的操作。下面是代码的主要内容:
- 导入了所需的类和包,包括MyBatis-Plus的BaseMapper接口和教师实体类。
- 定义了一个接口TeacherMapper,并继承了BaseMapper<Teacher>接口。
- BaseMapper<T>是MyBatis-Plus提供的通用Mapper接口,提供了一些常用的数据库操作方法,如插入、更新、删除、查询等。
- 泛型参数Teacher指定了该Mapper操作的实体类为Teacher,即对教师表进行操作。
- 该接口没有额外的方法定义,只继承了BaseMapper接口中的方法。
- 通过继承BaseMapper<Teacher>接口,可以直接使用继承的方法来进行教师表的增删改查等数据库操作。
ITeacherService:
这段代码是一个教师Service接口,用于定义教师相关的服务方法。下面是代码的主要内容:
- 导入了所需的类和包,包括MyBatis-Plus的IService接口和教师实体类。
- 定义了一个接口ITeacherService,并继承了IService<Teacher>接口。
- IService<T>是MyBatis-Plus提供的通用Service接口,提供了一些常用的服务方法,如插入、更新、删除、查询等。
- 泛型参数Teacher指定了该Service操作的实体类为Teacher,即对教师表进行操作。
- 该接口没有额外的方法定义,只继承了IService接口中的方法。
- 通过继承IService<Teacher>接口,可以直接使用继承的方法来进行教师表的增删改查等服务操作。
ITeacherServiceImpl:
这段代码是教师Service接口的实现类,用于实现教师相关的服务方法。下面是代码的主要内容:
- 导入了所需的类和包,包括教师Mapper接口、教师实体类、教师Service接口等。
- 使用@Slf4j注解,该注解是Lombok库提供的注解,用于自动生成日志记录的相关代码。
- 使用@Service注解,表示该类是一个Spring的服务类。
- 使用@Transactional注解,表示该类中的方法都需要在事务中执行。
- 类名为ITeacherServiceImpl,实现了ITeacherService接口,并继承了MyBatis-Plus的ServiceImpl<TeacherMapper, Teacher>类。
- 泛型参数TeacherMapper指定了该实现类使用的Mapper接口为TeacherMapper,泛型参数Teacher指定了该实现类操作的实体类为Teacher。
- 使用@Autowired注解将TeacherMapper注入到该实现类中。
- 实现了ITeacherService接口中定义的方法,具体的实现通过调用TeacherMapper中的方法来完成。
六、学生类设计与实现
StudentArchivesController:
一个Java类StudentArchivesController,它是一个控制器类,用于处理与学生档案管理相关的请求。该类包含了一些方法,每个方法处理不同的请求路径和请求方法,并提供相应的功能。
这个控制器类实现了以下功能:
1、添加学生到班级:通过班级id和学生id,将学生添加到班级中。如果班级或学生不存在,则返回错误消息。
2、设置班级学习委员:通过班级id和学生id,将学生设置为班级的学习委员。如果班级或学生不存在,则返回错误消息。
3、分页查询学生档案:根据查询条件查询学生档案,并进行分页。查询结果包括学生档案、班级信息和班主任信息。
4、初始化学生档案到用户模块:将现有的学生档案初始化到用户模块中,即创建对应的用户并关联学生档案。
5、新增学生档案:根据提供的学生档案信息新增学生档案,并创建对应的用户。
6、编辑学生档案:根据提供的学生档案信息编辑已存在的学生档案。
7、删除学生档案:根据提供的学生id列表删除学生档案,并同时删除对应的用户。
此外,代码中还包含了一个用于校验用户名、手机号和邮箱是否已存在的辅助方法。
StudentArchives:
这段代码实现了一个Java实体类StudentArchives,用于表示学生档案的信息,并与数据库表进行映射。
具体实现的功能包括:
1、定义实体类:通过class StudentArchives定义了一个学生档案的实体类。
2、继承关系:StudentArchives类继承自ZwzBaseEntity类,可能是一个基础实体类,继承了基本的字段和方法。
3、注解和注释:使用了一些注解来提供额外的信息和配置。@Entity和@Table注解指示该类是一个JPA实体类,并指定了数据库表的名称。@ApiModel和@ApiModelProperty注解用于在生成API文档时提供模型和属性的描述信息。
4、属性定义:定义了学生档案的各种属性,包括学生姓名、学号、性别、电话、班级ID、备注和用户ID等。
5、非持久化字段:className和classMain属性使用了@Transient注解,表示这些字段不会映射到数据库表中。它们用于存储学生档案关联的班级名称和班主任名称,但不作为数据库表的列。
6、表名映射:@Table和@TableName注解分别指定了数据库表的名称为a_student_archives。
7、lombok注解:使用了@Data注解,通过lombok库自动生成了常见的getter、setter和toString方法。
StudentArchivesMapper:
这段代码实现了一个StudentArchivesMapper接口,用于对学生档案进行数据库操作。
具体实现的功能包括:
1、继承关系:StudentArchivesMapper接口继承了BaseMapper<StudentArchives>接口,其中BaseMapper是MyBatis Plus框架提供的一个通用Mapper接口。
2、泛型类型:BaseMapper<StudentArchives>中的泛型类型指定了该Mapper接口操作的实体类为StudentArchives,也就是学生档案实体类。
3、数据库操作:通过继承BaseMapper接口,StudentArchivesMapper接口继承了一系列基本的数据库操作方法,如插入、更新、删除和查询等。这些方法的具体实现由MyBatis Plus框架提供。
IStudentArchivesService:
这段代码实现了一个接口IStudentArchivesService,用于定义学生档案的服务接
口。
具体实现的功能包括:
1、继承关系:IStudentArchivesService接口继承了IService<StudentArchives>接口,其中IService是MyBatis Plus框架提供的一个通用服务接口。
2、泛型类型:IService<StudentArchives>中的泛型类型指定了该服务接口操作的实体类为StudentArchives,也就是学生档案实体类。
3、服务方法定义:IStudentArchivesService接口可以定义一些特定的服务方法,用于处理与学生档案相关的业务逻辑。这些方法的具体实现由实现该接口的类提供。
IStudentArchivesServiceImpl:
这段代码实现了学生档案服务接口IStudentArchivesService的具体实现类
IStudentArchivesServiceImpl。
具体实现的功能包括:
1、继承关系:IStudentArchivesServiceImpl类继承自ServiceImpl<StudentArchivesMapper, StudentArchives>类,其中ServiceImpl是MyBatis Plus框架提供的一个通用服务实现类。
2、实现接口:IStudentArchivesServiceImpl类实现了IStudentArchivesService接口,通过继承ServiceImpl类,已经实现了IStudentArchivesService接口中定义的方法。
3、依赖注入:通过使用@Service注解,将IStudentArchivesServiceImpl类标识为一个服务类,并由Spring容器进行管理。这样可以通过依赖注入的方式在其他组件中使用该服务。
4、事务管理:通过使用@Transactional注解,对该服务类中的方法进行事务管理。这样可以确保在方法执行期间的数据库操作符合事务的 ACID 特性。
5、Mapper依赖:在泛型参数中指定了StudentArchivesMapper,表示该服务类依赖于StudentArchivesMapper接口来进行数据库操作。通过依赖注入的方式,可以在该服务类中使用StudentArchivesMapper接口提供的方法来操作学生档案的数据。
StudentController:
这段代码是一个Java类,命名为StudentController,是一个学生管理接口的控制
器。它使用了Spring MVC框架的注解来定义接口的路径和请求方法,并通过
@Autowired注解注入了IStudentService接口的实例。
下面是代码的主要结构和功能:
1、导入了一些类和包,包括日志、分页工具、结果处理工具等。
2、使用@RestController注解将该类标记为RESTful风格的控制器,它可以处理HTTP请求并返回JSON格式的响应。
3、使用@Api注解为该控制器添加了一个描述,说明它是学生管理接口。
4、使用@RequestMapping注解定义了该控制器的基本路径"/zwz/student"。
5、使用@Transactional注解将该控制器的所有方法都放在一个事务中进行处理。
6、声明了一个私有字段IStudentService iStudentService,并通过@Autowired注解自动注入该字段的实例。
7、定义了一系列接口方法,包括查询单个学生、查询全部学生个数、查询全部学生、分页查询学生、增改学生、新增学生、编辑学生和删除学生。
8、每个接口方法都使用了@SystemLog注解,该注解用于记录系统日志,包括操作描述、日志类型和操作类型。
9、每个接口方法都使用了@RequestMapping注解定义了其具体的路径和请求方法。
10、每个接口方法都使用了@ApiOperation注解来描述该接口的功能。
11、接口方法的具体实现根据功能的不同,使用了相应的业务逻辑操作,例如查询数据库、新增数据、更新数据等。
12、大部分接口方法都返回了一个Result对象,Result是一个自定义的通用结果类,用于封装接口的返回结果和状态码。
Student:
这段代码定义了一个名为Student的实体类,用于表示学生对象。以下是代码实现
的主要内容:
1、导入了一些类和包,包括基础类、注解、实体类相关的注解等。
2、使用@Data注解,该注解是Lombok库提供的一个注解,用于自动生成getter、setter、toString等方法。
3、使用@Entity注解,表示该类是一个实体类,将会与数据库中的表进行映射。
4、使用@Table注解,指定了数据库表的名称为"a_student"。
5、使用@DynamicInsert注解,表示在插入数据时,会动态生成INSERT语句,只插入非空字段。
6、使用@DynamicUpdate注解,表示在更新数据时,会动态生成UPDATE语句,只更新非空字段。
7、使用@TableName注解,指定了MyBatis-Plus框架使用的表名为"a_student"。
8、使用@ApiModel注解,用于对实体类进行描述,其中"value"属性指定了该实体类的名称为"学生"。
9、继承了ZwzBaseEntity类,该类是一个基础实体类,可能包含一些通用字段,如id、创建时间、修改时间等。
10、声明了一些字段,包括姓名、性别、年龄、学号和学校,每个字段都使用了@ApiModelProperty注解来描述字段的含义。
StudentMapper:
这段代码定义了一个名为StudentMapper的接口,该接口继承自BaseMapper接口,
并指定了泛型类型为Student。以下是代码实现的主要内容:
1、导入了一些类和包,包括BaseMapper接口和Student实体类。
2、定义了一个接口StudentMapper,并声明了继承自BaseMapper<Student>。
3、BaseMapper是MyBatis-Plus框架提供的一个通用Mapper接口,它提供了一些常用的数据库操作方法,如插入数据、更新数据、删除数据和查询数据等。
4、通过继承BaseMapper<Student>,StudentMapper接口就拥有了BaseMapper中定义的这些通用方法。
5、由于StudentMapper是一个接口,没有具体的方法实现,它只是定义了接口中应该包含的方法签名。
6、StudentMapper的实际实现是由MyBatis-Plus框架在运行时动态生成的,它会根据接口的定义自动创建相应的SQL语句,并执行数据库操作。
IStudentService:
这段代码定义了一个名为IStudentService的接口,该接口继承自IService接口,
并指定了泛型类型为Student。以下是代码实现的主要内容:
1、导入了一些类和包,包括IService接口和Student实体类。
2、定义了一个接口IStudentService,并声明了继承自IService<Student>。
3、IService是MyBatis-Plus框架提供的一个通用Service接口,它提供了一些常
用的数据库操作方法,如插入数据、更新数据、删除数据和查询数据等。
4、通过继承IService<Student>,IStudentService接口就拥有了IService中定义的这些通用方法。
5、由于IStudentService是一个接口,没有具体的方法实现,它只是定义了接口中应该包含的方法签名。
6、IStudentService接口可以被具体的实现类实现,实现类需要提供具体的方法实现,用于处理与Student实体类相关的业务逻辑。
IStudentServiceImpl:
这段代码实现了一个名为IStudentServiceImpl的类,该类实现了IStudentService
接口,并继承了ServiceImpl类。以下是代码实现的主要内容:
1、导入了一些类和包,包括StudentMapper接口、Student实体类、IStudentService接口等。
2、使用@Slf4j注解,该注解是Lombok库提供的一个注解,用于自动生成日志相关的代码。
3、使用@Service注解,将该类标记为一个服务类,表示它是业务逻辑的实现类。
4、使用@Transactional注解,将该类的所有方法都放在一个事务中进行处理。
5、类定义了一个私有字段StudentMapper studentMapper,并通过@Autowired注解进行自动注入。
6、通过继承ServiceImpl<StudentMapper, Student>,IStudentServiceImpl类获得了ServiceImpl中定义的一些通用的数据库操作方法的实现。
7、IStudentServiceImpl类还实现了IStudentService接口,该接口定义了一些与Student实体类相关的业务逻辑方法。
8、IStudentServiceImpl类可以根据需要重写或调用ServiceImpl中的通用方法,来实现具体的业务逻辑操作。
9、通过@Autowired注解,将StudentMapper的实例注入到studentMapper字段中,以便在方法中使用该实例进行数据库操作。
七、签到管理类设计与实现
ClassArchivesController:
这段代码实现了一个名为ClassArchivesController的RESTful API控制器类,用
于处理班级档案管理相关的请求。以下是代码实现的主要内容:
1、导入了一些类和包,包括各种实体类、服务类、工具类等。
2、使用@Slf4j注解,该注解是Lombok库提供的一个注解,用于自动生成日志相关的代码。
3、使用@RestController注解,将该类标记为一个控制器类,表示它可以处理HTTP请求并返回相应的结果。
4、使用@Api注解,定义了班级档案管理接口的描述信息。
5、使用@RequestMapping注解,指定了控制器中处理请求的基本路径。
6、类定义了一些私有字段,通过@Autowired注解进行自动注入,包括
IClassArchivesService、IStudentArchivesService和ITeacherArchivesService
的实例。
7、该类实现了多个请求处理方法,每个方法对应一个具体的请求路径和请求方法,并使用@ApiOperation注解对方法进行描述。
8、请求处理方法根据具体的业务逻辑调用相应的服务方法,进行数据查询、增加、修改和删除等操作。
9、返回结果使用ResultUtil类进行封装,以统一的格式返回响应结果。
10、通过@Transactional注解,将类中的方法都放在一个事务中进行处理。
11、在查询班级档案的方法中,使用QueryWrapper进行条件查询,并通过PageUtil对分页信息进行处理。
12、在查询班级档案的方法中,根据关联的学生档案和教师档案进行信息的补全。
13、在新增或修改班级档案的方法中,调用服务类的saveOrUpdate方法进行数据的保存或更新。
14、在删除班级档案的方法中,通过循环调用服务类的removeById方法进行数据的删除。
ClassArchives:
这段代码实现了一个名为ClassArchives的班级档案实体类。以下是代码实现的主
要内容:
1、导入了一些类和包,包括基类、注解、实体类等。
2、使用@Data注解,自动生成getter和setter方法,以及equals、hashCode和toString方法。
3、使用@Entity注解,将该类标记为一个实体类,表示它映射到数据库中的一个表。
4、使用@DynamicInsert注解,表示在插入数据时,只插入非null字段对应的列。
5、使用@DynamicUpdate注解,表示在更新数据时,只更新非null字段对应的列。
6、使用@Table注解,指定了实体类对应的表名。
7、使用@TableName注解,指定了实体类对应的表名,这个注解是MyBatis-Plus框架提供的。
8、使用@ApiModel注解,对实体类进行描述。
9、继承了ZwzBaseEntity类,表示该实体类是一个基类实体类,可能包含一些公共字段和方法。
10、定义了一些私有字段,对应于班级档案的各个属性,如班级名称、年级、学习委员ID、班主任ID、备注等。
11、使用@Transient注解,表示这两个字段不在数据库表中存在,是临时计算得到的字段。
12、使用@TableField注解,指定了这两个临时字段在数据库表中不存在。
13、使用@ApiModelProperty注解,对实体类的属性进行描述,用于生成API文档。
ClassArchivesMapper:
这段代码定义了一个名为ClassArchivesMapper的接口,它是一个MyBatis-Plus
的Mapper接口。以下是代码实现的主要内容:
1、导入了一些类和包,包括实体类和MyBatis-Plus的BaseMapper接口。
2、接口继承了BaseMapper<ClassArchives>,表示该接口是ClassArchives实体类的Mapper接口,用于对ClassArchives实体类进行数据库操作。
3、通过泛型指定了BaseMapper的类型参数为ClassArchives,这样在接口中可以使用BaseMapper提供的各种数据库操作方法,如插入、更新、删除和查询等。
4、该接口中没有定义任何方法,因为BaseMapper中已经包含了常用的数据库操作方法,可以直接使用。
IClassArchivesService:
这段代码定义了一个名为IClassArchivesService的接口,它是一个服务接口。以
下是代码实现的主要内容:
1、导入了一些类和包,包括实体类和MyBatis-Plus的IService接口。
2、接口继承了IService<ClassArchives>,表示该接口是ClassArchives实体类的服务接口,用于定义对ClassArchives实体类的业务逻辑。
3、通过泛型指定了IService的类型参数为ClassArchives,这样在接口中可以使用IService提供的各种服务方法,如插入、更新、删除和查询等。
4、该接口中没有定义任何方法,因为IService中已经包含了常用的服务方法,可以直接使用。
IClassArchivesServiceImpl:
这段代码实现了一个名为IClassArchivesServiceImpl的服务实现类,它是
IClassArchivesService接口的具体实现。以下是代码实现的主要内容:
1、导入了一些类和包,包括实体类、Mapper接口、服务接口、服务实现类等。
2、使用@Service注解,将该类标记为一个服务实现类,表示它提供了IClassArchivesService接口定义的具体服务实现。
3、使用@Transactional注解,将该类中的方法都放在一个事务中进行处理。
4、类继承了ServiceImpl<ClassArchivesMapper, ClassArchives>,表示该类是ClassArchives实体类的服务实现,同时也是IClassArchivesService接口的具体实现。
5、通过泛型指定了ServiceImpl的类型参数,第一个参数为ClassArchivesMapper,表示使用ClassArchivesMapper作为数据访问层的Mapper接口;第二个参数为ClassArchives,表示操作的实体类是ClassArchives。
6、该类中没有定义任何方法,因为ServiceImpl中已经包含了常用的服务方法,可以直接使用。
八、主程序设计与实现
Web管理系统的设计与实现
(1)登陆模块的功能设计
下图为web端班级考勤管理系统的登录界面,师生可以输入自己的工号/学号+密码的方式进行登陆,为了保证系统安全还设置了图形验证码验证,图形验证码是为了保护系统的接口不被频繁请求,维护系统的安全性。
登录系统界面
高校管理员、教师、学生都可以通过登陆模块进入系统,分别拥有者不同的菜单权限。对于高校管理员可以对系统基础的模块进行维护,对高校班级、教师、学生的数据进行增改,有权查询系统的登陆日志和有关请假、考勤的全部数据,拥有最高的权限。教师可以发起课堂签到,以及审核学生提交的请假单。学生的菜单权限则包括参与签到、发起请假、查询自己历史的请假单。
用户登录之后默认进入首页,班级考勤管理系统使用了IView组件库,该组件库封装了大量的现成前端组件,只需复制组件代码,进行少量的修改即可搭建前端界面。在首页中存放了六张图,提高界面的美观性。
首页
(2)高校管理员模块的功能设计
高校管理员进入系统之后,第一个大模块就是数据中心。数据中心模块包括了班级考勤系统最基础的功能,比如系统菜单、登陆角色权限、操作日志等等,给系统提供了数据支持,其中权限菜单配置页面如图所示。
系统基础模块角色权限修改
第二大模块就是班级学生模块,其中包括了班级档案、学生档案、教师档案三个子模块。其中班级档案支持模块界面如图5-4所示,班级档案包含了行政班级的信息,其中中间区域上部分含有添加、搜索、筛选功能按钮,下方显示班级的列表,点击班级所在行的“查看学生”,可以查询当前班级下有哪些学生;点击“添加学生”按钮,可以从非本班学生中添加学生到此班级;点击“设置学习委员”按钮,可以选择本班学生作为学习委员;点击“设置班主任”按钮,可以从教师档案中选择教师作为本班班主任。同样也包含了班级的一些基本信息,如班级名称、班级代码、备注等,管理人员可以点击右侧的编辑按钮对班级基础信息进行修改操作,也可以点击删除按钮来删除整个班级。
班级档案模块实现
同理,学生管理档案如图5-5所示。高校管理员可以对学生的具体数据进行查询,支持根据学生姓名进行查询,在左上角输入框输入学生的姓名后,点击搜索按钮即可实现模拟查询功能。
点击每一行学生的编辑按钮,可以对学生的现有数据进行编辑。点击每一行学生数据的设置班级按钮,可以为学生设置所在的班级。
学生管理模块
在模块中,管理员也可以点击添加按钮,实现添加学生,在输入完成学生的项目、学号、电话、性别后,点击提交并保存即可完成学生的添加操作,如下图所示。
添加学生档案的实现
新增学生代码 |
@RequestMapping(value = "/insert", method = RequestMethod.POST) @ApiOperation(value = "新增学生档案") public Result<StudentArchives> insert(StudentArchives studentArchives){ // 校验是否已存在 checkUserInfo(studentArchives.getStudyNumber(), studentArchives.getMobile(), studentArchives.getMobile() + "@qq.com"); User user = new User(); user.setUsername(studentArchives.getStudyNumber()); user.setNickname(studentArchives.getUserName()); user.setPassword(new BCryptPasswordEncoder().encode("123456")); user.setMobile(studentArchives.getMobile()); user.setEmail(studentArchives.getMobile() + "@qq.com"); user.setSex(studentArchives.getSex()); user.setDepartmentId("1464487432169852929"); user.setDepartmentTitle("默认部门"); user.setDescription("学生"); iUserService.saveOrUpdate(user); UserRole ur = new UserRole(); ur.setUserId(user.getId()); ur.setRoleId("1492065084732739584"); iUserRoleService.saveOrUpdate(ur); studentArchives.setUserId(user.getId()); if(iStudentArchivesService.saveOrUpdate(studentArchives)){ return new ResultUtil<StudentArchives>().setData(studentArchives); } return new ResultUtil<StudentArchives>().setErrorMsg("操作失败"); } |
(3)教师模块的功能设计
教师在班级考勤系统中的能看到考勤支持模块,其中分为考勤档案分模块和考勤报表分模块。考勤档案分模块下设发起考勤、考勤汇总、考勤补录三个子菜单。教师可以进入发起考勤界面,完成课堂考勤的发起操作,如图所示。
发起考勤模块的实现
此外还有考勤汇总模块,包括考勤名称、发起日期、参与班级、开始结束时间、签到类型的信息,以及考勤备注。还有查询二维码功能,如下图可以看出。
考勤档案二维码的实现
学生请假模块包含了学生请假单具体信息的维护。该部分可帮助高校教师查看自己班级学生的请假汇总信息,包括请假的类型、请假开始结束时间、请假原因、请假是否审核、请假的备注。如图所示,当前页面为学生请假的信息,在这个页面可以对学生的请假信息进行查看,该模块也可对数据进行增删查功能,在查找部分,管理员可根据请假的类型来选择请假单。该模块可点击通过按钮即可进行审核。
请假审核模块界面
管理员可以根据自己的需求,查看学生的考勤图表,如图所示。
图A
图表分析界面B
图表分析核心代码 |
renderStatistic(containerWidth, text, style) { const { width: textWidth, height: textHeight } = measureTextWidth(text, style); const R = containerWidth / 2; let scale = 1; if (containerWidth < textWidth) { scale = Math.min(Math.sqrt(Math.abs(Math.pow(R, 2) / (Math.pow(textWidth / 2, 2) + Math.pow(textHeight, 2)))), 1); } const textStyleStr = `width:${containerWidth}px;`; return `<div style="${textStyleStr};font-size:${scale}em;line-height:${scale < 1 ? 1 : 'inherit'};">${text}</div>`; }, |
(4)学生模块的功能设计
作为学生账号,也可以查询自己的历史请假记录,和历史请假的审核情况。另外也支持对已提交的请假单进行取消撤回操作,如图所示。
学生历史请假界面
学生账号还可以发起请假操作,需要输入请假的类型、请假时间、理由,提交后即可申请请假,如图所示.
学生发起请假界面
查询考勤核心代码 |
@RequestMapping(value = "/getMyAttendanceOnApp", method = RequestMethod.GET) @ApiOperation(value = "查询我的考勤待办") public Result<List<AttendanceItem>> getMyAttendance(@RequestParam String id) { QueryWrapper<StudentArchives> stuQw = new QueryWrapper<>(); stuQw.eq("user_id",id); StudentArchives sa = iStudentArchivesService.getOne(stuQw); if(sa == null) { return ResultUtil.error("非学生用户"); } QueryWrapper<AttendanceItem> itemQw = new QueryWrapper<>(); itemQw.eq("student_id",sa.getId()); return new ResultUtil<List<AttendanceItem>>().setData(iAttendanceItemService.list(itemQw)); } |
(5)微信小程序的设计与实现
学生可以在微信小程序上进行登陆。对于微信小程序,也采取了手机号登录的方式,学生进入微信小程序后,点击下面的马上登陆按钮,即可跳转到登陆界面,登陆界面如图所示。
微信小程序主界面
用户可以选择使用微信绑定的手机号一键登录系统,也可以使用普通登录,输入自己的账号和密码完成系统登陆。为了简化流程,建议使用微信绑定的手机号码一键登录,既方便又快捷,如图所示。
微信小程序登陆界面
今后系统后,学生可以通过微信小程序,进入到考勤打卡模块,首先进行GPS定位,然后一键参与考勤打卡,考勤需要输入老师设置的数字密码。若考勤密码正确,即可完成考勤;若考勤密码错误,则无法进行考勤打卡,防止代打卡、非打卡地打卡的情况出现,如图所示。
微信小程序考勤打卡界面
在班级考勤系统的微信小程序端,支持学生的历史请假查询功能。学生可以进入历史请假模块,就可以看到自己历史的请假数据,时刻关心自己的考勤情况,也方便自己对自己的学习生活有个基本的了解,如图所示。
微信小程序我的请假界面
九、软件测试与优化
(1)功能测试:
1、针对系统的各项功能进行全面测试,包括学生签到、考勤记录管理、教师管理、班级管理等。
2、确保系统能够正确地处理各种场景下的数据输入、验证和处理逻辑。
3、针对不同用户角色(如教师、学生、管理员)进行测试,确保每个角色都能正常使用系统功能。
(2)兼容性测试:
1、在不同操作系统(如Windows、Mac、Linux)和浏览器(如Chrome、Firefox、Safari)上进行测试,确保系统在各种环境下都能正常运行。
2、测试系统在不同设备上的响应性,包括桌面、平板和移动设备。
(3)性能测试:
1、对系统进行负载测试,模拟多个用户同时使用系统的情况,评估系统的性能和稳定性。
2、测试系统在处理大量数据时的性能表现,包括查询、统计和报表生成等操作。
(4)安全性测试:
1、对系统的登录和权限控制进行测试,确保只有授权用户能够访问系统的敏感数据和功能。
2、检测系统是否存在潜在的安全漏洞,如SQL注入、跨站脚本攻击等。
(5)用户界面测试:
1、确保系统的用户界面易于使用和导航,并具有一致的布局和样式。
2、进行用户体验测试,收集用户反馈,改进系统的用户界面和交互设计。
(6)错误处理和异常情况测试:
1、模拟各种错误和异常情况,如无效的输入、网络中断、数据库故障等,确保系统能够正确处理并给出适当的提示和错误信息。
(7)用户反馈和持续优化:
1、收集用户的反馈和建议,了解用户需求和问题,及时进行修复和改进。
2、进行系统性能监控和日志分析,发现潜在的性能问题和瓶颈,并进行优化。
(8)定期维护和更新:
1、定期进行系统的维护和更新,修复已知问题和漏洞,保持系统的安全性和稳定性。
2、根据用户需求和市场变化,持续改进和添加新功能,提供更好的用户体验。