考勤系统


100011125-实现(Web)考勤系统


一、 系统概要设计

本系统主要分为 Controller 层,Service 层,Dao 层三层设计,主要运用 SpringBoot 及 JDBC 等技术,Dao 层实现对数据库的增删查改操作,Service 使用 Dao 层提供的接口并为 Controller 层提供接口,Controller 层方法主要是调用 Service 层提供的接口。在调用时 Service 会进行相关的操作同时调用 Dao 层的接口实现数据库的操作,最后将结果传回给 Controller 层。

功能方面见于需求分析文档,主体功能实现代码在 Service 层,Controller 层只是执行获取数据并将数据作为传参调用 Service 层接口的操作。Dao 层也只是给 Service 层提供修改数据库的接口,本身并无功能代码。Dao 层功能实现代码主要通过映射的方式,在 resources 文件夹下建立 mapper 文件夹,再在内编写相关 XML 文件映射定义 Dao 层对数据库的具体操作。整个系统分为不同层对应的 package,其中只有 Service 的实现类(serviceImpl)有具体的操作代码,其他包内大部分类只提供接口和调用其他层方法。(utils 内为启动类)

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法

图 1-1 考勤系统内部 package

用户鉴权使用了 Apache Shiro 作为安全框架(有参考源代码),定义了 shiro Config 和 Realm,用户的权限储存在本地数据库当中,Realm 从本地数据库获取数据,在用户登录时将相关数据提供给 Shiro,这样限制了用户在后续所能执行的操作,当权限不足时会跳转到设定好的页面提示权限不足。

定义 HTML 文件得到网页前端,定义相应的脚本获取后台数据库数据(有参考源代码),登录界面依靠 Web 获取数据。在 Controller 层的方法内添加相应注释(@RequestParam)去获取 http 传入数据作为传参实现前后端交互。同时运用 thymeleaf 组件进行前端页面的跳转。

java 考勤时间算法 java实现考勤打卡_数据库_02

图1-2 系统前后端交互概述图

二、 数据库设计

1.attendRecord 表

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_03

该表中存储的数据为员工的打卡记录。

2.dept 表

java 考勤时间算法 java实现考勤打卡_数据库_04

用于存储公司部门信息。

3.Detailed 表

java 考勤时间算法 java实现考勤打卡_数据库_05

用于存储员工详细的工作时间。

4.dataProce_t 表

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_06

此表用于统计员工的考勤相关的信息,包含员工姓名、部门、工作时长、迟到情况、加班情况等信息。

5.Emptable 表

java 考勤时间算法 java实现考勤打卡_mysql_07

用于存储员工信息的数据库表,存储有员工姓名、性别、部门等基础的员工信息。

6.leaveTable 表

java 考勤时间算法 java实现考勤打卡_java_08

此表用于存储员工的请假申请,包括请假类别、请假起始时间、结束时间、审批人和审批状态等信息。

7.resource 表

java 考勤时间算法 java实现考勤打卡_java_09

此表用于存储前段功能,及相关的 URL 信息。

8.user_resource 表

java 考勤时间算法 java实现考勤打卡_前端_10

此表用于存储用户资源,包括用户 id 和用户的资源 id。

9.workTimeTable 表

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_11

此表用于存储员工的工作时间,包含当天工作的具体时间。

三、Controller 层设计

在 Controller 层中,我们方法都是调用 Service 层提供的接口,在方法中设定传入参数的值和类型,采用@RequestParam 去获取 http 请求传入的参数作为方法参数,并用@ResponseBody 将返回的结果直接写入 HTTP 响应正文中,

1. ApprovalController

ApprovalController 作为审批管理的类,调用了 ManagageService,ApprovalService,AuthorityService 接口作为私有变量。定义网页端访问链接为/approval,Result 为网页端返回 http 请求情况。

java 考勤时间算法 java实现考勤打卡_mysql_12

ApprovalController 是员工查询自己请假申请及相关情况的类,分别定义了以下功能:

查询审批人功能:调用 mangageService 接口中的 queryApprovalInfo 方法进行查询。

java 考勤时间算法 java实现考勤打卡_数据库_13

请假申请功能:调用 approvalService 接口中的 leaveApplication 方法进行查询。

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_14

查询待审批总数功能:调用 approvalService 接口中的 queryCount 方法进行查询

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_15

获取待审批记录功能:调用 approvalService 接口中的 getPendingApproval 方法进行查询

java 考勤时间算法 java实现考勤打卡_前端_16

查询已审批总数功能:调用 approvalService 接口中的 queryApprovalCount 方法进行查询

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_17

