1. 项目背景与核心价值
高校作为人员密集场所,疫情防控一直是校园管理的重点难点。传统的人工登记、纸质报表方式存在数据滞后、统计困难、预警不及时等问题。去年某高校爆发聚集性感染事件后,我们团队耗时三个月开发了这套基于Spring Boot的校园疫情信息管理系统。系统上线后,该校每日健康打卡率从63%提升至98%,疫情预警响应时间缩短了85%。
这个系统的核心价值在于:
- 实时采集学生体温、行程、接触史等关键数据
- 自动生成可视化图表辅助决策
- 建立分级预警机制实现早发现早处置
- 与校门闸机、宿舍门禁等IoT设备联动
2. 技术架构设计
2.1 整体技术栈选型
选择Spring Boot作为基础框架主要基于三点考虑:
- 快速开发:Starter依赖简化配置,内嵌Tomcat开箱即用
- 微服务友好:便于后期扩展健康码核验等独立服务
- 生态丰富:整合MyBatis-Plus、Redis等中间件成本低
graph TD A[前端] -->|Vue.js| B(Spring Boot) B --> C[MySQL] B --> D[Redis] B --> E[RabbitMQ] C --> F[数据可视化] D --> G[缓存优化] E --> H[异步通知]注意:实际部署时需要根据校园网环境调整MQ选型,部分高校内网限制使用RabbitMQ时可改用RocketMQ
2.2 核心模块划分
健康打卡模块
- 采用GeoHash算法实现定位校验
- 体温数据支持蓝牙体温枪直连上传
- 异常数据自动触发复核流程
预警分析模块
- 基于SIR模型改进的传播预测算法
- 使用Elasticsearch实现多维度检索
- 对接省市两级疫情大数据平台
可视化模块
- ECharts实现热力图展示
- 自定义预警阈值看板
- 移动端适配方案
3. 关键实现细节
3.1 疫情传播模型优化
传统SIR模型在校园场景下存在两个问题:
- 未考虑教室、食堂等场所的聚集系数
- 忽略学生课程表的时空关联性
我们的改进方案:
def modified_sir(beta, gamma, N, I0, R0, t): # 新增场所权重系数 location_weight = { 'dormitory': 0.3, 'classroom': 1.2, 'cafeteria': 1.5 } # 课时接触因子 contact_factor = get_timetable_overlap() S = N - I0 - R0 I = I0 R = R0 for _ in range(t): dS = -(beta * location_weight * contact_factor) * S * I / N dI = (beta * S * I / N) - gamma * I dR = gamma * I S += dS I += dI R += dR return S, I, R3.2 高并发打卡设计
早8:00-8:30是打卡高峰时段,实测需承受3000+QPS。我们采用三级缓存策略:
- 本地缓存:Caffeine存储用户基础信息
- Redis集群:存当日打卡记录
- MySQL分库:按学院水平分片
@Cacheable(value = "healthRecord", key = "#studentId+'_'+#date") public HealthRecord getRecord(String studentId, LocalDate date) { // 先查Redis // 再查数据库 }4. 数据可视化实践
4.1 热力图渲染优化
初始方案直接渲染全校2万+学生坐标导致浏览器卡死。最终方案:
- 后端使用GeoHash聚合
- 前端分zoom级别加载
- WebWorker处理计算
// 热力图数据预处理示例 function clusterPoints(points, zoom) { const gridSize = Math.pow(2, zoom) * 8; const clusters = []; points.forEach(point => { const gridX = Math.floor(point.lng * gridSize); const gridY = Math.floor(point.lat * gridSize); // 聚合逻辑... }); return clusters; }5. 部署注意事项
网络环境适配
- 校园网常限制外网访问,需配置内网镜像源
- 多校区部署要考虑专线延迟
数据合规要点
- 敏感字段必须加密存储
- 日志保留周期需符合当地规定
- 导出功能要做权限控制
容灾方案
- 每日3:00自动备份到校内NAS
- 准备离线登记应急方案
6. 踩坑实录
定位漂移问题
- 现象:部分Android机型上报坐标偏差大
- 解决:增加WiFi指纹辅助定位
- 代码:
public Location enhanceLocation(Location raw) { if (wifiScanner.isAvailable()) { List<WifiScanResult> scans = wifiScanner.scan(); return locationService.fingerprintMatch(scans); } return raw; }缓存雪崩预防
- 现象:Redis集群重启后数据库被打满
- 解决:采用阶梯过期策略
# application.properties spring.cache.redis.time-to-live=24h spring.cache.redis.random-delay=1800s
7. 扩展方向
- 对接校内OA系统实现请假联动
- 增加核酸检测预约功能
- 开发微信小程序轻量版
- 利用知识图谱分析传播路径
这个项目让我深刻体会到:校园场景的技术方案必须兼顾技术先进性和管理实用性。比如我们最初设计的复杂预警规则,在实际运行中简化为三级预警机制后反而更有效。建议后续开发者多与校医院、辅导员等一线人员沟通需求。