1. 项目背景与核心需求
2020年初爆发的新冠肺炎疫情对高校日常管理提出了严峻挑战。安康学院作为一所全日制普通本科院校,急需一套能够实时掌握师生健康状态、快速响应突发情况的疫情防控管理系统。传统的人工填报和Excel统计方式存在数据滞后、信息孤岛、统计效率低下等问题,无法满足疫情常态化防控的需求。
这个专题网站管理系统需要实现的核心功能包括:
- 师生每日健康打卡(体温、症状、行程等)
- 校内疫情动态实时更新与可视化展示
- 隔离人员管理与服务跟踪
- 防疫物资库存管理
- 返校审批流程电子化
- 疫情数据统计分析报表
实际开发中发现,高校疫情防控系统与普通企业系统最大的区别在于:需要处理大量并发提交(特别是每日晨午检时段),同时要兼顾不同年龄段用户的操作习惯(从18岁学生到60岁教职工)。
2. 技术选型与架构设计
2.1 后端技术栈选择
采用SpringBoot 2.7.x作为基础框架,主要基于以下考虑:
- 自动配置特性可快速搭建项目骨架
- 内嵌Tomcat简化部署流程
- 完善的健康检查机制(/actuator端点)
- 与MyBatis的天然集成支持
数据库选用MySQL 8.0,关键配置项包括:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/epidemic_control?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 加密处理
hikari:
maximum-pool-size: 20 # 根据实际服务器配置调整
2.2 前端技术方案
Vue 3.x + Element Plus的组合提供了:
- 响应式数据绑定,实时展示疫情数据变化
- 丰富的UI组件库加速开发(如ECharts数据可视化)
- 路由守卫实现权限控制
- Axios封装处理HTTP请求
典型API调用示例:
javascript复制// 封装axios实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 10000
})
// 请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
2.3 前后端分离架构
采用标准的RESTful API交互模式:
code复制前端(Vue) ←HTTP→ 后端(SpringBoot) ←JDBC→ MySQL
特别处理了跨域问题:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.maxAge(3600);
}
}
3. 核心功能模块实现
3.1 健康打卡系统
数据库表设计关键字段:
sql复制CREATE TABLE `health_report` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(32) NOT NULL COMMENT '学工号',
`temperature` decimal(3,1) NOT NULL COMMENT '体温',
`symptoms` varchar(255) DEFAULT NULL COMMENT '症状',
`location` json DEFAULT NULL COMMENT '地理位置',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user_date` (`user_id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
后端采用策略模式处理不同类型的打卡:
java复制public interface HealthCheckStrategy {
HealthCheckResult check(HealthReportDTO dto);
}
@Service
public class StudentCheckStrategy implements HealthCheckStrategy {
@Override
public HealthCheckResult check(HealthReportDTO dto) {
// 学生特殊校验逻辑
}
}
3.2 疫情数据可视化
使用ECharts实现的关键配置:
javascript复制option = {
tooltip: {
trigger: 'axis',
formatter: function(params) {
return `日期:${params[0].name}<br/>新增:${params[0].value}`
}
},
xAxis: {
type: 'category',
data: ['1月', '2月', '3月', '4月']
},
yAxis: { type: 'value' },
series: [{
data: [12, 19, 3, 5],
type: 'line',
smooth: true
}]
}
3.3 返校审批流程
状态机设计:
java复制public enum ApprovalStatus {
PENDING("待审核"),
APPROVED("已通过"),
REJECTED("已拒绝"),
CANCELLED("已取消");
private final String desc;
// ...
}
工作流引擎采用Activiti,关键表包括:
- ACT_RU_TASK 运行时任务
- ACT_HI_TASKINST 历史任务
- ACT_RU_IDENTITYLINK 身份关联
4. 性能优化实践
4.1 高并发处理
针对晨检时段的集中访问,实施以下措施:
- 使用Redis缓存基础数据(学院、班级等)
- 健康打卡采用异步写入
- 数据库连接池优化
异步处理示例:
java复制@Async("taskExecutor")
public void asyncProcessReport(HealthReport report) {
// 耗时操作
healthReportMapper.insert(report);
}
4.2 数据库优化
建立复合索引:
sql复制ALTER TABLE `health_report`
ADD INDEX `idx_user_date` (`user_id`, `create_time`);
慢查询监控配置:
properties复制# 开启慢查询日志
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2
4.3 前端性能提升
实施策略:
- 路由懒加载
- 组件按需引入
- API请求合并
示例:
javascript复制const router = new VueRouter({
routes: [
{
path: '/dashboard',
component: () => import('./views/Dashboard.vue')
}
]
})
5. 安全防护措施
5.1 认证与授权
JWT实现方案:
java复制public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
5.2 数据安全
敏感信息加密:
java复制public class AESUtil {
private static final String KEY = "加密密钥";
public static String encrypt(String content) {
// AES加密实现
}
}
5.3 日志审计
AOP记录操作日志:
java复制@Aspect
@Component
public class LogAspect {
@AfterReturning(pointcut = "@annotation(operLog)", returning = "result")
public void afterReturning(JoinPoint joinPoint, OperLog operLog, Object result) {
// 记录操作日志
}
}
6. 部署与运维
6.1 服务器环境
推荐配置:
- CPU: 4核以上
- 内存: 8GB+
- 磁盘: 100GB SSD
- OS: CentOS 7.6+
6.2 Docker部署
后端Dockerfile示例:
dockerfile复制FROM openjdk:11-jre
COPY target/epidemic-control.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
前端Nginx配置:
nginx复制server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
}
6.3 监控方案
Prometheus + Grafana监控指标:
- 系统指标:CPU、内存、磁盘
- 应用指标:JVM、接口QPS
- 业务指标:每日打卡量、异常体温数
7. 项目总结与扩展
在实际开发过程中,有几个关键经验值得分享:
-
表单设计要兼顾老年教职工的使用习惯,我们最终采用了:
- 大字号显示
- 极简表单字段
- 语音填报辅助功能
-
疫情数据统计的时区问题:
- 统一使用服务器时区
- 前端显示时做本地化转换
- 日报统计以北京时间0点为界
-
后续可扩展方向:
- 接入微信小程序扩大覆盖
- 增加AI体温异常预测
- 对接省级教育防疫平台
这个项目的完整源码已经过脱敏处理,包含70多个Java类、30多个Vue组件和完整的SQL脚本,实现了从用户管理到数据看板的完整闭环。在真实生产环境中运行稳定,日均处理健康打卡数据超过1.2万条,高峰期QPS达到150+。
