1. 项目概述
隔离人员管理系统是基于SpringBoot框架开发的B/S架构应用,主要用于疫情期间隔离人员的数字化管理。系统采用Java语言开发,MySQL作为后端数据库,实现了从人员登记、分配、日常管理到解除隔离的全流程闭环处理。
在实际开发中,我发现这类系统有几个关键需求:首先是信息录入的便捷性,基层工作人员往往需要在短时间内完成大量人员信息采集;其次是状态变更的实时性,隔离天数计算、核酸检测结果更新等操作必须及时准确;最后是数据统计的灵活性,管理人员需要多维度查看隔离情况报表。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构方案
系统采用经典的三层架构:
- 表现层:Thymeleaf模板引擎+HTML5
- 业务层:SpringBoot 2.7 + Spring Security
- 数据层:MySQL 8.0 + MyBatis-Plus
选择这套技术栈主要基于以下考虑:
- Thymeleaf相比JSP更符合现代开发趋势,天然支持HTML5标准
- SpringBoot的自动配置特性大幅减少了XML配置工作量
- MyBatis-Plus的ActiveRecord模式简化了单表CRUD操作
2.2 数据库设计要点
核心表结构设计时特别注意了以下几点:
sql复制CREATE TABLE `isolation_person` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) NOT NULL COMMENT '姓名',
`id_card` varchar(18) NOT NULL COMMENT '身份证号',
`phone` varchar(20) NOT NULL COMMENT '联系电话',
`isolation_type` tinyint NOT NULL COMMENT '隔离类型(1:居家 2:集中)',
`start_date` datetime NOT NULL COMMENT '开始时间',
`end_date` datetime NOT NULL COMMENT '结束时间',
`address` varchar(200) DEFAULT NULL COMMENT '隔离地址',
`status` tinyint DEFAULT '0' COMMENT '状态(0:在隔离 1:已解除)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_idcard` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
特别注意:身份证号字段必须建立唯一索引,防止重复登记
3. 核心功能实现
3.1 人员信息管理模块
采用分页查询优化大数据量展示:
java复制@GetMapping("/list")
public R<Page<IsolationPerson>> list(
@RequestParam(required = false) String name,
@RequestParam(required = false) String idCard,
@RequestParam Integer pageNum,
@RequestParam Integer pageSize) {
LambdaQueryWrapper<IsolationPerson> wrapper = Wrappers.lambdaQuery();
wrapper.like(StringUtils.isNotBlank(name), IsolationPerson::getName, name)
.like(StringUtils.isNotBlank(idCard), IsolationPerson::getIdCard, idCard);
return R.success(isolationPersonService.page(
new Page<>(pageNum, pageSize), wrapper));
}
3.2 隔离天数自动计算
利用Java 8的日期API实现精准计算:
java复制public long calculateRemainingDays(LocalDate endDate) {
LocalDate today = LocalDate.now();
if (today.isAfter(endDate)) {
return 0;
}
return ChronoUnit.DAYS.between(today, endDate);
}
3.3 核酸检测记录管理
采用乐观锁解决并发更新问题:
java复制@Transactional
public boolean updateTestResult(Long id, Integer result) {
IsolationPerson person = getById(id);
if (person.getVersion() != version) {
throw new OptimisticLockException("数据已被修改");
}
person.setTestResult(result);
return updateById(person);
}
4. 系统安全设计
4.1 权限控制方案
基于RBAC模型设计权限体系:
code复制用户 -> 角色 -> 菜单权限 -> 按钮权限
Spring Security配置示例:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/staff/**").hasAnyRole("ADMIN", "STAFF")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login");
}
4.2 数据加密处理
敏感信息采用AES加密存储:
java复制public class CryptoUtils {
private static final String KEY = "secureKey12345678";
public static String encrypt(String data) {
// AES加密实现
}
public static String decrypt(String encrypted) {
// AES解密实现
}
}
5. 性能优化实践
5.1 缓存策略设计
采用多级缓存方案:
- 本地Caffeine缓存高频访问数据
- Redis缓存共享数据
- MySQL持久化存储
缓存更新策略:
java复制@CacheEvict(value = "person", key = "#id")
public void updatePerson(IsolationPerson person) {
// 更新数据库
}
@Cacheable(value = "person", key = "#id")
public IsolationPerson getById(Long id) {
// 查询数据库
}
5.2 数据库查询优化
针对常用查询建立复合索引:
sql复制ALTER TABLE `isolation_person`
ADD INDEX `idx_status_type` (`status`, `isolation_type`);
使用EXPLAIN分析慢查询:
sql复制EXPLAIN SELECT * FROM isolation_person
WHERE status = 0 AND isolation_type = 1
ORDER BY start_date DESC LIMIT 10;
6. 部署与运维
6.1 多环境配置
SpringBoot多环境配置示例:
yaml复制# application-dev.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/isolation_dev
username: dev
password: dev123
# application-prod.yml
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-db:3306/isolation_prod
username: prod
password: prod@2023
6.2 健康检查端点
配置Actuator监控端点:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always
7. 常见问题解决方案
7.1 日期格式处理
统一处理前端日期格式:
java复制@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
registrar.registerFormatters(registry);
}
}
7.2 文件上传限制
调整文件上传大小限制:
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
7.3 跨域问题处理
全局跨域配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.maxAge(3600);
}
}
8. 项目扩展方向
8.1 微信小程序集成
通过微信开放平台API实现:
- 获取用户手机号绑定系统账号
- 推送隔离状态变更通知
- 健康打卡功能
8.2 大数据分析
基于隔离数据构建分析模型:
- 隔离人员分布热力图
- 疫情传播趋势预测
- 资源需求预测
8.3 物联网设备对接
对接智能门磁等设备:
- 实时监测隔离状态
- 异常出入预警
- 自动化报表生成
在实际开发过程中,我发现系统初期最容易出现的问题是数据一致性维护。例如当同时有工作人员通过PC端和管理员通过手机端修改同一个隔离人员的状态时,需要特别注意并发控制。我们最终采用的解决方案是:
- 关键操作添加分布式锁
- 重要状态变更记录操作日志
- 敏感数据修改增加二次确认
另一个值得分享的经验是,在开发核酸检测结果导入功能时,最初使用POI直接解析Excel导致内存溢出。后来改用EasyExcel的事件驱动模式,内存消耗降低了80%:
java复制// 使用EasyExcel读取大文件
EasyExcel.read(file.getInputStream(), TestResult.class,
new TestResultListener(testResultService)).sheet().doRead();
