高校考勤管理一直是教学管理中的痛点问题。传统纸质签到效率低下、容易代签,而市面上的商业考勤系统又往往价格昂贵、功能冗余。这个基于SpringBoot+小程序的高校考勤系统,正好切中了这个细分场景的需求痛点。
我去年为本地一所职业院校实施过类似的系统,实测用小程序扫码考勤,比传统方式节省了80%的课堂时间。这个开源项目最大的亮点是提供了完整的前后端代码,对于想学习企业级全栈开发的学生和需要快速搭建原型的开发者来说,是个难得的实战案例。
SpringBoot 2.7.4 + MyBatis-Plus 3.5.1的组合提供了稳定的后端基础。项目采用了经典的三层架构:
特别值得注意的是其考勤业务的状态机设计:
java复制public enum AttendanceStatus {
NORMAL(0), // 正常签到
LATE(1), // 迟到
LEAVE(2), // 请假
ABSENCE(3); // 缺勤
// ...省略getter/setter
}
这种枚举设计比直接用magic number更利于维护。
微信小程序采用原生框架开发,主要功能模块包括:
二维码生成采用了比较巧妙的方案:
javascript复制// 生成带课程ID和时间戳的加密字符串
function generateQRCode(courseId) {
const timestamp = Date.now();
const rawString = `${courseId}|${timestamp}`;
return CryptoJS.MD5(rawString).toString();
}
这种设计既防止了二维码被伪造,又避免了频繁请求服务器。
教师发起签到:
学生扫码签到:
数据统计:
项目实现了三重防代签策略:
这些策略在配置文件中都可以灵活调整:
yaml复制attendance:
check:
geo-range: 50 # 单位:米
time-interval: 60 # 单位:秒
基础环境要求:
建议使用Docker快速搭建依赖服务:
bash复制docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
docker run --name some-redis -p 6379:6379 -d redis:5.0
核心表结构说明:
| 表名 | 关键字段 | 说明 |
|---|---|---|
| t_course | course_id, course_name, teacher_id | 课程基础信息 |
| t_attendance | attend_id, course_id, student_id, status, attend_time | 考勤记录表 |
| t_leave_apply | apply_id, student_id, course_id, reason, status | 请假申请表 |
建表SQL已包含在源码的sql/init.sql中。
二维码生成失败:
签到记录丢失:
定位偏差大:
java复制@Cacheable(value = "attendance", key = "#courseId+'_'+#weekNum")
public List<Attendance> getWeeklyAttendance(String courseId, int weekNum) {
//...查询数据库
}
添加类似这样的Spring Cache注解可以显著减少数据库压力。
java复制boolean success = attendanceService.saveBatch(attendanceList, 100);
这个基础架构可以扩展出很多实用功能:
人脸识别签到:
接入百度AI或腾讯云的人脸识别API
课堂互动功能:
数据可视化:
使用ECharts生成考勤趋势图
多平台适配:
用Uniapp重构小程序端,同时支持支付宝/钉钉
我在实际部署时发现,增加一个简单的"异常签到预警"功能特别实用:当某个课程缺勤率突然升高时,自动给教师发送企业微信通知。这个可以通过Spring的EventListener机制实现:
java复制@EventListener
public void handleAttendanceAlert(AttendanceEvent event) {
if(event.getAbsenceRate() > 0.3) {
wechatService.sendAlert(event.getCourseId());
}
}
这个项目的代码结构清晰,注释完善,特别适合作为毕业设计或企业内训的案例。我在教学使用中发现,学生最容易卡壳的地方是微信支付配置和小程序发布流程,建议提前准备好相关的开发者账号。