1. 项目背景与核心需求
2020年以来的特殊公共卫生事件让高校管理面临全新挑战。我去年为某高校开发的这套封闭管理系统,核心解决三个痛点:学生流动精准管控、健康数据动态采集、校内服务闭环保障。系统上线后,该校学生跨区域流动率下降92%,每日健康打卡完成率从63%提升至99.8%。
1.1 典型应用场景
- 离校审批:辅导员在后台看到学生小王的出校申请,点击查看其最近14天行动轨迹和健康记录后,5分钟内完成电子审批
- 异常预警:学生小李连续两天未打卡,系统自动触发三级预警机制,同步推送提醒给本人、辅导员和校医院
- 物资配送:食堂阿姨通过配送模块,将300份餐食精准分配至各宿舍楼层的取餐点
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
mermaid复制graph TD
A[前端] -->|Vue.js| B(Element UI)
C[后端] -->|SpringBoot| D(MyBatis-Plus)
E[数据库] -->|MySQL 8.0| F(Redis缓存)
G[安全] -->|Shiro| H(HTTPS+国密SM4)
这套组合经过压力测试,在校园网环境下可支持8000+师生并发操作。特别说明几个关键选择:
- MyBatis-Plus vs JPA:选前者因为需要复杂SQL查询(如"查找过去3天到过图书馆的体温异常学生")
- Redis应用:缓存高频访问的宿舍楼宇数据,QPS从150提升到2100
- 国密算法:满足等保2.0要求,加密性能比AES提升40%
2.2 核心表结构设计
sql复制CREATE TABLE `student_track` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`student_id` VARCHAR(20) NOT NULL COMMENT '学号',
`location_id` INT(11) NOT NULL COMMENT '区域编号',
`entry_time` DATETIME NOT NULL COMMENT '进入时间',
`exit_time` DATETIME DEFAULT NULL COMMENT '离开时间',
`temperature` DECIMAL(3,1) DEFAULT NULL COMMENT '当时体温',
PRIMARY KEY (`id`),
INDEX `idx_student` (`student_id`),
INDEX `idx_time` (`entry_time`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
这个轨迹表每天产生约50万条记录,我们通过以下优化手段:
- 按月分表(track_202301)
- 建立联合索引
- 冷数据归档策略
3. 核心功能实现
3.1 电子围栏动态识别
java复制// 围栏判断算法核心逻辑
public boolean checkInFence(Point point, Polygon fence) {
int intersectCount = 0;
for (int i = 0; i < fence.getPoints().size(); i++) {
Point p1 = fence.getPoints().get(i);
Point p2 = fence.getPoints().get((i+1) % fence.getPoints().size());
if (rayCast(point, p1, p2)) {
intersectCount++;
}
}
return (intersectCount % 2) == 1;
}
实际开发中踩过的坑:
- 地理坐标纠偏:国产手机GPS需转换WGS84坐标系
- 围栏抖动问题:设置50米缓冲带避免频繁进出报警
- 离线处理机制:断网时本地缓存最近围栏数据
3.2 健康打卡智能提醒
我们采用状态机模型管理打卡流程:
code复制[未打卡] --定时任务--> [首次提醒] --2小时后--> [二次提醒] --4小时后--> [三级预警]
关键参数配置:
yaml复制reminder:
level1:
cron: "0 9 * * ?" # 每天9点
template: "【系统提醒】请今日尽快完成健康打卡"
level2:
delay: 7200 # 2小时(秒)
receivers: [student, monitor]
4. 部署与性能优化
4.1 服务器配置方案
| 组件 | 配置 | 说明 |
|---|---|---|
| 应用服务器 | 4核8G × 2 | 开启G1垃圾回收 |
| MySQL | 8核16G + SSD | 配置主从复制 |
| Redis | 哨兵模式 × 3 | 持久化策略AOF每秒 |
| Nginx | 负载均衡 × 2 | 配置HTTP/2协议 |
4.2 压测数据对比
优化前:
- 500并发时API平均响应时间:1.2s
- JVM Full GC频率:2次/小时
优化措施:
- 添加Redis缓存热点数据
- 优化SQL查询(避免SELECT *)
- 启用连接池(HikariCP)
优化后:
- 1000并发时响应时间:380ms
- Full GC降为1次/天
5. 扩展开发建议
-
物联网集成:对接门禁系统实现自动放行
java复制// 伪代码示例 @PostMapping("/access-control") public Response grantAccess(@Valid AccessRequest request) { if (healthService.checkHealthy(request.getStudentId())) { iotDeviceService.openDoor(request.getGateId()); return Response.success(); } return Response.fail("健康状态异常"); } -
数据分析看板:使用ECharts实现:
- 各楼宇人流热力图
- 异常打卡时间分布
- 审批通过率趋势分析
-
移动端优化:
- 采用Uniapp跨端开发
- 添加扫码登记功能
- 支持离线模式数据同步
重要提示:涉及个人隐私数据存储时,务必遵循《个人信息保护法》要求,我们采取的措施包括:
- 敏感信息加密存储
- 操作日志审计追踪
- 数据访问权限分级
这套系统在部署时,建议先在小范围试点运行。我们最初在3栋宿舍楼试运行两周,根据反馈调整了11处功能细节,包括优化审批流程、增加异常情况人工复核通道等。
