1. 项目背景与核心价值
居家养老服务系统是当前智慧养老领域的热门方向,随着人口老龄化加剧,传统养老机构已无法满足多样化需求。这个SpringBoot项目正是针对独居老人、空巢家庭的实际痛点,通过技术手段实现远程监护、服务对接和紧急响应。
我在实际开发中发现,这类系统要解决三个核心问题:一是如何实时采集老人健康数据,二是怎样建立高效的服务响应机制,三是确保系统在低网络环境下的可用性。本项目的创新点在于将智能硬件数据对接、服务派单算法和分级预警机制进行了有机整合。
2. 系统架构设计
2.1 技术选型解析
采用SpringBoot 2.7 + MyBatis-Plus + Redis的组合,主要基于以下考量:
- SpringBoot的自动配置特性适合快速迭代,特别适合学生开发周期短的毕业设计
- MyBatis-Plus的AR模式简化了DAO层开发,内置的分页插件完美适配养老服务的分页查询
- Redis不仅用作缓存,更关键的是存储紧急告警事件,采用SortedSet结构实现告警优先级队列
数据库选用MySQL 8.0,考虑到:
- JSON字段类型可以灵活存储智能设备上报的非结构化数据
- 窗口函数便于生成服务人员的绩效统计报表
2.2 微服务划分策略
虽然是小规模系统,但依然采用模块化设计:
code复制com.eldercare
├── admin # 管理后台
├── api # 移动端接口
├── alert # 告警处理中心
├── device # 智能设备对接
└── scheduler # 服务调度引擎
这种结构方便后续扩展为真正的微服务架构。我在开发时特别注意了模块间的通信:
- 同步调用使用FeignClient封装
- 异步事件通过Spring Event机制处理
- 跨模块事务用Seata的AT模式解决
3. 核心功能实现
3.1 健康数据采集模块
对接了主流智能手环(华为/小米)的开放API,关键实现点:
java复制// 数据解析示例
public HealthData parseDeviceData(String raw) {
// 使用GSON处理厂商特定格式
JsonObject json = JsonParser.parseString(raw).getAsJsonObject();
return HealthData.builder()
.heartRate(json.get("hr").getAsInt())
.bloodOxygen(json.get("spo2").getAsBigDecimal())
.timestamp(new Date(json.get("ts").getAsLong()))
.build();
}
注意:不同厂商的API返回字段差异很大,建议定义适配器接口统一处理
3.2 智能预警算法
采用三级预警机制:
- 初级预警(心率<50):APP推送通知
- 中级预警(血氧<90%):自动联系紧急联系人
- 高级预警(跌倒检测):启动视频通话确认
核心判断逻辑:
sql复制-- 使用存储过程实现复合条件判断
CREATE PROCEDURE check_emergency(IN userId BIGINT)
BEGIN
DECLARE hr INT;
SELECT heart_rate INTO hr FROM health_data
WHERE user_id = userId ORDER BY create_time DESC LIMIT 1;
IF hr < 50 THEN
INSERT INTO alert_queue VALUES (userId, 'LOW_HR', NOW());
END IF;
-- 更多判断条件...
END
4. 服务调度系统
4.1 服务人员匹配算法
基于距离、技能、负荷三个维度计算权重:
java复制public List<Worker> matchWorkers(ServiceRequest request) {
return workerMapper.selectList(new QueryWrapper<Worker>()
.eq("skill_type", request.getServiceType())
.apply("ST_Distance(location, ST_GeomFromText({0})) < 5000",
request.getLocation().toText())
.orderByAsc("current_load")
.last("LIMIT 5"));
}
4.2 订单状态机设计
使用枚举实现状态流转:
java复制public enum OrderStatus {
PENDING {
public boolean canTransferTo(OrderStatus target) {
return target == ACCEPTED || target == REJECTED;
}
},
ACCEPTED {
public boolean canTransferTo(OrderStatus target) {
return target == PROCESSING;
}
},
// 其他状态...
}
5. 关键问题解决方案
5.1 高并发预警处理
采用Redis + 本地缓存的二级缓冲方案:
- 设备数据先写入Redis Stream
- 后台Worker批量消费处理
- 计算结果缓存到Caffeine
配置示例:
properties复制# application.yml
spring:
redis:
stream:
elder-alert: alert_stream
caffeine:
spec: maximumSize=1000,expireAfterWrite=5m
5.2 多终端同步问题
使用WebSocket实现实时状态同步:
java复制@ServerEndpoint("/alert/{userId}")
public class AlertEndpoint {
@OnOpen
public void onOpen(Session session, @PathParam("userId") Long userId) {
sessionMap.put(userId, session);
}
@OnMessage
public void onAlert(String message) {
// 处理移动端确认消息
}
}
6. 部署与监控方案
6.1 容器化部署
Docker Compose编排方案:
yaml复制version: '3'
services:
app:
image: elder-care:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6-alpine
ports:
- "6379:6379"
6.2 监控配置
SpringBoot Admin集成关键指标:
- 接口响应时间百分位
- JVM内存使用情况
- 数据库连接池状态
7. 开发经验总结
-
时间规划建议:
- 第1周:完成需求分析和原型设计
- 第2-3周:搭建基础框架和核心模块
- 第4周:对接硬件API和测试预警逻辑
- 第5周:完善管理后台和报表功能
-
性能优化技巧:
- 使用@Cacheable注解缓存常用查询
- 批量插入数据时关闭MyBatis日志
- 复杂统计改用原生SQL查询
-
毕设答辩重点:
- 突出三级预警机制的设计思路
- 演示服务派单的实时性
- 准备设备对接的技术细节问答
这个项目我在测试阶段发现最易出问题的环节是设备数据解析,建议开发者:
- 编写完善的Mock测试用例
- 对异常数据做好防御性编程
- 记录详细的接口调用日志
源码中特别值得参考的部分是alert模块的事件驱动设计,通过Spring的ApplicationEvent机制实现了业务解耦。在实际部署时,记得调整Redis的持久化策略为AOF模式,防止预警事件丢失。