1. 项目概述:企业级敬老院管理系统核心架构解析
这套基于SpringBoot+Vue+MyBatis+MySQL的敬老院管理系统源码,是我在养老行业信息化领域深耕多年后提炼出的实战解决方案。不同于市面上简单的CRUD demo,该系统完整实现了从入住登记、健康监测到费用结算的全流程数字化管理,特别针对国内养老机构普遍存在的"纸质记录混乱""跨部门协作低效""紧急响应迟缓"三大痛点设计了专业解决方案。
系统采用前后端分离架构,后端基于SpringBoot 2.7提供RESTful API,前端使用Vue 3组合式API开发管理后台,MyBatis-Plus作为ORM框架大幅提升开发效率,MySQL 8.0提供事务支持。实测在200床位规模的养老院场景下,系统可稳定支撑50+并发操作,关键业务响应时间控制在300ms以内。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构深度拆解
2.1 后端SpringBoot核心模块设计
采用经典三层架构但做了领域驱动设计优化:
- 控制器层:采用
@RestControllerAdvice统一异常处理,特别针对老年人生日查询、用药记录等高频接口做了缓存设计 - 服务层:使用Spring事务管理,关键业务如费用结算添加
@Transactional(rollbackFor=Exception.class)注解 - 持久层:MyBatis-Plus 3.5.2 + 自定义SQL注入器,实现软删除自动填充
java复制// 典型健康记录更新服务
@Slf4j
@Service
@RequiredArgsConstructor
public class HealthRecordServiceImpl implements HealthRecordService {
private final HealthRecordMapper recordMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean updateCriticalInfo(HealthRecordUpdateDTO dto) {
HealthRecord record = recordMapper.selectById(dto.getId());
if (record.getIsLocked()) {
throw new BusinessException("该记录已被医生锁定");
}
record.setBloodPressure(dto.getBloodPressure());
record.setRemark(dto.getRemark());
return recordMapper.updateById(record) > 0;
}
}
2.2 Vue前端工程化实践
前端采用Vue 3 + Vite 4构建,具有以下技术亮点:
- 基于
<script setup>语法糖的组件封装 - 使用Pinia进行状态管理,特别设计老人信息全局缓存
- 动态路由表实现权限精确控制
- 自研表单验证插件解决医疗数据合规校验
javascript复制// 老人信息表格组件关键逻辑
const tableData = ref([])
const loading = ref(false)
const fetchData = async (params) => {
loading.value = true
try {
const { data } = await api.getElderlyList(params)
tableData.value = data.map(item => ({
...item,
age: calculateAge(item.birthDate)
}))
} finally {
loading.value = false
}
}
2.3 MyBatis高级应用技巧
在持久层实现上,我们突破了基础CRUD:
- 自定义
LogicSqlInjector实现全局逻辑删除 - 使用
@Interceptor注解实现敏感数据自动加密 - 动态SQL处理复杂查询场景:
xml复制<select id="selectMedicalRecords" resultType="MedicalRecordVO">
SELECT * FROM medical_record
<where>
<if test="elderlyId != null">
AND elderly_id = #{elderlyId}
</if>
<if test="startDate != null and endDate != null">
AND record_date BETWEEN #{startDate} AND #{endDate}
</if>
<if test="criticalOnly">
AND is_critical = 1
</if>
</where>
ORDER BY record_date DESC
</select>
3. 数据库设计与优化
3.1 MySQL核心表结构
主要业务表采用InnoDB引擎并设置utf8mb4字符集:
sql复制CREATE TABLE `elderly_info` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(20) NOT NULL COMMENT '姓名',
`gender` tinyint NOT NULL COMMENT '性别',
`birth_date` date NOT NULL COMMENT '出生日期',
`id_card` varchar(18) NOT NULL COMMENT '身份证号',
`contact_phone` varchar(20) NOT NULL COMMENT '联系电话',
`emergency_contact` varchar(20) NOT NULL COMMENT '紧急联系人',
`emergency_phone` varchar(20) NOT NULL COMMENT '紧急电话',
`room_number` varchar(10) NOT NULL COMMENT '房间号',
`check_in_date` date NOT NULL COMMENT '入住日期',
`health_status` varchar(50) DEFAULT NULL COMMENT '健康状况',
`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_id_card` (`id_card`),
KEY `idx_room` (`room_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='老人基本信息表';
3.2 性能优化实践
- 索引策略:
- 高频查询字段建立组合索引(如
(room_number, health_status)) - 使用覆盖索引优化统计查询
- 高频查询字段建立组合索引(如
- 查询优化:
- 大文本字段(如病历备注)单独分表
- 使用EXPLAIN分析慢查询
- 连接池配置:
yaml复制spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000
4. 典型业务场景实现
4.1 健康监测预警流程
mermaid复制graph TD
A[智能设备数据采集] --> B{数据异常?}
B -->|是| C[触发预警规则]
C --> D[通知责任护工]
D --> E[生成处理记录]
B -->|否| F[存入健康档案]
4.2 费用结算核心逻辑
采用策略模式处理不同类型的费用计算:
java复制public interface FeeCalculationStrategy {
BigDecimal calculate(Elderly elderly, LocalDate startDate, LocalDate endDate);
}
@Service
@RequiredArgsConstructor
public class FeeService {
private final Map<String, FeeCalculationStrategy> strategies;
public BigDecimal calculateTotalFee(String elderlyId, LocalDate start, LocalDate end) {
Elderly elderly = getElderly(elderlyId);
return strategies.values().stream()
.map(strategy -> strategy.calculate(elderly, start, end))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
5. 部署与运维实战
5.1 生产环境部署方案
推荐使用Docker Compose编排:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
5.2 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 健康数据同步延迟 | MQ消费堆积 | 增加消费者数量或调整批处理大小 |
| 费用计算差异 | 时区配置错误 | 统一设置时区为Asia/Shanghai |
| 导出Excel内存溢出 | 未分页查询 | 使用POI的SXSSFWorkbook模式 |
6. 二次开发建议
- 扩展接口:
- 对接智能手环等IoT设备
- 增加微信小程序家属端
- 性能提升:
- 引入Redis缓存热点数据
- 使用Elasticsearch实现全文检索
- 安全加固:
- 增加操作日志审计
- 实现敏感数据脱敏
这套系统在实际部署中经历过三次重大迭代,我的体会是:养老机构管理系统必须平衡技术先进性与操作简便性,特别是要考虑护工人员的电脑操作水平。我们在Vue前端特别设计了"特大字体模式"和"一键快捷入口",后端接口也保持高度兼容性以支持老旧设备接入。
