1. 项目背景与核心价值
大健康养老公寓管理系统是当前智慧养老领域的热门解决方案,我们团队基于SpringBoot+Vue+MyBatis技术栈实现了一套完整的前后端分离系统。这套系统最初是为某连锁养老机构开发的,经过三个版本的迭代,目前已经稳定运行在12家养老机构中,管理着超过2000个床位。
选择前后端分离架构主要基于三点考虑:首先,养老机构的IT人员配置有限,分离架构可以让前端和后端开发人员各司其职;其次,系统需要适配多种终端(PC、平板、移动设备),Vue的响应式特性完美解决了这个问题;最后,SpringBoot的快速开发特性让我们能在3个月内完成从需求分析到上线的全过程。
提示:养老管理系统与传统ERP的最大区别在于对IoT设备的集成需求,我们在架构设计时特别考虑了设备接入层,这是很多开源项目容易忽略的点
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈选型解析
2.1 SpringBoot后端设计
采用SpringBoot 2.7.3版本(LTS版本),主要模块包括:
- 核心模块:处理业务逻辑(床位管理、老人档案、护理计划等)
- 设备接入模块:通过MQTT协议对接智能床垫、定位手环等IoT设备
- 报表模块:使用POI-TL实现自定义报表导出
数据库设计上,我们做了几个关键决策:
- 老人健康数据使用MySQL单独分表,避免主表过大
- 护理记录采用时序数据模式,方便后期做数据分析
- 所有表都添加了created_by和updated_at字段,满足审计要求
java复制// 典型Controller示例
@RestController
@RequestMapping("/api/bed")
public class BedController {
@Autowired
private BedService bedService;
@GetMapping("/available")
public Result<List<Bed>> getAvailableBeds(
@RequestParam(required = false) String areaCode,
@RequestParam(required = false) BedType type) {
return Result.success(bedService.findAvailableBeds(areaCode, type));
}
}
2.2 Vue前端架构
前端采用Vue 3 + Element Plus的组合,有几点特别设计:
- 动态路由:根据用户角色加载不同菜单
- 全局状态管理:使用Pinia代替Vuex,模块化设计特别适合养老业务的多维度状态
- 自定义指令:实现了v-permission用于按钮级权限控制
我们遇到的典型挑战是护理排班表的可视化展示,最终采用了FullCalendar组件并做了深度定制:
javascript复制// 排班表组件关键配置
const calendarOptions = {
initialView: 'timeGridWeek',
slotMinTime: '06:00:00',
slotMaxTime: '22:00:00',
eventContent: (arg) => {
return createCustomEventContent(arg.event.extendedProps);
}
}
3. 关键业务模块实现
3.1 老人健康档案管理
这是系统的核心模块,包含几个技术要点:
- 健康数据趋势图:使用ECharts实现血压、血糖等指标的动态展示
- 异常预警:基于规则引擎(Drools)设置阈值告警
- 数据采集:支持手动录入和IoT设备自动同步两种方式
数据库表设计示例:
sql复制CREATE TABLE `health_record` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`elder_id` BIGINT NOT NULL,
`metric_type` VARCHAR(20) NOT NULL COMMENT 'BP/GLUCOSE/OXYGEN等',
`metric_value` DECIMAL(10,2) NOT NULL,
`record_time` DATETIME NOT NULL,
`device_id` VARCHAR(50) COMMENT '如果是设备采集则记录设备ID',
PRIMARY KEY (`id`),
INDEX `idx_elder_time` (`elder_id`, `record_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 护理任务派发系统
采用状态机模式管理任务生命周期:
code复制待分配 -> 已分配 -> 进行中 -> 已完成/已取消
↑_____________|
后端使用Spring StateMachine实现,前端用颜色区分不同状态:
- 待分配:灰色
- 已分配:蓝色
- 进行中:橙色
- 已完成:绿色
- 已取消:红色
4. 系统部署实战
4.1 生产环境准备
推荐的最低服务器配置:
- 应用服务器:2核4G(SpringBoot) + 2核4G(Nginx)
- 数据库:4核8G(MySQL 8.0)
- 缓存:Redis 6.x(可选,用于会话管理)
我们实测过的部署方案对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 传统部署 | 简单直接 | 难扩展 | 小型养老院(<100床位) |
| Docker Compose | 隔离性好 | 需要Docker知识 | 中型机构 |
| Kubernetes | 弹性伸缩 | 维护复杂 | 连锁机构 |
4.2 宝塔面板部署指南
- 安装宝塔面板(建议使用CentOS 7.9)
- 通过面板安装:
- Nginx 1.20+
- MySQL 8.0
- Redis(可选)
- 前端部署:
bash复制# 在Vue项目目录 npm run build # 将dist目录上传到/www/wwwroot/frontend - 后端部署:
bash复制nohup java -jar nursing-home.jar --spring.profiles.active=prod > app.log 2>&1 &
4.3 常见部署问题排查
-
端口冲突问题:
- 检查8080(SpringBoot)和80(Nginx)端口是否被占用
- 使用
netstat -tunlp | grep 端口号排查
-
数据库连接失败:
- 确认MySQL用户有远程连接权限
- 检查application-prod.yml中的连接配置
-
前端路由404:
- 在Nginx配置中添加try_files规则:
nginx复制location / { try_files $uri $uri/ /index.html; }
5. 系统安全实践
5.1 接口安全防护
我们采用JWT+SA-Token的双重验证机制:
- 登录时颁发JWT token(有效期2小时)
- 每次请求携带token并在网关层验证
- 敏感操作需要二次验证(通过SA-Token的临时token)
安全配置示例:
java复制@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()));
}
}
5.2 数据安全措施
- 敏感字段加密:老人身份证号等使用AES加密存储
- 操作日志:记录所有关键数据变更
- 定期备份:使用mysqldump每天全量备份一次
- 漏洞扫描:使用OWASP ZAP进行月度安全扫描
6. 性能优化经验
6.1 数据库优化
我们通过几个步骤将查询性能提升了3倍:
- 添加合适的索引(特别是护理记录表的时间范围查询)
- 对大表进行水平分表(按养老院ID分表)
- 使用Spring Cache缓存常用数据
java复制// 缓存配置示例
@Cacheable(value = "elders", key = "#id")
public Elder getElderById(Long id) {
return elderMapper.selectById(id);
}
6.2 前端性能提升
- 组件异步加载:
javascript复制const CarePlan = () => import('./views/CarePlan.vue') - 接口合并:使用GraphQL替代部分REST接口
- 图片懒加载:特别是老人相册模块
7. 扩展与二次开发
系统设计了完善的扩展点:
- 设备接入插件机制:实现DeviceHandler接口即可接入新设备
- 报表模板系统:通过XML定义报表格式
- 工作流引擎:集成Flowable用于自定义审批流程
典型扩展案例 - 对接智能床垫:
java复制@Component
public class SmartMattressHandler implements DeviceHandler {
@Override
public boolean support(String deviceType) {
return "SMART_MATTRESS".equals(deviceType);
}
@Override
public void handleMessage(DeviceMessage message) {
// 解析床垫数据并存入数据库
}
}
在实际部署中,我们发现养老院的网络环境往往比较复杂,建议在部署前做好网络规划。我们团队积累了一套标准的《养老IT基础设施检查清单》,包含18个必检项目,比如每个楼层的WiFi信号强度测试、备用网络切换测试等。
