1. 项目概述:敬老院管理系统技术架构解析
这套基于Java SpringBoot+Vue3+MyBatis的敬老院管理系统,采用了典型的前后端分离架构。后端使用SpringBoot 2.7.x构建RESTful API,前端采用Vue3+Element Plus实现响应式界面,数据持久层通过MyBatis-Plus与MySQL 8.0交互。系统主要包含老人档案管理、护理记录、药品管理、费用结算等核心模块,特别针对敬老院场景优化了批量操作和家属端协同功能。
技术选型心得:选择MyBatis-Plus而非JPA是考虑到敬老院业务中存在大量复杂报表查询需求,需要更灵活的SQL控制能力。而Vue3的组合式API在复杂表单场景下的代码组织优势明显。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计与实现
2.1 老人档案管理模块
采用树形结构组织老人信息:
java复制// 老人实体类核心字段
public class Elder {
private Long id;
private String name;
private Integer gender;
private LocalDate birthDate;
private String idCard; // 身份证加密存储
private Integer healthLevel; // 健康等级
private List<Guardian> guardians; // 家属信息
// 审计字段
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
关键实现要点:
- 身份证号使用AES加密存储,实现类配置了TypeHandler自动加解密
- 健康状态变更记录通过Spring Data Envers实现审计
- 照片存储采用MinIO对象存储方案
2.2 护理计划动态生成
基于规则引擎Drools实现护理级别自动判定:
drools复制rule "判定一级护理"
when
$e : Elder(age >= 80, healthLevel < 60)
then
insert(new CarePlan($e, "一级护理"));
end
前端采用Gantt图展示护理排班:
vue复制<template>
<el-gantt :data="carePlans"
:show-weekend="true"
@node-click="handleNodeClick">
</el-gantt>
</template>
3. 关键技术实现细节
3.1 前后端鉴权方案
采用JWT+双Token机制实现安全控制:
- AccessToken有效期2小时
- RefreshToken有效期7天
- 敏感操作需二次验证
Spring Security配置示例:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/elder/**").hasRole("STAFF")
.antMatchers("/api/finance/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
return http.build();
}
}
3.2 MyBatis动态SQL优化
针对复杂报表查询的解决方案:
xml复制<select id="selectElderStats" resultType="ElderStatsDTO">
SELECT
health_level,
COUNT(*) as count,
AVG(age) as avg_age
FROM t_elder
<where>
<if test="startDate != null">
AND create_time >= #{startDate}
</if>
<if test="endDate != null">
AND create_time <= #{endDate}
</if>
<if test="careLevel != null">
AND care_level = #{careLevel}
</if>
</where>
GROUP BY health_level
</select>
性能提示:大数据量分页采用"延迟关联"优化:
sql复制SELECT * FROM t_elder e
JOIN (SELECT id FROM t_elder LIMIT 100000,10) tmp
ON e.id = tmp.id
4. 典型问题解决方案
4.1 家属端消息推送延迟
解决方案:
- 采用WebSocket+消息队列双通道保障
- 重要通知使用阿里云短信备份
- 消息状态机设计:
mermaid复制stateDiagram
[*] --> Pending
Pending --> Sent: 即时发送
Sent --> Failed: 3次重试
Failed --> Archived: 人工处理
Sent --> Read: 用户已读
4.2 药品库存并发控制
使用MySQL乐观锁实现:
java复制@Update("UPDATE t_medicine SET stock = stock - #{count}, version = version + 1
WHERE id = #{id} AND version = #{version}")
int deductStock(@Param("id") Long id,
@Param("count") Integer count,
@Param("version") Integer version);
前端配合使用Loading状态防止重复提交:
vue复制<script setup>
const onSubmit = async () => {
loading.value = true
try {
await deductMedicine()
} finally {
loading.value = false
}
}
</script>
5. 部署与监控方案
5.1 容器化部署
Docker Compose编排示例:
yaml复制version: '3'
services:
backend:
image: elder-system:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
frontend:
image: nginx:1.23
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html
5.2 健康检查配置
SpringBoot Actuator扩展:
properties复制management.endpoint.health.probes.enabled=true
management.health.db.enabled=true
management.health.redis.enabled=true
Prometheus监控指标示例:
java复制@RestController
public class MetricsController {
@GetMapping("/api/elder/count")
public String getElderCount() {
Counter.builder("elder.count")
.tag("type", "total")
.register(Metrics.globalRegistry)
.increment();
return "OK";
}
}
6. 安全防护实践
6.1 SQL注入防护
- 严格使用#{}参数绑定
- 动态表名采用白名单校验:
java复制public String checkTableName(String input) {
Set<String> validTables = Set.of("t_elder", "t_staff");
if(!validTables.contains(input)){
throw new IllegalArgumentException("Invalid table name");
}
return input;
}
6.2 隐私数据脱敏
Jackson自定义序列化:
java复制public class IdCardSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen,
SerializerProvider provider) {
if(value != null && value.length() > 10) {
gen.writeString(value.substring(0,3) + "****" + value.substring(14));
}
}
}
7. 性能优化记录
7.1 报表查询加速
采用多级缓存策略:
- 热点数据 -> Caffeine本地缓存(5分钟)
- 次热数据 -> Redis集群(2小时)
- 全量数据 -> MySQL分库分表
缓存注解示例:
java复制@Cacheable(value = "elderStats", key = "#root.methodName+#startDate+#endDate")
public List<ElderStatsDTO> getElderStats(LocalDate startDate, LocalDate endDate) {
// 复杂查询逻辑
}
7.2 前端性能优化
Vue3特定技巧:
- 使用v-memo缓存静态列表
- 重型组件动态导入:
vue复制<script setup>
const HeavyChart = defineAsyncComponent(() =>
import('./components/HeavyChart.vue')
)
</script>
8. 扩展开发建议
8.1 智能预警扩展
接入TensorFlow.js实现跌倒检测:
javascript复制// 视频流分析
const model = await tf.loadGraphModel('fall-detection.json');
const predictions = model.execute(tensor);
if(predictions[0] > 0.9) {
websocket.send(JSON.stringify({
type: 'emergency',
elderId: currentElder.id
}));
}
8.2 微信小程序适配
Uniapp跨端方案改造要点:
- 封装统一的request方法
- 调整Element Plus组件为uni-ui
- 实现原生功能插件:
javascript复制// 调用摄像头
uni.chooseImage({
success: (res) => {
this.avatar = res.tempFilePaths[0]
}
})
这套系统在实际部署中需要特别注意敬老院工作人员的操作习惯,我们专门增加了以下特性:
- 大字体模式开关
- 一键导出所有联系人
- 批量登记药品功能
- 离线操作数据同步机制
对于技术团队,建议重点关注护理记录模块的并发写入性能,我们最终采用的方案是通过Redis队列缓冲写请求,夜间批量同步到MySQL。这个设计使得高峰期系统响应时间从原来的2秒降低到300毫秒以内。
