1. 项目背景与核心需求
校园疫情防控信息管理系统是当前高校管理中的刚需工具。去年某高校爆发聚集性感染事件后,我们团队接到校方紧急委托,要求在两个月内开发一套能够覆盖全校3万师生健康监测、行程追踪、异常预警的数字化平台。这个Java+SpringBoot的项目最终成功上线,并在后续的常态化防控中发挥了关键作用。
疫情防控系统的核心在于实时性、准确性和可追溯性。传统纸质登记方式存在信息滞后、统计困难、容易遗漏等问题。我们设计的系统需要实现:
- 师生每日健康打卡(体温、症状上报)
- 校内场所扫码登记
- 异常情况自动预警
- 疫情数据可视化分析
- 应急事件处置流程管理
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用SpringBoot 2.7 + MyBatis-Plus + MySQL 8.0的组合,前端使用Vue3+Element Plus。这个技术栈的选择基于以下考虑:
-
开发效率:SpringBoot的自动配置和起步依赖可以快速搭建项目骨架,配合MyBatis-Plus的代码生成器,基础CRUD接口开发时间缩短60%
-
性能需求:校园场景下需要考虑高并发情况(如晨检时段集中打卡),MySQL配合Redis缓存可以支撑3000+ QPS
-
可维护性:采用前后端分离架构,接口文档使用Swagger自动生成,便于后续迭代
java复制// 典型Controller层代码结构
@RestController
@RequestMapping("/health")
@Api(tags = "健康打卡模块")
public class HealthReportController {
@Autowired
private HealthReportService reportService;
@PostMapping("/submit")
@ApiOperation("提交健康信息")
public Result submitReport(@RequestBody HealthReportDTO dto) {
return reportService.processReport(dto);
}
}
2.2 数据库设计要点
核心表结构设计遵循疫情防控的业务逻辑:
-
用户基础表(user_info)
- 区分教职工、学生、访客等身份类型
- 关联学号/工号等校园统一认证信息
-
健康打卡表(health_report)
- 包含体温、症状、行程等字段
- 设置定时任务检查未打卡人员
-
场所登记表(location_checkin)
- 记录各场所的进出记录
- 使用Geohash存储位置信息
sql复制CREATE TABLE `health_report` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`temperature` decimal(3,1) NOT NULL COMMENT '体温',
`symptoms` varchar(255) DEFAULT NULL COMMENT '症状',
`report_time` datetime NOT NULL COMMENT '上报时间',
`location` point DEFAULT NULL COMMENT '地理位置',
PRIMARY KEY (`id`),
KEY `idx_user_time` (`user_id`,`report_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现
3.1 实时预警机制
系统通过多种方式实现异常情况预警:
- 定时扫描:每小时检查一次未打卡人员,通过企业微信自动提醒
- 阈值触发:体温≥37.3℃自动触发预警流程
- 时空关联:发现确诊案例时,自动筛查同期同场所人员
java复制// 预警检查的定时任务示例
@Scheduled(cron = "0 0 * * * ?")
public void checkMissingReports() {
LocalDate today = LocalDate.now();
List<Long> missingUsers = userMapper.selectMissingReportUsers(today);
missingUsers.forEach(userId -> {
wechatService.sendReminder(userId);
});
}
3.2 行程追溯功能
通过两种方式实现行程追踪:
- 主动登记:各场所张贴二维码,师生扫码登记
- 被动记录:校门闸机、宿舍门禁等系统自动同步数据
使用图数据库Neo4j存储人员流动关系,当出现病例时,可以快速生成传播链图谱:
code复制MATCH path=(p:Person)-[r:CONTACT*1..3]-(infected:Person)
WHERE infected.id = $caseId
RETURN path
4. 性能优化实践
4.1 高并发处理
晨检时段面临的高并发挑战通过以下方案解决:
- 读写分离:打卡数据写入主库,查询走从库
- 缓存策略:
- 使用Redis缓存常用配置信息
- 热点数据(如班级打卡率)每5分钟更新一次
- 异步处理:非核心流程(如通知发送)通过消息队列解耦
java复制// 使用Redis缓存的示例
public class HealthStatsCache {
private static final String CACHE_KEY = "health:stats";
@Cacheable(value = CACHE_KEY, key = "#classId")
public HealthStats getClassStats(Long classId) {
return healthMapper.selectClassStats(classId);
}
}
4.2 大数据量处理
历史数据归档方案:
- 按月分表(health_report_202301)
- 超过3个月的数据转移到HBase
- 使用Elasticsearch实现快速检索
5. 安全防护措施
5.1 数据安全
- 敏感信息加密:身份证号等字段使用AES加密存储
- 权限控制:基于RBAC模型,不同角色看到的数据范围不同
- 操作审计:关键操作记录操作人和时间
5.2 接口安全
- 防重放攻击:请求携带时间戳和签名
- 频率限制:敏感接口每分钟最多调用10次
- XSS防护:前端输入统一过滤,后端使用Jackson转义
java复制// XSS防护配置示例
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
return new Jackson2ObjectMapperBuilder()
.serializers(new StringXssSerializer());
}
public class StringXssSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen,
SerializerProvider provider) {
gen.writeString(HtmlUtils.htmlEscape(value));
}
}
6. 部署与运维
6.1 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
app:
image: campus-covid:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6
ports:
- "6379:6379"
6.2 监控方案
- Prometheus采集JVM指标
- Grafana展示关键指标看板
- ELK收集和分析日志
7. 典型问题解决方案
7.1 打卡数据不一致
现象:偶尔出现打卡成功但页面显示未打卡
排查:
- 检查读写分离延迟
- 验证缓存更新机制
- 最终发现是前端localStorage缓存未及时清除
解决方案:
javascript复制// 前端增加缓存清除逻辑
axios.interceptors.response.use(response => {
if(response.config.url.includes('/health/submit')) {
localStorage.removeItem('healthStatus');
}
return response;
});
7.2 高并发下的死锁问题
现象:晨检时段偶发数据库死锁
分析:多个事务同时更新同一个用户的打卡状态
解决方案:
- 改为先查询再插入,避免update竞争
- 对用户ID取模实现行级锁分散
- 添加重试机制
java复制@Retryable(value = {DeadlockLoserDataAccessException.class},
maxAttempts = 3)
public void processHealthReport(Long userId) {
// 业务逻辑
}
8. 项目扩展方向
- 移动端增强:开发小程序实现扫码登记更方便
- 物联网集成:对接智能测温设备自动上传数据
- 预测分析:基于历史数据建立疫情传播模型
- 应急演练:模拟疫情场景测试系统响应能力
这个项目让我深刻体会到,好的校园防疫系统不仅要技术过关,更需要理解疫情防控的实际工作流程。比如最初我们设计的异常预警是实时通知校领导,后来根据实际需求调整为先通知校医初步排查,确认后再升级处理,这样的流程设计更符合实际工作场景。
