🎓 一、 选题背景:为什么选这个题?
兄弟们,如果说“商城”是红海,“图书管理”是死海,那**“智慧养老”**就是绝对的蓝海!
- 立意满分(Buff叠满):紧扣“人口老龄化”、“社区治理”、“网格化管理”等国家热点。导师听了都得点头说你有社会担当。
- 视觉冲击:别的系统是静态的,你这个是动态的!当“呼救”触发时,管理员屏幕直接弹窗报警+播放警报声,全场最靓的仔。
- 技术唬人:虽然核心只是一个简单的 WebSocket 推送,但你可以吹成**“物联网(IoT)”、“实时流处理”、“云边端协同”**。
🏗️ 二、 系统架构设计
为了体现“网格化”和“实时性”,我们将架构描述为**“云-管-端”**三层架构(其实就是 BS 架构)。
1. 技术栈选型
- 后端:Spring Boot 2.7+、WebSocket (核心)、MyBatis Plus
- 前端:Vue 3、Element Plus、ECharts (网格地图可视化)
- 中间件:Redis (缓存网格员在线状态)
- 数据库:MySQL 8.0
2. 系统逻辑架构图 (Mermaid)
这张图展示了报警信号是如何从“老人端”秒级传输到“网格员端”的。
🛠️ 三、 项目亮点包装(Project Highlights)
这部分专门用来应对“你的项目有什么创新点?”
1. 基于 WebSocket 的“毫秒级”生命救援通道
包装话术:区别于传统系统的轮询机制(前端每隔几秒问一次服务器),本系统采用WebSocket 全双工通信协议。当老人触发 SOS 时,服务器能主动向网格员的监控大屏推送报警信号,延迟控制在50ms 以内,为抢救生命争取黄金时间。
2. 动态“网格化”RBAC 权限模型
包装话术:系统设计了精细的数据隔离机制。将社区划分为若干“网格”,每个网格员只能查看和接收自己辖区内老人的报警信息。通过数据库层面的
grid_id字段过滤,实现了**“定人、定岗、定责”**的精细化治理。
3. 模拟 IoT 设备的“数字孪生”接入
包装话术:虽然演示时使用的是 Web 按钮模拟呼救,但后端预留了标准的MQTT 接口。这意味着系统可以无缝对接真实的智能手环、烟感报警器或跌倒检测雷达,具备极强的硬件扩展性。
💻 四、 核心功能实现(保姆级代码)
核心只有两个:数据库怎么存老人信息,WebSocket 怎么推报警。
1. 核心表结构设计
老人健康档案表 (sys_elderly)
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id | BIGINT | 主键 | - |
name | VARCHAR | 姓名 | - |
grid_id | BIGINT | 所属网格ID | 数据隔离核心 |
health_level | TINYINT | 健康等级 | 1:健康, 2:高血压, 3:重症 |
emergency_contact | VARCHAR | 紧急联系人 | 电话号码 |
device_id | VARCHAR | 绑定的设备ID | 模拟手环MAC地址 |
报警记录表 (sys_alarm_log)
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id | BIGINT | 主键 | - |
elderly_id | BIGINT | 老人ID | 谁报的警 |
alarm_type | VARCHAR | 类型 | 手动SOS/心率异常/跌倒 |
status | TINYINT | 状态 | 0:未处理, 1:处理中, 2:已完成 |
handle_time | DATETIME | 处理时间 | - |
2. 难点代码:WebSocket 消息推送 (WebSocketServer.java)
这是整个项目的灵魂。直接复制这个类,Spring Boot 就能支持 WebSocket。
packagecom.bishe.community.websocket;importorg.springframework.stereotype.Component;importjavax.websocket.*;importjavax.websocket.server.ServerEndpoint;importjava.io.IOException;importjava.util.concurrent.CopyOnWriteArraySet;/** * WebSocket 服务端,监听前端连接 * 访问地址: ws://localhost:8080/ws/alarm */@ServerEndpoint("/ws/alarm")@ComponentpublicclassWebSocketServer{// 存放每个客户端对应的 WebSocketServer 对象 (线程安全 Set)privatestaticCopyOnWriteArraySet<WebSocketServer>webSocketSet=newCopyOnWriteArraySet<>();// 与某个客户端的连接会话,需要通过它来给客户端发送数据privateSessionsession;/** * 连接建立成功调用的方法 */@OnOpenpublicvoidonOpen(Sessionsession){this.session=session;webSocketSet.add(this);// 加入 set 中System.out.println("监控大屏已连接,当前在线网格员人数: "+webSocketSet.size());}/** * 连接关闭调用的方法 */@OnClosepublicvoidonClose(){webSocketSet.remove(this);// 从 set 中删除}/** * 核心方法:群发自定义消息(报警弹窗) */publicstaticvoidsendAlarmMessage(Stringmessage){for(WebSocketServeritem:webSocketSet){try{// 这里的 synchronized 防止并发发送报错synchronized(item.session){item.session.getBasicRemote().sendText(message);}}catch(IOExceptione){e.printStackTrace();}}}}3. 模拟触发报警接口 (AlarmController.java)
前端做一个红色的“SOS”大按钮,点击就调这个接口。
@RestController@RequestMapping("/api/alarm")publicclassAlarmController{@AutowiredprivateElderlyMapperelderlyMapper;/** * 模拟老人按下 SOS 键 */@PostMapping("/trigger")publicAjaxResulttriggerSOS(@RequestBodyAlarmDtoalarmDto){// 1. 查出是哪个老人Elderlyelderly=elderlyMapper.selectById(alarmDto.getElderlyId());// 2. 存入数据库 (状态设为未处理)AlarmLoglog=newAlarmLog();log.setElderlyId(elderly.getId());log.setAlarmType("紧急呼救SOS");log.setStatus(0);log.setCreateTime(newDate());alarmLogMapper.insert(log);// 3. 【核心】通过 WebSocket 推送给所有在线网格员// 构造 JSON 消息JSONObjectmsg=newJSONObject();msg.put("type","SOS_ALERT");msg.put("content","网格["+elderly.getGridId()+"] 老人 "+elderly.getName()+" 发起呼救!");msg.put("phone",elderly.getEmergencyContact());WebSocketServer.sendAlarmMessage(msg.toJSONString());returnAjaxResult.success("报警已发送,救援即将到达!");}}📸 五、 运行效果展示 (答辩 PPT 必杀技)
这部分是分数的倍增器,描述一定要有画面感:
- 监控大屏(平时状态):展示社区地图(一张 ECharts 地图),上面有很多小绿点,代表老人状态正常。
- 报警状态(高潮):
- 视觉:前端收到 WebSocket 消息,屏幕中央弹出一个红色的、闪烁的巨大弹窗:“警告!3号网格李大爷跌倒!”
- 听觉:前端 JS 调用
<audio>标签,自动播放“警报音效”(可以找个消防车的声音)。 - 交互:网格员点击“立即出警”,弹窗消失,状态变为“处理中”。
🗣️ 六、 答辩防御术(高情商回答)
Q1: 你的硬件设备(手环)在哪里?我怎么没看到?
A (机智版):“老师,由于毕设经费和演示场地的限制,我没有采购真实的智能手环。但我开发的系统是基于标准 IoT 架构的。您看到的那个网页上的‘SOS按钮’,在逻辑上完全等同于手环发出的 MQTT 信号。后端接口是通用的,只要把手环接入网络,调用这个 API,效果是一模一样的。”
Q2: 如果几千个老人同时报警,你的 WebSocket 撑得住吗?
A (专业版):"针对高并发场景,我的设计方案是**‘消息队列削峰 + Netty 高性能网关’**。
- 首先,报警信号不会直接进数据库,而是先发给RabbitMQ,保证数据不丢。
- 其次,Spring Boot 自带的 WebSocket 适合中小规模,如果扩展到几万连接,我会将通信层替换为Netty框架,利用其 NIO 异步非阻塞特性来维持海量长连接。"
(解析:承认现在的不足,但给出大厂级别的优化方案,老师会觉得你懂架构。)
总结:
这个项目就是典型的**“小功能,大包装”。代码写起来比 CRUD 商城还简单(因为业务逻辑少),但只要你把 WebSocket 弹窗 做得足够酷炫,声音够响,答辩现场绝对是全场最佳**。