1. 项目背景与需求分析
养老院管理系统作为智慧养老服务体系的核心组成部分,正在经历从传统纸质化向数字化、智能化的转型。随着我国老龄化程度不断加深(截至2022年底,60岁以上人口占比达19.8%),养老机构面临着床位管理效率低、护理资源分配不均、健康监测不及时等痛点。
这个基于Java+SpringBoot的Web版解决方案,主要解决以下核心问题:
- 多角色协同难题:院长、护理员、家属三方信息不对称
- 业务流程碎片化:入住登记、费用结算、药品管理等环节脱节
- 数据资产沉睡:健康档案、服务记录等数据未形成有效分析
实际调研发现:中小型养老院平均每天要处理23份纸质表格,护理员30%的工作时间耗费在记录填写上
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用分层架构设计,具体技术组合:
code复制前端:Thymeleaf + Bootstrap + ECharts
后端:SpringBoot 2.7 + MyBatis-Plus 3.5
安全:Spring Security + JWT
数据库:MySQL 8.0(主从分离)
中间件:Redis 6.2(缓存)+ RabbitMQ 3.9(异步任务)
选择SpringBoot而非传统SSM框架的三大理由:
- 内嵌Tomcat简化部署,特别适合养老院这类IT能力弱的客户
- Starter机制快速集成健康检查(/actuator)、Swagger等运维组件
- 配置文件优先级机制便于多环境部署(dev/test/prod)
2.2 关键架构决策
2.2.1 混合认证方案
java复制// 示例:JWT与Session混合认证配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/**").authenticated() // API走JWT
.antMatchers("/admin/**").hasRole("ADMIN") // 管理端用Session
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
}
}
这种设计既保证移动端API的无状态访问,又满足管理后台的会话安全需求。
2.2.2 智能预警模块设计
采用规则引擎+时间序列分析:
- 规则引擎(Drools)处理固定阈值告警(如血压超标)
- LSTM模型分析生命体征时序数据预测风险
- 告警分级推送(短信/APP弹窗/系统消息)
3. 核心功能实现
3.1 老人健康档案管理
3.1.1 多源数据采集
java复制// 健康数据聚合服务
@Service
public class HealthDataService {
@Scheduled(cron = "0 0/30 * * * ?")
public void syncDeviceData() {
// 从智能手环、床垫等IoT设备同步数据
List<DeviceDTO> data = iotClient.getLatestData();
healthMapper.batchInsert(convertToEntity(data));
}
@Async
public void handleManualInput(HealthRecord record) {
// 异步处理护理员手动录入数据
validator.validate(record);
healthMapper.insert(record);
}
}
3.1.2 健康趋势分析
使用ECharts实现可视化:
javascript复制// 血压趋势图配置
option = {
dataset: { source: healthData },
xAxis: { type: 'category' },
yAxis: {
axisLabel: {
formatter: '{value} mmHg'
}
},
series: [
{ type: 'line', encode: { x: 'date', y: 'systolic' } },
{ type: 'line', encode: { x: 'date', y: 'diastolic' } }
],
tooltip: {
trigger: 'axis',
formatter: params => {
return `日期:${params[0].value[0]}<br/>
收缩压:${params[0].value[1]}<br/>
舒张压:${params[1].value[2]}`;
}
}
};
3.2 智能排班系统
3.2.1 排班算法核心逻辑
java复制public class SchedulingAlgorithm {
public List<Schedule> generate(List<Nurse> nurses,
List<Resident> residents,
LocalDate periodStart,
LocalDate periodEnd) {
// 1. 计算护理强度系数
Map<Long, Integer> careLevels = residents.stream()
.collect(Collectors.toMap(
Resident::getId,
r -> calculateCareLevel(r.getHealthStatus())));
// 2. 遗传算法排班(简化版)
return new GeneticScheduler()
.withConstraints(
new ShiftConstraint(), // 班次限制
new SkillConstraint(), // 技能匹配
new RestConstraint() // 休息间隔
)
.generate(nurses, careLevels, periodStart, periodEnd);
}
}
3.2.2 冲突检测机制
sql复制-- 排班冲突检测SQL
SELECT COUNT(*)
FROM schedule
WHERE nurse_id = #{nurseId}
AND shift_date = #{date}
AND shift_type IN ('MORNING', 'NIGHT')
AND status = 'APPROVED';
4. 特殊场景处理
4.1 并发缴费场景
采用乐观锁防止超额扣款:
java复制@Transactional
public PaymentResult charge(Long residentId, BigDecimal amount) {
Resident resident = residentMapper.selectById(residentId);
BigDecimal newBalance = resident.getBalance().subtract(amount);
if (newBalance.compareTo(BigDecimal.ZERO) < 0) {
throw new BusinessException("余额不足");
}
int updated = residentMapper.updateBalance(
residentId,
resident.getVersion(),
newBalance);
if (updated == 0) {
throw new ConcurrentUpdateException("请重试");
}
return new PaymentResult(newBalance);
}
4.2 敏感数据脱敏
使用自定义MyBatis TypeHandler:
java复制public class SensitiveTypeHandler extends BaseTypeHandler<String> {
private final SensitiveProcessor processor = new AesProcessor();
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
String parameter, JdbcType jdbcType) {
ps.setString(i, processor.encrypt(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) {
return processor.decrypt(rs.getString(columnName));
}
}
5. 性能优化实践
5.1 缓存策略设计
三级缓存体系:
- 本地缓存(Caffeine):高频访问的字典数据
- Redis缓存:共享的院区信息
- MySQL缓存:使用Materialized View预计算报表
java复制@Cacheable(value = "residentDetail",
key = "#id",
cacheManager = "multiLevelCacheManager")
public ResidentDetail getDetail(Long id) {
return residentMapper.selectDetailById(id);
}
5.2 SQL优化案例
慢查询优化前后对比:
sql复制-- 优化前(执行时间:1.8s)
SELECT * FROM medication
WHERE resident_id IN (
SELECT id FROM resident WHERE room_id = 12
);
-- 优化后(执行时间:0.2s)
SELECT m.* FROM medication m
JOIN resident r ON m.resident_id = r.id
WHERE r.room_id = 12;
6. 部署与运维
6.1 容器化部署方案
Docker Compose配置示例:
yaml复制version: '3'
services:
app:
image: nursing-home:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
mysql:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
6.2 监控指标配置
Prometheus监控关键指标:
yaml复制# application.yml
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
metrics:
export:
prometheus:
enabled: true
tags:
application: nursing-home-system
7. 项目演进方向
- 智能设备深度集成:对接更多IoT设备(如跌倒检测传感器)
- 家属端小程序开发:基于uni-app的多平台适配方案
- 知识图谱构建:将护理经验转化为可复用的知识库
- 微服务化改造:按业务域拆分为独立服务(入住服务、护理服务等)
实际开发中发现:养老院员工平均年龄48岁,UI设计必须遵循:
- 按钮尺寸不小于48×48px
- 主要操作三步可达
- 重要信息使用红黄蓝高对比色
