1. 项目背景与核心需求
2020年以来的全球公共卫生事件让健康监测系统成为刚需。我去年为某高校开发的这套疫情打卡系统,核心解决三个痛点:师生每日健康数据采集困难、人工统计效率低下、异常情况响应滞后。系统采用SpringBoot+Vue的前后端分离架构,MySQL作为数据持久层,实现了从数据采集到风险预警的全流程自动化。
这个毕设选题的巧妙之处在于:既符合当下社会需求,又能完整展示全栈开发能力。系统包含用户端(微信小程序+Vue网页)、管理后台、数据看板三大模块,完整覆盖了从需求分析到部署上线的软件开发全生命周期。
2. 技术栈选型解析
2.1 为什么选择SpringBoot
后端选用SpringBoot 2.7.3版本(非最新的3.x),主要考虑三点:
- 自动配置特性让疫情这种需要快速响应的项目能立即启动
- 内置Tomcat简化部署,配合Actuator端点方便监控系统健康状态
- 事务管理采用@Transactional默认自动提交,适合高频打卡场景
特别提醒:SpringBoot与MyBatis整合时,分页插件PageHelper的依赖版本要特别注意。我们遇到过5.3.0版本与SpringBoot 2.7.x的兼容性问题,最终锁定5.2.0版本稳定运行。
2.2 Vue3的组合式API优势
前端选用Vue3+Element Plus,相比Vue2有明显提升:
- 组合式API让健康码状态管理更清晰
- Teleport组件优化了弹窗式疫情通知的DOM结构
- 用Vue Router的路径参数实现地区疫情等级传递
踩坑记录:尝试用vue-fullscreen插件实现全屏地图展示疫情分布时,发现与Element Plus的弹窗组件存在z-index冲突,最终通过动态修改transition样式解决。
2.3 MySQL设计要点
数据库采用MySQL 8.0,关键设计包括:
- 用户健康表添加spatial索引支持地理位置查询
- 打卡记录表使用分区表(按日期range分区)
- 建立触发器自动更新学生所在班级的风险等级
特别注意:timestamp字段的时区问题曾导致跨时区部署时统计异常,最终统一采用UTC时间并在业务层转换。
3. 核心功能实现细节
3.1 健康码状态机设计
系统最复杂的业务逻辑是健康码状态转换:
// 状态枚举定义 public enum HealthCodeStatus { GREEN(1), YELLOW(2), RED(3); // 状态转换规则 public static HealthCodeStatus transition(HealthReport report) { if(report.getTemperature() > 37.3) return RED; if(report.getContactRisk()) return YELLOW; return GREEN; } }重要提示:状态变更需要同步通知班主任和校医,我们采用Spring事件机制实现解耦:
@EventListener public void handleCodeChange(HealthCodeChangeEvent event) { wechatService.pushAlert(event.getUserId(), event.getNewStatus()); }
3.2 前后端交互关键点
- 跨域解决方案:采用Nginx反向代理而非@CrossOrigin注解,因为需要支持Cookie传输
- 文件上传:使用阿里云OSS直传方案,前端获取临时凭证
- 实时数据推送:WebSocket协议实现风险地区实时预警
接口设计示例:
// Vue组件中调用打卡接口 const submitHealthReport = async () => { try { await axios.post('/api/health/report', { temperature: 36.5, location: store.getters.currentLocation, symptoms: [] }, { headers: { 'X-Requested-With': 'XMLHttpRequest' } }); } catch (err) { ElMessage.error('提交失败:' + err.response.data.message); } }4. 部署与性能优化
4.1 多环境部署方案
开发环境:Docker Compose一键启动
services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql生产环境:
- 前端:Nginx容器化部署,开启gzip和Brotli压缩
- 后端:JAR包配合Jenkins CI/CD流水线
- 数据库:阿里云RDS主从架构
4.2 性能优化实战
- 热点数据缓存:用Redis缓存班级风险等级,TTL设置15分钟
- 定时任务优化:改用Elastic-Job替代@Scheduled,解决分布式环境重复执行问题
- SQL优化:对日报统计查询添加covering index
压力测试结果:
- 单机配置(4核8G)可支撑5000人同时打卡
- 95%的API响应时间<200ms
- 使用JMeter模拟峰值流量时发现MySQL连接池瓶颈,调整HikariCP配置后解决
5. 论文写作要点
技术类毕设论文要突出以下几点:
- 创新性:我们引入了LBS地理围栏技术,自动校验打卡位置真实性
- 完整性:系统包含需求分析、架构设计、安全方案(防SQL注入/XSS)、测试用例
- 实用性:已实际部署在某高校运行6个月,收集真实用户反馈
特别提醒:论文中的架构图建议使用Draw.io绘制,时序图用PlantUML,保持专业风格。数据库ER图可直接从MySQL Workbench导出。
6. 常见问题解决方案
6.1 微信定位偏差处理
实测发现不同手机型号的GPS精度差异导致打卡位置校验失败,最终解决方案:
- 前端增加"手动确认位置"按钮
- 后端采用Haversine公式计算两点距离
- 对郊区校区设置500米宽容阈值
6.2 并发打卡冲突
使用MySQL乐观锁解决:
UPDATE health_report SET status = 'SUBMITTED' WHERE user_id = 123 AND date = CURDATE() AND version = 1;6.3 离线环境适配
针对网络条件差的农村校区:
- 前端添加PWA离线支持
- 采用localStorage暂存未提交数据
- 实现自动重传机制
这套系统开发过程中最大的收获是:真实场景下的技术决策必须考虑非理想条件。比如我们原计划使用腾讯地图API,但在某些地区访问不稳定,最终不得不增加高德地图作为备用方案