1. 项目背景与核心价值
最近在做一个养老机构信息化管理的项目,发现市面上很多传统养老管理系统还是采用老旧的单体架构,前后端耦合严重,维护起来特别头疼。正好借着这个机会,我用SpringBoot+Vue这套主流技术栈开发了一套前后端分离的大健康养老公寓管理系统,今天就把完整实现过程和踩坑经验分享给大家。
这个系统主要解决养老机构日常运营中的几个痛点:一是传统Excel手工登记容易出错且难以追溯;二是医护人员和家属之间信息不对称;三是健康数据监测和分析缺乏数字化手段。系统实现了老人档案管理、健康监测、护理计划、家属端小程序等核心功能模块,采用前后端分离架构后,前端迭代速度提升了60%,后端接口响应时间控制在200ms以内。
2. 技术选型与架构设计
2.1 技术栈组合解析
后端选择SpringBoot 2.7 + MyBatis-Plus的组合主要基于:
- SpringBoot的自动配置特性快速搭建微服务(实测从零到产出第一个接口仅需2小时)
- MyBatis-Plus的代码生成器可快速产出老人档案、健康记录等模块的CRUD接口
- 搭配Hutool工具包处理日期、加密等常见工具类需求
前端选用Vue3 + Element Plus的考虑:
- 养老机构管理员年龄偏大,需要极简的操作界面(Element Plus的表单组件可配置性最强)
- 需要同时开发Web管理端和微信小程序(Vue3的Composition API代码复用率更高)
- 使用Pinia状态管理解决多组件间健康数据共享问题
2.2 系统架构图
code复制[前端层]
├── Web管理端(Vue3)
└── 微信小程序(Uniapp)
[网关层]
├── Nginx反向代理
└── JWT鉴权过滤
[业务层]
├── 老人服务(档案管理)
├── 健康服务(监测数据)
├── 护理服务(计划排班)
└── 家属服务(消息通知)
[数据层]
├── MySQL 8.0(业务数据)
└── Redis(缓存健康预警数据)
关键设计原则:前端轻量化、接口标准化、数据可视化。所有健康监测数据接口都遵循RESTful规范,返回字段包含code/message/data三层结构。
3. 核心功能实现细节
3.1 老人健康监测模块
数据库表设计特别注意了医疗数据的特殊性:
sql复制CREATE TABLE `health_record` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`elder_id` BIGINT NOT NULL COMMENT '关联老人ID',
`blood_pressure` VARCHAR(20) COMMENT '格式:高压/低压',
`blood_sugar` DECIMAL(5,2) COMMENT '空腹血糖值',
`temperature` DECIMAL(3,1) COMMENT '体温',
`spo2` TINYINT COMMENT '血氧饱和度',
`measure_time` DATETIME NOT NULL COMMENT '测量时间',
`nurse_id` BIGINT COMMENT '操作护工ID',
PRIMARY KEY (`id`),
INDEX `idx_elder` (`elder_id`),
INDEX `idx_time` (`measure_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
后端接口开发时的几个技术要点:
- 使用MyBatis-Plus的TypeHandler处理血压的特殊格式
- 血糖值超过11.1mmol/L自动触发预警(Redis发布订阅模式)
- 采用Spring Schedule定时生成每日健康报告PDF
3.2 护理计划排班算法
排班逻辑主要考虑:
- 护工技能等级匹配(初级/中级/高级)
- 老人护理等级(1-5级)
- 工作时长均衡性(每人每天不超过10小时)
核心算法片段:
java复制public List<Schedule> generateSchedule(LocalDate startDate, int days) {
// 1. 获取所有有效护工
List<Nurse> nurses = nurseMapper.selectAvailableNurses();
// 2. 获取需要护理的老人列表
List<Elder> elders = elderMapper.selectNeedCareElders();
// 3. 基于匈牙利算法进行最优匹配
int[][] costMatrix = buildCostMatrix(nurses, elders);
HungarianAlgorithm algorithm = new HungarianAlgorithm(costMatrix);
int[] assignment = algorithm.execute();
// 4. 生成最终排班计划
return buildSchedules(assignment, startDate, days);
}
4. 部署与运维实战
4.1 生产环境部署方案
推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:6-alpine
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
4.2 性能优化要点
- 接口响应优化:
- 启用MyBatis-Plus二级缓存(配置CacheNamespace注解)
- 高频查询接口添加@Cacheable注解
- 使用HikariCP连接池(配置maxPoolSize=50)
- 前端加载优化:
- 路由懒加载
- Gzip压缩(nginx配置)
- 健康数据图表按需渲染
5. 典型问题排查实录
5.1 微信小程序登录失败
症状:家属端小程序提示"登录超时"
排查过程:
- 检查后端日志发现JWT过期时间设置为2小时
- 小程序端未正确处理token刷新
- 发现iOS系统时间不同步导致校验失败
解决方案:
javascript复制// 小程序端增加时间校准
wx.getNetworkType({
success: () => {
wx.getSystemInfo({
success: (res) => {
if (res.system.indexOf('iOS') !== -1) {
this.syncTimeWithServer()
}
}
})
}
})
5.2 健康数据同步延迟
症状:智能设备上传的数据有时显示延迟
根本原因:
- 批量插入数据时未使用事务
- MySQL连接池配置不足
优化后的批量插入方法:
java复制@Transactional
public void batchInsertHealthData(List<HealthRecord> records) {
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
try {
HealthRecordMapper mapper = session.getMapper(HealthRecordMapper.class);
records.forEach(mapper::insert);
session.commit();
} finally {
session.close();
}
}
6. 扩展开发建议
- 智能预警升级:
- 接入ML模型分析健康趋势
- 跌倒检测算法集成(需对接智能手环)
- 多端适配方案:
- 管理端增加大字体模式
- 开发TV版家属查看界面
- 数据可视化增强:
- 使用ECharts实现健康数据热力图
- 护理质量评估雷达图
这个项目最让我意外的是养老机构对技术接受度很高,有位60岁的管理员阿姨甚至学会了用开发者工具排查问题。建议开发时多考虑中老年用户的操作习惯,比如所有按钮都要有明显边框、重要操作需要二次确认弹窗。