SpringBoot+Vue疫情打卡系统开发实战与优化
2026/9/12 15:04:02 网站建设 项目流程

1. 项目背景与核心需求

2020年以来的全球公共卫生事件让健康监测系统成为刚需。我去年为某高校开发的这套疫情打卡系统,核心解决三个痛点:师生每日健康数据采集困难、人工统计效率低下、异常情况响应滞后。系统采用SpringBoot+Vue的前后端分离架构,MySQL作为数据持久层,实现了从数据采集到风险预警的全流程自动化。

这个毕设选题的巧妙之处在于:既符合当下社会需求,又能完整展示全栈开发能力。系统包含用户端(微信小程序+Vue网页)、管理后台、数据看板三大模块,完整覆盖了从需求分析到部署上线的软件开发全生命周期。

2. 技术栈选型解析

2.1 为什么选择SpringBoot

后端选用SpringBoot 2.7.3版本(非最新的3.x),主要考虑三点:

  1. 自动配置特性让疫情这种需要快速响应的项目能立即启动
  2. 内置Tomcat简化部署,配合Actuator端点方便监控系统健康状态
  3. 事务管理采用@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,关键设计包括:

  1. 用户健康表添加spatial索引支持地理位置查询
  2. 打卡记录表使用分区表(按日期range分区)
  3. 建立触发器自动更新学生所在班级的风险等级

特别注意: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 前后端交互关键点

  1. 跨域解决方案:采用Nginx反向代理而非@CrossOrigin注解,因为需要支持Cookie传输
  2. 文件上传:使用阿里云OSS直传方案,前端获取临时凭证
  3. 实时数据推送: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 性能优化实战

  1. 热点数据缓存:用Redis缓存班级风险等级,TTL设置15分钟
  2. 定时任务优化:改用Elastic-Job替代@Scheduled,解决分布式环境重复执行问题
  3. SQL优化:对日报统计查询添加covering index

压力测试结果:

  • 单机配置(4核8G)可支撑5000人同时打卡
  • 95%的API响应时间<200ms
  • 使用JMeter模拟峰值流量时发现MySQL连接池瓶颈,调整HikariCP配置后解决

5. 论文写作要点

技术类毕设论文要突出以下几点:

  1. 创新性:我们引入了LBS地理围栏技术,自动校验打卡位置真实性
  2. 完整性:系统包含需求分析、架构设计、安全方案(防SQL注入/XSS)、测试用例
  3. 实用性:已实际部署在某高校运行6个月,收集真实用户反馈

特别提醒:论文中的架构图建议使用Draw.io绘制,时序图用PlantUML,保持专业风格。数据库ER图可直接从MySQL Workbench导出。

6. 常见问题解决方案

6.1 微信定位偏差处理

实测发现不同手机型号的GPS精度差异导致打卡位置校验失败,最终解决方案:

  1. 前端增加"手动确认位置"按钮
  2. 后端采用Haversine公式计算两点距离
  3. 对郊区校区设置500米宽容阈值

6.2 并发打卡冲突

使用MySQL乐观锁解决:

UPDATE health_report SET status = 'SUBMITTED' WHERE user_id = 123 AND date = CURDATE() AND version = 1;

6.3 离线环境适配

针对网络条件差的农村校区:

  1. 前端添加PWA离线支持
  2. 采用localStorage暂存未提交数据
  3. 实现自动重传机制

这套系统开发过程中最大的收获是:真实场景下的技术决策必须考虑非理想条件。比如我们原计划使用腾讯地图API,但在某些地区访问不稳定,最终不得不增加高德地图作为备用方案

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询