1. 项目背景与核心需求
在老龄化社会背景下,老年人就医陪护已成为亟待解决的社会问题。根据卫健委数据显示,我国60岁以上老年人口已达2.8亿,其中超过40%的老年人存在就医陪伴需求。传统陪护服务存在信息不对称、响应速度慢、服务质量参差不齐等问题。这个基于SpringBoot的老年陪诊系统,正是为解决这些痛点而生。
系统设计遵循三个核心原则:
- 易用性优先:针对老年用户操作习惯,简化交互流程
- 服务闭环:从预约到评价形成完整服务链路
- 多角色协同:连接老人、家属、陪护人员三方需求
实际开发中发现,老年用户最关注的是操作简单性和服务可靠性,而非功能复杂度。因此我们在设计时做了大量减法,核心功能集中在前3屏可完成。
2. 技术架构设计
2.1 整体技术栈选型
graph TD A[微信小程序] --> B[SpringBoot后端] B --> C[MySQL数据库] B --> D[Redis缓存] A --> E[腾讯云IM]技术选型考量因素:
- 微信小程序:覆盖率高(老年用户微信使用率超70%),无需安装
- SpringBoot:快速迭代(本项目从0到1仅用6周),社区支持完善
- MySQL:事务支持完善,适合订单类业务
- Redis:应对预约高峰期的并发请求
2.2 核心架构设计
系统采用经典三层架构,但针对老年服务特性做了优化:
表现层:
- 小程序端:使用WXML+WXSS,字体放大至18px
- 管理后台:Vue+ElementUI,支持大图标模式
业务层:
- 订单服务:处理预约/取消/改期等核心逻辑
- 评价服务:采用异步消峰设计
- 即时通讯:集成腾讯云IM(日均消息量约2000条)
数据层:
- 主库:AWS RDS MySQL 5.7
- 缓存:Redis集群(3节点)
- 备份:每日全量备份+binlog
3. 核心功能实现
3.1 预约流程设计
// 预约核心逻辑代码片段 public AppointmentResult createAppointment(AppointmentDTO dto) { // 1. 参数校验 validateParams(dto); // 2. 服务人员匹配(半径3km内,评分4星以上) List<Staff> matchedStaff = staffService.matchStaff( dto.getLocation(), dto.getServiceType(), LocalDateTime.now() ); // 3. 创建订单 Order order = orderService.createOrder(dto, matchedStaff); // 4. 消息通知 notifyService.sendAppointmentNotice(order); return buildResult(order); }关键设计点:
- 智能匹配算法:基于LBS+服务评价+实时位置
- 防超卖设计:Redis分布式锁+数据库乐观锁
- 状态机设计:明确各状态转换条件(如图)
3.2 即时通讯实现
采用腾讯云IM方案,关键配置:
# application-im.properties tencent.im.appid=123456 tencent.im.key=your_key tencent.im.expire=86400消息类型处理:
- 文本消息:敏感词过滤(内置医疗相关词库)
- 图片消息:压缩至100KB以下
- 位置消息:加密存储
4. 数据库设计优化
4.1 核心表结构
CREATE TABLE `appointment_order` ( `id` bigint NOT NULL AUTO_INCREMENT, `order_no` varchar(32) NOT NULL COMMENT '订单编号', `elderly_id` bigint NOT NULL, `staff_id` bigint NOT NULL, `service_type` tinyint NOT NULL COMMENT '1-陪诊 2-居家陪护', `status` tinyint NOT NULL DEFAULT '0' COMMENT '0-待确认 1-已预约 2-服务中 3-已完成 4-已取消', `start_time` datetime NOT NULL, `end_time` datetime NOT NULL, `actual_start_time` datetime DEFAULT NULL, `location` point NOT NULL COMMENT 'GIS位置', `address` varchar(255) NOT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_order_no` (`order_no`), KEY `idx_elderly` (`elderly_id`), KEY `idx_staff` (`staff_id`), SPATIAL KEY `idx_location` (`location`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4.2 性能优化措施
查询优化:
- 热点数据缓存:使用Redis缓存常用老人信息(TTL 30分钟)
- 空间索引:针对LBS查询使用MySQL GIS功能
分表策略:
- 按城市分表(北/上/广等超大城市单独分表)
- 历史数据归档(3个月前的订单移入历史表)
5. 安全与合规设计
5.1 数据安全措施
敏感数据加密:
// 手机号加密存储 public String encryptPhone(String phone) { return AESUtil.encrypt(phone, SECRET_KEY); }权限控制:
- RBAC模型设计
- 接口级权限注解
@PreAuthorize("hasRole('STAFF') or #elderlyId == principal.id") public AppointmentDetail getDetail(Long elderlyId) { //... }
5.2 合规要点
- 隐私政策:明确告知数据使用范围
- 监护人确认:关键操作需家属二次验证
- 数据留存:聊天记录保存30天
6. 部署与监控
6.1 生产环境部署
# docker-compose-prod.yml version: '3' services: app: image: registry.cn-hangzhou.aliyuncs.com/elder-care/app:1.0 ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod depends_on: - redis - mysql redis: image: redis:6-alpine volumes: - redis-data:/data mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - mysql-data:/var/lib/mysql volumes: redis-data: mysql-data:6.2 监控方案
- 基础监控:Prometheus+Grafana
- 业务监控:
- 预约成功率(SLA≥99.5%)
- 平均响应时间(API<500ms)
- 告警规则:
- 连续5分钟错误率>1%
- 订单积压>100
7. 典型问题排查实录
7.1 定位信息丢失问题
现象:部分老人位置信息保存失败
排查过程:
- 检查日志发现GIS字段插入异常
- 定位到Hibernate空间类型处理问题
- 解决方案:
// 修改实体类注解 @Column(columnDefinition = "POINT") @Type(type = "org.hibernate.spatial.GeometryType") private Point location;7.2 高并发场景优化
压测数据:
- 100并发下,创建订单接口RT从1200ms降至300ms
- 优化措施:
- 引入二级缓存(Caffeine+Redis)
- 异步写日志
- 数据库连接池调优
8. 项目演进方向
- 智能调度:引入强化学习优化服务人员匹配
- 健康监测:对接智能穿戴设备数据
- 语音交互:增加语音控制功能
在实际运营中发现,约35%的老年用户会在首次使用后7天内产生复购,因此我们正在设计会员体系来提高用户粘性。