获取已审批记录功能:调用 approvalService 接口中的 getApproval 方法进行查询

java 考勤时间算法 java实现考勤打卡_mysql_18

审批操作功能:调用 approvalService 接口中的 operation 方法进行查询

java 考勤时间算法 java实现考勤打卡_前端_19

查询是否拥有权限功能:调用 authorityService 接口中的 authorityUrl 方法进行查询

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_20

删除待审批记录功能:调用 approvalService 接口中的 delApproval 方法进行查询

java 考勤时间算法 java实现考勤打卡_数据库_21

2. AuthorityController

AuthorityController 作为权限管理的类,调用了 AuthorityService 接口,定义网页端访问链接为/authority

java 考勤时间算法 java实现考勤打卡_java_22

AuthorityController 是最高级别管理者(admin)所应用的类,定义了查询员工信息,查询员工总数,添加权限和查询权限的功能。

查询员工信息功能:调用 AuthorityService 接口的 queryEmpInfo 方法

java 考勤时间算法 java实现考勤打卡_前端_23

查询员工总数功能:调用 AuthorityService 接口的 queryCount 方法

java 考勤时间算法 java实现考勤打卡_java_24

添加权限功能:调用 AuthorityService 接口的 addAuthority 方法

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_25

查询权限功能:调用 AuthorityService 接口的 queryAuthorityId 方法

java 考勤时间算法 java实现考勤打卡_前端_26

3. DeptController

DeptController 作为部门管理的相关类,调用了 DeptService 和 AuthorityService 接口,定义网页端访问链接为/dept

java 考勤时间算法 java实现考勤打卡_前端_27

只有有部门管理权限的员工才可以进行相关的操作,定义了与部门操作相关的功能:

添加,删除部门:调用 deptService 接口的 addDept 和 delDept 方法

java 考勤时间算法 java实现考勤打卡_数据库_28

查询,更新部门信息:调用 deptService 接口的 queryDept 和 upDept 方法

java 考勤时间算法 java实现考勤打卡_java_29

查询是否拥有部门管理权限:调用 authorityService 接口的 authorityUrl 方法

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_30

查询部门总数,部门 id,根据 id 查询部门信息:调用 deptService 接口的 queryCount,queryDeptInfo 和 getDeptInfoById 方法

java 考勤时间算法 java实现考勤打卡_mysql_31

4. ManageController

ManageController 为员工管理类,调用了 ManagaService 和 AuthorityService 接口,定义网页端访问链接为/mangage

java 考勤时间算法 java实现考勤打卡_java_32

员工管理需要登录账户有员工管理权限才能进行相关的操作,定义了员工信息的相关操作。

增删查改员工信息:调用了 managaService 的 queryDeptEmpInfo,delEmpInfo,addEmp 和 upEmpInfo 方法

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_33

java 考勤时间算法 java实现考勤打卡_java_34

员工总数及修改员工密码:调用了 managaService 的 queryDeptEmpInfo,delEmpInfo,addEmp 和 upEmpInfo 方法

java 考勤时间算法 java实现考勤打卡_数据库_35

5. ViewController

ViewController 负责不同页面之间的跳转,根据我们使用的 SpringBoot,我们再运用了 thymeleaf 进行页面的跳转,HTML 网页我们定义在 templates 文件夹中,在 pom 中添加了 Thymeleaf 组件,在 ViewController 设定好了各个网页的返回值以实现最终的动态页面跳转。

pom 文件部分:

java 考勤时间算法 java实现考勤打卡_前端_36

ViewController:

java 考勤时间算法 java实现考勤打卡_数据库_37

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_38

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_39

四、Service 层设计

Service 层作为中间层,既使用 Dao 层提供的接口,同时又向 Controller 层提供接口,用 Entity 作为不同层之间传递的参数进行相应的修改。我们在 Service 层定义了其实现类,在接收到 Controller 传来的数据后进行封装,让其像 Dao 层请求数据进行操作并返还结果给 Controller 层。这里展示主要的 Service 接口的实现类,Service 接口类和功能较边缘类忽略。

1. ApprovalServiceImpl

ApprovalServiceImpl 调用了 ApprovalDao 和 AuthorityDao 接口进行请假审核的相应操作并鉴定权限,将权限 applicant 作为参数传给 Dao 层进行鉴权,功能如下:

1.请假申请,得到 Controller 层传入数据后即进行封装调用 Dao 接口进行申请(修改数据库),根据返回结果判断是否申请成功(后述功能思想基本相同)。

java 考勤时间算法 java实现考勤打卡_java_40

2.查询请假申请以及查询待定请假申请

