1. 项目背景与需求分析
校外兼职教师考勤管理是高校教务管理中的痛点领域。传统的手工签到、Excel表格统计方式存在三大核心问题:考勤数据分散难汇总、请假调课流程不规范、课时统计与薪酬计算耗时易错。某高校教务处的调研数据显示,兼职教师平均每月因考勤问题产生的沟通成本高达15个工时。
这个SpringBoot+Vue3的考勤系统主要解决以下场景需求:
- 多校区兼职教师的移动端签到(支持GPS定位和拍照打卡)
- 智能排课冲突检测(防止同一教师时段重叠)
- 自动生成课时统计报表(对接财务系统接口)
- 分级权限管理(院系管理员、教师、教务处的不同视图)
关键设计原则:系统需要兼容高校现有的统一身份认证平台(通常是CAS/OAuth2),同时考虑兼职教师群体手机型号差异大,前端必须做低端机型适配。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 后端技术栈选型
采用SpringBoot 2.7.x + MyBatis-Plus的组合,主要基于以下考量:
- 高校IT环境通常限定JDK8,该版本SpringBoot对老环境兼容性最佳
- MyBatis-Plus的AR模式适合快速开发考勤业务CRUD
- 集成Hutool工具包处理中国特色的日期格式(如第3-4节课对应10:00-11:40)
数据库选用MySQL 5.7(高校常用版本)并做如下优化:
sql复制-- 考勤记录表添加空间索引
ALTER TABLE attendance_record
ADD SPATIAL INDEX idx_location (gps_point);
2.2 前端技术栈实现
Vue3组合式API更适合考勤系统的特点:
- 使用Pinia管理跨组件状态(如当前学期选择)
- 基于Vite的按需编译显著提升低配设备加载速度
- 关键代码示例:GPS定位封装
javascript复制// 高德地图定位封装
const getLocation = () => {
return new Promise((resolve) => {
AMap.plugin('AMap.Geolocation', () => {
const geolocation = new AMap.Geolocation({
enableHighAccuracy: true,
timeout: 10000
})
geolocation.getCurrentPosition((status, result) => {
if(status === 'complete') {
resolve([result.position.lng, result.position.lat])
} else {
resolve([])
}
})
})
})
}
3. 核心业务逻辑实现
3.1 动态考勤规则引擎
不同院系的考勤规则存在差异:
- 外语学院要求课前15分钟签到
- 体育学院允许课后补签
- 继续教育学院需要双重验证(GPS+人脸)
采用策略模式实现规则配置化:
java复制public interface AttendancePolicy {
boolean validate(AttendanceRecord record);
}
@Slf4j
@Component("sportsPolicy")
public class SportsAttendancePolicy implements AttendancePolicy {
@Override
public boolean validate(AttendanceRecord record) {
// 体育课特殊逻辑
return record.getSubmitTime().isBefore(
record.getScheduleTime().plusMinutes(30));
}
}
3.2 并发签到处理
高峰期可能产生300+并发签到请求,解决方案:
- 使用Redis分布式锁防止重复提交
java复制public boolean tryLock(String key) {
return redisTemplate.opsForValue()
.setIfAbsent(key, "1", 30, TimeUnit.SECONDS);
}
- 消息队列削峰(RocketMQ事务消息)
- 前端采用指数退避重试策略
4. 特殊场景处理
4.1 离线考勤模式
针对网络信号差的实训场地:
- 使用PWA技术实现前端离线缓存
- 采用增量同步策略(类似git的push/pull)
- 冲突解决采用"最后修改优先"原则
4.2 安全防护措施
- 防代签:活体检测+动作指令验证
- 防篡改:区块链存证关键考勤记录
- 防爆破:基于用户行为的动态验证码策略
5. 性能优化实践
5.1 数据库分片策略
按学期分表+冷热数据分离:
- 当前学期:MySQL主库
- 历史数据:TiDB集群
- 归档数据:MinIO对象存储
5.2 前端渲染优化
针对低端安卓机的专项优化:
- 虚拟滚动长列表(vue-virtual-scroller)
- Web Worker处理复杂统计计算
- 关键CSS内联避免FOUT
6. 部署与监控方案
6.1 容器化部署
使用Docker Compose编排:
yaml复制services:
attendance-service:
image: openjdk:8-jdk-alpine
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
resources:
limits:
cpus: '2'
memory: 2G
6.2 监控体系搭建
- Prometheus采集JVM指标
- ELK日志分析(特别关注GPS定位失败日志)
- 业务级监控看板(今日异常考勤率等)
7. 踩坑与解决方案
7.1 微信浏览器兼容性问题
现象:iOS微信内置浏览器无法唤起摄像头
根因:微信安全策略限制
解决方案:
- 引导用户使用Safari打开
- 或申请微信JS-SDK权限
7.2 课时统计误差问题
典型场景:调课导致课时重复计算
最终方案:
- 引入事件溯源模式
- 使用TCC事务补偿机制
- 增加人工修正入口
这个项目在落地过程中最大的体会是:高校IT系统的改造必须考虑现有组织架构和工作惯性。我们最终保留了Excel导出功能(尽管系统能自动生成报表),因为财务处坚持要人工复核。技术方案再完美,也需要适配真实的业务流程。
