在高校教学管理场景中,考勤统计一直是占用教师大量时间的重复性工作。传统纸质签到存在代签、统计效率低等问题,而市面上的商业考勤系统往往功能冗余且价格昂贵。我最近用SpringBoot+MyBatis技术栈实现了一套轻量级课堂考勤系统,核心功能模块包含:
这个系统在我校计算机学院试运行一个学期后,教师考勤统计效率提升80%,异常考勤率下降65%。下面从技术实现角度详细解析关键设计点。
选择SpringBoot+MyBatis组合主要基于以下实际考量:
技术栈版本选择经验:
markdown复制- SpringBoot 2.7.18(LTS版本)
- MyBatis 3.5.13 + PageHelper 5.3.2(分页插件)
- MySQL 8.0.32(窗口函数支持考勤排名)
- Redis 6.2.6(签到令牌5分钟过期)
考勤系统的核心表关系如下图所示(简化为Markdown表格):
| 表名 | 关键字段 | 设计要点 |
|---|---|---|
| sys_user | user_id, role_type(1教师/2学生) | 用bitmask存储复合角色 |
| course | course_id, teacher_id, location | 包含GPS坐标字段 |
| attendance | sign_time, sign_type, status | 建立course_id+user_id联合索引 |
特别注意的点:
二维码签到的安全设计是重点难点,我们的解决方案:
java复制// 生成带时效的加密令牌
public String generateSignToken(Long courseId) {
String raw = courseId + "|" + System.currentTimeMillis();
return AESUtil.encrypt(raw, SECRET_KEY);
}
// 校验示例
public boolean validateToken(String token, Long courseId) {
String decrypted = AESUtil.decrypt(token, SECRET_KEY);
String[] parts = decrypted.split("\\|");
return parts[0].equals(courseId.toString())
&& (System.currentTimeMillis() - Long.parseLong(parts[1])) < 300000;
}
关键经验:二维码内容应包含课程ID+时间戳的加密组合,避免使用简单递增数字导致的安全风险
高峰期可能出现的并发问题解决方案:
java复制public boolean trySign(Long courseId, Long userId) {
String lockKey = "sign_lock:" + courseId + ":" + userId;
try {
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
if (locked != null && locked) {
// 执行签到逻辑
}
} finally {
redisTemplate.delete(lockKey);
}
}
java复制@Scheduled(cron = "0 0/10 * * * ?")
public void updateAttendanceStats() {
// 每10分钟批量更新统计结果到缓存
}
初期测试发现部分Android设备定位偏差较大,解决方案:
java复制public boolean checkDistance(Location loc1, Location loc2) {
double distance = Haversine.distance(loc1.getLat(), loc1.getLng(),
loc2.getLat(), loc2.getLng());
return distance < 100; // 允许100米误差
}
处理大数据量导出时的内存优化方案:
java复制// 使用MyBatis流式查询
@Select("SELECT * FROM attendance WHERE course_id = #{courseId}")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
void exportAttendanceData(Long courseId, ResultHandler<Attendance> handler);
// 配合POI的SXSSFWorkbook实现分页写入Excel
目前正在开发的增强功能:
这个项目让我深刻体会到:教育信息化工具的设计必须紧扣实际教学场景。比如在实现"补签审批"功能时,我们增加了教研室主任的二级审批流程,这比简单的管理员操作更符合高校管理规范。