|
|
@@ -0,0 +1,3081 @@
|
|
|
+# 研年艾灸椅APP需求文档(详细版)
|
|
|
+
|
|
|
+> 文档版本:v2.0
|
|
|
+> 整理日期:2026-05-25
|
|
|
+> 项目说明:后台和算法已完成,本文档用于指导APP前端开发
|
|
|
+> 技术栈:UniApp框架(非UniAppX),支持iOS/Android/HarmonyOS跨平台
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 目录
|
|
|
+
|
|
|
+- [1. 项目概述与架构](#1-项目概述与架构)
|
|
|
+- [2. 技术框架规范](#2-技术框架规范)
|
|
|
+- [3. 全局交互规范](#3-全局交互规范)
|
|
|
+- [4. 启动与引导模块](#4-启动与引导模块)
|
|
|
+- [5. 登录注册模块](#5-登录注册模块)
|
|
|
+- [6. 用户管理模块](#6-用户管理模块)
|
|
|
+- [7. 设备管理模块](#7-设备管理模块)
|
|
|
+- [8. 首页-设备控制模块](#8-首页-设备控制模块)
|
|
|
+- [9. 无艾灸模式(休闲模式)](#9-无艾灸模式休闲模式)
|
|
|
+- [10. 专业模式(一键艾灸)](#10-专业模式一键艾灸)
|
|
|
+- [11. 自定义模式](#11-自定义模式)
|
|
|
+- [12. 艾灸执行过程](#12-艾灸执行过程)
|
|
|
+- [13. 我的方案管理](#13-我的方案管理)
|
|
|
+- [14. 发现模块](#14-发现模块)
|
|
|
+- [15. 健康模块](#15-健康模块)
|
|
|
+- [16. 消息中心模块](#16-消息中心模块)
|
|
|
+- [17. 个人中心模块](#17-个人中心模块)
|
|
|
+- [18. 版本升级模块](#18-版本升级模块)
|
|
|
+- [19. 蓝牙通信规范](#19-蓝牙通信规范)
|
|
|
+- [20. 后台接口清单](#20-后台接口清单)
|
|
|
+- [21. 全局错误码与提示文案](#21-全局错误码与提示文案)
|
|
|
+- [22. 页面清单与路由表](#22-页面清单与路由表)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 项目概述与架构
|
|
|
+
|
|
|
+### 1.1 产品定义
|
|
|
+
|
|
|
+研年艾灸椅APP是一款配合智能艾灸椅硬件使用的移动控制应用。用户通过APP完成设备配对、艾灸方案选择/编辑、艾灸过程控制、设备状态监控等操作。APP通过蓝牙BLE与艾灸椅通信,通过HTTPS与后台服务交互。
|
|
|
+
|
|
|
+### 1.2 核心业务流程图
|
|
|
+
|
|
|
+```
|
|
|
++-------------------------------------------------------------+
|
|
|
+| 用户打开APP |
|
|
|
+| ↓ |
|
|
|
+| 首次使用? → 隐私政策 → 登录/注册 → 补充信息 → 首页 |
|
|
|
+| ↓ |
|
|
|
+| 已登录? → 检查蓝牙 → 连接设备 → 选择模式 → 开始艾灸 |
|
|
|
+| ↓ |
|
|
|
+| 艾灸中 ←→ 暂停/继续/结束 ←→ 查看记录 |
|
|
|
++-------------------------------------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+### 1.3 系统架构
|
|
|
+
|
|
|
+```
|
|
|
++------------------+ BLE蓝牙 +------------------+
|
|
|
+| | <--------------> | |
|
|
|
+| APP (UniApp) | | 艾灸椅设备 |
|
|
|
+| | | (主控端) |
|
|
|
++--------+---------+ +------------------+
|
|
|
+ | HTTPS RESTful
|
|
|
+ v
|
|
|
++------------------+ +------------------+
|
|
|
+| | <--------------> | 算法服务 |
|
|
|
+| 后台服务 | | (穴位计算) |
|
|
|
+| (业务API) | +------------------+
|
|
|
+| |
|
|
|
+| - 用户管理 |
|
|
|
+| - 方案管理 |
|
|
|
+| - 消息推送 |
|
|
|
+| - 版本管理 |
|
|
|
+| - 数据记录 |
|
|
|
+| - 推荐算法 |
|
|
|
++------------------+
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 技术框架规范
|
|
|
+
|
|
|
+### 2.1 框架选型
|
|
|
+
|
|
|
+| 项目 | 规范 |
|
|
|
+|------|------|
|
|
|
+| 开发框架 | UniApp(Vue3语法,非UniAppX) |
|
|
|
+| 支持平台 | iOS / Android / HarmonyOS |
|
|
|
+| 蓝牙通信 | uni-app蓝牙API(BLE低功耗蓝牙) |
|
|
|
+| 网络请求 | uni.request(HTTPS) |
|
|
|
+| 本地存储 | uni.setStorageSync / plus.sqlite |
|
|
|
+| 推送服务 | uni-push 或厂商推送通道 |
|
|
|
+| 页面路由 | uni.navigateTo / uni.redirectTo |
|
|
|
+
|
|
|
+### 2.2 蓝牙通信要求
|
|
|
+
|
|
|
+- 蓝牙版本:BLE 4.0及以上
|
|
|
+- 通信协议:GATT协议
|
|
|
+- 数据帧格式:包头(1B) + 命令字(1B) + 数据长度(2B) + 数据内容(NB) + 校验(1B)
|
|
|
+- 坐标精度:毫米单位传输
|
|
|
+- 连接距离:有效范围内自动重连
|
|
|
+
|
|
|
+### 2.3 网络要求
|
|
|
+
|
|
|
+- 协议:HTTPS
|
|
|
+- 数据格式:JSON
|
|
|
+- 认证方式:Header携带Token(长期有效)
|
|
|
+- 超时设置:10秒
|
|
|
+- 重试策略:失败时自动重试1次
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 全局交互规范
|
|
|
+
|
|
|
+### 3.1 页面加载规范
|
|
|
+
|
|
|
+| 场景 | 交互方式 |
|
|
|
+|------|---------|
|
|
|
+| 页面初始化 | 显示骨架屏,加载完成后展示内容 |
|
|
|
+| 数据加载中 | 显示loading动画,禁止重复提交 |
|
|
|
+| 数据为空 | 显示空状态插图+提示文字 |
|
|
|
+| 网络错误 | 显示错误状态,提供"重新加载"按钮 |
|
|
|
+| 请求失败 | Toast提示错误信息 |
|
|
|
+
|
|
|
+### 3.2 弹窗层级规范
|
|
|
+
|
|
|
+| 类型 | 使用场景 | 交互特性 |
|
|
|
+|------|---------|---------|
|
|
|
+| Toast | 轻提示(成功/失败/警告) | 2秒自动消失,不阻塞操作 |
|
|
|
+| 确认弹窗 | 需要用户确认的操作 | 阻断操作,必须选择 |
|
|
|
+| 底部弹窗 | 选项选择、信息展示 | 点击蒙层可关闭 |
|
|
|
+| 全屏弹窗 | 复杂表单填写 | 带返回/关闭按钮 |
|
|
|
+
|
|
|
+### 3.3 按钮状态规范
|
|
|
+
|
|
|
+| 状态 | 视觉表现 | 交互特性 |
|
|
|
+|------|---------|---------|
|
|
|
+| 正常 | 主色调填充 | 可点击 |
|
|
|
+| 禁用 | 灰色填充 | 不可点击,点击无响应 |
|
|
|
+| 加载中 | 显示loading图标 | 不可点击 |
|
|
|
+| 危险操作 | 红色填充 | 二次确认 |
|
|
|
+
|
|
|
+### 3.4 输入验证规范
|
|
|
+
|
|
|
+| 输入项 | 验证规则 | 错误提示 |
|
|
|
+|--------|---------|---------|
|
|
|
+| 手机号 | 1开头的11位数字 | "请输入正确的手机号码" |
|
|
|
+| 验证码 | 6位数字 | "请输入6位验证码" |
|
|
|
+| 用户姓名 | 1-20个字符 | "姓名长度不超过20个字符" |
|
|
|
+| 身高 | 50-250的数字 | "请输入50-250之间的数字" |
|
|
|
+| 体重 | 10-300的数字 | "请输入10-300之间的数字" |
|
|
|
+| 方案名称 | 1-30个字符 | "方案名称不超过30个字符" |
|
|
|
+
|
|
|
+### 3.5 下拉刷新与上拉加载
|
|
|
+
|
|
|
+| 页面 | 下拉刷新 | 上拉加载 |
|
|
|
+|------|---------|---------|
|
|
|
+| 我的设备 | 是(刷新连接状态) | 否 |
|
|
|
+| 我的方案 | 是 | 否 |
|
|
|
+| 发现首页 | 是 | 否 |
|
|
|
+| 专家方案 | 是 | 是 |
|
|
|
+| 消息中心 | 是 | 是 |
|
|
|
+| 使用记录 | 是 | 是 |
|
|
|
+| 健康推荐 | 是 | 是 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 启动与引导模块
|
|
|
+
|
|
|
+### 4.1 冷启动流程
|
|
|
+
|
|
|
+**步骤说明:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:用户点击APP图标
|
|
|
+ → 显示启动页(品牌LOGO,固定2秒)
|
|
|
+
|
|
|
+步骤2:判断是否为首次安装
|
|
|
+ → 是:进入隐私政策弹窗
|
|
|
+ → 否:进入步骤3
|
|
|
+
|
|
|
+步骤3:判断登录状态
|
|
|
+ → 本地存在有效Token:进入首页
|
|
|
+ → 本地无Token或Token失效:进入登录页
|
|
|
+```
|
|
|
+
|
|
|
+**错误处理:**
|
|
|
+| 异常场景 | 处理方式 |
|
|
|
+|---------|---------|
|
|
|
+| 启动时崩溃 | 记录日志,下次启动尝试恢复 |
|
|
|
+| 启动页加载超时 | 5秒后自动跳过 |
|
|
|
+| 本地数据损坏 | 清除本地缓存,视为首次启动 |
|
|
|
+
|
|
|
+### 4.2 隐私政策弹窗
|
|
|
+
|
|
|
+**页面元素:**
|
|
|
+- 弹窗标题:"服务协议与隐私政策"
|
|
|
+- 内容区域:滚动显示政策摘要
|
|
|
+- 关键条款高亮:
|
|
|
+ - 《用户协议》:协议适用范围、服务内容及形式、软件使用及许可、终端责任安全、用户权利与义务、用户行为规范、知识产权声明、用户信息保护
|
|
|
+ - 《隐私政策》:我们收集的信息(个人信息、设备信息、日志信息、位置信息)、我们如何使用信息
|
|
|
+- 底部按钮组:
|
|
|
+ - "不同意"按钮(灰色)
|
|
|
+ - "同意"按钮(主色调)
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:弹窗显示
|
|
|
+ → 用户阅读政策内容(可上下滚动)
|
|
|
+
|
|
|
+步骤2:用户点击"不同意"
|
|
|
+ → 弹出二次确认:"不同意将无法使用APP,是否退出?"
|
|
|
+ → 确认退出 → 关闭APP
|
|
|
+ → 取消 → 回到隐私政策弹窗
|
|
|
+
|
|
|
+步骤3:用户点击"同意"
|
|
|
+ → 记录同意状态(本地持久化)
|
|
|
+ → 关闭弹窗,进入登录页
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+| 操作 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 未阅读直接点同意 | 无强制要求,但提供可滚动阅读 |
|
|
|
+| 点击内容中的链接 | 跳转对应的协议详情页面 |
|
|
|
+
|
|
|
+### 4.3 协议详情页面
|
|
|
+
|
|
|
+**页面元素:**
|
|
|
+- 顶部导航栏:返回按钮 + "隐私政策"/"用户协议"
|
|
|
+- 内容区域:完整协议文本
|
|
|
+- 支持字体缩放
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+```
|
|
|
+步骤1:从隐私政策弹窗点击协议链接 或 从设置页进入
|
|
|
+ → 打开协议详情页
|
|
|
+
|
|
|
+步骤2:用户阅读(可上下滚动)
|
|
|
+
|
|
|
+步骤3:点击返回按钮
|
|
|
+ → 返回上一页
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 登录注册模块
|
|
|
+
|
|
|
+### 5.1 登录页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| 状态栏 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| HELLO, |
|
|
|
+| 欢迎使用研年健康平台 |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | +86 | 请输入手机号 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 请输入验证码 | [获取验证码] | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 登录 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| ---------- 其他登录方式 --------- |
|
|
|
+| |
|
|
|
+| [微信图标] [Apple图标] |
|
|
|
+| |
|
|
|
+| [ ] 登录即代表同意隐私政策 |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+【整体流程】
|
|
|
+步骤1:进入登录页
|
|
|
+ → 手机号输入框自动获得焦点
|
|
|
+ → 唤起数字键盘
|
|
|
+
|
|
|
+步骤2:输入手机号
|
|
|
+ → 实时校验手机号格式(1开头的11位数字)
|
|
|
+ → 格式正确时,"获取验证码"按钮变为可用状态
|
|
|
+ → 格式不正确时,按钮保持禁用状态
|
|
|
+
|
|
|
+步骤3:点击"获取验证码"
|
|
|
+ → 按钮变为禁用状态,开始60秒倒计时
|
|
|
+ → 按钮文字变为"60s"(逐秒递减)
|
|
|
+ → 后台调用发送验证码接口
|
|
|
+ → 发送成功:Toast提示"验证码已发送"
|
|
|
+ → 发送失败:恢复按钮状态,Toast提示错误原因
|
|
|
+
|
|
|
+步骤4:输入验证码
|
|
|
+ → 限制输入6位数字
|
|
|
+ → 满6位后自动校验格式
|
|
|
+
|
|
|
+步骤5:点击"登录"按钮
|
|
|
+ → 按钮进入loading状态
|
|
|
+ → 调用登录接口(手机号+验证码)
|
|
|
+ → 登录成功:
|
|
|
+ - 保存Token到本地(持久化存储,永不过期)
|
|
|
+ - 保存用户信息
|
|
|
+ - 判断是否为首次登录
|
|
|
+ - 是:跳转到补充信息页
|
|
|
+ - 否:跳转到首页
|
|
|
+ → 登录失败:
|
|
|
+ - 恢复按钮状态
|
|
|
+ - Toast提示错误信息
|
|
|
+
|
|
|
+【第三方登录流程】
|
|
|
+步骤1:点击微信/Apple图标
|
|
|
+ → 唤起对应第三方登录SDK
|
|
|
+ → 用户完成授权
|
|
|
+ → 获取第三方授权码
|
|
|
+ → 调用后台绑定/登录接口
|
|
|
+ → 后续流程同手机号登录
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 | 处理方式 |
|
|
|
+|------|---------|---------|
|
|
|
+| 手机号为空 | "请输入手机号" | 登录按钮禁用 |
|
|
|
+| 手机号格式错误 | "请输入正确的11位手机号" | 实时校验,红色边框提示 |
|
|
|
+| 手机号未注册 | 后台自动注册新用户 | 无需提示,直接进入补充信息 |
|
|
|
+| 验证码为空 | "请输入验证码" | 登录按钮禁用 |
|
|
|
+| 验证码格式错误 | "验证码为6位数字" | 实时校验 |
|
|
|
+| 验证码已过期 | "验证码已过期,请重新获取" | 清空验证码框,恢复获取按钮 |
|
|
|
+| 验证码错误 | "验证码错误,请重新输入" | 保留手机号,清空验证码框 |
|
|
|
+| 发送验证码频繁 | "发送过于频繁,请稍后再试" | 保持倒计时 |
|
|
|
+| 网络请求失败 | "网络连接失败,请检查网络" | 提供重试按钮 |
|
|
|
+| 服务器异常 | "服务器繁忙,请稍后再试" | 提供重试按钮 |
|
|
|
+| 第三方登录取消 | "登录已取消" | Toast提示,留在登录页 |
|
|
|
+| 第三方登录失败 | "登录失败,请尝试其他方式" | Toast提示 |
|
|
|
+
|
|
|
+**边缘场景处理:**
|
|
|
+
|
|
|
+| 场景 | 处理方案 |
|
|
|
+|------|---------|
|
|
|
+| 倒计时期间切换页面 | 保持倒计时,返回后显示剩余时间 |
|
|
|
+| 倒计时结束未获取 | 按钮恢复为"获取验证码" |
|
|
|
+| 登录过程中杀掉APP | 下次启动重新走登录流程 |
|
|
|
+| 同一账号多设备登录 | 允许多设备同时登录,各自独立 |
|
|
|
+
|
|
|
+### 5.2 补充信息页面(首次登录引导)
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 完善个人信息 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| 请完善以下信息,以便我们为您 |
|
|
|
+| 提供更精准的艾灸服务 |
|
|
|
+| |
|
|
|
+| 姓名 |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 请输入您的姓名 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| 性别 |
|
|
|
+| [ 男 ] [ 女 ] |
|
|
|
+| |
|
|
|
+| 年龄 |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 请选择年龄 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| 身高(cm) |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 请输入身高 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| 体重(kg) |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 请输入体重 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 保存并进入 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:新用户登录成功后自动跳转
|
|
|
+ → 表单所有字段为空
|
|
|
+
|
|
|
+步骤2:填写姓名
|
|
|
+ → 输入1-20个字符
|
|
|
+ → 超过20字符禁止继续输入
|
|
|
+
|
|
|
+步骤3:选择性别
|
|
|
+ → 点击男/女单选按钮
|
|
|
+ → 选中项高亮显示
|
|
|
+
|
|
|
+步骤4:选择年龄
|
|
|
+ → 点击弹出底部选择器
|
|
|
+ → 范围:1-120岁
|
|
|
+ → 默认选中25岁
|
|
|
+ → 滑动选择后点击确认
|
|
|
+
|
|
|
+步骤5:填写身高
|
|
|
+ → 输入50-250的数字
|
|
|
+ → 限制只能输入数字
|
|
|
+ → 输入范围外数字时红色提示
|
|
|
+
|
|
|
+步骤6:填写体重
|
|
|
+ → 输入10-300的数字
|
|
|
+ → 限制只能输入数字
|
|
|
+
|
|
|
+步骤7:点击"保存并进入"
|
|
|
+ → 校验所有字段是否已填写
|
|
|
+ → 未填写项红色提示并滚动到对应位置
|
|
|
+ → 校验通过:调用用户信息更新接口
|
|
|
+ → 保存成功:进入首页
|
|
|
+ → 保存失败:Toast提示错误信息
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 姓名为空 | "请输入姓名" |
|
|
|
+| 姓名超过20字符 | "姓名不超过20个字符" |
|
|
|
+| 性别未选择 | "请选择性别" |
|
|
|
+| 年龄未选择 | "请选择年龄" |
|
|
|
+| 身高为空 | "请输入身高" |
|
|
|
+| 身高超出范围 | "请输入50-250之间的数字" |
|
|
|
+| 体重为空 | "请输入体重" |
|
|
|
+| 体重超出范围 | "请输入10-300之间的数字" |
|
|
|
+| 网络保存失败 | "保存失败,请检查网络后重试" |
|
|
|
+
|
|
|
+**边缘场景:**
|
|
|
+
|
|
|
+| 场景 | 处理方案 |
|
|
|
+|------|---------|
|
|
|
+| 用户点击返回 | 弹窗提示"完善信息可获得更精准的服务,是否跳过?",跳过则以默认参数进入首页 |
|
|
|
+| 保存过程中断网 | 提示网络错误,保留表单数据 |
|
|
|
+| 后台返回错误 | 保留表单数据,提示具体错误原因 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 用户管理模块
|
|
|
+
|
|
|
+### 6.1 用户列表管理
|
|
|
+
|
|
|
+**入口:** 首页 → 设备详情页 → 点击用户切换按钮
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 用户管理 [+ 新增] |
|
|
|
++----------------------------------+
|
|
|
+| 最多可添加10个用户 |
|
|
|
++----------------------------------+
|
|
|
+| [========= 用户卡片 =========] |
|
|
|
+| 头像 张三 男 28岁 |
|
|
|
+| 肩高:135cm 肩宽:42cm |
|
|
|
+| [编辑] [删除] |
|
|
|
+| [============================] |
|
|
|
+| |
|
|
|
+| [========= 用户卡片 =========] |
|
|
|
+| 头像 李四 女 56岁 |
|
|
|
+| 肩高:128cm 肩宽:38cm |
|
|
|
+| [编辑] [删除] |
|
|
|
+| [============================] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 查看用户列表:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入用户管理页
|
|
|
+ → 调用接口获取用户列表
|
|
|
+ → 显示loading动画
|
|
|
+ → 加载完成显示用户卡片列表
|
|
|
+
|
|
|
+步骤2:用户切换
|
|
|
+ → 点击某个用户卡片
|
|
|
+ → 该卡片高亮显示(选中状态)
|
|
|
+ → 保存选中用户ID到本地
|
|
|
+ → Toast提示"已切换至用户:XXX"
|
|
|
+ → 自动返回设备详情页
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 新增用户:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击右上角"+ 新增"按钮
|
|
|
+ → 进入体形数据录入页
|
|
|
+
|
|
|
+步骤2:填写用户信息
|
|
|
+ → 同5.2节补充信息表单
|
|
|
+
|
|
|
+步骤3:点击保存
|
|
|
+ → 校验:当前用户数量是否已达到10个
|
|
|
+ → 已达10个:Toast提示"最多可添加10个用户,请先删除其他用户"
|
|
|
+ → 未满10个:调用新增接口
|
|
|
+ → 成功:返回用户列表,显示新用户
|
|
|
+ → 失败:提示错误信息
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 编辑用户:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击用户卡片的"编辑"按钮
|
|
|
+ → 进入编辑页面
|
|
|
+ → 表单回显当前用户信息
|
|
|
+
|
|
|
+步骤2:修改信息
|
|
|
+ → 同新增流程
|
|
|
+
|
|
|
+步骤3:点击保存
|
|
|
+ → 调用编辑接口
|
|
|
+ → 成功:返回列表页,刷新显示
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 删除用户:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击用户卡片的"删除"按钮
|
|
|
+ → 弹出确认弹窗:"确定删除用户XXX?删除后将无法恢复"
|
|
|
+ → 按钮:"取消" / "确定删除"(红色)
|
|
|
+
|
|
|
+步骤2:点击确定
|
|
|
+ → 调用删除接口
|
|
|
+ → 删除成功:移除该卡片,Toast提示"删除成功"
|
|
|
+ → 删除失败:Toast提示错误
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 用户达到上限(10人) | "最多可添加10个用户" |
|
|
|
+| 删除最后一个用户 | "至少保留一个用户" |
|
|
|
+| 删除失败 | "删除失败,请重试" |
|
|
|
+| 编辑时用户不存在 | "用户信息已过期,请刷新" |
|
|
|
+| 网络错误 | "网络连接失败,请检查网络" |
|
|
|
+
|
|
|
+### 6.2 体形数据录入
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 体形参数 |
|
|
|
++----------------------------------+
|
|
|
+| 请录入体形参数,用于精准定位穴位 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| 肩高(地面到肩膀的高度,cm) |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 例如:135 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| [========滑块========] 135cm |
|
|
|
+| |
|
|
|
+| 肩宽(两肩之间的宽度,cm) |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 例如:42 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| [========滑块========] 42cm |
|
|
|
+| |
|
|
|
+| 体重(kg) |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 例如:65 | |
|
|
|
+| +------------------------------+ |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 保存 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入体形参数页
|
|
|
+ → 如已有数据则回显
|
|
|
+
|
|
|
+步骤2:填写肩高
|
|
|
+ → 输入框输入数字
|
|
|
+ → 或拖动滑块调节
|
|
|
+ → 范围:50-250cm
|
|
|
+
|
|
|
+步骤3:填写肩宽
|
|
|
+ → 输入框输入数字
|
|
|
+ → 或拖动滑块调节
|
|
|
+ → 范围:20-80cm
|
|
|
+
|
|
|
+步骤4:填写体重
|
|
|
+ → 输入框输入数字
|
|
|
+ → 范围:10-300kg
|
|
|
+
|
|
|
+步骤5:点击保存
|
|
|
+ → 校验所有字段
|
|
|
+ → 调用体形数据保存接口
|
|
|
+ → 后台触发穴位坐标计算算法
|
|
|
+ → 保存成功:返回上一页
|
|
|
+ → 保存失败:提示错误
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 肩高为空 | "请输入肩高" |
|
|
|
+| 肩高超出范围 | "肩高范围50-250cm" |
|
|
|
+| 肩宽为空 | "请输入肩宽" |
|
|
|
+| 肩宽超出范围 | "肩宽范围20-80cm" |
|
|
|
+| 体重为空 | "请输入体重" |
|
|
|
+| 体重超出范围 | "体重范围10-300kg" |
|
|
|
+| 保存失败 | "保存失败,请重试" |
|
|
|
+
|
|
|
+### 6.3 指纹录入绑定
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:在用户管理页选择"指纹录入"
|
|
|
+ → 进入指纹录入引导页
|
|
|
+
|
|
|
+步骤2:阅读操作说明
|
|
|
+ → 显示图文并茂的操作指引:
|
|
|
+ "请将手指放在艾灸椅扶手处的指纹采集器上,
|
|
|
+ 听到'滴'声后抬起,重复3次完成录入"
|
|
|
+
|
|
|
+步骤3:点击"开始录入"
|
|
|
+ → 通过蓝牙发送指纹采集指令到设备
|
|
|
+ → 设备进入指纹录入模式
|
|
|
+ → APP显示"等待指纹录入..."
|
|
|
+
|
|
|
+步骤4:用户在设备上录入指纹
|
|
|
+ → 设备采集指纹
|
|
|
+ → 蓝牙回传指纹ID
|
|
|
+
|
|
|
+步骤5:绑定指纹
|
|
|
+ → APP收到指纹ID
|
|
|
+ → 调用后台接口绑定用户与指纹ID
|
|
|
+ → 显示"指纹录入成功"
|
|
|
+ → 返回用户管理页
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 | 处理方式 |
|
|
|
+|------|---------|---------|
|
|
|
+| 设备未连接 | "请先连接艾灸椅设备" | 引导用户先连接设备 |
|
|
|
+| 指纹采集超时 | "指纹采集超时,请重试" | 提供"重新录入"按钮 |
|
|
|
+| 指纹质量不佳 | "指纹采集不清晰,请清洁手指后重试" | 重试 |
|
|
|
+| 指纹ID回传失败 | "设备通信异常,请检查蓝牙连接" | 重试 |
|
|
|
+| 后台绑定失败 | "绑定失败,请稍后再试" | 重试 |
|
|
|
+| 该指纹已被绑定 | "该指纹已被其他用户绑定,请更换手指" | 提示更换手指 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 设备管理模块
|
|
|
+
|
|
|
+### 7.1 我的设备(首页默认页面)
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| 我的设备 [+]添加 |
|
|
|
++----------------------------------+
|
|
|
+| 已添加的设备 |
|
|
|
++----------------------------------+
|
|
|
+| +---------------------------+ |
|
|
|
+| | [艾灸椅图片] | |
|
|
|
+| | | |
|
|
|
+| | 我的艾灸椅 | |
|
|
|
+| | ● 已连接 | |
|
|
|
+| +---------------------------+ |
|
|
|
+| |
|
|
|
+| +---------------------------+ |
|
|
|
+| | [艾灸椅图片] | |
|
|
|
+| | | |
|
|
|
+| | 客厅艾灸椅 | |
|
|
|
+| | ○ 未连接 | |
|
|
|
+| +---------------------------+ |
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+| [首页] [发现] [健康] [我的] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 进入页面:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击底部Tab"首页"
|
|
|
+ → 检查本地是否有已绑定设备
|
|
|
+ → 无设备:显示空状态("暂无设备,点击添加" + 添加按钮)
|
|
|
+ → 有设备:显示设备列表卡片
|
|
|
+
|
|
|
+步骤2:自动刷新设备状态
|
|
|
+ → 遍历设备列表尝试蓝牙连接
|
|
|
+ → 已连接设备显示"已连接"绿色状态
|
|
|
+ → 未连接设备显示"未连接"灰色状态
|
|
|
+ → 连接中显示loading动画
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 蓝牙未开启 | 提示"蓝牙未开启,部分功能不可用" |
|
|
|
+| 刷新状态失败 | "状态刷新失败,下拉重试" |
|
|
|
+| 连接超时 | "连接超时,请确保设备在附近且已开机" |
|
|
|
+
|
|
|
+### 7.2 添加设备流程
|
|
|
+
|
|
|
+**完整操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+【步骤1:进入添加页面】
|
|
|
+操作:点击"+"按钮
|
|
|
+结果:跳转到添加设备页
|
|
|
+
|
|
|
+【步骤2:检查蓝牙状态】
|
|
|
+操作:页面自动检查手机蓝牙是否开启
|
|
|
+ → 蓝牙已开启:进入步骤3
|
|
|
+ → 蓝牙未开启:弹出引导弹窗
|
|
|
+ 弹窗内容:"当前手机蓝牙未开启,是否打开以扫描附近蓝牙设备?"
|
|
|
+ 按钮:"取消" / "去开启"
|
|
|
+ 点击"取消":返回上一页
|
|
|
+ 点击"去开启":跳转系统蓝牙设置
|
|
|
+ → 用户开启蓝牙后返回APP
|
|
|
+ → 自动进入步骤3
|
|
|
+
|
|
|
+【步骤3:搜索设备】
|
|
|
+页面显示:
|
|
|
+ - 中央:蓝牙信号搜索动画(波纹扩散效果)
|
|
|
+ - 文字:"正在搜索附近设备..."
|
|
|
+ - 下方:"请确保艾灸椅已接通电源并处于待连接状态"
|
|
|
+
|
|
|
+后台行为:
|
|
|
+ → 调用 uni.openBluetoothAdapter 初始化蓝牙
|
|
|
+ → 调用 uni.startBluetoothDevicesDiscovery 开始搜索
|
|
|
+ → 监听 uni.onBluetoothDeviceFound 事件
|
|
|
+ → 超时设置:30秒
|
|
|
+
|
|
|
+【步骤4:搜索结果处理】
|
|
|
+
|
|
|
+情况A:搜索到艾灸椅设备
|
|
|
+ → 底部弹出设备选择弹窗
|
|
|
+ → 弹窗标题:"搜索到以下设备"
|
|
|
+ → 列表显示发现的设备名称(过滤非艾灸椅设备)
|
|
|
+ → 点击设备项选中(高亮)
|
|
|
+ → 按钮:"取消" / "连接"
|
|
|
+
|
|
|
+ 点击"连接"后:
|
|
|
+ → 显示"正在连接..."
|
|
|
+ → 调用 uni.createBLEConnection
|
|
|
+ → 连接成功:
|
|
|
+ → 停止搜索
|
|
|
+ → 发现GATT服务和特征值
|
|
|
+ → 显示"连接成功"
|
|
|
+ → 1秒后自动跳转到设备详情页
|
|
|
+ → 连接失败:
|
|
|
+ → 提示"连接失败,请重试"
|
|
|
+ → 保留在弹窗,可重新选择
|
|
|
+
|
|
|
+情况B:未搜索到设备(30秒超时)
|
|
|
+ → 停止搜索动画
|
|
|
+ → 显示"未扫描到设备"
|
|
|
+ → 提示文字:"请检查:\n1. 手机蓝牙是否已开启\n2. 艾灸椅是否已接通电源\n3. 艾灸椅是否在附近(10米内)"
|
|
|
+ → 按钮:"重新搜索" / "手动输入"
|
|
|
+ → 点击"重新搜索":回到步骤3
|
|
|
+
|
|
|
+情况C:搜索过程中蓝牙被关闭
|
|
|
+ → 停止搜索
|
|
|
+ → 提示"蓝牙已关闭,搜索已停止"
|
|
|
+ → 提供"开启蓝牙重新搜索"按钮
|
|
|
+
|
|
|
+【步骤5:绑定设备】
|
|
|
+操作:首次连接成功后自动绑定
|
|
|
+ → 调用后台接口:绑定设备到当前用户
|
|
|
+ → 保存设备信息到本地
|
|
|
+ → 保存蓝牙MAC地址用于自动重连
|
|
|
+ → Toast提示"设备添加成功"
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 | 处理方式 |
|
|
|
+|------|---------|---------|
|
|
|
+| 蓝牙适配器初始化失败 | "蓝牙初始化失败,请重启手机蓝牙" | 引导重启蓝牙 |
|
|
|
+| 搜索被其他应用占用 | "蓝牙搜索被占用,请关闭其他应用后重试" | 提示关闭其他BLE应用 |
|
|
|
+| 连接被拒绝 | "连接被拒绝,请确认设备是否处于配对模式" | 引导检查设备 |
|
|
|
+| 连接超时 | "连接超时,请确保设备在有效范围内" | 重试 |
|
|
|
+| 服务发现失败 | "设备服务异常,请重启设备后重试" | 引导重启设备 |
|
|
|
+| 特征值获取失败 | "设备通信异常" | 断开重连 |
|
|
|
+| 绑定后台接口失败 | "设备绑定失败,请检查网络" | 本地保存,网络恢复后重试 |
|
|
|
+| 已达到最大绑定数 | "每个账号最多绑定5台设备" | 提示解绑旧设备 |
|
|
|
+
|
|
|
+### 7.3 设备详情页
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 我的艾灸椅 [≡]菜单 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| [艾灸椅3D图] |
|
|
|
+| ● 大椎穴 |
|
|
|
+| |
|
|
|
+| 蓝牙已连接 |
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+| 选择模式 |
|
|
|
+| +----------------------------+ |
|
|
|
+| | 专业模式 [切换→] | |
|
|
|
+| +----------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+| 其他功能 |
|
|
|
+| [⭐我的方案] [📦艾灸余量] [🔧滤芯状态] |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | [开始按钮] | |
|
|
|
+| | ● | |
|
|
|
+| | 开始 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**页面布局 - 艾灸执行中状态:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 我的艾灸椅 [≡]菜单 |
|
|
|
++----------------------------------+
|
|
|
+| [设备] [穴位] |
|
|
|
+| [艾灸椅3D图/穴位图] |
|
|
|
+| ● 大椎穴 |
|
|
|
+| |
|
|
|
+| 蓝牙已连接 |
|
|
|
++----------------------------------+
|
|
|
+| 选择模式 |
|
|
|
+| +----------------------------+ |
|
|
|
+| | 自定义模式 [切换→] | |
|
|
|
+| +----------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+| 其他功能 |
|
|
|
+| [📦艾灸余量] [🔧滤芯状态] |
|
|
|
++----------------------------------+
|
|
|
+| 正在艾灸 00:10:38 |
|
|
|
+| [继续] [暂停] [结束] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**Tab切换 - 设备/穴位:**
|
|
|
+
|
|
|
+| Tab | 显示内容 |
|
|
|
+|-----|---------|
|
|
|
+| 设备 | 艾灸椅3D模型图,当前施灸穴位红点标记 |
|
|
|
+| 穴位 | 人体背部穴位图,白色圆点标记所有穴位,红色标记当前穴位 |
|
|
|
+
|
|
|
+**操作流程 - 模式切换:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"选择模式"卡片
|
|
|
+ → 底部弹出模式选择弹窗
|
|
|
+
|
|
|
+步骤2:选择模式
|
|
|
+ → 无艾灸模式
|
|
|
+ → 专业模式
|
|
|
+ → 自定义模式
|
|
|
+
|
|
|
+步骤3:点击确认
|
|
|
+ → 关闭弹窗,更新显示的模式名称
|
|
|
+ → 同时更新下方功能区域显示
|
|
|
+```
|
|
|
+
|
|
|
+### 7.4 设备状态监控
|
|
|
+
|
|
|
+**操作流程 - 查看耗材状态:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"艾灸余量"图标
|
|
|
+ → 进入耗材管理页面
|
|
|
+
|
|
|
+步骤2:页面显示
|
|
|
+ → 尘盒滤芯:进度条 + 百分比(如75%)
|
|
|
+ → 艾灸柱:剩余数量(如5个)
|
|
|
+
|
|
|
+步骤3:实时监控
|
|
|
+ → 通过蓝牙轮询读取传感器数据(每5秒)
|
|
|
+ → 数据变化时更新显示
|
|
|
+ → 艾材余量≤3:进度条变红色
|
|
|
+ → 废料舱≥80%:进度条变红色
|
|
|
+```
|
|
|
+
|
|
|
+**状态阈值与提示:**
|
|
|
+
|
|
|
+| 监控项 | 正常 | 预警 | 危险 | 操作限制 |
|
|
|
+|--------|------|------|------|---------|
|
|
|
+| 艾材余量 | >3个 | 1-3个 | 0个 | =0时禁止启动艾灸 |
|
|
|
+| 废料舱 | <80% | 80-99% | 100% | ≥100%时禁止启动 |
|
|
|
+| 滤芯寿命 | <80% | 80-99% | 100% | ≥100%时提醒更换 |
|
|
|
+
|
|
|
+**预警提示文案:**
|
|
|
+
|
|
|
+| 场景 | 提示方式 | 提示文案 |
|
|
|
+|------|---------|---------|
|
|
|
+| 艾材余量=3 | Toast | "艾材余量不足,剩余3个,请及时补充" |
|
|
|
+| 艾材余量=1 | 弹窗 | "艾材即将用完,只剩1个,建议补充后再使用" |
|
|
|
+| 艾材余量=0 | 弹窗 | "艾材已用完,无法启动艾灸,请补充艾材" |
|
|
|
+| 废料舱=80% | Toast | "废料舱即将满仓,请及时清理" |
|
|
|
+| 废料舱=100% | 弹窗 | "废料舱已满,无法启动艾灸,请清理废料舱" |
|
|
|
+| 滤芯=80% | Toast | "滤芯使用寿命即将到期,建议更换" |
|
|
|
+| 滤芯=100% | 弹窗 | "滤芯已到期,请更换滤芯以保证使用效果" |
|
|
|
+
|
|
|
+### 7.5 座椅角度调节
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 座椅角度调节 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| [艾灸椅侧视图] |
|
|
|
+| 当前角度:100° |
|
|
|
+| |
|
|
|
+| 90° [========●===========] 150° |
|
|
|
+| 拖动滑块调节角度 |
|
|
|
+| |
|
|
|
+| 快捷角度: |
|
|
|
+| [ 90° ] [ 110° ] [ 130° ] [ 150° ]|
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入座椅角度调节页
|
|
|
+ → 显示当前角度值
|
|
|
+ → 滑块定位到当前角度
|
|
|
+
|
|
|
+步骤2A:拖动滑块调节
|
|
|
+ → 实时显示角度值(整数)
|
|
|
+ → 松开手指后:通过蓝牙发送目标角度指令
|
|
|
+ → 设备执行角度调节
|
|
|
+ → 设备反馈到位信号后更新显示
|
|
|
+
|
|
|
+步骤2B:点击快捷角度按钮
|
|
|
+ → 直接设置到对应角度
|
|
|
+ → 蓝牙发送目标角度指令
|
|
|
+
|
|
|
+步骤3:调节完成
|
|
|
+ → 点击返回按钮回到设备详情页
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 设备未连接 | "设备未连接,无法调节角度" |
|
|
|
+| 调节超时 | "角度调节超时,请检查设备" |
|
|
|
+| 调节被中断 | "调节被中断,当前角度:XXX°" |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 首页-设备控制模块
|
|
|
+
|
|
|
+### 8.1 模式选择流程
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:在设备详情页点击"选择模式"区域
|
|
|
+ → 底部弹出模式选择面板
|
|
|
+
|
|
|
+步骤2:面板内容
|
|
|
+ → 单选列表:
|
|
|
+ ○ 无艾灸模式
|
|
|
+ 副标题:"纯休闲模式,享受白噪音和座椅按摩"
|
|
|
+ ○ 专业模式
|
|
|
+ 副标题:"选择功效,自动匹配灸方"
|
|
|
+ ○ 自定义模式
|
|
|
+ 副标题:"自选穴位,个性化艾灸方案"
|
|
|
+ → 底部:"模式说明"链接
|
|
|
+
|
|
|
+步骤3:选择一个模式
|
|
|
+ → 该选项高亮(单选)
|
|
|
+ → 其他选项取消选中
|
|
|
+
|
|
|
+步骤4:点击"确认"或点击蒙层关闭
|
|
|
+ → 更新首页显示的模式名称
|
|
|
+ → 根据模式切换下方功能区域
|
|
|
+
|
|
|
+模式说明弹窗内容:
|
|
|
+- 无艾灸模式:不启动艾灸功能,仅使用座椅角度调节和白噪音播放功能
|
|
|
+- 专业模式:选择八大功效之一,系统自动根据您的体形数据计算穴位并匹配灸方
|
|
|
+- 自定义模式:手动选择穴位、设置时长和温度,编辑个性化艾灸方案
|
|
|
+```
|
|
|
+
|
|
|
+### 8.2 开始艾灸流程
|
|
|
+
|
|
|
+**操作流程(通用):**
|
|
|
+
|
|
|
+```
|
|
|
+前置检查(点击开始按钮时自动执行):
|
|
|
+ 1. 检查蓝牙连接 → 未连接:提示"请先连接设备"
|
|
|
+ 2. 检查艾材余量 → =0:提示"艾材不足,请补充"
|
|
|
+ 3. 检查废料舱 → =100%:提示"废料舱已满,请清理"
|
|
|
+ 4. 检查滤芯 → =100%:提示"滤芯已到期,请更换"
|
|
|
+
|
|
|
+步骤1:点击"开始"按钮
|
|
|
+ → 按钮变为loading状态
|
|
|
+ → 根据当前模式准备艾灸数据
|
|
|
+
|
|
|
+步骤2:进入预热阶段
|
|
|
+ → 显示"正在预热 X%"
|
|
|
+ → 进度条动态增长
|
|
|
+ → 此阶段设备预热艾材
|
|
|
+ → 显示倒计时(如30秒预热)
|
|
|
+
|
|
|
+步骤3:预热完成
|
|
|
+ → 显示"已完成预热 100%"
|
|
|
+ → 弹窗:"已完成预热,即将开始艾灸5s"
|
|
|
+ → 3秒倒计时自动关闭,或点击"确认"
|
|
|
+
|
|
|
+步骤4:艾灸开始
|
|
|
+ → 更新UI为"正在艾灸"状态
|
|
|
+ → 显示倒计时
|
|
|
+ → 开始播放白噪音(如已选择)
|
|
|
+ → 开始接收设备状态上报
|
|
|
+
|
|
|
+步骤5:艾灸过程中
|
|
|
+ → 实时更新:当前穴位、剩余时长、当前温度、当前手法
|
|
|
+ → 穴位Tab显示当前施灸穴位红色标记
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 无艾灸模式(休闲模式)
|
|
|
+
|
|
|
+### 9.1 模式配置页
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 无艾灸模式 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| 座椅角度(拖动滑块调整) |
|
|
|
+| [====●===========] 100° |
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+| 选择模式 |
|
|
|
+| +----------------------------+ |
|
|
|
+| | 无艾灸模式 [切换→] | |
|
|
|
+| +----------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+| 白噪音 |
|
|
|
+| +----------------------------+ |
|
|
|
+| | [⏵] 河流 03:21 / --:--| |
|
|
|
+| | 夏雨 | |
|
|
|
+| | 森林 | |
|
|
|
+| | 鸟鸣 | |
|
|
|
+| | 漂流 | |
|
|
|
+| | 雨滴 | |
|
|
|
+| | 炉火 | |
|
|
|
+| | 海浪 | |
|
|
|
+| +----------------------------+ |
|
|
|
+| |
|
|
|
+| 音量 |
|
|
|
+| [--●----------] |
|
|
|
+| [🔔] 一键静音 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 开始 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+### 9.2 音效控制详细操作
|
|
|
+
|
|
|
+**操作流程 - 选择音效:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:在音效列表中点击某一项
|
|
|
+ → 该项高亮显示
|
|
|
+ → 自动开始播放
|
|
|
+ → 播放按钮变为暂停图标
|
|
|
+ → 显示播放进度条
|
|
|
+
|
|
|
+步骤2:播放控制
|
|
|
+ → 点击暂停:暂停播放,按钮变为播放图标
|
|
|
+ → 点击继续:继续播放
|
|
|
+ → 进度条可拖动快进/快退
|
|
|
+
|
|
|
+步骤3:切换音效
|
|
|
+ → 点击其他音效项
|
|
|
+ → 当前音效淡出
|
|
|
+ → 新音效淡入播放
|
|
|
+ → 更新进度条
|
|
|
+
|
|
|
+步骤4:停止播放
|
|
|
+ → 模式切换或退出页面时自动停止
|
|
|
+```
|
|
|
+
|
|
|
+**音量调节:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:拖动音量滑块
|
|
|
+ → 实时调节音量(0-100%)
|
|
|
+ → 通过蓝牙发送音量控制指令
|
|
|
+
|
|
|
+步骤2:点击静音按钮
|
|
|
+ → 一键静音(音量设为0)
|
|
|
+ → 静音图标变为带斜杠
|
|
|
+ → 保留系统提示音不受静音影响
|
|
|
+
|
|
|
+步骤3:再次点击静音
|
|
|
+ → 恢复静音前的音量值
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 音效播放失败 | "音效播放失败,请重试" |
|
|
|
+| 蓝牙音量控制失败 | "音量调节失败,请检查设备连接" |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 10. 专业模式(一键艾灸)
|
|
|
+
|
|
|
+### 10.1 功效选择页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 选择功效 |
|
|
|
++----------------------------------+
|
|
|
+| 请选择您需要的艾灸功效 |
|
|
|
++----------------------------------+
|
|
|
+| +------------+ +------------+ |
|
|
|
+| | ❄️ | | 💨 | |
|
|
|
+| | 驱寒 | | 祛风 | |
|
|
|
+| +------------+ +------------+ |
|
|
|
+| |
|
|
|
+| +------------+ +------------+ |
|
|
|
+| | 💧 | | 🩸 | |
|
|
|
+| | 祛湿 | | 化瘀 | |
|
|
|
+| +------------+ +------------+ |
|
|
|
+| |
|
|
|
+| +------------+ +------------+ |
|
|
|
+| | 🫁 | | ❤️ | |
|
|
|
+| | 化痰 | | 活血 | |
|
|
|
+| +------------+ +------------+ |
|
|
|
+| |
|
|
|
+| +------------+ +------------+ |
|
|
|
+| | ☀️ | | 🌸 | |
|
|
|
+| | 扶阳 | | 养颜 | |
|
|
|
+| +------------+ +------------+ |
|
|
|
++----------------------------------+
|
|
|
+| +------------------------------+ |
|
|
|
+| | 确认选择 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入功效选择页
|
|
|
+ → 显示8种功效网格
|
|
|
+ → 无默认选中项
|
|
|
+
|
|
|
+步骤2:选择功效
|
|
|
+ → 点击某个功效卡片
|
|
|
+ → 卡片高亮(选中状态)
|
|
|
+ → 再次点击取消选中
|
|
|
+
|
|
|
+步骤3:确认选择
|
|
|
+ → 点击"确认选择"按钮
|
|
|
+ → 校验:必须选中至少1个功效
|
|
|
+ → 未选中:提示"请至少选择一种功效"
|
|
|
+ → 已选中:进入艾灸准备流程
|
|
|
+
|
|
|
+步骤4:一键艾灸准备
|
|
|
+ → 显示loading:"正在为您计算穴位方案..."
|
|
|
+ → APP读取当前选中用户的体形数据
|
|
|
+ → 调用后台接口:用户穴位坐标计算
|
|
|
+ 参数:用户ID、体形数据(肩高/肩宽/体重)
|
|
|
+ 返回:各穴位坐标参数
|
|
|
+ → 调用后台接口:功效-灸方参数匹配
|
|
|
+ 参数:功效类型、穴位坐标
|
|
|
+ 返回:灸方参数(穴位/温度/手法/时长)
|
|
|
+ → 计算完成:显示方案摘要弹窗
|
|
|
+
|
|
|
+步骤5:方案确认弹窗
|
|
|
+ → 显示内容:
|
|
|
+ "为您匹配的艾灸方案:"
|
|
|
+ "施灸穴位:大椎穴、风池穴、肩井穴..."
|
|
|
+ "总时长:25分钟"
|
|
|
+ "温度:40℃"
|
|
|
+ → 按钮:"重新选择" / "开始艾灸"
|
|
|
+ → 点击"开始艾灸":进入预热流程
|
|
|
+```
|
|
|
+
|
|
|
+**功效说明:**
|
|
|
+
|
|
|
+| 功效 | 适用症状 | 灸方特点 |
|
|
|
+|------|---------|---------|
|
|
|
+| 驱寒 | 手脚冰凉、畏寒怕冷 | 温热灸法,重点督脉 |
|
|
|
+| 祛风 | 风寒感冒、头痛 | 祛风穴位组合 |
|
|
|
+| 祛湿 | 身体困重、水肿 | 健脾祛湿穴位 |
|
|
|
+| 化瘀 | 血瘀疼痛、经络不通 | 活血化瘀手法 |
|
|
|
+| 化痰 | 咳嗽痰多、胸闷 | 理气化痰穴位 |
|
|
|
+| 活血 | 血液循环不畅 | 促进血液循环 |
|
|
|
+| 扶阳 | 阳气不足、乏力 | 温补阳气穴位 |
|
|
|
+| 养颜 | 面色暗沉、皮肤松弛 | 面部相关穴位 |
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 | 处理方式 |
|
|
|
+|------|---------|---------|
|
|
|
+| 未选择功效 | "请至少选择一种功效" | 停留在选择页 |
|
|
|
+| 用户无体形数据 | "请先完善体形信息" | 跳转到体形录入页 |
|
|
|
+| 穴位计算接口失败 | "方案生成失败,请检查网络后重试" | 提供重试按钮 |
|
|
|
+| 灸方匹配失败 | "灸方匹配失败,请尝试其他功效" | 返回功效选择 |
|
|
|
+| 蓝牙未连接 | "设备未连接,无法开始艾灸" | 引导连接设备 |
|
|
|
+| 用户切换后无数据 | "当前用户无体形数据,请先录入" | 跳转体形录入 |
|
|
|
+
|
|
|
+### 10.2 多功效组合选择(扩展功能)
|
|
|
+
|
|
|
+如需支持多功效同时选择:
|
|
|
+
|
|
|
+```
|
|
|
+操作:点击多个功效卡片(多选)
|
|
|
+ → 多个卡片同时高亮
|
|
|
+ → 按钮显示"已选X种功效"
|
|
|
+限制:最多同时选择3种功效
|
|
|
+ → 选第4个时提示"最多同时选择3种功效"
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 11. 自定义模式
|
|
|
+
|
|
|
+### 11.1 穴位选择页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 穴位编辑 [设备][穴位] |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| [人体背部穴位图] |
|
|
|
+| ○ ○ ○ |
|
|
|
+| ○ ● ○ |
|
|
|
+| ○ ○ ○ |
|
|
|
+| ○ ○ ○ |
|
|
|
+| |
|
|
|
+| ○ 大椎穴 ○ 风池穴 ○ 肩井穴 |
|
|
|
+| (白色=未选 红色=已选 黄色=当前)|
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+| 已选穴位(0/3): |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 开始 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 穴位选择:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入穴位编辑页
|
|
|
+ → 默认显示"穴位"Tab
|
|
|
+ → 显示人体背部穴位图
|
|
|
+ → 所有可用穴位显示白色圆点
|
|
|
+ → 底部显示"已选穴位(0/3)"
|
|
|
+
|
|
|
+步骤2:点击穴位
|
|
|
+ → 方式A:点击图上穴位点
|
|
|
+ → 该穴位变为红色(选中状态)
|
|
|
+ → 显示穴位名称标签
|
|
|
+ → 底部"已选穴位"计数+1
|
|
|
+ → 弹出时长温度设定面板
|
|
|
+
|
|
|
+ → 方式B:点击下方穴位名称列表
|
|
|
+ → 同上效果
|
|
|
+
|
|
|
+步骤3:设置时长和温度(弹出面板)
|
|
|
+ → 温度选择:38℃ / 40℃ / 42℃ / 44℃(单选)
|
|
|
+ → 时长选择:5分 / 10分 / 15分 / ... / 50分(单选)
|
|
|
+ → 按钮:"取消" / "确认"
|
|
|
+ → 点击确认:保存该穴位参数,面板关闭
|
|
|
+
|
|
|
+步骤4:继续添加穴位(可选)
|
|
|
+ → 重复步骤2-3
|
|
|
+ → 最多3个穴位
|
|
|
+ → 选第4个时:弹窗"单次最多可选择3个穴位"
|
|
|
+
|
|
|
+步骤5:总时长校验
|
|
|
+ → 每次添加后校验总时长
|
|
|
+ → 总时长 = 所有穴位时长之和
|
|
|
+ → 总时长 > 30分钟:弹窗"总时长不超过30分钟,请重新分配"
|
|
|
+ → 超出时:要求用户减少某个穴位的时长
|
|
|
+
|
|
|
+步骤6:调整穴位顺序
|
|
|
+ → 在已选穴位列表中长按拖拽
|
|
|
+ → 调整执行顺序
|
|
|
+ → 蓝牙下发时按此顺序
|
|
|
+
|
|
|
+步骤7:二次修改穴位参数
|
|
|
+ → 点击已选的穴位
|
|
|
+ → 重新弹出时长温度面板
|
|
|
+ → 回显已设置的参数
|
|
|
+ → 修改后确认
|
|
|
+
|
|
|
+步骤8:删除穴位
|
|
|
+ → 在已选穴位列表中左滑
|
|
|
+ → 显示"删除"按钮
|
|
|
+ → 点击删除,该穴位恢复白色
|
|
|
+
|
|
|
+步骤9:点击"开始"按钮
|
|
|
+ → 校验:至少选择1个穴位
|
|
|
+ → 未选穴位:提示"请至少选择一个穴位"
|
|
|
+ → 已选穴位:进入艾灸预热流程
|
|
|
+```
|
|
|
+
|
|
|
+**穴位图交互说明:**
|
|
|
+
|
|
|
+| 状态 | 颜色 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| 未选中 | 白色 | 可选的穴位 |
|
|
|
+| 已选中 | 红色 | 已添加到方案的穴位 |
|
|
|
+| 当前施灸 | 黄色闪烁 | 艾灸执行中正在施灸的穴位 |
|
|
|
+
|
|
|
+**详细错误提示清单:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 | 处理方式 |
|
|
|
+|------|---------|---------|
|
|
|
+| 未选穴位点开始 | "请至少选择一个穴位" | 停留页面 |
|
|
|
+| 穴位超过3个 | "单次最多可增加3个穴位" | 阻止添加 |
|
|
|
+| 总时长超30分钟 | "总时长不超过30分钟,请重新分配" | 弹出时长调整面板 |
|
|
|
+| 温度未设置 | "请为每个穴位设置温度" | 引导设置 |
|
|
|
+| 时长未设置 | "请为每个穴位设置时长" | 引导设置 |
|
|
|
+| 穴位坐标获取失败 | "穴位数据加载失败,请下拉刷新" | 下拉刷新 |
|
|
|
+
|
|
|
+### 11.2 保存自定义方案
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+触发条件:自定义模式编辑完成后
|
|
|
+
|
|
|
+步骤1:编辑完成后不直接开始,可选择保存
|
|
|
+ → 显示"保存方案"按钮
|
|
|
+
|
|
|
+步骤2:点击"保存方案"
|
|
|
+ → 弹出输入框:"请输入方案名称"
|
|
|
+ → 默认名称:"自定义方案 + 当前日期"
|
|
|
+ → 最多30个字符
|
|
|
+
|
|
|
+步骤3:输入名称并确认
|
|
|
+ → 校验名称是否为空
|
|
|
+ → 调用后台接口保存方案
|
|
|
+ 参数:用户ID + 方案名称 + 艾灸工艺数组 + 总时长
|
|
|
+ → 保存成功:Toast"方案保存成功",跳转到我的方案页
|
|
|
+ → 保存失败:提示错误
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 12. 艾灸执行过程
|
|
|
+
|
|
|
+### 12.1 预热阶段
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击开始 → 进入预热
|
|
|
+ → 显示"正在预热 0%"
|
|
|
+ → 圆形/条形进度条动画
|
|
|
+ → 预计预热时间:30秒
|
|
|
+
|
|
|
+步骤2:预热进度更新
|
|
|
+ → 蓝牙接收设备预热进度上报
|
|
|
+ → 进度条动态增长:0% → 25% → 50% → 75% → 100%
|
|
|
+ → 显示预计剩余时间
|
|
|
+
|
|
|
+步骤3:预热完成
|
|
|
+ → 进度条达到100%
|
|
|
+ → 显示"已完成预热"
|
|
|
+ → 弹窗:"已完成预热,即将开始艾灸"
|
|
|
+ → 3秒倒计时,或点击"确认"立即开始
|
|
|
+ → 弹窗关闭,进入艾灸执行阶段
|
|
|
+
|
|
|
+异常情况 - 预热失败:
|
|
|
+ → 进度长时间不更新(超时60秒)
|
|
|
+ → 弹窗:"预热超时,请检查设备后重试"
|
|
|
+ → 按钮:"重试" / "取消"
|
|
|
+
|
|
|
+异常情况 - 预热中断:
|
|
|
+ → 蓝牙断开
|
|
|
+ → 提示"连接已断开,预热中断"
|
|
|
+ → 重新连接后可重新开始
|
|
|
+```
|
|
|
+
|
|
|
+### 12.2 艾灸执行阶段
|
|
|
+
|
|
|
+**设备Tab显示内容:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| [设备] [穴位] |
|
|
|
+| [艾灸椅3D图] |
|
|
|
+| ● 大椎穴 |
|
|
|
+| (红色标记当前穴位) |
|
|
|
++----------------------------------+
|
|
|
+| 正在艾灸 |
|
|
|
+| 剩余时间:00:08:25 |
|
|
|
+| 当前穴位:大椎穴 |
|
|
|
+| 当前温度:40℃ |
|
|
|
+| 当前手法:悬定灸 |
|
|
|
++----------------------------------+
|
|
|
+| [⏵ 继续] [⏸ 暂停] [⏹ 结束] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**穴位Tab显示内容:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| [设备] [穴位] |
|
|
|
+| [人体背部穴位图] |
|
|
|
+| ○ ○ ○ |
|
|
|
+| ○ 🟡 ○ |
|
|
|
+| ○ ○ ○ |
|
|
|
+| ○ ○ ○ |
|
|
|
+| (🟡黄色=当前施灸穴位) |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作 - 暂停:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"暂停"按钮
|
|
|
+ → 通过蓝牙发送暂停指令
|
|
|
+ → 设备:灸头后退2cm(安全距离)
|
|
|
+ → 设备:暂停计时
|
|
|
+ → APP状态更新:"已暂停"
|
|
|
+ → 按钮切换:显示"继续"按钮
|
|
|
+
|
|
|
+步骤2:暂停状态显示
|
|
|
+ → 倒计时停止
|
|
|
+ → 显示"已暂停 剩余XX:XX"
|
|
|
+ → 温度显示逐步降低(自然散热)
|
|
|
+```
|
|
|
+
|
|
|
+**操作 - 继续:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"继续"按钮
|
|
|
+ → 通过蓝牙发送继续指令
|
|
|
+ → 设备:灸头回到施灸位置
|
|
|
+ → 设备:恢复计时
|
|
|
+ → APP状态更新:"正在艾灸"
|
|
|
+ → 按钮切换:显示"暂停"按钮
|
|
|
+```
|
|
|
+
|
|
|
+**操作 - 结束:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"结束"按钮
|
|
|
+ → 弹出二次确认弹窗
|
|
|
+ → "确定结束本次艾灸?"
|
|
|
+ → 按钮:"取消" / "确定结束"(红色)
|
|
|
+
|
|
|
+步骤2:确认结束
|
|
|
+ → 通过蓝牙发送结束指令
|
|
|
+ → 设备:灸头归位,停止加热
|
|
|
+ → APP显示"艾灸已完成"
|
|
|
+ → 上报使用记录到后台
|
|
|
+ → 3秒后自动返回设备详情页(待机状态)
|
|
|
+
|
|
|
+步骤3:取消结束
|
|
|
+ → 关闭弹窗,继续艾灸
|
|
|
+```
|
|
|
+
|
|
|
+### 12.3 温度监控与安全防护
|
|
|
+
|
|
|
+**温度监控流程:**
|
|
|
+
|
|
|
+```
|
|
|
+实时上报:
|
|
|
+ → 设备每2秒上报一次温度数据
|
|
|
+ → APP更新温度显示
|
|
|
+ → 温度曲线可查看(可选功能)
|
|
|
+
|
|
|
+超温保护:
|
|
|
+ → 温度超过安全阈值
|
|
|
+ → 设备自动切换为"雀啄灸"手法(快速提插,避免持续高温)
|
|
|
+ → APP显示:"温度过高,已自动切换手法防止灼伤"
|
|
|
+ → 温度回落后恢复正常手法
|
|
|
+
|
|
|
+极端超温:
|
|
|
+ → 温度持续超限
|
|
|
+ → 设备自动暂停
|
|
|
+ → APP显示警告:"温度异常,艾灸已自动暂停,请检查"
|
|
|
+```
|
|
|
+
|
|
|
+### 12.4 艾灸完成
|
|
|
+
|
|
|
+**正常完成流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:最后一个穴位施灸完成
|
|
|
+ → 设备发送完成信号
|
|
|
+ → 蓝牙上报完成状态
|
|
|
+
|
|
|
+步骤2:APP显示
|
|
|
+ → "艾灸已完成"
|
|
|
+ → 显示本次艾灸摘要:
|
|
|
+ - 施灸穴位列表
|
|
|
+ - 总时长
|
|
|
+ - 平均温度
|
|
|
+ → 播放完成提示音
|
|
|
+
|
|
|
+步骤3:数据上报
|
|
|
+ → 自动上报使用记录到后台
|
|
|
+ → 参数:用户ID/时间/功效/穴位/时长/温度
|
|
|
+
|
|
|
+步骤4:3秒后自动返回设备详情页(待机状态)
|
|
|
+```
|
|
|
+
|
|
|
+### 12.5 异常中断处理
|
|
|
+
|
|
|
+| 中断原因 | 处理方式 | 用户提示 |
|
|
|
+|---------|---------|---------|
|
|
|
+| 蓝牙断开 | 自动重连(3次),失败后暂停艾灸 | "蓝牙连接断开,正在尝试重连..." |
|
|
|
+| APP被杀掉 | 设备继续执行(独立运行) | 下次打开APP恢复状态 |
|
|
|
+| 设备断电 | 艾灸终止 | "设备已断电" |
|
|
|
+| 检测到异物 | 设备自动暂停 | "检测到有异物,已暂停艾灸,清理后重试" |
|
|
|
+| 艾材用完 | 设备自动暂停 | "艾材已用完,艾灸已暂停" |
|
|
|
+| 多手机操控 | 当前操控权被抢占 | "当前设备正在被其他手机操控" |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 13. 我的方案管理
|
|
|
+
|
|
|
+### 13.1 方案列表页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 我的方案 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| +---------------------------+ |
|
|
|
+| | 一套针对颈椎的艾灸方案 | |
|
|
|
+| | 王凤娇 | |
|
|
|
+| | [使用] | |
|
|
|
+| +---------------------------+ |
|
|
|
+| |
|
|
|
+| +---------------------------+ |
|
|
|
+| | 艾灸方案二 | |
|
|
|
+| | [使用] | |
|
|
|
+| +---------------------------+ |
|
|
|
+| |
|
|
|
+| +---------------------------+ |
|
|
|
+| | 艾灸方案三 | |
|
|
|
+| | [使用] | |
|
|
|
+| +---------------------------+ |
|
|
|
+| |
|
|
|
+| [更多方案] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 查看列表:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:从设备详情页点击"我的方案"
|
|
|
+ → 进入方案列表页
|
|
|
+ → 调用接口获取当前用户的方案列表
|
|
|
+ → 按创建时间倒序排列
|
|
|
+ → 显示loading → 显示列表
|
|
|
+
|
|
|
+步骤2:方案操作
|
|
|
+ → 点击方案卡片:进入方案详情
|
|
|
+ → 点击"使用"按钮:直接应用该方案开始艾灸
|
|
|
+ → 左滑方案卡片:显示"删除"按钮
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 删除方案:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:左滑方案卡片
|
|
|
+ → 显示红色"删除"按钮
|
|
|
+
|
|
|
+步骤2:点击删除
|
|
|
+ → 弹出确认:"确定删除方案XXX?"
|
|
|
+ → 取消:关闭弹窗
|
|
|
+ → 确认:调用删除接口
|
|
|
+ → 成功:移除卡片,Toast"删除成功"
|
|
|
+ → 失败:Toast"删除失败"
|
|
|
+```
|
|
|
+
|
|
|
+### 13.2 方案详情页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 方案详情 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| 方案名称:一套针对颈椎的艾灸方案 |
|
|
|
+| 作者:王凤娇 |
|
|
|
+| |
|
|
|
+| 艾灸穴位: |
|
|
|
+| 1. 大椎穴 - 15分钟 - 40℃ |
|
|
|
+| 2. 风池穴 - 10分钟 - 42℃ |
|
|
|
+| 3. 肩井穴 - 10分钟 - 40℃ |
|
|
|
+| |
|
|
|
+| 总时长:35分钟 |
|
|
|
+| |
|
|
|
+| [编辑方案] [立即使用] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作 - 立即使用:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"立即使用"
|
|
|
+ → 弹窗确认"使用该方案开始艾灸?"
|
|
|
+ → 确认:进入艾灸预热流程
|
|
|
+ → 取消:关闭弹窗
|
|
|
+```
|
|
|
+
|
|
|
+### 13.3 从发现页添加方案
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:在发现页浏览公用方案
|
|
|
+ → 进入方案详情页
|
|
|
+ → 显示"添加到我的方案"按钮
|
|
|
+
|
|
|
+步骤2:点击"添加到我的方案"
|
|
|
+ → 弹窗:"确认添加到我的方案?"
|
|
|
+ → 按钮:"取消" / "确认"
|
|
|
+
|
|
|
+步骤3:点击确认
|
|
|
+ → 调用后台接口:复制方案到个人方案(深拷贝)
|
|
|
+ → 成功:Toast"已添加到我的方案"
|
|
|
+ → 失败:提示错误
|
|
|
+
|
|
|
+权限控制:
|
|
|
+ → 公用方案:所有用户可见,可复制到个人方案
|
|
|
+ → 个人方案:仅本人可见
|
|
|
+ → 定向方案:仅指定用户可见
|
|
|
+```
|
|
|
+
|
|
|
+### 13.4 多用户方案同步
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:切换用户
|
|
|
+ → 进入用户管理页
|
|
|
+ → 选择另一个用户
|
|
|
+
|
|
|
+步骤2:方案自动切换
|
|
|
+ → 刷新方案列表
|
|
|
+ → 显示当前用户的方案
|
|
|
+ → 不同用户的方案完全隔离
|
|
|
+
|
|
|
+步骤3:方案同步到设备
|
|
|
+ → 选择方案后点击"同步到设备"
|
|
|
+ → 蓝牙发送方案数据包到设备
|
|
|
+ → 设备本地存储该方案
|
|
|
+ → 后续可通过指纹直接调用
|
|
|
+```
|
|
|
+
|
|
|
+### 13.5 离线方案使用
|
|
|
+
|
|
|
+```
|
|
|
+网络正常时:
|
|
|
+ → 方案列表从服务器获取
|
|
|
+ → 同时缓存到本地数据库
|
|
|
+
|
|
|
+网络异常时:
|
|
|
+ → 从本地数据库读取方案列表
|
|
|
+ → 可查看已保存的方案
|
|
|
+ → 已同步到设备的方案可直接通过蓝牙使用
|
|
|
+ → 无需网络即可完成艾灸
|
|
|
+
|
|
|
+蓝牙直连模式:
|
|
|
+ → 无需网络
|
|
|
+ → 直接使用已同步到设备的方案
|
|
|
+ → 通过指纹识别调用用户方案
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 14. 发现模块
|
|
|
+
|
|
|
+### 14.1 发现首页
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| [LOGO] |
|
|
|
++----------------------------------+
|
|
|
+| [======== Banner轮播 ========] |
|
|
|
+| 源自天然古法精髓 |
|
|
|
+| 手工艾灸,延传养生之道 |
|
|
|
++----------------------------------+
|
|
|
+| 热灸推荐 |
|
|
|
+| +---------------------------+ |
|
|
|
+| | [图] 颈腰同治-督脉艾灸方案 | |
|
|
|
+| | 缓解颈椎僵硬与腰椎酸痛 | |
|
|
|
+| | 45分钟 | |
|
|
|
+| +---------------------------+ |
|
|
|
+| +---------------------------+ |
|
|
|
+| | [图] 通络强背-脊柱养护方案 | |
|
|
|
+| | 改善胸背疼痛与脊柱侧弯 | |
|
|
|
+| | 60分钟 | |
|
|
|
+| +---------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+| 灸研室 [更多] |
|
|
|
+| +---------+ +---------+ |
|
|
|
+| |[图]方案1| |[图]方案2| |
|
|
|
+| +---------+ +---------+ |
|
|
|
+| +---------+ +---------+ |
|
|
|
+| |[图]方案3| |[图]方案4| |
|
|
|
+| +---------+ +---------+ |
|
|
|
++----------------------------------+
|
|
|
+| [首页] [发现] [健康] [我的] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 浏览首页:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击底部Tab"发现"
|
|
|
+ → 加载发现页数据
|
|
|
+ → Banner轮播自动播放(每3秒切换)
|
|
|
+ → 显示热灸推荐列表
|
|
|
+ → 显示灸研室方案网格
|
|
|
+
|
|
|
+步骤2:Banner操作
|
|
|
+ → 左右滑动切换
|
|
|
+ → 点击Banner进入对应详情页
|
|
|
+
|
|
|
+步骤3:热灸推荐
|
|
|
+ → 上下滑动浏览
|
|
|
+ → 点击方案卡片进入方案详情
|
|
|
+
|
|
|
+步骤4:灸研室
|
|
|
+ → 点击"更多"进入专家方案列表
|
|
|
+ → 点击方案卡片进入方案详情
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 数据加载失败 | "内容加载失败,下拉刷新试试" |
|
|
|
+| Banner加载失败 | 显示默认占位图 |
|
|
|
+| 图片加载失败 | 显示默认占位图 |
|
|
|
+
|
|
|
+### 14.2 专家方案列表
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 专家方案 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| +--------+ +--------+ |
|
|
|
+| |[图] | |[图] | |
|
|
|
+| |方案一名| |方案二名| |
|
|
|
+| |简介... | |简介... | |
|
|
|
+| +--------+ +--------+ |
|
|
|
+| |
|
|
|
+| +--------+ +--------+ |
|
|
|
+| |[图] | |[图] | |
|
|
|
+| |方案三名| |方案四名| |
|
|
|
+| |简介... | |简介... | |
|
|
|
+| +--------+ +--------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:从发现页点击"更多"进入
|
|
|
+ → 调用接口获取专家方案列表
|
|
|
+ → 2列网格布局展示
|
|
|
+
|
|
|
+步骤2:浏览方案
|
|
|
+ → 上下滑动浏览
|
|
|
+ → 上拉加载更多(分页加载)
|
|
|
+ → 下拉刷新
|
|
|
+
|
|
|
+步骤3:点击方案卡片
|
|
|
+ → 进入方案详情页
|
|
|
+```
|
|
|
+
|
|
|
+### 14.3 方案详情页
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 分享 |
|
|
|
+| [========= 方案大图 =========] |
|
|
|
++----------------------------------+
|
|
|
+| 一套针对颈椎的艾灸方案 |
|
|
|
+| 王凤娇 |
|
|
|
+| [立即体验] |
|
|
|
++----------------------------------+
|
|
|
+| 简介 |
|
|
|
+| 通过艾灸特定穴位,缓解颈椎病症状...|
|
|
|
+| [展开] |
|
|
|
++----------------------------------+
|
|
|
+| 艾灸穴位 |
|
|
|
+| 1. 风池穴 |
|
|
|
+| • 定位:枕骨下方,胸锁乳突肌与 |
|
|
|
+| 斜方肌上端之间的凹陷处 |
|
|
|
+| • 作用:疏风散寒,缓解头痛、颈痛 |
|
|
|
+| 2. 大椎穴 |
|
|
|
+| • 定位:第七颈椎棘突下凹陷中 |
|
|
|
+| • 作用:通阳解表,缓解颈肩疼痛 |
|
|
|
+| ... |
|
|
|
++----------------------------------+
|
|
|
+| 适用人群 |
|
|
|
+| • 颈椎病患者 |
|
|
|
+| • 长期伏案工作者 |
|
|
|
+| • 颈部肌肉紧张者 |
|
|
|
++----------------------------------+
|
|
|
+| 注意事项 |
|
|
|
+| 1. 保暖:艾灸后避免受风受寒 |
|
|
|
+| 2. 时间控制:每次艾灸时间不宜过长 |
|
|
|
+| 3. 皮肤保护:艾灸前可在皮肤上涂 |
|
|
|
+| 少量凡士林,防止灼伤 |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:浏览方案详情
|
|
|
+ → 上下滚动查看完整内容
|
|
|
+ → 简介区域默认折叠,点击"展开"查看全部
|
|
|
+
|
|
|
+步骤2:点击"立即体验"
|
|
|
+ → 判断登录状态
|
|
|
+ → 未登录:跳转登录页
|
|
|
+ → 已登录:弹窗"确认添加到我的方案?"
|
|
|
+ → 点击"确认"
|
|
|
+ → 调用方案复制接口(深拷贝)
|
|
|
+ → 成功:Toast"已添加到我的方案"
|
|
|
+ → 可跳转"我的方案"或留在当前页
|
|
|
+ → 点击"取消":关闭弹窗
|
|
|
+
|
|
|
+步骤3:点击"分享"
|
|
|
+ → 唤起系统分享面板
|
|
|
+ → 可分享给微信好友/朋友圈
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 15. 健康模块
|
|
|
+
|
|
|
+### 15.1 推荐列表页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| 推荐 |
|
|
|
++----------------------------------+
|
|
|
+| +--------+ +--------+ |
|
|
|
+| |[图] | |[图] | |
|
|
|
+| |文章标题| |文章标题| |
|
|
|
+| |官方 12-21| |官方 12-20| |
|
|
|
+| +--------+ +--------+ |
|
|
|
+| +--------+ +--------+ |
|
|
|
+| |[图] | |[图] | |
|
|
|
+| |文章标题| |文章标题| |
|
|
|
+| |官方 12-19| |官方 12-18| |
|
|
|
+| +--------+ +--------+ |
|
|
|
++----------------------------------+
|
|
|
+| [首页] [发现] [健康] [我的] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击底部Tab"健康"
|
|
|
+ → 加载推荐文章列表
|
|
|
+ → 2列网格布局
|
|
|
+
|
|
|
+步骤2:浏览文章
|
|
|
+ → 上下滑动
|
|
|
+ → 下拉刷新
|
|
|
+ → 上拉加载更多
|
|
|
+
|
|
|
+步骤3:点击文章卡片
|
|
|
+ → 进入文章详情页
|
|
|
+```
|
|
|
+
|
|
|
+### 15.2 文章详情页
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 详情 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| [========= 文章配图 =========] |
|
|
|
+| |
|
|
|
+| 灸后调养做好这三点,效果会更好! |
|
|
|
+| |
|
|
|
+| 2024-12-21 研年健康贴士 |
|
|
|
+| |
|
|
|
+| -------------------------------- |
|
|
|
+| |
|
|
|
+| 关注艾灸后调养的三个要素:休息... |
|
|
|
+| |
|
|
|
+| 1. 灸后休息有保障。 |
|
|
|
+| 艾灸后,尤其是重灸后对机体来说是 |
|
|
|
+| 一个较强的刺激... |
|
|
|
+| |
|
|
|
+| 2. 灸后锻炼要适度。 |
|
|
|
+| "生命在于运动",任何疗法也代替不 |
|
|
|
+| 了运动。但是... |
|
|
|
+| |
|
|
|
+| [展开全文] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入文章详情
|
|
|
+ → 加载文章内容(富文本渲染)
|
|
|
+ → 图片懒加载
|
|
|
+
|
|
|
+步骤2:阅读文章
|
|
|
+ → 上下滚动
|
|
|
+ → 长文默认折叠,点击"展开全文"
|
|
|
+ → 展开后可继续阅读
|
|
|
+
|
|
|
+步骤3:返回
|
|
|
+ → 点击返回按钮
|
|
|
+ → 回到推荐列表(保持浏览位置)
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 文章加载失败 | "文章加载失败,请重试" |
|
|
|
+| 图片加载失败 | 显示默认占位图 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 16. 消息中心模块
|
|
|
+
|
|
|
+### 16.1 消息列表页面
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 消息中心 |
|
|
|
++----------------------------------+
|
|
|
+| [全部] [系统通知] [方案推送] |
|
|
|
++----------------------------------+
|
|
|
+| [头像] 系统消息 |
|
|
|
+| 向您推荐了新的艾灸方案 |
|
|
|
+| 2025-03-27 21:37 |
|
|
|
+| [●未读] |
|
|
|
++----------------------------------+
|
|
|
+| [头像] 孙佳敏 |
|
|
|
+| 向您推荐了新的艾灸方案 |
|
|
|
+| 2025-03-26 22:36 |
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+| [头像] 钱博雯 |
|
|
|
+| 向您推荐了新的艾灸方案 |
|
|
|
+| 2025-03-26 00:57 |
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 查看消息:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:进入消息中心
|
|
|
+ → 从个人中心点击"系统消息"进入
|
|
|
+ → 默认显示"全部"Tab
|
|
|
+ → 调用接口获取消息列表
|
|
|
+ → 显示未读消息红点
|
|
|
+
|
|
|
+步骤2:筛选消息
|
|
|
+ → 点击Tab切换:全部/系统通知/方案推送
|
|
|
+ → 切换时刷新列表
|
|
|
+
|
|
|
+步骤3:点击消息
|
|
|
+ → 标记为已读(红点消失)
|
|
|
+ → 调用已读接口
|
|
|
+ → 根据消息类型跳转:
|
|
|
+ - 方案推送:跳转到对应方案详情
|
|
|
+ - 系统通知:显示通知详情
|
|
|
+
|
|
|
+步骤4:下拉刷新
|
|
|
+ → 刷新消息列表
|
|
|
+ → 同步未读消息数
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 未读消息处理:**
|
|
|
+
|
|
|
+```
|
|
|
+APP启动时:
|
|
|
+ → 调用接口查询未读消息数量
|
|
|
+ → 数量>0:在个人中心"系统消息"项显示红点+数字
|
|
|
+ → 数量=0:不显示红点
|
|
|
+
|
|
|
+收到推送时:
|
|
|
+ → 显示系统通知栏推送
|
|
|
+ → APP内未读数+1
|
|
|
+ → 如果APP在前台,显示Toast提示
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 消息加载失败 | "消息加载失败,请重试" |
|
|
|
+| 标记已读失败 | 本地先标记,后台异步同步 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 17. 个人中心模块
|
|
|
+
|
|
|
+### 17.1 个人中心首页
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| 15066998888 |
|
|
|
+| 这是简介 |
|
|
|
+| [圆形头像] |
|
|
|
+| |
|
|
|
++----------------------------------+
|
|
|
+| ⭐ 个性化方案 > |
|
|
|
++----------------------------------+
|
|
|
+| 🔔 系统消息 > |
|
|
|
++----------------------------------+
|
|
|
+| ⬆️ 版本升级 > |
|
|
|
++----------------------------------+
|
|
|
+| ❓ 帮助 > |
|
|
|
++----------------------------------+
|
|
|
+| 📋 使用记录 > |
|
|
|
++----------------------------------+
|
|
|
+| ⬅️ 退出登录 > |
|
|
|
++----------------------------------+
|
|
|
+| [首页] [发现] [健康] [我的] |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+### 17.2 个性化方案
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"个性化方案"
|
|
|
+ → 跳转到"我的方案"列表页
|
|
|
+ → 同13.1方案列表操作
|
|
|
+```
|
|
|
+
|
|
|
+### 17.3 系统消息
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"系统消息"
|
|
|
+ → 跳转到消息中心页
|
|
|
+ → 同16.1消息列表操作
|
|
|
+ → 进入后自动标记该类消息为已读
|
|
|
+```
|
|
|
+
|
|
|
+### 17.4 版本升级
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 版本信息 |
|
|
|
++----------------------------------+
|
|
|
+| |
|
|
|
+| [APP图标] |
|
|
|
+| |
|
|
|
+| 研年健康平台 |
|
|
|
+| V1.0 |
|
|
|
+| |
|
|
|
+| +------------------------------+ |
|
|
|
+| | 检查更新 | |
|
|
|
+| +------------------------------+ |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程 - 检查更新:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"检查更新"
|
|
|
+ → 按钮变为loading
|
|
|
+ → 调用版本检测接口
|
|
|
+ 参数:当前平台(iOS/Android/HarmonyOS)、当前版本号
|
|
|
+ 返回:是否有更新、最新版本号、下载URL、更新类型
|
|
|
+
|
|
|
+步骤2:处理检查结果
|
|
|
+
|
|
|
+ 情况A:已是最新版
|
|
|
+ → 提示"当前已是最新版本"
|
|
|
+
|
|
|
+ 情况B:可选更新
|
|
|
+ → 弹窗:
|
|
|
+ 标题:"发现新版本 VX.X.X"
|
|
|
+ 内容:更新文案
|
|
|
+ 按钮:"暂不更新" / "立即更新"
|
|
|
+ → 点击"立即更新":跳转应用商店/下载URL
|
|
|
+
|
|
|
+ 情况C:强制更新
|
|
|
+ → 弹窗(不可关闭):
|
|
|
+ 标题:"重要更新"
|
|
|
+ 内容:"当前版本已不可用,请更新到最新版本"
|
|
|
+ 按钮:"立即更新"(唯一选项)
|
|
|
+ → 点击后跳转应用商店
|
|
|
+ → 不更新则无法继续使用APP
|
|
|
+
|
|
|
+步骤3:更新下载
|
|
|
+ → 显示下载进度
|
|
|
+ → 下载完成后自动安装(或提示安装)
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 检查更新失败 | "检查更新失败,请检查网络" |
|
|
|
+| 下载失败 | "下载失败,请重试" |
|
|
|
+| 安装失败 | "安装失败,请手动安装" |
|
|
|
+
|
|
|
+### 17.5 帮助中心
|
|
|
+
|
|
|
+**页面布局 - FAQ列表:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 全部问题 |
|
|
|
++----------------------------------+
|
|
|
+| 常见问题 |
|
|
|
+| |
|
|
|
+| 1. 如何注销 > |
|
|
|
++----------------------------------+
|
|
|
+| 2. 如何删除设备 > |
|
|
|
++----------------------------------+
|
|
|
+| 3. 如何关闭消息推送 > |
|
|
|
++----------------------------------+
|
|
|
+| 4. 搜索不到蓝牙 > |
|
|
|
++----------------------------------+
|
|
|
+| 5. 连不上设备 > |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**页面布局 - 问题详情:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 问题解答 |
|
|
|
++----------------------------------+
|
|
|
+| 连不上设备 |
|
|
|
+| |
|
|
|
+| 1. 检查设备是否接通电源 |
|
|
|
+| 2. 确认设备是否收到过外力碰撞, |
|
|
|
+| 若有可能已损坏,可联系售后 |
|
|
|
+| 维修,售后电话400-000-0000 |
|
|
|
+| 3. 检查手机蓝牙是否开启 |
|
|
|
+| 4. 确保设备在10米范围内 |
|
|
|
+| 5. 尝试重启设备和手机蓝牙 |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"帮助"
|
|
|
+ → 进入FAQ列表页
|
|
|
+
|
|
|
+步骤2:点击问题项
|
|
|
+ → 进入问题详情页
|
|
|
+ → 显示完整的解答内容
|
|
|
+
|
|
|
+步骤3:返回
|
|
|
+ → 点击返回回到列表页
|
|
|
+```
|
|
|
+
|
|
|
+**FAQ内容清单:**
|
|
|
+
|
|
|
+| 序号 | 问题 | 答案要点 |
|
|
|
+|------|------|---------|
|
|
|
+| 1 | 如何注销 | 个人中心→退出登录 |
|
|
|
+| 2 | 如何删除设备 | 首页→长按设备卡片→删除,或进入设备详情解除绑定 |
|
|
|
+| 3 | 如何关闭消息推送 | 手机系统设置→通知管理→研年健康→关闭推送 |
|
|
|
+| 4 | 搜索不到蓝牙 | 检查蓝牙开启、设备电源、距离10米内、设备未被他手机连接 |
|
|
|
+| 5 | 连不上设备 | 检查电源、重启设备、重启蓝牙、确认设备未被占用 |
|
|
|
+
|
|
|
+### 17.6 使用记录
|
|
|
+
|
|
|
+**页面布局:**
|
|
|
+```
|
|
|
++----------------------------------+
|
|
|
+| < 使用记录 |
|
|
|
++----------------------------------+
|
|
|
+| 2025年3月 |
|
|
|
++----------------------------------+
|
|
|
+| 我的艾灸椅 |
|
|
|
+| 操作记录 |
|
|
|
+| 2025-03-31 13:37 |
|
|
|
++----------------------------------+
|
|
|
+| 我的艾灸椅 |
|
|
|
+| 操作记录 |
|
|
|
+| 2025-03-31 05:11 |
|
|
|
++----------------------------------+
|
|
|
+| 我的艾灸椅 |
|
|
|
+| 操作记录 |
|
|
|
+| 2025-03-30 17:23 |
|
|
|
++----------------------------------+
|
|
|
+```
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"使用记录"
|
|
|
+ → 进入使用记录页
|
|
|
+ → 调用接口获取历史记录
|
|
|
+ → 按时间倒序排列
|
|
|
+ → 按月分组显示
|
|
|
+
|
|
|
+步骤2:浏览记录
|
|
|
+ → 上下滑动
|
|
|
+ → 上拉加载更多(分页)
|
|
|
+ → 下拉刷新
|
|
|
+
|
|
|
+步骤3:点击记录项
|
|
|
+ → 进入记录详情页(可选)
|
|
|
+ → 显示:设备/时间/功效/穴位/时长/温度
|
|
|
+```
|
|
|
+
|
|
|
+**错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 记录加载失败 | "加载失败,请重试" |
|
|
|
+| 暂无记录 | "暂无使用记录"(空状态) |
|
|
|
+
|
|
|
+### 17.7 退出登录
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:点击"退出登录"
|
|
|
+ → 底部弹出确认面板
|
|
|
+ → 标题:"确定退出登录?"
|
|
|
+ → 按钮:"取消" / "退出登录"(红色)
|
|
|
+
|
|
|
+步骤2:点击"取消"
|
|
|
+ → 关闭面板,留在当前页
|
|
|
+
|
|
|
+步骤3:点击"退出登录"
|
|
|
+ → 清除本地Token
|
|
|
+ → 清除本地用户信息(保留设备绑定信息)
|
|
|
+ → 跳转到登录页
|
|
|
+ → 下次需重新登录
|
|
|
+```
|
|
|
+
|
|
|
+**详细错误提示:**
|
|
|
+
|
|
|
+| 场景 | 错误提示 |
|
|
|
+|------|---------|
|
|
|
+| 退出时网络异常 | 本地清除数据,不影响退出 |
|
|
|
+| 清除数据失败 | 强制清除,跳转到登录页 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 18. 版本升级模块
|
|
|
+
|
|
|
+### 18.1 自动检查更新
|
|
|
+
|
|
|
+**操作流程:**
|
|
|
+
|
|
|
+```
|
|
|
+触发时机:
|
|
|
+ 1. APP冷启动时(一天内只检查一次)
|
|
|
+ 2. 用户手动点击"检查更新"
|
|
|
+
|
|
|
+步骤1:调用版本检测接口
|
|
|
+ → 参数:平台类型、当前版本号
|
|
|
+ → 返回:最新版本信息
|
|
|
+
|
|
|
+步骤2:版本对比
|
|
|
+ → 当前版本 < 最新版本:提示更新
|
|
|
+ → 当前版本 = 最新版本:不提示
|
|
|
+ → 当前版本 > 最新版本:不提示(可能是测试版)
|
|
|
+
|
|
|
+步骤3:更新策略
|
|
|
+ → 强制更新:阻断使用,必须更新
|
|
|
+ → 可选更新:用户可选择不更新
|
|
|
+ → 静默更新:后台下载,下次启动生效
|
|
|
+```
|
|
|
+
|
|
|
+### 18.2 版本管理后台配置
|
|
|
+
|
|
|
+后台支持配置的字段:
|
|
|
+
|
|
|
+| 字段 | 说明 |
|
|
|
+|------|------|
|
|
|
+| 平台 | iOS / Android / HarmonyOS |
|
|
|
+| 版本号 | 如 1.0.0 |
|
|
|
+| 更新类型 | 强制更新 / 可选更新 / 静默更新 |
|
|
|
+| 下载地址 | App Store链接 或 APK下载URL |
|
|
|
+| 更新文案 | 显示给用户看的更新说明 |
|
|
|
+| 最低支持版本 | 低于此版本必须更新 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 19. 蓝牙通信规范
|
|
|
+
|
|
|
+### 19.1 蓝牙连接状态机
|
|
|
+
|
|
|
+```
|
|
|
+[未初始化] --openAdapter--> [已初始化]
|
|
|
+[已初始化] --startScan--> [扫描中]
|
|
|
+[扫描中] --foundDevice--> [发现设备]
|
|
|
+[发现设备] --connect--> [连接中]
|
|
|
+[连接中] --success--> [已连接]
|
|
|
+[连接中] --fail--> [连接失败]
|
|
|
+[连接失败] --retry--> [连接中]
|
|
|
+[已连接] --disconnect--> [已断开]
|
|
|
+[已断开] --autoReconnect--> [连接中]
|
|
|
+[已连接] --switchDevice--> [连接中]
|
|
|
+```
|
|
|
+
|
|
|
+### 19.2 蓝牙操作流程
|
|
|
+
|
|
|
+**连接流程:**
|
|
|
+
|
|
|
+```
|
|
|
+步骤1:初始化蓝牙适配器
|
|
|
+ → uni.openBluetoothAdapter()
|
|
|
+ → 成功:进入步骤2
|
|
|
+ → 失败:提示用户开启蓝牙
|
|
|
+
|
|
|
+步骤2:开始搜索设备
|
|
|
+ → uni.startBluetoothDevicesDiscovery()
|
|
|
+ → 设置allowDuplicatesKey: false
|
|
|
+ → 设置interval: 1000
|
|
|
+
|
|
|
+步骤3:监听发现设备
|
|
|
+ → uni.onBluetoothDeviceFound()
|
|
|
+ → 过滤设备名称(包含"艾灸椅"或指定UUID)
|
|
|
+ → 收集设备列表
|
|
|
+
|
|
|
+步骤4:停止搜索
|
|
|
+ → uni.stopBluetoothDevicesDiscovery()
|
|
|
+ → 30秒超时自动停止
|
|
|
+
|
|
|
+步骤5:连接设备
|
|
|
+ → uni.createBLEConnection()
|
|
|
+ → 设置timeout: 10000
|
|
|
+ → 成功:进入步骤6
|
|
|
+ → 失败:提示重试
|
|
|
+
|
|
|
+步骤6:发现服务
|
|
|
+ → uni.getBLEDeviceServices()
|
|
|
+ → 找到指定Service UUID
|
|
|
+
|
|
|
+步骤7:发现特征值
|
|
|
+ → uni.getBLEDeviceCharacteristics()
|
|
|
+ → 找到:
|
|
|
+ - 写特征值(APP→设备指令)
|
|
|
+ - 读/通知特征值(设备→APP状态)
|
|
|
+
|
|
|
+步骤8:开启通知
|
|
|
+ → uni.notifyBLECharacteristicValueChange()
|
|
|
+ → 监听设备主动上报
|
|
|
+
|
|
|
+步骤9:监听数据
|
|
|
+ → uni.onBLECharacteristicValueChange()
|
|
|
+ → 解析设备上报数据,更新UI
|
|
|
+```
|
|
|
+
|
|
|
+### 19.3 蓝牙指令清单
|
|
|
+
|
|
|
+**连接管理类:**
|
|
|
+
|
|
|
+| 指令 | 命令字 | 说明 |
|
|
|
+|------|--------|------|
|
|
|
+| 设备发现 | 0x01 | 搜索附近艾灸椅 |
|
|
|
+| 建立连接 | 0x02 | 与指定设备建立BLE连接 |
|
|
|
+| 断开连接 | 0x03 | 主动断开连接 |
|
|
|
+| 心跳保活 | 0x04 | 维持连接状态 |
|
|
|
+| 操控权请求 | 0x05 | 请求设备操控权 |
|
|
|
+| 操控权释放 | 0x06 | 释放设备操控权 |
|
|
|
+
|
|
|
+**艾灸控制类:**
|
|
|
+
|
|
|
+| 指令 | 命令字 | 说明 |
|
|
|
+|------|--------|------|
|
|
|
+| 一键启动 | 0x10 | 参数:用户ID/指纹ID/方案ID |
|
|
|
+| 开始艾灸 | 0x11 | 启动当前方案 |
|
|
|
+| 暂停艾灸 | 0x12 | 灸头后退2cm,暂停计时 |
|
|
|
+| 继续艾灸 | 0x13 | 恢复施灸和计时 |
|
|
|
+| 结束艾灸 | 0x14 | 灸头归位,停止加热 |
|
|
|
+| 下发灸方 | 0x15 | 发送完整艾灸工艺数据包 |
|
|
|
+
|
|
|
+**参数控制类:**
|
|
|
+
|
|
|
+| 指令 | 命令字 | 说明 |
|
|
|
+|------|--------|------|
|
|
|
+| 座椅角度 | 0x20 | 参数:目标角度(90-150) |
|
|
|
+| 音量控制 | 0x21 | 参数:音量百分比(0-100) |
|
|
|
+| 音效选择 | 0x22 | 参数:音效编号(1-8) |
|
|
|
+| 音效播放控制 | 0x23 | 参数:播放/暂停/停止 |
|
|
|
+| 温度设置 | 0x24 | 参数:目标温度(38-44) |
|
|
|
+
|
|
|
+**数据采集类:**
|
|
|
+
|
|
|
+| 指令 | 命令字 | 说明 |
|
|
|
+|------|--------|------|
|
|
|
+| 读取艾材余量 | 0x30 | 返回剩余数量 |
|
|
|
+| 读取废料舱状态 | 0x31 | 返回容量百分比 |
|
|
|
+| 读取滤芯状态 | 0x32 | 返回寿命百分比 |
|
|
|
+| 读取温度 | 0x33 | 返回当前温度 |
|
|
|
+| 读取执行进度 | 0x34 | 返回当前穴位/剩余时长/手法 |
|
|
|
+| 读取设备状态 | 0x35 | 返回设备整体状态 |
|
|
|
+
|
|
|
+**用户管理类:**
|
|
|
+
|
|
|
+| 指令 | 命令字 | 说明 |
|
|
|
+|------|--------|------|
|
|
|
+| 指纹录入 | 0x40 | 启动设备指纹采集 |
|
|
|
+| 指纹查询 | 0x41 | 查询已绑定指纹列表 |
|
|
|
+| 方案同步 | 0x42 | 将方案同步到设备本地 |
|
|
|
+| 方案查询 | 0x43 | 查询设备已存储的方案 |
|
|
|
+
|
|
|
+### 19.4 数据上报格式
|
|
|
+
|
|
|
+**设备状态周期性上报(每2秒):**
|
|
|
+
|
|
|
+```
|
|
|
+数据格式:
|
|
|
+[当前穴位编号: 2B]
|
|
|
+[剩余时长(秒): 2B]
|
|
|
+[当前温度(℃): 1B]
|
|
|
+[当前手法: 1B] (0=悬定灸, 1=雀啄灸, 2=回旋灸)
|
|
|
+[设备状态: 1B] (0=待机, 1=预热, 2=运行, 3=暂停, 4=完成, 5=异常)
|
|
|
+[错误码: 1B] (0=无错误, 1=艾材不足, 2=废料满, 3=超温, 4=异物)
|
|
|
+[艾材余量: 1B]
|
|
|
+[废料舱百分比: 1B]
|
|
|
+[滤芯百分比: 1B]
|
|
|
+[预热进度: 1B] (0-100, 非预热时为0)
|
|
|
+[座椅当前角度: 1B]
|
|
|
+```
|
|
|
+
|
|
|
+**艾灸工艺数据包格式:**
|
|
|
+
|
|
|
+```
|
|
|
+[包头: 0xAA 0x55] (2B固定)
|
|
|
+[命令字: 0x15] (1B)
|
|
|
+[数据长度: 2B]
|
|
|
+[穴位数量: 1B] (1-3)
|
|
|
+[
|
|
|
+ [穴位编号: 2B]
|
|
|
+ [施灸时长(秒): 2B]
|
|
|
+ [施灸温度: 1B]
|
|
|
+ [施灸手法: 1B]
|
|
|
+] × 穴位数量
|
|
|
+[校验和: 1B]
|
|
|
+```
|
|
|
+
|
|
|
+### 19.5 蓝牙错误处理
|
|
|
+
|
|
|
+| 错误码 | 说明 | 处理方式 |
|
|
|
+|--------|------|---------|
|
|
|
+| 10000 | 未初始化蓝牙适配器 | 重新初始化 |
|
|
|
+| 10001 | 当前蓝牙适配器不可用 | 提示开启蓝牙 |
|
|
|
+| 10002 | 没有找到指定设备 | 重新搜索 |
|
|
|
+| 10003 | 连接失败 | 重试连接 |
|
|
|
+| 10004 | 没有找到指定服务 | 设备不兼容 |
|
|
|
+| 10005 | 没有找到指定特征值 | 设备固件异常 |
|
|
|
+| 10006 | 当前连接已断开 | 自动重连 |
|
|
|
+| 10007 | 当前特征值不支持此操作 | 设备版本过低 |
|
|
|
+| 10008 | 其余所有系统上报的异常 | 通用提示 |
|
|
|
+| 10009 | Android系统特有,系统版本低于4.3不支持BLE | 提示升级系统 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 20. 后台接口清单
|
|
|
+
|
|
|
+### 20.1 认证模块
|
|
|
+
|
|
|
+```
|
|
|
+POST /api/auth/send-sms
|
|
|
+ 请求参数:
|
|
|
+ phone: string (必填, 11位手机号)
|
|
|
+ 响应:
|
|
|
+ code: 200成功
|
|
|
+ message: "验证码已发送"
|
|
|
+ 错误:
|
|
|
+ 400: 手机号格式错误
|
|
|
+ 429: 发送过于频繁
|
|
|
+ 500: 服务器内部错误
|
|
|
+
|
|
|
+POST /api/auth/verify-login
|
|
|
+ 请求参数:
|
|
|
+ phone: string (必填)
|
|
|
+ code: string (必填, 6位验证码)
|
|
|
+ platform: string (ios/android/harmonyos)
|
|
|
+ deviceId: string (设备唯一标识)
|
|
|
+ 响应:
|
|
|
+ token: string (长期有效)
|
|
|
+ userId: string
|
|
|
+ isNewUser: boolean
|
|
|
+ userInfo: object
|
|
|
+ 错误:
|
|
|
+ 400: 验证码错误或已过期
|
|
|
+ 429: 验证次数过多
|
|
|
+
|
|
|
+POST /api/auth/third-party-login
|
|
|
+ 请求参数:
|
|
|
+ type: string (wechat/apple)
|
|
|
+ authCode: string
|
|
|
+ platform: string
|
|
|
+ 响应:同verify-login
|
|
|
+```
|
|
|
+
|
|
|
+### 20.2 用户模块
|
|
|
+
|
|
|
+```
|
|
|
+POST /api/user/profile
|
|
|
+ 请求参数:
|
|
|
+ name: string (1-20字符)
|
|
|
+ gender: number (0=女, 1=男)
|
|
|
+ age: number (1-120)
|
|
|
+ height: number (50-250, cm)
|
|
|
+ weight: number (10-300, kg)
|
|
|
+ 响应:userInfo对象
|
|
|
+
|
|
|
+GET /api/user/list
|
|
|
+ 响应:
|
|
|
+ users: array [{id, name, gender, age, height, weight, bodyData}]
|
|
|
+ maxCount: 10
|
|
|
+
|
|
|
+POST /api/user
|
|
|
+ 请求参数:同profile
|
|
|
+ 响应:新建的用户对象
|
|
|
+ 错误:
|
|
|
+ 409: 用户数量已达上限(10人)
|
|
|
+
|
|
|
+PUT /api/user/{id}
|
|
|
+ 请求参数:同profile
|
|
|
+ 响应:更新后的用户对象
|
|
|
+
|
|
|
+DELETE /api/user/{id}
|
|
|
+ 响应:204 No Content
|
|
|
+ 错误:
|
|
|
+ 400: 不能删除最后一个用户
|
|
|
+ 404: 用户不存在
|
|
|
+
|
|
|
+POST /api/user/body-data
|
|
|
+ 请求参数:
|
|
|
+ userId: string
|
|
|
+ shoulderHeight: number (肩高, cm)
|
|
|
+ shoulderWidth: number (肩宽, cm)
|
|
|
+ weight: number (kg)
|
|
|
+ 响应:
|
|
|
+ success: true
|
|
|
+ acupoints: object (穴位坐标计算结果)
|
|
|
+```
|
|
|
+
|
|
|
+### 20.3 设备模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/user/devices
|
|
|
+ 响应:
|
|
|
+ devices: array [{
|
|
|
+ id, name, macAddress,
|
|
|
+ connectStatus, lastConnectTime,
|
|
|
+ materialCount, wasteLevel, filterLevel
|
|
|
+ }]
|
|
|
+
|
|
|
+POST /api/user/devices/bind
|
|
|
+ 请求参数:
|
|
|
+ deviceName: string
|
|
|
+ macAddress: string
|
|
|
+ model: string
|
|
|
+ 响应:绑定的设备对象
|
|
|
+ 错误:
|
|
|
+ 409: 设备已被其他账号绑定
|
|
|
+ 409: 绑定数量已达上限(5台)
|
|
|
+
|
|
|
+DELETE /api/user/devices/{id}
|
|
|
+ 响应:204
|
|
|
+
|
|
|
+POST /api/user/devices/switch
|
|
|
+ 请求参数:
|
|
|
+ deviceId: string
|
|
|
+ 响应:当前设备对象
|
|
|
+```
|
|
|
+
|
|
|
+### 20.4 算法模块
|
|
|
+
|
|
|
+```
|
|
|
+POST /api/algorithm/acupoint-calculate
|
|
|
+ 请求参数:
|
|
|
+ userId: string
|
|
|
+ bodyData: {
|
|
|
+ shoulderHeight: number
|
|
|
+ shoulderWidth: number
|
|
|
+ weight: number
|
|
|
+ }
|
|
|
+ 响应:
|
|
|
+ acupoints: array [{
|
|
|
+ code: string (穴位编码)
|
|
|
+ name: string (穴位名称)
|
|
|
+ x: number (X坐标, mm)
|
|
|
+ y: number (Y坐标, mm)
|
|
|
+ z: number (Z坐标, mm)
|
|
|
+ }]
|
|
|
+
|
|
|
+POST /api/algorithm/moxa-plan
|
|
|
+ 请求参数:
|
|
|
+ userId: string
|
|
|
+ efficacy: string (功效类型)
|
|
|
+ acupoints: array (穴位坐标)
|
|
|
+ 响应:
|
|
|
+ plan: {
|
|
|
+ name: string
|
|
|
+ totalDuration: number (总时长, 秒)
|
|
|
+ acupoints: array [{
|
|
|
+ code, name, duration, temperature, technique
|
|
|
+ }]
|
|
|
+ }
|
|
|
+```
|
|
|
+
|
|
|
+### 20.5 方案模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/plan/list
|
|
|
+ 请求参数:
|
|
|
+ userId: string (可选, 不传则查询公用方案)
|
|
|
+ type: string (personal/public/directed)
|
|
|
+ page: number
|
|
|
+ pageSize: number
|
|
|
+ 响应:
|
|
|
+ total: number
|
|
|
+ list: array [{
|
|
|
+ id, name, author, type,
|
|
|
+ totalDuration, acupointCount,
|
|
|
+ acupoints: array,
|
|
|
+ createTime
|
|
|
+ }]
|
|
|
+
|
|
|
+GET /api/plan/{id}
|
|
|
+ 响应:方案详情对象
|
|
|
+
|
|
|
+POST /api/plan/save
|
|
|
+ 请求参数:
|
|
|
+ userId: string
|
|
|
+ name: string (1-30字符)
|
|
|
+ acupoints: array [{
|
|
|
+ code, duration, temperature, technique, order
|
|
|
+ }]
|
|
|
+ totalDuration: number
|
|
|
+ 响应:保存的方案对象
|
|
|
+
|
|
|
+POST /api/plan/copy
|
|
|
+ 请求参数:
|
|
|
+ planId: string
|
|
|
+ userId: string
|
|
|
+ 响应:复制的方案对象
|
|
|
+ 错误:
|
|
|
+ 403: 无权复制该方案
|
|
|
+ 404: 方案不存在
|
|
|
+
|
|
|
+DELETE /api/plan/{id}
|
|
|
+ 错误:
|
|
|
+ 403: 无权删除(非本人方案)
|
|
|
+ 409: 方案正在执行中
|
|
|
+```
|
|
|
+
|
|
|
+### 20.6 穴位模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/acupoint/list
|
|
|
+ 响应:
|
|
|
+ acupoints: array [{
|
|
|
+ code, name,
|
|
|
+ location: string (定位描述)
|
|
|
+ effect: string (作用描述)
|
|
|
+ defaultX, defaultY, defaultZ
|
|
|
+ }]
|
|
|
+```
|
|
|
+
|
|
|
+### 20.7 消息模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/message/list
|
|
|
+ 请求参数:
|
|
|
+ type: string (all/system/plan)
|
|
|
+ page: number
|
|
|
+ pageSize: number
|
|
|
+ 响应:
|
|
|
+ total: number
|
|
|
+ unreadCount: number
|
|
|
+ list: array [{
|
|
|
+ id, type, title, content,
|
|
|
+ sender, sendTime, isRead,
|
|
|
+ relatedId, relatedType
|
|
|
+ }]
|
|
|
+
|
|
|
+POST /api/message/read
|
|
|
+ 请求参数:
|
|
|
+ messageIds: array
|
|
|
+ 响应:更新的消息列表
|
|
|
+
|
|
|
+GET /api/message/unread-count
|
|
|
+ 响应:{ count: number }
|
|
|
+```
|
|
|
+
|
|
|
+### 20.8 版本模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/version/check
|
|
|
+ 请求参数:
|
|
|
+ platform: string
|
|
|
+ currentVersion: string
|
|
|
+ 响应:
|
|
|
+ hasUpdate: boolean
|
|
|
+ isForce: boolean
|
|
|
+ latestVersion: string
|
|
|
+ downloadUrl: string
|
|
|
+ updateLog: string
|
|
|
+ minSupportedVersion: string
|
|
|
+```
|
|
|
+
|
|
|
+### 20.9 记录模块
|
|
|
+
|
|
|
+```
|
|
|
+POST /api/record/report
|
|
|
+ 请求参数:
|
|
|
+ userId: string
|
|
|
+ deviceId: string
|
|
|
+ planId: string (可选)
|
|
|
+ efficacy: string (可选)
|
|
|
+ acupoints: array
|
|
|
+ totalDuration: number
|
|
|
+ avgTemperature: number
|
|
|
+ startTime: timestamp
|
|
|
+ endTime: timestamp
|
|
|
+ 响应:{ id: string }
|
|
|
+
|
|
|
+GET /api/record/list
|
|
|
+ 请求参数:
|
|
|
+ userId: string
|
|
|
+ startDate: string
|
|
|
+ endDate: string
|
|
|
+ page: number
|
|
|
+ pageSize: number
|
|
|
+ 响应:
|
|
|
+ total: number
|
|
|
+ list: array [{
|
|
|
+ id, deviceName, planName,
|
|
|
+ efficacy, acupoints, totalDuration,
|
|
|
+ avgTemperature, startTime, endTime
|
|
|
+ }]
|
|
|
+```
|
|
|
+
|
|
|
+### 20.10 推荐模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/recommend/hot
|
|
|
+ 请求参数:
|
|
|
+ userId: string (可选)
|
|
|
+ season: string (可选, 春夏秋冬)
|
|
|
+ 响应:推荐方案列表
|
|
|
+
|
|
|
+GET /api/recommend/personal
|
|
|
+ 请求参数:
|
|
|
+ userId: string (必填)
|
|
|
+ 响应:
|
|
|
+ basedOn: string (推荐理由)
|
|
|
+ plans: array
|
|
|
+```
|
|
|
+
|
|
|
+### 20.11 内容模块
|
|
|
+
|
|
|
+```
|
|
|
+GET /api/article/list
|
|
|
+ 请求参数:
|
|
|
+ category: string
|
|
|
+ page: number
|
|
|
+ pageSize: number
|
|
|
+ 响应:文章列表
|
|
|
+
|
|
|
+GET /api/article/{id}
|
|
|
+ 响应:文章详情
|
|
|
+```
|
|
|
+
|
|
|
+### 20.12 推送模块
|
|
|
+
|
|
|
+```
|
|
|
+POST /api/push/bind-token
|
|
|
+ 请求参数:
|
|
|
+ platform: string
|
|
|
+ pushToken: string
|
|
|
+ deviceId: string
|
|
|
+ 响应:{ success: true }
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 21. 全局错误码与提示文案
|
|
|
+
|
|
|
+### 21.1 系统级错误码
|
|
|
+
|
|
|
+| 错误码 | 错误描述 | 用户提示 | 处理方式 |
|
|
|
+|--------|---------|---------|---------|
|
|
|
+| 200 | 成功 | - | 正常流程 |
|
|
|
+| 400 | 请求参数错误 | "请求参数有误,请检查后重试" | 检查表单 |
|
|
|
+| 401 | 未授权/Token失效 | "登录已过期,请重新登录" | 跳转登录页 |
|
|
|
+| 403 | 无权访问 | "无权进行此操作" | 阻止操作 |
|
|
|
+| 404 | 资源不存在 | "请求的内容不存在" | 返回上一页 |
|
|
|
+| 409 | 资源冲突 | "操作冲突,请刷新后重试" | 刷新页面 |
|
|
|
+| 429 | 请求过于频繁 | "操作过于频繁,请稍后再试" | 延迟重试 |
|
|
|
+| 500 | 服务器内部错误 | "服务器繁忙,请稍后再试" | 重试 |
|
|
|
+| 502 | 网关错误 | "网络连接不稳定,请重试" | 重试 |
|
|
|
+| 503 | 服务不可用 | "服务暂时不可用" | 稍后重试 |
|
|
|
+| 504 | 网关超时 | "请求超时,请检查网络" | 重试 |
|
|
|
+
|
|
|
+### 21.2 业务错误码
|
|
|
+
|
|
|
+| 错误码 | 场景 | 用户提示 |
|
|
|
+|--------|------|---------|
|
|
|
+| 1001 | 手机号格式错误 | "请输入正确的11位手机号" |
|
|
|
+| 1002 | 验证码错误 | "验证码错误,请重新输入" |
|
|
|
+| 1003 | 验证码过期 | "验证码已过期,请重新获取" |
|
|
|
+| 1004 | 发送验证码过于频繁 | "发送过于频繁,请{seconds}秒后重试" |
|
|
|
+| 1005 | 用户数量已达上限 | "最多可添加10个用户" |
|
|
|
+| 1006 | 不能删除最后一个用户 | "至少保留一个用户" |
|
|
|
+| 1007 | 设备绑定数量已达上限 | "每个账号最多绑定5台设备" |
|
|
|
+| 1008 | 设备已被其他账号绑定 | "该设备已被其他账号绑定" |
|
|
|
+| 1009 | 方案穴位数超限 | "单次最多可选择3个穴位" |
|
|
|
+| 1010 | 方案总时长超限 | "总时长不超过30分钟" |
|
|
|
+| 1011 | 艾材不足 | "艾材不足,无法启动艾灸" |
|
|
|
+| 1012 | 废料舱已满 | "废料舱已满,无法启动艾灸" |
|
|
|
+| 1013 | 设备正在被操控 | "当前设备正在被其他手机操控" |
|
|
|
+| 1014 | 蓝牙未连接 | "设备未连接,请连接后重试" |
|
|
|
+| 1015 | 方案正在执行中 | "该方案正在执行,无法删除" |
|
|
|
+| 1016 | 无权操作此方案 | "无权操作此方案" |
|
|
|
+| 1017 | 体形数据不完整 | "请先完善体形信息" |
|
|
|
+| 1018 | 预热超时 | "预热超时,请检查设备后重试" |
|
|
|
+
|
|
|
+### 21.3 网络错误提示
|
|
|
+
|
|
|
+| 场景 | 用户提示 | 处理方式 |
|
|
|
+|------|---------|---------|
|
|
|
+| 无网络连接 | "网络连接失败,请检查网络设置" | 提供设置入口 |
|
|
|
+| 网络超时 | "网络请求超时,请重试" | 提供重试按钮 |
|
|
|
+| 网络不稳定 | "网络不稳定,请稍后再试" | 自动重试1次 |
|
|
|
+| 服务器维护 | "系统维护中,请稍后再试" | 显示维护页面 |
|
|
|
+| DNS解析失败 | "网络连接异常,请检查网络" | 重试 |
|
|
|
+| SSL证书错误 | "网络安全验证失败" | 提示安全风险 |
|
|
|
+
|
|
|
+### 21.4 设备端错误提示
|
|
|
+
|
|
|
+| 错误码 | 触发条件 | 提示方式 | 提示文案 |
|
|
|
+|--------|---------|---------|---------|
|
|
|
+| D001 | 艾材余量=3 | Toast | "艾材余量不足,剩余3个,请及时补充" |
|
|
|
+| D002 | 艾材余量=1 | 弹窗 | "艾材即将用完,只剩1个,建议补充后再使用" |
|
|
|
+| D003 | 艾材余量=0 | 弹窗+禁用 | "艾材已用完,无法启动艾灸,请补充艾材" |
|
|
|
+| D004 | 废料舱=80% | Toast | "废料舱即将满仓,请及时清理" |
|
|
|
+| D005 | 废料舱=100% | 弹窗+禁用 | "废料舱已满,无法启动艾灸,请清理废料舱" |
|
|
|
+| D006 | 滤芯=80% | Toast | "滤芯使用寿命即将到期,建议更换" |
|
|
|
+| D007 | 滤芯=100% | 弹窗 | "滤芯已到期,请更换滤芯以保证使用效果" |
|
|
|
+| D008 | 检测到异物 | 弹窗+暂停 | "检测到有异物,已暂停艾灸,清理后重试" |
|
|
|
+| D009 | 无法启动 | 弹窗 | "无法启动设备,请检查艾灸盒状态或是否正确连接" |
|
|
|
+| D010 | 耗材ID不符 | 弹窗 | "艾灸耗材ID不符,请检查艾灸盒或尝试重启设备" |
|
|
|
+| D011 | 设备断电 | 弹窗 | "设备已断电,艾灸已终止" |
|
|
|
+| D012 | 温度超上限 | Toast | "温度过高,已自动切换手法防止灼伤" |
|
|
|
+| D013 | 蓝牙断开 | Toast | "蓝牙连接断开,正在尝试重连..." |
|
|
|
+| D014 | 操控权冲突 | Toast | "当前设备正在被其他手机操控" |
|
|
|
+| D015 | 指纹不匹配 | Toast | "指纹不匹配,请重试" |
|
|
|
+| D016 | 预热失败 | 弹窗 | "预热失败,请检查设备后重试" |
|
|
|
+
|
|
|
+### 21.5 操作确认弹窗文案
|
|
|
+
|
|
|
+| 操作 | 弹窗标题 | 弹窗内容 | 确认按钮 |
|
|
|
+|------|---------|---------|---------|
|
|
|
+| 删除方案 | 确认删除 | 确定删除方案"XXX"?删除后无法恢复 | 删除(红) |
|
|
|
+| 删除用户 | 确认删除 | 确定删除用户"XXX"? | 删除(红) |
|
|
|
+| 结束艾灸 | 确认结束 | 确定结束本次艾灸? | 结束(红) |
|
|
|
+| 退出登录 | 确认退出 | 确定退出登录? | 退出(红) |
|
|
|
+| 解绑设备 | 确认解绑 | 确定解绑设备"XXX"? | 解绑(红) |
|
|
|
+| 覆盖保存 | 确认覆盖 | 该名称方案已存在,是否覆盖? | 覆盖 |
|
|
|
+| 离开编辑页 | 确认离开 | 当前编辑未保存,确定离开? | 离开(红) |
|
|
|
+
|
|
|
+### 21.6 状态文案汇总
|
|
|
+
|
|
|
+| 状态 | 显示文案 |
|
|
|
+|------|---------|
|
|
|
+| 蓝牙未连接 | "蓝牙未连接" |
|
|
|
+| 蓝牙已连接 | "蓝牙已连接" |
|
|
|
+| 蓝牙连接中 | "蓝牙连接中..." |
|
|
|
+| 正在预热 | "正在预热 {X}%" |
|
|
|
+| 已完成预热 | "已完成预热 100%" |
|
|
|
+| 正在艾灸 | "正在艾灸" |
|
|
|
+| 已暂停 | "已暂停 剩余{XX:XX}" |
|
|
|
+| 等待开始 | "等待开始 {XX:XX}" |
|
|
|
+| 艾灸已完成 | "艾灸已完成" |
|
|
|
+| 设备异常 | "设备异常:{错误原因}" |
|
|
|
+| 加载中 | "加载中..." |
|
|
|
+| 数据同步中 | "数据同步中..." |
|
|
|
+| 方案保存成功 | "方案保存成功" |
|
|
|
+| 方案删除成功 | "方案删除成功" |
|
|
|
+| 用户切换成功 | "已切换至用户:{用户名}" |
|
|
|
+| 设备添加成功 | "设备添加成功" |
|
|
|
+| 设备解绑成功 | "设备解绑成功" |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 22. 页面清单与路由表
|
|
|
+
|
|
|
+### 22.1 页面路由表
|
|
|
+
|
|
|
+| 页面ID | 页面名称 | 路径 | 类型 | 需登录 | 需蓝牙 |
|
|
|
+|--------|---------|------|------|--------|--------|
|
|
|
+| P001 | 隐私政策弹窗 | /pages/privacy/popup | 弹窗 | 否 | 否 |
|
|
|
+| P002 | 隐私政策详情 | /pages/privacy/detail | 页面 | 否 | 否 |
|
|
|
+| P003 | 登录页 | /pages/login/index | 页面 | 否 | 否 |
|
|
|
+| P004 | 补充信息 | /pages/user/profile-fill | 页面 | 是 | 否 |
|
|
|
+| P005 | 首页-设备列表 | /pages/home/index | Tab页 | 是 | 否 |
|
|
|
+| P006 | 添加设备 | /pages/device/add | 页面 | 是 | 是 |
|
|
|
+| P007 | 设备详情 | /pages/device/detail | 页面 | 是 | 是 |
|
|
|
+| P008 | 用户管理 | /pages/user/list | 页面 | 是 | 否 |
|
|
|
+| P009 | 体形录入 | /pages/user/body-data | 页面 | 是 | 否 |
|
|
|
+| P010 | 指纹录入 | /pages/user/fingerprint | 页面 | 是 | 是 |
|
|
|
+| P011 | 耗材管理 | /pages/device/consumable | 页面 | 是 | 是 |
|
|
|
+| P012 | 座椅角度 | /pages/device/seat-angle | 页面 | 是 | 是 |
|
|
|
+| P013 | 模式选择 | /pages/moxa/mode-select | 底部弹窗 | 是 | 否 |
|
|
|
+| P014 | 功效选择 | /pages/moxa/efficacy-select | 页面 | 是 | 否 |
|
|
|
+| P015 | 穴位编辑 | /pages/moxa/acupoint-edit | 页面 | 是 | 否 |
|
|
|
+| P016 | 艾灸执行 | /pages/moxa/executing | 页面 | 是 | 是 |
|
|
|
+| P017 | 音效选择 | /pages/moxa/sound-select | 底部弹窗 | 是 | 是 |
|
|
|
+| P018 | 方案确认 | /pages/moxa/plan-confirm | 弹窗 | 是 | 否 |
|
|
|
+| P019 | 预热中 | /pages/moxa/preheating | 页面 | 是 | 是 |
|
|
|
+| P020 | 我的方案 | /pages/plan/list | 页面 | 是 | 否 |
|
|
|
+| P021 | 方案详情 | /pages/plan/detail | 页面 | 是 | 否 |
|
|
|
+| P022 | 发现首页 | /pages/discover/index | Tab页 | 是 | 否 |
|
|
|
+| P023 | 专家方案 | /pages/discover/expert | 页面 | 是 | 否 |
|
|
|
+| P024 | 方案详情(发现) | /pages/discover/plan-detail | 页面 | 是 | 否 |
|
|
|
+| P025 | 健康推荐 | /pages/health/index | Tab页 | 是 | 否 |
|
|
|
+| P026 | 文章详情 | /pages/health/article-detail | 页面 | 是 | 否 |
|
|
|
+| P027 | 消息中心 | /pages/message/list | 页面 | 是 | 否 |
|
|
|
+| P028 | 消息详情 | /pages/message/detail | 页面 | 是 | 否 |
|
|
|
+| P029 | 个人中心 | /pages/mine/index | Tab页 | 是 | 否 |
|
|
|
+| P030 | 版本信息 | /pages/mine/version | 页面 | 是 | 否 |
|
|
|
+| P031 | 帮助中心 | /pages/mine/help | 页面 | 是 | 否 |
|
|
|
+| P032 | 问题详情 | /pages/mine/help-detail | 页面 | 是 | 否 |
|
|
|
+| P033 | 使用记录 | /pages/mine/records | 页面 | 是 | 否 |
|
|
|
+| P034 | 记录详情 | /pages/mine/record-detail | 页面 | 是 | 否 |
|
|
|
+
|
|
|
+### 22.2 路由跳转规范
|
|
|
+
|
|
|
+```
|
|
|
+页面跳转方式:
|
|
|
+- Tab切换:uni.switchTab()
|
|
|
+- 普通跳转:uni.navigateTo()
|
|
|
+- 重定向(不保留历史):uni.redirectTo()
|
|
|
+- 返回:uni.navigateBack()
|
|
|
+- 返回Tab页:uni.switchTab()
|
|
|
+
|
|
|
+页面返回规则:
|
|
|
+- 普通页面 → navigateBack()
|
|
|
+- 需要刷新上一页 → navigateBack() + 上一页onShow刷新
|
|
|
+- 跳转到Tab页 → switchTab()
|
|
|
+
|
|
|
+登录拦截:
|
|
|
+- 需登录页面:检查Token
|
|
|
+- 无Token → 保存当前路径 → 跳转登录页
|
|
|
+- 登录成功 → 恢复原路径
|
|
|
+```
|
|
|
+
|
|
|
+### 22.3 页面状态保持
|
|
|
+
|
|
|
+| 页面 | 状态保持策略 |
|
|
|
+|------|-------------|
|
|
|
+| 设备详情 | 保持蓝牙连接状态,onShow时刷新状态 |
|
|
|
+| 艾灸执行 | 后台运行保持连接,返回页面恢复状态显示 |
|
|
|
+| 方案编辑 | 页面隐藏时保存草稿,onShow时恢复 |
|
|
|
+| 消息列表 | onShow时刷新未读数 |
|
|
|
+| 使用记录 | 保持分页位置 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 附录
|
|
|
+
|
|
|
+### A. 功效与穴位映射表(参考)
|
|
|
+
|
|
|
+| 功效 | 推荐穴位 | 默认温度 | 默认手法 |
|
|
|
+|------|---------|---------|---------|
|
|
|
+| 驱寒 | 大椎、命门、关元 | 42℃ | 悬定灸 |
|
|
|
+| 祛风 | 风池、风门、肺俞 | 40℃ | 雀啄灸 |
|
|
|
+| 祛湿 | 足三里、阴陵泉、脾俞 | 40℃ | 悬定灸 |
|
|
|
+| 化瘀 | 血海、膈俞、肝俞 | 42℃ | 回旋灸 |
|
|
|
+| 化痰 | 丰隆、膻中、中脘 | 40℃ | 雀啄灸 |
|
|
|
+| 活血 | 心俞、厥阴俞、膻中 | 42℃ | 悬定灸 |
|
|
|
+| 扶阳 | 肾俞、命门、腰阳关 | 44℃ | 悬定灸 |
|
|
|
+| 养颜 | 百会、四白、迎香 | 38℃ | 雀啄灸 |
|
|
|
+
|
|
|
+### B. 音效列表详情
|
|
|
+
|
|
|
+| 编号 | 名称 | 时长 | 类型 |
|
|
|
+|------|------|------|------|
|
|
|
+| 1 | 河流 | 30分钟 | 自然水声 |
|
|
|
+| 2 | 夏雨 | 30分钟 | 雨声 |
|
|
|
+| 3 | 森林 | 30分钟 | 森林环境 |
|
|
|
+| 4 | 鸟鸣 | 30分钟 | 鸟鸣声 |
|
|
|
+| 5 | 漂流 | 30分钟 | 流水声 |
|
|
|
+| 6 | 雨滴 | 30分钟 | 细雨声 |
|
|
|
+| 7 | 炉火 | 30分钟 | 火焰声 |
|
|
|
+| 8 | 海浪 | 30分钟 | 海浪声 |
|
|
|
+
|
|
|
+### C. 温度与手法对照
|
|
|
+
|
|
|
+| 温度 | 适用手法 | 说明 |
|
|
|
+|------|---------|------|
|
|
|
+| 38℃ | 雀啄灸 | 温和,适合面部/敏感部位 |
|
|
|
+| 40℃ | 悬定灸 | 标准温度,适合大部分穴位 |
|
|
|
+| 42℃ | 悬定灸/回旋灸 | 较强刺激,适合背部大穴 |
|
|
|
+| 44℃ | 悬定灸 | 强刺激,适合耐受部位 |
|
|
|
+
|
|
|
+### D. 艾灸手法说明
|
|
|
+
|
|
|
+| 手法 | 描述 | 适用场景 |
|
|
|
+|------|------|---------|
|
|
|
+| 悬定灸 | 灸头固定于穴位上方不动 | 常规施灸 |
|
|
|
+| 雀啄灸 | 灸头快速上下提插 | 防灼伤/敏感部位 |
|
|
|
+| 回旋灸 | 灸头在穴位上方画圈 | 大面积温热 |
|
|
|
+
|
|
|
+### E. 开发排期建议
|
|
|
+
|
|
|
+| 阶段 | 内容 | 建议工期 |
|
|
|
+|------|------|---------|
|
|
|
+| 第一阶段 | 框架搭建 + 登录注册 + 用户管理 | 1周 |
|
|
|
+| 第二阶段 | 蓝牙模块 + 设备管理 + 连接绑定 | 1周 |
|
|
|
+| 第三阶段 | 艾灸功能(三种模式)+ 穴位编辑 | 1.5周 |
|
|
|
+| 第四阶段 | 方案管理 + 发现模块 | 1周 |
|
|
|
+| 第五阶段 | 消息中心 + 个人中心 + 版本升级 | 0.5周 |
|
|
|
+| 第六阶段 | 联调测试 + 优化修复 | 1周 |
|
|
|
+| **合计** | | **6周** |
|