java 考勤时间算法 java实现考勤打卡_java_41

3.查询已批准请假申请

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_42

4.对请假申请进行审批操作或删除操作

java 考勤时间算法 java实现考勤打卡_前端_43

2. DeptServiceImpl

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_44

DeptServiceImpl 为部门管理实现类,调用了 DeptDao 对部门表进行操作,功能如下:

1.对部门的增加删除,查询部门信息

java 考勤时间算法 java实现考勤打卡_mysql_45

2.修改部门信息

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_46

3.获取所有部门信息,或根据 id 搜索对应部门信息

java 考勤时间算法 java实现考勤打卡_前端_47

3. ManagaServiceImpl

java 考勤时间算法 java实现考勤打卡_前端_48

ManagaServiceImpl 类为员工管理 Service 的实现类,调用了 MangageDao 接口,功能如下:

1.登录验证(初始页面登录功能)

java 考勤时间算法 java实现考勤打卡_mysql_49

2.添加员工信息,根据员工名字和 number 生成密码(后可能舍弃 md5 加密功能)

java 考勤时间算法 java实现考勤打卡_数据库_50

3.查询所有员工信息

java 考勤时间算法 java实现考勤打卡_java_51

4.删除员工信息

java 考勤时间算法 java实现考勤打卡_前端_52

5.更改员工信息

java 考勤时间算法 java实现考勤打卡_前端_53

4. AuthorityServiceImpl

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_54

AuthorityServiceImpl 作为实现鉴权 Service 类,调用了 AuthorityDao 和 ResourceDao 接口去获取 Entity 和数据库数据和相应权限判断。相应功能如下:

1.根据员工 id 添加指定员工的权限

java 考勤时间算法 java实现考勤打卡_数据库_55

2.查询所有员工的权限情况

java 考勤时间算法 java实现考勤打卡_java_56

3.根据 id 查询某个员工的权限

java 考勤时间算法 java实现考勤打卡_java_57

5.OtherServiceImpls

剩下的非主要的类及其功能在此列出不做详细的代码截图:

AttendServiceImpl:记录员工打卡情况的 Service 实现类

QueryRecordServiceImpl:查询员工个人或部门工时的 Service 实现类

UpLoadServiceImpl:记录员工考勤情况并插入到数据库中的 Service 实现类

五、Entity 和 Dao 层设计

1. Entity 设计

Entity 中定义了不同的表对应数据库包括员工信息,请教申请表,部门信息,考勤打卡表,出勤表,外出表,员工对应 id,员工对应权限,有条件的检索表等。Dao 层从数据库获取到数据传给 Service 层,Service 将数据录入相应的 Entity 实体集表中作为返回结果参数。

java 考勤时间算法 java实现考勤打卡_mysql_58

图 5-1 Entity 表粗略情况图

java 考勤时间算法 java实现考勤打卡_前端_59

图5-2 Entity表具体情况(请放大观看)

2. Dao 层设计及其 mapper 映射 XML 文件

Dao 层主要是对数据库进行相应操作,本身作为接口提供给 Service 使用,具体的数据库语句通过 resources 文件夹下的 mapper 文件夹内写的 XML 文件映射相应的 Dao 层接口,在 Service 调用 Dao 层方法时会执行其对应映射文件下的 SQL 语句对数据库进行相应操作。

Dao 层主要根据需求功能进行相应的设计,提供的功能接口如下:

(因 Dao 层包含较多接口,后续主要对部分 Dao 层主要功能接口进行详细叙述)

java 考勤时间算法 java实现考勤打卡_数据库_60

图 5-3 Dao 层及其对应功能(请放大观看)

1) ApprovalDao

java 考勤时间算法 java实现考勤打卡_前端_61

ApprovalDao 负责请假申请的审核及申请,同时可查询申请情况狂,主要修改的是数据库的 LeaveTable 表即请假表,同时会对相关操作人员权限进行鉴定(applicant),映射对应 XML 文件如下所示:

1.请假申请,查询待审批申请总数,获取待审批申请记录

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_62

2.根据搜索条件查询已审批申请

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_63

3.查询已审批总数

java 考勤时间算法 java实现考勤打卡_mysql_64

4.查询已审批记录

java 考勤时间算法 java实现考勤打卡_mysql_65

5.根据搜索条件查询已审批记录

java 考勤时间算法 java实现考勤打卡_数据库_66

6.进行请假申请审批,删除操作

java 考勤时间算法 java实现考勤打卡_数据库_67

2) MangageDao

java 考勤时间算法 java实现考勤打卡_数据库_68

