1. 项目背景与核心需求分析
2020年以来的全球公共卫生事件,让健康管理系统的需求呈现爆发式增长。传统的纸质登记方式存在数据统计滞后、接触风险高、信息追溯困难等问题。我们团队为某高校设计的这套疫情打卡健康评测系统,正是为了解决以下痛点:
- 实时性要求:需要分钟级统计师生健康状态,而传统方式需要人工汇总Excel表格
- 多维度评估:不仅要记录体温,还需结合行程轨迹、接触史等综合评估风险等级
- 权限分级:院系管理员、辅导员、学生需要不同级别的数据查看和操作权限
- 移动端适配:90%以上的打卡操作发生在手机端,必须保证移动体验
系统采用SpringBoot+Vue的前后端分离架构,这种选型主要基于:
- SpringBoot的自动配置特性可快速搭建RESTful API
- Vue的响应式数据绑定适合频繁的表单交互
- MyBatis的灵活性便于处理复杂的健康评估逻辑
2. 技术架构设计详解
2.1 后端技术栈实现
SpringBoot核心配置:
java复制@SpringBootApplication
@MapperScan("com.health.mapper")
public class HealthApplication {
public static void main(String[] args) {
SpringApplication.run(HealthApplication.class, args);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 密码加密
}
}
数据库设计关键表:
- 用户表(health_user):
- 特别添加health_status字段(0-健康,1-疑似,2-确诊)
- last_report_time记录最后打卡时间
- 打卡记录表(health_report):
- 包含体温、行程码颜色、是否接触风险地区等字段
- 使用空间索引优化地理位置查询
MyBatis动态SQL示例:
xml复制<select id="selectRiskUsers" resultMap="userMap">
SELECT * FROM health_user
WHERE
<if test="areaLevel != null">
area_level = #{areaLevel} AND
</if>
health_status != 0
ORDER BY last_report_time DESC
</select>
2.2 前端工程化实践
采用Vue CLI 4.x搭建项目,关键配置:
javascript复制// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
ws: true,
changeOrigin: true
}
}
},
chainWebpack: config => {
config.plugin('html').tap(args => {
args[0].title = '健康打卡系统';
return args;
});
}
}
核心组件设计:
- 打卡表单使用VeeValidate进行验证
- 风险地图集成高德地图API
- 使用Vuex管理用户状态和权限信息
3. 核心功能实现细节
3.1 健康打卡流程
-
表单智能填充:
- 自动获取上次打卡的常用数据
- 地理位置通过浏览器API自动获取
- 体温输入增加合理性校验(34-42℃范围)
-
风险评估算法:
java复制public Integer evaluateRisk(ReportDTO dto) {
int score = 0;
// 体温因素
if(dto.getTemperature() > 37.3) score += 30;
// 行程因素
if("RED".equals(dto.getTravelCode())) score += 50;
// 接触史
if(dto.getHasContact()) score += 20;
return score > 60 ? 2 : score > 30 ? 1 : 0;
}
3.2 数据可视化大屏
使用ECharts实现:
- 实时显示各院系打卡率
- 风险人员地理热力图
- 近7天体温异常趋势图
关键配置:
javascript复制option = {
tooltip: {
trigger: 'axis',
formatter: params => {
return `${params[0].name}<br/>
体温: ${params[0].value}℃<br/>
人数: ${params[1].value}人`;
}
},
// ...其他配置
}
4. 安全与性能优化
4.1 安全防护措施
-
接口安全:
- 使用JWT进行身份验证
- 敏感接口增加@PreAuthorize注解
- 打卡提交防重放攻击(5分钟内禁止重复提交)
-
数据安全:
- 敏感字段加密存储(如手机号)
- 数据库定时备份到OSS
- 操作日志完整记录
4.2 性能优化方案
缓存策略:
java复制@Cacheable(value = "dailyReport", key = "#date")
public DailyReportVO getDailyReport(String date) {
// 数据库查询逻辑
}
SQL优化:
- 为高频查询字段添加复合索引
- 大数据量分表(按月份拆分打卡记录)
- 使用EXPLAIN分析慢查询
5. 部署与运维实践
5.1 生产环境部署
服务器配置:
- 2核4G云服务器 × 2(后端+数据库)
- 1核2G云服务器(前端)
- 使用Nginx配置负载均衡
Docker部署示例:
dockerfile复制# 后端Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/health-system.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
5.2 常见问题排查
-
打卡提交缓慢:
- 检查MySQL连接池配置
- 确认是否开启了慢查询日志
- 验证网络带宽是否充足
-
地图加载失败:
- 检查高德地图API密钥
- 确认跨域配置正确
- 测试第三方接口可用性
6. 项目扩展方向
-
微信小程序接入:
- 使用uni-app跨平台开发
- 集成微信订阅消息提醒
-
大数据分析:
- 使用Flink实时处理打卡数据
- 构建用户健康画像
-
物联网集成:
- 对接智能体温计设备
- 开发蓝牙打卡功能
这个项目在2022年春季学期实际支撑了3万师生的每日健康管理,峰值QPS达到150。开发过程中最大的收获是:一定要提前设计好数据统计维度,后期添加字段的成本非常高。建议在需求阶段就与业务方确认所有报表需求,在数据库设计时预留扩展字段。
