1. 项目背景与核心需求
疫情常态化背景下,社区管理面临人员流动监控难、物资调配效率低、信息传递滞后三大痛点。光明小区管理系统正是针对这些实际问题设计的SpringBoot全栈解决方案,主要实现以下核心功能:
- 居民健康状态动态监测(体温上报、健康码状态)
- 出入权限智能管控(人脸识别+通行证双验证)
- 物资供需精准对接(团购管理、配送追踪)
- 疫情信息实时同步(公告推送、数据可视化)
关键设计考量:系统采用"轻前端+重服务"架构,后台管理端使用Thymeleaf模板引擎快速开发,移动端通过RESTful API对接,确保在毕业设计周期内完成全功能闭环。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 技术栈选型
| 层级 | 技术方案 | 选型理由 |
|---|---|---|
| 前端 | Bootstrap + jQuery | 毕业设计友好,快速实现响应式布局 |
| 后端框架 | SpringBoot 2.7.3 | 自动配置特性简化开发,内嵌Tomcat便于部署 |
| 安全框架 | Spring Security + JWT | 实现RBAC权限控制,JWT保障移动端认证安全 |
| 数据库 | MySQL 8.0 + Redis | 关系型存储业务数据,Redis缓存高频访问的通行状态 |
| 消息队列 | RabbitMQ | 异步处理批量通行记录上报,削峰填谷 |
| 文件存储 | 本地存储+七牛云备份 | 毕业设计成本考量,同时保证证件照等关键数据安全 |
2.2 核心模块设计
java复制// 典型领域模型示例
public class Resident {
private Long id;
@NotBlank(message = "姓名不能为空")
private String name;
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")
private String phone;
@TableField(exist = false)
private HealthStatus healthStatus; // 动态健康状态
}
@Entity
public class AccessLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private LocalDateTime accessTime;
@Enumerated(EnumType.STRING)
private AccessType type; // 出入类型
@ManyToOne
private Resident resident;
}
3. 关键功能实现细节
3.1 动态通行证生成算法
java复制/**
* 根据居民健康状态生成通行证有效期
* 绿码:7天有效期
* 黄码:单次通行(2小时有效)
* 红码:直接拒绝
*/
public PassCode generatePassCode(Resident resident) {
HealthCode code = healthService.getLatestCode(resident.getId());
LocalDateTime now = LocalDateTime.now();
switch(code.getColor()) {
case GREEN:
return new PassCode(UUID.randomUUID().toString(),
now, now.plusDays(7));
case YELLOW:
return new PassCode(UUID.randomUUID().toString(),
now, now.plusHours(2));
default:
throw new IllegalStateException("红码人员禁止通行");
}
}
3.2 物资库存预警策略
- 库存阈值配置(application.yml):
yaml复制inventory:
warning-threshold:
masks: 1000
disinfectant: 500
vegetables: 300
- 定时检查任务:
java复制@Scheduled(cron = "0 0 9,15 * * ?")
public void checkInventory() {
inventoryService.getLowStockItems().forEach(item -> {
String msg = String.format("[库存预警] %s剩余%d件",
item.getName(), item.getQuantity());
wechatService.pushToManagers(msg);
});
}
4. 典型问题解决方案
4.1 高并发出入记录上报
问题现象:早晚高峰时段,门禁系统批量上报记录导致数据库连接池耗尽
解决方案:
- 引入RabbitMQ实现异步处理
- 采用批量插入优化(MyBatis批量模式)
- 添加熔断机制(Resilience4j)
java复制@CircuitBreaker(name = "accessLogService", fallbackMethod = "logToFile")
public void batchSave(List<AccessLog> logs) {
accessLogMapper.batchInsert(logs); // 500条/批次
}
4.2 健康状态缓存一致性
问题场景:居民健康码状态变更后,门禁系统仍读取到缓存旧数据
处理方案:
- 双写策略:数据库更新后立即刷新Redis
- 本地缓存+Redis二级缓存
- 设置合理过期时间(绿码12h,黄码1h)
java复制@CacheEvict(value = "healthCode", key = "#residentId")
public void updateHealthStatus(Long residentId, HealthCode newCode) {
// 先更新数据库
healthCodeMapper.update(newCode);
// 再异步刷新Redis
redisTemplate.opsForValue().set(
"health:" + residentId,
newCode,
newCode.getColor() == GREEN ? 12 : 1,
TimeUnit.HOURS);
}
5. 部署与测试要点
5.1 多环境配置方案
properties复制# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/community_dev
logging.level.root=debug
# application-prod.properties
spring.datasource.url=jdbc:mysql://10.0.0.1:3306/community_prod?useSSL=true
logging.level.root=warn
启动命令示例:
bash复制java -jar community-system.jar --spring.profiles.active=prod
5.2 压力测试关键指标
使用JMeter模拟100并发测试:
- 通行验证接口:平均响应时间<300ms
- 公告发布接口:TPS>200
- 数据库连接池:最大使用率<80%
避坑指南:测试前务必关闭SpringBoot的Actuator端点,避免监控数据影响性能测试结果
6. 毕业设计扩展建议
- AI测温集成:通过OpenCV接入红外测温摄像头,自动关联通行记录
- 微信小程序扩展:使用Uniapp开发居民自助服务端
- 数据分析模块:基于ECharts实现疫情热力图展示
- 物联网对接:通过MQTT协议连接智能门锁设备
python复制# 伪代码示例:人脸识别测温逻辑
def access_control(frame):
face = detect_face(frame)
if face:
temp = measure_temperature(face.roi)
if temp < 37.3:
grant_access()
else:
alert_health_worker()
实际开发中发现,SpringBoot的@Cacheable注解在嵌套调用时可能失效,建议通过AOP显式处理缓存逻辑。数据库字段设计要预留足够扩展空间,比如居民表的address字段原本设计为varchar(50),实际部署后发现需要支持详细楼栋门牌号存储,后期不得不进行表结构变更。