MangageDao 负责员工的管理,基本只有管理员 admin 或者被赋予员工管理权限的用户才能执行相关的操作,主要修改的为数据库中的员工信息表,员工对应 id 表,会对相关操作人员权限进行鉴定(applicant),映射对应 XML 文件如下所示:

1.添加员工信息

java 考勤时间算法 java实现考勤打卡_java_69

2.根据部门和名字搜索员工信息

java 考勤时间算法 java实现考勤打卡_数据库_70

3.根据员工 id 删除或更新员工信息

java 考勤时间算法 java实现考勤打卡_前端_71

4.根据员工名字查询部门,管理员查询所有员工信息

java 考勤时间算法 java实现考勤打卡_java_72

5.查询有权限的审批人信息,查询员工总数,更新员工密码,初始化员工信息

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_73

6.根据 id 查询员工的信息,得到被初始化的员工信息

java 考勤时间算法 java实现考勤打卡_java_74

3) RecordDao

java 考勤时间算法 java实现考勤打卡_前端_75

RecordDao 主要记录员工的打卡信息,对数据库中的员工打卡表进行相应的修改,同时管理员或拥有相关权限的人员可以进行员工打卡情况的查询等操作。

4)DeptDao

java 考勤时间算法 java实现考勤打卡_mysql_76

DeptDao 对应数据库中的部门信息表,实现对数据库内部门表进行增删查改部门信息,支持通过 id 来查找相应部门。

5)UpLoadDao

java 考勤时间算法 java实现考勤打卡_mysql_77

UpLoadDao 对应数据库中的打卡表,实现将员工上下班打卡记录情况插入到数据库中(数据库初始化时已有预设值)

6)AuthorityDao

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_78

AuthorityDao 对应数据库中的员工 id 信息表,员工权限表和权限对应 id 表,实现查询数据库内员工信息表得到员工信息及员工总数,可以对指定员工的权限进行修改(需要管理员 admin 权限)。

7)DataProceDao

java 考勤时间算法 java实现考勤打卡_前端_79

DataProceDao 将员工表工时数据插入到数据库中。

8)AttendDao

java 考勤时间算法 java实现考勤打卡_数据库_80

AttendDao 实现从 Entity 中获取员工个人总工时统计以及部门的总工时统计

六、实现效果

1. 鉴权

考虑到安全性,我们不在 URL 上进行账号密码的明文传输,我们使用 shiro 框架进行及安全设计,而相应的登录接口的调用(manage/login.io)则交给 JS 脚本

首先我们先用 postman 来测试鉴权效果,如果不登陆直接访问查询员工总数的接口,则会直接跳转至登陆界面如下图:

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_81

2. 登录

使用浏览器输入 localhost:8081/login 来进入登陆界面,并输入账号密码来进行登录,这里我们使用管理员进行登录,方便演示所有功能:

java 考勤时间算法 java实现考勤打卡_前端_82

java 考勤时间算法 java实现考勤打卡_mysql_83

3. 员工管理

java 考勤时间算法 java实现考勤打卡_数据库_84

员工管理可以查看所有的员工情况。当然,首先会进行一个鉴权行为判断当前登录者是不是有权限管理员工。这里有一个添加员工按钮,有权限的人可以添加员工,如下图。

java 考勤时间算法 java实现考勤打卡_java_85

4. 考勤记录(上班记录)

可以查看某个人的上班记录,如下图:

java 考勤时间算法 java实现考勤打卡_数据库_86

5. 考勤管理(签到早退情况)

这个网页,管理员可以查看所有成员都签到打卡情况,如下图:

java 考勤时间算法 java实现考勤打卡_java_87

6. 权限管理

管理员可以分配权限:

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_88

7. 审批管理

在这里有两个功能:请假和审批,首先是请假功能:

java 考勤时间算法 java实现考勤打卡_前端_89

其次是审批:

java 考勤时间算法 java实现考勤打卡_mysql_90

这里第一个是待审批的记录,第二个是已审批的记录,作为管理员都可以更改。

8. 部门管理

第一个是添加部门,第二个是部门列表。(由于前端 HTML 和 JS 不知道怎么写,参考了老师给的和网上别人的代码还是存在 bug,此功能使用 postman 测试是通过的)

java 考勤时间算法 java实现考勤打卡_java 考勤时间算法_91

java 考勤时间算法 java实现考勤打卡_mysql_92

9. 数据导入

这个功能主要是实现上班记录的批量导入。服务器接收客户端传送的表格文件并进行数据处理,比如判断是否迟到等等。

java 考勤时间算法 java实现考勤打卡_mysql_93

♻️ 资源

java 考勤时间算法 java实现考勤打卡_前端_94