梦友 / 梦貘儿童睡眠监护灯后端服务。
这是我在 2025 年 3 月 - 4 月 完成的软硬件结合产品 Demo 后端,用于支持一款面向家长的儿童睡眠监护灯:设备采集睡眠环境与人体状态数据,后端负责数据接入、用户与设备管理、睡眠记录查询、异常事件模拟,以及结合儿童睡眠数据和医学资料的 AI 问答。
项目定位:课程产品 Demo / 后端原型,不是医疗诊断系统。
梦友是一款以中国神兽“梦貘”为概念的儿童床头灯产品。它在白天作为普通床头灯使用,夜间进入睡眠呵护模式,通过声光引导孩子入睡,并结合温湿度、噪声、红外、雷达、振动、触摸等传感器数据,辅助判断孩子的睡眠阶段和异常情况。
后端主要服务于 App 与硬件设备:
- 接收 ESP32 设备通过 MQTT 上报的传感器数据
- 为 App 提供用户认证、设备绑定、实时数据、睡眠记录等 RESTful API
- 支持睡眠模式演示模拟,包括浅睡、深睡、REM、异常警报等状态
- 提供儿童睡眠知识 AI 问答:结合用户睡眠数据、PubMed 检索结果与 DeepSeek 模型生成回答
| 分类 | 技术 |
|---|---|
| 后端框架 | Spring Boot 3.4.4 |
| 语言与构建 | Java 17, Maven |
| 数据访问 | Spring Data JPA, Hibernate |
| 数据库 | MySQL |
| 认证 | Spring Security, JWT, BCrypt |
| 设备通信 | Spring Integration MQTT, Eclipse Paho |
| AI 接入 | WebClient, SSE, SiliconFlow + DeepSeek |
| 外部知识 | MCP PubMed 服务 |
| API 文档 | springdoc-openapi / Swagger UI |
| 其他 | Lombok, Bean Validation, 全局异常处理 |
项目采用典型的 Spring Boot 分层架构:
App / Web Client
|
| REST API / SSE
v
Controller 层
| 处理请求、参数校验、统一响应
v
Service 层
| 核心业务逻辑:认证、模拟、AI 问答、设备数据处理
v
Repository 层
| Spring Data JPA 数据访问
v
MySQL
ESP32 Device
|
| MQTT: devices/{deviceUuid}/sensors
v
MqttConfig -> MqttService -> SensorDataRepository
主要包结构:
src/main/java/com/dreamyou
├── config # Security、MQTT、OpenAPI、WebClient、CORS 等配置
├── controller # REST API 与 SSE 接口
├── service # 业务接口
├── service/impl # 业务实现
├── repository # JPA Repository
├── entity # 用户、传感器、睡眠记录、AI 会话等实体
├── dto # 请求与响应 DTO
├── security # JWT 过滤器与用户认证适配
├── exception # 业务异常与全局异常处理
└── enums # 睡眠状态、事件类型、异常类型枚举
- 用户注册、登录、临时用户创建
- JWT 无状态认证
- 当前用户信息查询
- 儿童信息、设备绑定、睡眠呵护时间段等用户设置管理
- 订阅 MQTT 主题
devices/{deviceUuid}/sensors - 解析设备上报的温度、湿度、噪声等数据并持久化
- 提供指定设备的最新传感器数据查询接口
- 查询当前用户的历史睡眠记录
- 查询最近 N 天睡眠数据
- 查询指定日期的睡眠记录
- 查询睡眠过程中的状态变化和异常事件
- 开始 / 结束睡眠模式模拟
- 更新当前睡眠状态
- 触发轻度或重度睡眠异常警报
- 返回睡眠时长、阶段占比、异常摘要、环境数据等演示结果
- 创建和查询 AI 会话
- 分页获取历史消息
- 通过 SSE 流式返回 AI 回答进度与内容
- 问答流程会读取用户近 7 天睡眠记录,调用 PubMed MCP 服务检索资料,再调用 DeepSeek 模型生成回答
| 模块 | 方法与路径 | 说明 |
|---|---|---|
| 健康检查 | GET /api/test/health |
服务健康检查 |
| 认证 | POST /api/auth/register |
用户注册 |
| 认证 | POST /api/auth/login |
用户登录并返回 JWT |
| 认证 | POST /api/auth/registerTemporary |
创建演示用临时用户 |
| 用户 | GET /api/users/me |
获取当前用户信息 |
| 用户 | PUT /api/users/profile |
更新用户资料 |
| 用户 | PUT /api/users/settings |
更新设备绑定和睡眠模式设置 |
| 设备 | GET /api/device/latestSensorData/{deviceUuid} |
获取设备最新传感器数据 |
| 睡眠记录 | GET /api/sleep-records |
分页查询睡眠记录 |
| 睡眠记录 | GET /api/sleep-records/date/{date} |
查询指定日期记录 |
| 睡眠记录 | GET /api/sleep-records/recent?days=7 |
查询最近 N 天记录 |
| 睡眠事件 | GET /api/sleep-events/user/{userId} |
查询某天睡眠事件 |
| 睡眠事件 | GET /api/sleep-events/user/{userId}/type/{eventType} |
按事件类型查询 |
| 模拟 | POST /api/simulation/start/{userId} |
开始睡眠模拟 |
| 模拟 | POST /api/simulation/end/{userId} |
结束睡眠模拟并生成总结 |
| 模拟 | POST /api/simulation/updateState/{userId} |
更新模拟睡眠状态 |
| 模拟 | POST /api/simulation/triggerAlert/{userId}/{alertType} |
触发异常警报 |
| 模拟 | GET /api/simulation/status/{userId} |
获取当前模拟状态 |
| AI 会话 | POST /api/ai/conversations |
创建新会话 |
| AI 会话 | GET /api/ai/conversations |
查询当前用户会话列表 |
| AI 会话 | GET /api/ai/conversations/{conversationUuid}/messages |
分页查询会话消息 |
| AI 聊天 | GET /api/ai/chat/stream/{conversationUuid}?userInput=... |
SSE 流式 AI 问答 |
- JDK 17+
- MySQL 8+
- Maven Wrapper 已包含在项目中
- 可选:本地 MQTT Broker,例如 Mosquitto
- 可选:PubMed MCP 服务与 SiliconFlow API Key,用于 AI 问答链路
CREATE DATABASE IF NOT EXISTS mengmo_db
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;启动后,JPA 会根据实体配置更新本地数据库表结构。
项目默认读取环境变量,避免把密钥提交到仓库:
DB_URL=jdbc:mysql://localhost:3306/mengmo_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&createDatabaseIfNotExist=true
DB_USERNAME=root
DB_PASSWORD=your_mysql_password
JWT_SECRET=replace-with-your-own-secret
MQTT_BROKER_URL=tcp://localhost:1883
MCP_URL=http://localhost:8005
SILICONFLOW_API_KEY=your_siliconflow_api_key./mvnw spring-boot:runWindows:
.\mvnw.cmd spring-boot:run默认端口:8082
Swagger UI:
http://localhost:8082/swagger-ui/index.html
这是 2025 年 3 月 - 4 月完成的产品 Demo 后端,重点是验证“硬件采集 + App 展示 + 睡眠记录 + AI 科普问答”的完整链路。当前代码适合作为作品集项目展示,也可以作为后续继续完善真实设备接入、算法判断和移动端体验的基础。