1. 项目背景与核心价值
这个疫情信息管理系统源码包是专门为中小型社区设计的全栈解决方案。去年我在参与某社区防疫工作时,发现很多居委会还在用Excel表格手工登记居民健康信息,不仅效率低下,而且存在数据丢失风险。当时就萌生了开发这套系统的想法,经过三个月的迭代优化,最终形成了这个开箱即用的版本。
系统采用当前主流的前后端分离架构,后端基于SpringBoot 2.7实现RESTful API,前端使用Vue 3组合式API开发管理界面,数据库选用MySQL 8.0。特别值得一提的是,所有组件都采用当前最新的稳定版本,避免了常见教学项目中版本过时的问题。
2. 系统架构设计解析
2.1 技术栈选型考量
选择SpringBoot+Vue的组合主要基于以下实际考量:
- 开发效率:SpringBoot的自动配置特性让后端开发更专注业务逻辑
- 维护成本:Vue的组件化开发便于后期功能扩展
- 性能平衡:MySQL在中小规模数据场景下表现稳定
- 人才储备:这两种技术在国内开发者群体中普及度高
我在技术选型时特别测试了JPA和MyBatis两种ORM方案,最终选择了MyBatis-Plus。实测发现,在需要复杂查询的疫情统计场景下,MyBatis-Plus的动态SQL功能比JPA的Criteria API更直观易用。
2.2 系统模块划分
系统主要包含以下核心模块:
- 居民信息管理:实现住户基础信息的CRUD操作
- 健康打卡模块:每日体温上报与异常预警
- 出入登记系统:扫码登记与通行记录查询
- 物资管理:防疫物资入库/出库/库存预警
- 数据统计看板:关键指标可视化展示
每个模块都设计了独立的API接口文档,采用Swagger UI实现。这里有个实用技巧:在SpringBoot配置中加入@EnableSwagger2注解后,记得设置Docket的apiInfo(),这样前端开发人员就能实时查看接口文档。
3. 环境准备与项目部署
3.1 基础环境配置
建议使用以下环境配置:
- JDK 17(LTS版本)
- Node.js 16.x
- MySQL 8.0.28+
- Maven 3.8.6
安装MySQL时有个关键设置:需要将默认字符集改为utf8mb4,否则存储中文时会出现乱码。配置示例:
sql复制[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
3.2 数据库初始化
项目提供了完整的SQL初始化脚本,包含:
- 表结构定义(28张核心表)
- 基础数据初始化(角色/权限/管理员账号)
- 存储过程(用于每日统计报表)
执行脚本前需要先创建数据库:
sql复制CREATE DATABASE `community_epidemic` DEFAULT CHARACTER SET utf8mb4;
3.3 后端服务启动
修改application.yml中的数据库连接配置后,可通过两种方式启动:
- IDE直接运行
EpidemicApplication.java - 命令行执行:
mvn spring-boot:run
建议开发时开启热部署:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
3.4 前端项目运行
前端项目使用Vite构建,启动命令:
bash复制npm install
npm run dev
部署生产环境时,建议修改vite.config.js中的base路径,然后执行:
bash复制npm run build
4. 核心功能实现细节
4.1 健康打卡流程设计
采用状态机模式管理健康状态流转:
java复制public enum HealthStatus {
NORMAL(0),
ABNORMAL(1),
CONFIRMED(2),
//...
}
// 状态变更校验
public void changeStatus(Long userId, HealthStatus newStatus) {
HealthStatus current = getCurrentStatus(userId);
if (!current.canTransferTo(newStatus)) {
throw new IllegalStateException("状态变更不合法");
}
//...
}
4.2 出入登记二维码生成
使用ZXing库生成动态二维码,关键代码:
java复制@GetMapping("/qrcode/{userId}")
public void generateQRCode(@PathVariable Long userId,
HttpServletResponse response) {
String content = "epid://" + userId + "?t=" + System.currentTimeMillis();
QRCodeWriter writer = new QRCodeWriter();
BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, 200, 200);
MatrixToImageWriter.writeToStream(matrix, "PNG", response.getOutputStream());
}
4.3 数据统计优化方案
对于大社区的数据统计,采用以下优化策略:
- 定时任务预计算热点数据
- 使用Redis缓存查询结果
- 复杂报表采用异步导出
Spring Scheduler配置示例:
java复制@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
public void generateDailyReport() {
// 预计算各楼栋的异常人数统计
reportService.preCalculateBuildingStats();
}
5. 系统安全设计
5.1 权限控制实现
采用RBAC模型,核心表设计:
- sys_user
- sys_role
- sys_menu
- sys_user_role
- sys_role_menu
权限校验使用Spring Security + JWT,关键配置:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/login").permitAll()
.antMatchers("/api/**").authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
5.2 数据安全措施
- 敏感字段加密:身份证号等采用AES加密存储
- 操作日志审计:记录所有数据变更操作
- 接口防刷:使用Guava RateLimiter限制高频调用
字段加密示例:
java复制public String encryptIdCard(String idCard) {
return AESUtil.encrypt(idCard, SECRET_KEY);
}
6. 常见问题排查指南
6.1 前端跨域问题
解决方案:在后端添加CORS配置
java复制@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*");
}
};
}
6.2 日期格式不一致
统一前后端日期格式处理:
- 后端配置:
yaml复制spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
- 前端axios拦截器处理:
javascript复制axios.interceptors.response.use(response => {
if (response.data instanceof Object) {
processDateFields(response.data);
}
return response;
});
6.3 性能优化建议
- 数据库层面:
- 为高频查询字段添加索引
- 大表考虑分库分表
- 应用层面:
- 启用SpringBoot Actuator监控
- 配置Druid连接池监控
- 前端层面:
- 使用Vue的keep-alive缓存组件
- 大数据列表采用虚拟滚动
7. 项目扩展方向
7.1 微信小程序集成
可扩展微信小程序端,实现居民自助服务:
- 复用现有后端API
- 新增小程序专属接口
- 使用WXML+WXSS开发界面
7.2 大数据分析扩展
接入Spark或Flink实现:
- 疫情传播链分析
- 高风险区域预测
- 物资需求预测
7.3 物联网设备对接
可扩展对接:
- 智能门禁系统
- 红外测温设备
- 环境消杀机器人
我在实际部署中发现,这套系统最适合200-5000户规模的中小型社区。对于更大的社区,建议将MySQL升级为集群方案,并考虑引入Redis缓存热点数据。系统默认管理员账号admin/123456,部署后请务必修改密码。