1. 项目背景与核心需求
2020年以来的特殊公共卫生事件让隔离管理成为社会刚需。作为计算机专业毕业生,我选择开发这套隔离人员管理系统,主要解决三个痛点:传统纸质登记效率低下、信息更新滞后、各部门协同困难。系统采用B/S架构,前端工作人员通过浏览器即可完成所有操作,后台使用SpringBoot+MySQL技术栈,日均需承载500+并发请求。
这套系统需要实现的核心功能包括:
- 隔离人员信息数字化录入(含身份证OCR识别)
- 健康状态每日打卡(体温、症状上报)
- 隔离期限智能计算(根据政策自动调整)
- 多级权限管理(社区/街道/区县三级视图)
- 异常情况自动预警(体温超标、擅自外出等)
实际开发中发现,单纯实现CRUD并不难,难点在于业务规则的灵活配置。比如不同地区隔离政策差异、特殊人群(孕妇、慢性病患者)的差异化处理等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 为什么选择SpringBoot
相比传统SSM框架,SpringBoot的自动配置特性显著提升了开发效率:
- 内嵌Tomcat无需单独部署
- starter依赖一键集成MyBatis、Redis等组件
- Actuator提供完善的监控端点
- 与IDEA开发工具深度契合
java复制// 典型的主启动类配置
@SpringBootApplication
@MapperScan("com.isolation.mapper")
public class IsolationApp {
public static void main(String[] args) {
SpringApplication.run(IsolationApp.class, args);
}
}
2.2 数据库设计要点
MySQL表结构设计遵循几个原则:
- 基础信息与动态数据分离(人员表 vs 健康记录表)
- 建立时间轴表记录政策变更历史
- 所有表必须包含create_time/update_time字段
关键表结构示例:
sql复制CREATE TABLE `isolation_person` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8mb4_bin NOT NULL,
`id_card` varchar(18) COLLATE utf8mb4_bin NOT NULL,
`phone` varchar(11) COLLATE utf8mb4_bin NOT NULL,
`start_date` datetime NOT NULL,
`end_date` datetime NOT NULL,
`address` varchar(200) COLLATE utf8mb4_bin NOT NULL,
`status` tinyint NOT NULL COMMENT '0-待隔离 1-隔离中 2-已解除',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
3. 核心功能实现细节
3.1 智能隔离期限计算
政策可能随时调整,硬编码计算逻辑不可取。我们的解决方案:
- 建立policy_rule规则表存储计算公式
- 使用Spring EL表达式动态计算
- 添加本地缓存减少数据库查询
java复制// 政策规则应用示例
public LocalDate calculateEndDate(LocalDate startDate, String areaCode) {
String expression = policyService.getRule(areaCode);
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("startDate", startDate);
return parser.parseExpression(expression).getValue(context, LocalDate.class);
}
3.2 健康打卡的并发处理
早高峰时段易出现并发提交问题,解决方案:
- 为打卡记录表添加联合唯一索引(person_id+check_date)
- 使用Redis分布式锁控制并发
- 前端做防重复提交限制
java复制// 基于Redis的打卡锁实现
public boolean dailyCheck(CheckInDTO dto) {
String lockKey = "check:lock:" + dto.getPersonId();
try {
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(locked)) {
return checkService.doCheck(dto);
}
throw new BusinessException("操作太频繁,请稍后重试");
} finally {
redisTemplate.delete(lockKey);
}
}
4. 系统安全与性能优化
4.1 三级权限控制方案
采用RBAC模型扩展:
- 社区级:只能查看本社区人员
- 街道级:可查看下辖所有社区
- 区县级:拥有全区数据权限
通过MyBatis拦截器自动注入SQL条件:
java复制@Intercepts(@Signature(type= Executor.class, method="query",
args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class DataPermissionInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取当前用户权限级别
Integer level = SecurityUtils.getDataLevel();
if (level == 1) { // 社区级
BoundSql boundSql = ms.getBoundSql(parameterObject);
String newSql = boundSql.getSql() + " AND community_id = " + SecurityUtils.getCommunityId();
resetSql(invocation, newSql);
}
// 其他级别处理...
return invocation.proceed();
}
}
4.2 高并发场景优化
通过JMeter压测发现两个性能瓶颈:
- 名单导出Excel耗时过长
- 大屏数据统计查询缓慢
优化方案:
- 使用EasyExcel替代POI(内存占用减少60%)
- 建立统计结果缓存表(每小时定时更新)
- 对核心接口添加二级缓存
java复制// 基于Caffeine的本地缓存配置
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager();
manager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES));
return manager;
}
}
5. 部署与运维实践
5.1 多环境配置管理
使用SpringBoot Profile特性管理配置:
code复制application.yml # 公共配置
application-dev.yml # 开发环境
application-test.yml # 测试环境
application-prod.yml # 生产环境
关键配置项:
- 数据库连接池(Druid推荐配置)
- 文件存储路径(生产环境需挂载NAS)
- 短信/邮件报警阈值
5.2 日志收集方案
采用ELK栈实现集中日志管理:
- Logback输出JSON格式日志
- Filebeat收集日志文件
- Elasticsearch建立全文索引
- Kibana展示监控大盘
logback-spring.xml配置片段:
xml复制<appender name="ELK" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/isolation.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
6. 开发中的典型问题解决
6.1 时区问题排查
发现数据库时间与Java程序获取的时间不一致:
- MySQL配置:jdbc-url添加
serverTimezone=Asia/Shanghai - Docker容器需挂载
/etc/localtime - 前端传参统一使用ISO8601格式
6.2 内存泄漏分析
使用Arthas定位到问题:
- 执行
dashboard观察内存趋势 - 发现HashMap持续增长
- 最终定位到未关闭的Excel导出流
解决方案:
java复制// 正确资源关闭写法
try (InputStream is = file.getInputStream();
Workbook workbook = WorkbookFactory.create(is)) {
// 处理逻辑
}
7. 项目扩展方向
已完成基础功能后,可以考虑:
- 接入健康码核验接口
- 增加智能门磁设备对接
- 开发微信小程序端
- 引入大数据分析模块
以微信通知为例的扩展实现:
java复制public void sendWxTemplateMsg(String openId, String templateId, Map<String,String> data) {
String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + getAccessToken();
Map<String,Object> params = new HashMap<>();
params.put("touser", openId);
params.put("template_id", templateId);
params.put("data", data);
restTemplate.postForObject(url, params, String.class);
}
这个项目让我深刻体会到:业务系统开发中,技术实现只占30%,剩余70%是对业务场景的理解和异常情况的处理。比如有次凌晨2点接到街道电话,说系统显示某隔离人员已超期,但实际政策前晚刚调整。这促使我们增加了政策版本管理功能,确保任何调整都可追溯。
