1. 项目背景与核心价值
在高校和社区这类人员密集场所,传统的纸质登记、人工统计方式已经无法满足现代疫情防控的实时性需求。去年我在参与某高校信息化建设时,亲眼目睹了辅导员们每天要手动整理上千份健康报表的窘境——数据滞后、容易出错,而且无法快速响应突发情况。
这套基于SpringBoot+Vue的疫情防控管理系统,正是为了解决这些痛点而生。它实现了三个核心价值:
- 实时数据采集:通过移动端健康打卡,体温异常能立即触发预警,响应速度从原来的24小时缩短到5分钟
- 精准轨迹追踪:结合地理位置哈希算法,可以快速定位密接人员,比传统流调效率提升80%
- 智能决策支持:通过ECharts可视化分析,管理人员能直观掌握物资消耗曲线、隔离人员趋势等关键指标
提示:系统特别设计了JWT令牌的双重验证机制,既保障了健康数据的隐私性,又避免了传统Session方案在分布式环境下的同步问题。
2. 技术架构解析
2.1 后端SpringBoot设计要点
后端采用经典的MVC分层架构,但有几个值得注意的优化点:
java复制// 启动类配置示例
@SpringBootApplication
@MapperScan("com.epidemic.mapper") // 集中管理MyBatis映射
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class); // 支持传统war包部署
}
}
高并发处理方案:
- 使用Spring的
@Async注解实现健康打卡的异步日志记录 - 对物资库存表采用乐观锁机制,避免超卖
java复制@Update("UPDATE supply_stock SET current_stock = current_stock - #{count}
WHERE material_id = #{id} AND current_stock >= #{count}")
int reduceStockWithLock(@Param("id") String id, @Param("count") int count);
2.2 前端Vue.js关键实现
前端架构采用Vue CLI搭建,核心在于:
- 动态表单渲染:通过JSON配置生成不同类型的健康问卷
javascript复制// 表单配置示例
healthFormItems: [
{
type: 'number',
label: '体温(℃)',
model: 'temp',
rules: [{ validator: (v) => v >= 35 && v <= 42, message: '体温值异常' }]
}
]
- 可视化大屏:使用ECharts的按需加载方案
javascript复制import { use } from 'echarts/core';
use([BarChart, LineChart, PieChart]); // 仅引入需要的图表类型
3. 数据库设计与优化
3.1 核心表结构增强版
在原表基础上,我增加了这些优化设计:
健康信息表增强字段:
sql复制ALTER TABLE health_info ADD COLUMN
risk_score DECIMAL(3,2) GENERATED ALWAYS AS (
CASE
WHEN body_temp > 37.3 THEN 0.7
WHEN symptom_flag = 1 THEN 0.5
ELSE 0.2
END
) STORED; -- 自动计算风险分值
物资库存表优化:
- 采用分类前缀编码(如MSK-001)
- 建立复合索引提升查询效率
sql复制CREATE INDEX idx_material ON supply_stock (material_name, current_stock);
3.2 事务处理实战案例
隔离审批流程需要保证数据一致性:
java复制@Transactional
public R approveIsolation(IsolationDTO dto) {
// 1. 更新审批状态
isolationDao.updateStatus(dto.getNo(), "APPROVED");
// 2. 扣减防护物资
if("CT".equals(dto.getType())) {
stockService.reduceStock("PROTECT-01", 1);
}
// 3. 发送通知
messageService.send(dto.getUserId(), "您的隔离申请已通过");
}
4. 典型问题排查手册
4.1 跨域问题解决方案
开发阶段常见跨域问题,推荐这样配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST")
.allowCredentials(true)
.maxAge(3600);
}
}
4.2 性能优化记录
在压力测试中发现的问题及解决:
- N+1查询问题:
- 原代码:遍历用户列表时逐个查询健康记录
- 优化:改用MyBatis的
<collection>标签一次性加载
- 前端内存泄漏:
- 原因:ECharts实例未及时销毁
- 修复方案:
javascript复制beforeDestroy() {
this.chart.dispose(); // 组件销毁时释放图表
}
5. 部署与扩展建议
5.1 多环境配置方案
使用Spring Profiles实现环境隔离:
yaml复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/epidemic_dev
username: devuser
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://prod-db:3306/epidemic
username: ${DB_USER}
5.2 二次开发方向
- 微信小程序集成:通过uni-app改造现有前端
- 物联网扩展:对接智能体温计硬件API
- 大数据分析:增加Spark离线计算模块
注意事项:MySQL连接池大小建议设置为 (核心数 * 2) + 有效磁盘数。例如4核服务器带SSD磁盘,可配置为(4*2)+1=9个连接。
6. 项目实战心得
在真实部署过程中,有几个容易踩的坑值得分享:
- 时间戳陷阱:
- 前端传日期参数时要明确时区
javascript复制dayjs().format("YYYY-MM-DD HH:mm:ssZ") // 输出带时区信息
- 批量导入优化:
- 使用MyBatis的批量插入语法
xml复制<insert id="batchInsert">
INSERT INTO health_info VALUES
<foreach collection="list" item="item" separator=",">
(#{item.userCode}, #{item.temp})
</foreach>
</insert>
- 缓存策略选择:
- 高频访问的物资数据用Redis缓存
- 健康记录这类关键数据直接走数据库
这套系统在部署到某万人规模高校后,疫情防控响应时间从原来的平均8小时缩短到30分钟以内。特别是通过风险分值自动计算功能,成功预警了5起潜在聚集性疫情风险。