APP详细功能设计文档
迅思维智能宠物喂食器 App
详细功能设计文档
文档版本: v2.1
更新日期: 2026-04-23
产品名称: 迅思维智能宠物喂食器
App 版本: v1.0.0
目录
- 文档说明
- 角色说明与缩略语
- 数据存储规格说明
- 功能模块总览
- 模块一:认证与账号
- 模块二:首页与设备概览
- 模块三:设备详情与实时监控
- 模块四:相册(抓拍与录像)
- 模块五:定时喂食计划
- 模块六:宠物管理
- 模块七:设备设置
- 模块八:家庭管理
- 模块九:消息中心
- 模块十:设备配网与绑定
- 模块十一:我的(个人中心)
1. 文档说明
1.1 目的
本文档为迅思维智能宠物喂食器 App 的详细功能设计说明,旨在明确 App 端、服务端、设备端在每个功能点上的具体职责、数据流转与状态管理,并对应 HTML 设计稿中的具体页面截图进行功能说明,为开发团队提供完整、可执行的功能规格参考。
1.2 适用范围
- 开发团队:App 端(iOS/Android)、服务端、设备端三方协同开发
1.3 阅读说明
- 每个功能模块均按 App端、服务端、设备端 三个视角展开
- 部分模块附有 设计稿截图索引,说明该功能在 HTML 设计稿中对应的页面位置
- 符号说明:
- 🟢 = 该端需处理
- ⚪ = 该端不参与
- ⭐ = 重点/关键逻辑
1.4 设计稿截图索引说明
本文档中每个模块标题下方均标注「设计稿对应页面」
开发/测试人员可打开 HTML 文件,定位到页面,查看该功能模块的视觉设计稿。
2. 角色说明与缩略语
2.1 系统角色
| 角色 | 说明 | 设计稿对应 |
|---|---|---|
| 管理员 | 家庭创建者,拥有设备管理、成员管理、喂食计划管理的全部权限,可删除/编辑所有计划 | 家庭管理页面(模块八) |
| 成员 | 被邀请加入家庭的账号,可查看设备状态、触发手动喂食、查看消息通知,不可编辑他人计划 | 首页设备卡片(模块二) |
| 设备 | 迅思维宠物喂食器硬件终端,通过 WiFi/蓝牙与 App 连接 | 设备详情页(模块三) |
2.2 设备型号规格
| 项目 | 规格 |
|---|---|
| 设备型号 | 暂无 |
| 设备名称格式 | XSW-型号-{随机4位字母}(例:XSW-PF200-AB12) |
| 固件命名 | xsw-pf200-v{x.y.z}.bin |
| 支持系统 | iOS 12.0+ / Android 8.0+ |
2.3 设备状态定义
| 状态 | 描述 | 显示文字 | 设计稿样式 |
|---|---|---|---|
online |
设备已联网,正常运行 | 🟢 正常 / 🟢 在线 | 首页卡片角标绿色 |
offline |
设备断网,无法连接 | 🔴 离线 | 首页卡片角标灰色 |
feeding |
正在出粮 | ⏳ 出粮中 | 首页卡片加载动画 |
error |
设备异常(卡粮、通信故障等) | ❌ 异常 | 首页卡片红色告警 |
2.4 缩略语
| 缩略语 | 全称 | 说明 |
|---|---|---|
| BLE | Bluetooth Low Energy | 低功耗蓝牙,用于设备配网 |
| MQTT | Message Queuing Telemetry Transport | 物联网消息传输协议 |
| OSS | Object Storage Service | 对象存储服务(阿里云/腾讯云) |
| CDN | Content Delivery Network | 内容分发网络 |
| OTA | Over-The-Air | 空中固件升级 |
| RTC | Real-Time Clock | 实时时钟,设备本地定时 |
| RTMP | Real-Time Messaging Protocol | 实时消息传输协议(设备视频推流) |
| HLS | HTTP Live Streaming | HTTP 直播流(App 拉流) |
| RTSP | Real Time Streaming Protocol | 实时流协议(局域网直连拉流) |
| JPEG | JPEG | 图片压缩格式 |
| AAC | Advanced Audio Coding | 音频编码格式 |
| ACK | Acknowledgement | 确认响应 |
| JWT | JSON Web Token | 用户身份令牌 |
| Redis | Redis | 内存数据库(验证码/会话存储) |
3. 数据存储规格说明
3.1 用户数据存储
3.1.1 照片存储
| 项目 | 规格 | 对应设计稿元素 |
|---|---|---|
| 单张图片大小 | ~200KB(JPEG 压缩,1280×960,质量 70%) | 相册页面网格展示(模块四) |
| 色彩格式 | JPEG(RGB) | — |
| 每用户照片上限 | 50 张 | 相册页面「已存 8/50 张」统计 |
| 保存时长 | 7 天(自动清理,超期服务端删除,App 端同步清除本地缓存) | — |
| 存储位置 | 服务端对象存储(OSS)+ CDN 加速 | — |
| 删除策略 | 后台定时任务(每日 03:00 UTC+8)按创建时间清理超过 7 天的记录 | — |
| 本地缓存 | App 本地不持久化照片,仅缓存缩略图(首次查看时缓存,缓存上限 20MB) | 相册页面图片占位符 |
3.1.2 视频存储
| 项目 | 规格 | 对应设计稿元素 |
|---|---|---|
| 单段视频时长 | 最长 30 秒(超过 30 秒自动截断) | 设备详情页录像按钮(按住录制 UI 提示) |
| 单段视频大小 | ~5MB(H.264,640×480,15fps,码率 ~1.5Mbps) | — |
| 视频格式 | MP4(H.264 视频 / AAC 音频) | — |
| 每用户视频上限 | 5 段 | 相册页面「已存 2/5 段」统计 |
| 保存时长 | 3 天(自动清理,超期服务端删除,App 端同步清除本地缓存) | — |
| 存储位置 | 服务端对象存储(OSS) | — |
| 删除策略 | 后台定时任务(每日 04:00 UTC+8)按创建时间清理超过 3 天的记录 | — |
3.1.3 设备状态数据结构
// 设备实时状态上报(MQTT / HTTP 轮询备用)
{
"device_id": "PF200-ABC123",
"sn": "XSW20260408PF200",
"model": "PF200",
"firmware_version": "v2.1.0",
"online": true,
"power_mode": "plug",
"battery_level": 100,
"food_level": 75,
"food_weight_g": 750,
"last_feeding_time": "2026-04-23T10:30:00+08:00",
"today_feeding_count": 3,
"today_feeding_total_g": 85,
"total_feeding_count": 128,
"total_feeding_g": 3840,
"runtime_hours": 12,
"network_rssi": -45,
"error_code": 0,
"error_message": "",
"camera_stream_url": "rtmp://media.xswei.com/live/PF200-ABC123",
"camera_status": "active",
"microphone_status": "active",
"speaker_status": "active",
"timestamp": "2026-04-23T11:55:00+08:00"
}
设备错误码定义:
| error_code | 说明 | 严重级别 | 用户提示 |
|---|---|---|---|
| 0 | 无错误 | — | — |
| 101 | 粮仓未安装 | 中 | 请正确安装粮仓 |
| 102 | 粮仓未关闭 | 中 | 请关闭粮仓盖 |
| 201 | 卡粮检测 | 高 | 出粮异常,请检查并清理出粮口 |
| 202 | 电机过载 | 高 | 电机异常,请联系客服 |
| 301 | 摄像头故障 | 低 | 摄像头异常,但喂食功能正常 |
| 302 | 麦克风故障 | 低 | 语音功能异常 |
| 303 | 扬声器故障 | 低 | 语音播放功能异常 |
| 401 | WiFi 连接断开 | 中 | 请检查网络连接 |
| 402 | 云端连接断开 | 中 | 请检查网络连接 |
| 403 | OTA 升级失败 | 中 | 固件升级失败,请重试 |
| 501 | 电池电量耗尽 | 高 | 设备电量耗尽,请充电 |
3.1.4 喂食记录存储
| 字段 | 类型 | 说明 |
|---|---|---|
| id | UUID | 记录唯一标识 |
| device_id | String | 设备 ID |
| user_id | String | 操作用户 ID |
| pet_id | String | 关联宠物 ID(可选,为 null 表示未关联宠物) |
| family_id | String | 家庭 ID |
| feed_type | Enum | manual(手动)/ scheduled(定时) |
| feed_plan_id | UUID | 关联的喂食计划 ID(定时喂食时有值) |
| feed_amount_g | Integer | 出粮量(克),实际出粮量(可能与计划不符,如卡粮时) |
| feed_time | DateTime | 喂食时间 |
| result | Enum | success / fail |
| fail_reason | String | 失败原因(result=fail 时有值) |
| actual_weight_g | Integer | 称重传感器实测重量(出粮后粮仓减少量) |
| food_level_after | Integer | 喂食后余粮百分比 |
- 存储时长:喂食记录永久保存,支持用户按月/按设备导出
- 查询限制:App 端单次查询最多返回 100 条,支持游标分页
- 设计稿对应:首页「今日统计」模块展示今日喂食次数和总克数;设备详情页展示今日/本周/本月统计
3.1.5 家庭数据存储
| 字段 | 说明 | 设计稿对应 |
|---|---|---|
| family_id | 家庭唯一 ID | — |
| family_name | 家庭名称(如「小贝一家」) | 首页顶部切换家庭下拉 |
| owner_id | 创建者(管理员)用户 ID | 家庭管理成员列表 |
| created_at | 创建时间 | — |
| address | 家庭地址(选填) | — |
| timezone | 时区(默认 Asia/Shanghai) | — |
| member_count | 成员数量(含管理员) | 我的页面「家庭×1」统计 |
4. 功能模块总览
| # | 模块名称 | App端 | 服务端 | 设备端 | 优先级 | 设计稿对应页面 |
|---|---|---|---|---|---|---|
| 1 | 认证与账号 | ✅ | ✅ | ⚪ | P0 | 登录/注册页 |
| 2 | 首页与设备概览 | ✅ | ✅ | ⚪ | P0 | 首页 |
| 3 | 设备详情与实时监控 | ✅ | ✅ | ✅ | P0 | 设备详情页 |
| 4 | 相册(抓拍与录像) | ✅ | ✅ | ✅ | P1 | 相册页 |
| 5 | 定时喂食计划 | ✅ | ✅ | ✅ | P0 | 喂食计划页 |
| 6 | 宠物管理 | ✅ | ✅ | ⚪ | P1 | 宠物页 |
| 7 | 设备设置 | ✅ | ✅ | ✅ | P1 | 设备设置页 |
| 8 | 家庭管理 | ✅ | ✅ | ⚪ | P1 | 家庭管理页 |
| 9 | 消息中心 | ✅ | ✅ | ⚪ | P1 | 消息页 |
| 10 | 设备配网与绑定 | ✅ | ✅ | ✅ | P0 | 添加设备页 |
| 11 | 我的(个人中心) | ✅ | ✅ | ⚪ | P2 | 我的页 |
5. 模块一:认证与账号
对应页面名称:登录/注册页面(auth-page)
设计稿截图说明:页面采用全屏渐变背景(深青→青→浅青),顶部居中 Logo + 应用名称,下方白色圆角卡片承载登录/注册表单。主Tab切换「登录」与「注册」,子Tab切换「验证码登录」与「密码登录」。!image-20260423163202366
5.1 模块概述
支持手机号 + 验证码登录、手机号 + 密码登录两种方式,以及新用户注册流程。账号体系为家庭共享制,同一手机号可加入多个家庭。
5.2 功能 1:验证码登录
功能描述:用户输入手机号,获取短信验证码,完成登录。
设计稿对应元素(HTML 第 530~600 行):
- 输入框:手机号输入框(带 +86 前缀标识)
- 获取验证码按钮(点击后显示60秒倒计时)
- 验证码6位数字输入框
- 登录按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 输入手机号(11位,中国大陆格式,+86前缀显示)→ 请求发送验证码 → 输入6位验证码 → 调用登录API → 存储JWT token → 跳转首页 |
| 服务端 | 🟢 验证手机号格式 → 生成6位数字验证码(不可重复使用)→ 存储Redis(key=sms:login:{phone},TTL=300s)→ 调用短信网关发送 → 验证用户输入 → 查找/创建用户记录 → 颁发JWT token |
| 设备端 | ⚪ 不参与 |
数据规格:
| 项目 | 规格 |
|---|---|
| 验证码长度 | 6位数字 |
| 验证码有效期 | 5分钟(300秒) |
| 同一手机号发送频率 | 最快60秒/次 |
| 错误重试限制 | 连续错误5次,锁定15分钟 |
| 锁定期间 | 返回错误码 ERR_CODE_LOCKED,不发送短信 |
| JWT access_token 有效期 | 7天 |
| JWT refresh_token 有效期 | 30天 |
5.3 功能 2:密码登录
功能描述:用户输入手机号和密码,完成登录。
设计稿对应元素
- 手机号输入框
- 密码输入框(带显示/隐藏切换图标)
- 记住账号复选框
- 忘记密码文字链接
- 登录按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 输入手机号 + 密码 → 勾选「记住账号」(本地存储手机号)→ 调用登录API → 存储token → 跳转首页 |
| 服务端 | 🟢 验证账号存在 → 验证密码(bcrypt 加密比对)→ 颁发JWT |
| 设备端 | ⚪ 不参与 |
密码规则:6-20位,支持字母、数字、符号混合,必须包含字母和数字。
5.4 功能 3:注册
功能描述:新用户通过手机号注册账号,注册成功后自动创建第一个家庭。
设计稿对应元素:
- 手机号输入框(+86前缀)
- 获取验证码按钮 + 验证码输入框
- 设置密码输入框(带显示/隐藏切换)
- 确认密码输入框
- 用户协议勾选框(链接到协议页)
- 注册按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 输入手机号 → 获取验证码 → 设置密码(6-20位,含字母和数字)→ 确认密码(与密码相同)→ 勾选同意协议 → 提交注册 |
| 服务端 | 🟢 验证手机号唯一性(未注册)→ 创建用户记录 → 颁发JWT → 自动创建第一个家庭(默认名称=「{昵称}的家庭」,可编辑) |
| 设备端 | ⚪ 不参与 |
数据规格:
| 项目 | 规格 |
|---|---|
| 手机号 | 11位中国大陆手机号(正则 /^1[3-9]\d{9}$/) |
| 密码 | 6-20位,必须包含字母和数字 |
| 确认密码 | 必须与密码完全一致 |
| 验证码 | 6位,有效期5分钟,同一手机号注册频率30天/次 |
| 昵称 | 选填,2-20字符,注册时默认取「用户{手机号后4位}」 |
注册后自动行为:
1. 颁发 JWT token(用户直接进入首页,无需重新登录)
2. 自动创建一个家庭(家庭名默认「{昵称}的家庭」)
3. 记录注册来源(iOS/Android/App版本)
5.5 功能 4:账号安全
功能描述:修改密码、绑定手机
设计稿对应:「我的」页面 → 设置入口 → 账号安全设置页
| 维度 | 说明 |
|---|---|
| App端 | 🟢 展示当前绑定信息(手机号脱敏显示 138****1234)→ 修改密码需验证旧密码 |
| 服务端 | 🟢 密码修改(校验旧密码后更新,bcrypt重加密) |
| 设备端 | ⚪ 不参与 |
6. 模块二:首页与设备概览
对应页面名称:首页(home-page)
设计稿截图说明:顶部渐变导航栏(青→深青),左上角应用 Logo + 「小贝一家」家庭名称(可点击展开切换),右上角消息图标(带未读数字红点)。主区域为设备卡片列表,每张卡片包含:设备缩略图(占位图)、设备名称、在线状态角标、今日喂食次数和总量。底部固定Tab栏(首页/相册/喂食/宠物/我的)。!image-20260423163501832
6.1 模块概述
首页是用户打开 App 后的第一个页面,展示已绑定设备的状态概览、快捷操作入口(手动喂食、定时计划入口)、家庭成员/宠物数量统计,以及宠物卡片展示。
6.2 功能 1:首页设备卡片
功能描述:展示设备名称、实时监控缩略图(占位图)、在线状态、今日喂食统计。
设计稿对应元素:
- 导航栏:家庭名称(带下拉箭头)+ 消息图标(红点未读数)
- 设备卡片:缩略图区(圆角矩形占位图)+ 设备名称 + 状态角标(在线/离线)+ 今日统计行(🍚今日喂食×3次,共85g)+ 底部快捷操作行
- 快捷操作行:📷 录像 ⏰ 计划 ⚙️ 设置
| 维度 | 说明 |
|---|---|
| App端 | 🟢 页面加载时请求设备列表 API → 展示设备卡片(名称、状态、余粮%、今日喂食次数)→ 点击卡片跳转设备详情 → 点击快捷操作图标分别跳转对应子页面 |
| 服务端 | 🟢 GET /api/v1/devices(查询当前用户有权限的设备列表,含实时状态);状态缓存策略:设备状态缓存 30 秒(Redis),减少设备端 MQTT 上报压力 |
| 设备端 | ⚪ 不参与 |
设备卡片数据结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| device_id | String | 设备唯一ID |
| device_name | String | 用户设置的设备名称 |
| online | Boolean | 是否在线 |
| food_level | Integer | 余粮百分比(0-100) |
| today_feeding_count | Integer | 今日喂食次数 |
| today_feeding_total_g | Integer | 今日喂食总量(克) |
| thumbnail_url | String | 设备监控缩略图 URL(最新帧) |
| camera_status | String | active=正常 / offline=故障 / disabled=已关闭 |
6.3 功能 2:手动喂食(快捷操作)
功能描述:在首页设备卡片下方提供「手动喂食」按钮,一键触发出粮。
设计稿对应元素:设备详情页设备卡片右下角「🍚 手动喂食」按钮(主题色按钮,点击后变为加载状态)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击「手动喂食」→ 显示加载态(按钮变灰+转圈)→ 请求 API → 等待设备响应(最多5秒)→ Toast 提示成功/失败结果 → 更新今日统计数据 |
| 服务端 | 🟢 接收请求 → 验证用户对设备操作权限(家庭成员关系查询)→ 验证设备在线状态 → 转发 MQTT 消息到设备 → 等待设备 ACK(超时5秒)→ 记录喂食日志 |
| 设备端 | 🟢 接收 MQTT 消息(topic=device/{device_id}/feed)→ 执行出粮动作(步进电机旋转指定角度)→ 称重传感器确认出粮量 → 上报出粮结果 |
手动喂食规格:
| 项目 | 规格 |
|---|---|
| 触发方式 | 点击按钮一次,出粮一份 |
| 默认出粮量 | 设备设置中的「默认出粮量」(范围 5-200g,可在设备设置页修改) |
| 出粮前检测 | 粮仓余量 < 默认出粮量时,弹出确认提示「余粮不足,是否继续?」 |
| 操作频率限制 | 同一设备两次手动喂食间隔 ≥ 1 分钟(防误触) |
| 成员权限 | 家庭成员均可触发手动喂食 |
6.4 功能 3:家庭切换
功能描述:同一账号可属于多个家庭,首页顶部显示当前家庭,点击可展开切换面板。
设计稿对应元素:导航栏左侧「🏠 小贝一家 ▾」(点击展开下拉面板,列出所有家庭+当前勾选标记)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击家庭名称展开切换面板 → 显示家庭列表(带勾选标记当前家庭)→ 选择后保存到本地(下次启动默认此家庭)+ 请求新家庭设备列表 → 刷新首页 |
| 服务端 | 🟢 GET /api/v1/families(返回用户所属全部家庭列表,含每家庭下的设备数量)→ 切换时 GET /api/v1/devices?family_id=xxx |
| 设备端 | ⚪ 不参与 |
7. 模块三:设备详情与实时监控
对应页面名称:设备详情页(live-page / device-detail-page)
设计稿截图说明:页面顶部为视频监控区(黑色背景16:9比例),左上角返回按钮,左上叠加设备名称标签,右上叠加「LIVE」红点+当前时间。视频下方为监控控制栏:抓拍按钮、录像按钮(全屏)、对讲按钮、全屏按钮。余粮进度条(大号环形图)+ 今日喂食统计卡片 + 快捷操作按钮组(设备设置/喂食计划/分享/更多)。!image-20260423163640968
7.1 模块概述
设备详情页是 App 的核心交互页面,包含实时视频监控画面、监控控制栏(抓拍/录像/对讲/全屏)、余粮/喂食统计、设备快捷操作入口。
7.2 功能 1:实时监控视频流
功能描述:显示设备摄像头实时画面(RTMP 推流 + HLS 拉流),左上角显示 LIVE 标识和当前时间,支持多码流切换。
设计稿对应元素:
- 视频区域:黑色16:9背景,摄像头画面填充
- 左上角:「📹 设备名称」白色半透明标签
- 右上角:「🔴 LIVE」红点标签 + 时间显示「14:32:05」
- 视频加载时:居中显示加载动画(旋转圆圈)
- 视频断开时:显示断连图标 + 「视频连接中断,点击重试」
- 音频:默认静音,开启对讲前保持静音
| 维度 | 说明 |
|---|---|
| App端 | 🟢 使用视频播放器组件(iOS: AVPlayer / Android: ExoPlayer)→ 连接 HLS 流地址(.m3u8)→ 播放实时画面 → 音频默认静音 → 断流自动重连(3次重试,间隔5秒,超限后显示手动重试按钮) |
| 服务端 | 🟢 提供 RTMP 接收地址(设备推流到 media server)→ 转 HLS(.m3u8 + .ts 分片,每个分片4秒)→ 流地址带临时 token(有效期10分钟,App 每8分钟刷新一次 token) |
| 设备端 | 🟢 摄像头采集视频 → H.264 编码 → 通过 RTMP 协议推流到服务端 media server(rtmp://media.xswei.com/live/{device_id})→ 设备端码率自适应(256kbps-2Mbps) |
⭐ 摄像头通道与多码流支持:
| 项目 | 规格 |
|---|---|
| 设备摄像头通道 | 单通道(内置摄像头,不可外接扩展) |
| 设备支持码流 | 设备端同时输出两路码流:主码流(高清,1920×1080)和 子码流(标清,640×480) |
| 默认码流 | 子码流(标清,节省带宽和设备资源) |
| App 码流切换 | 在设备设置页选择「标清 640×480」(默认)或「高清 1920×1080」,选择后服务端切换转码参数 |
| 推流协议 | RTMP(设备→服务端 media server) |
| App 拉流协议 | HLS(.m3u8 + .ts 分片,4秒一片,共缓存8片) |
| 端到端延迟 | ≤3秒(标清)/ ≤4秒(高清) |
视频流规格:
| 项目 | 规格(标清) | 规格(高清) | 说明 |
|---|---|---|---|
| 编码格式 | H.264 | H.264 | — |
| 分辨率 | 640×480 | 1920×1080 | 设备设置中可切换 |
| 帧率 | 15fps | 15fps | — |
| 码率 | 512kbps(自适应 256k-1M) | 1Mbps(自适应 512k-2M) | 网络差时自动降码率 |
| 音频 | AAC 32kbps 单声道 | AAC 32kbps 单声道 | — |
| HLS分片时长 | 4秒 | 4秒 | — |
| 离线判断 | 设备断网后,App端最多等待30秒自动显示离线状态 | — | — |
流地址刷新机制:
| 步骤 | 操作 |
|---|---|
| 1 | App 首次加载视频页 → GET /api/v1/devices/{id}/stream-url |
| 2 | 服务端返回: {hls_url: "https://.../live.m3u8?token=xxx", expires_at: "+10min"} |
| 3 | App 播放 HLS 流(AVPlayer / ExoPlayer) |
| 4 | 定时器每8分钟(或 expires_at 前2分钟)刷新 token |
| 5 | GET /api/v1/devices/{id}/stream-url(刷新)→ 播放器切换到新地址(无缝切换,不中断播放) |
7.3 功能 2:抓拍照片
功能描述:在监控画面上点击「抓拍」按钮,截取当前视频帧保存为 JPEG 图片,上传到服务端并存入相册。
设计稿对应元素:
- 监控控制栏第一个图标按钮「📷 抓拍」(圆形,蓝色渐变填充)
- 点击后:屏幕闪白一下(模拟快门效果)+ 右上角 Toast「✅ 抓拍成功,已保存到相册」
- 抓拍数量统计 +1(如「已存 9/50 张」)
设计稿对应元素(HTML 第 1325~1340 行):
- 设备详情页底部「抓拍与录像」入口卡片,显示缩略图预览 + 「12张照片 · 3个视频」统计
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击抓拍 → 从当前视频流解码当前帧(AVCaptureVideoDataOutput / VideoFrame)→ JPEG 压缩(1280×960,质量70%,约200KB)→ 显示本地预览(可选删除)→ 上传到服务端 → 保存到相册 → 更新本地统计 |
| 服务端 | 🟢 接收图片上传( multipart/form-data,单次≤500KB)→ 存储到 OSS → 生成 CDN URL → 写入数据库(关联 device_id、user_id、family_id、timestamp)→ 检查用户照片数量是否达到50张上限 → 超限则删除最早的1张 |
| 设备端 | ⚪ 不参与(App 端直接截取视频流帧,无需设备配合) |
⭐ 抓拍本地缓存策略:
| 阶段 | 行为 |
|---|---|
| 点击抓拍 | 立即截取视频帧(< 100ms 响应),显示快门效果(闪白100ms) |
| 生成JPEG | App 本地压缩(不请求服务端,< 500ms) |
| 本地预览 | 显示缩略图预览(1秒后自动消失,或用户手动删除) |
| 上传 | 后台上传(不阻塞用户继续操作),上传失败时本地保留3天并重试 |
| 本地临时文件 | 抓拍后立即上传,上传成功则删除本地临时文件;上传失败则保留并最多重试3次(间隔30秒/1分钟/5分钟) |
抓拍规格:
| 项目 | 规格 |
|---|---|
| 图片格式 | JPEG(RGB) |
| 分辨率 | 1280×960(固定,不受视频流分辨率影响) |
| 压缩质量 | 70% |
| 单张大小 | ~200KB |
| 每用户上限 | 50 张(超过自动删除最早的,不弹窗) |
| 保存时长 | 7 天(每日 03:00 UTC+8 后台清理) |
| 上传方式 | HTTPS POST multipart/form-data |
| 上传超时 | 10秒,超时提示「上传失败,点击重试」 |
| 快门响应时延 | < 100ms(从点击到屏幕闪白效果呈现) |
| 图片来源 | 截取当前视频播放器的解码帧,非设备端截图 |
7.4 功能 3:录像
功能描述:按住「录像」按钮开始录制,松开停止,生成最长 30 秒的 MP4 视频文件,上传到服务端并存入相册。
设计稿对应元素:
- 监控控制栏第二个图标按钮「🎬 录像」(圆形,红色填充)
- 按住时按钮变红色 + 显示 REC 标识 + 录制时长倒计时「⏺ REC 00:24 / 00:30」
- 下方文字提示「长按录像,最长30秒」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 按住录像按钮 → 请求麦克风权限(如无权限先申请)→ 开始录制本地临时视频文件(H.264,640×480,15fps)→ 屏幕顶部显示 REC 红点 + 时长倒计时 → 松手(或达到30秒)停止 → 视频压缩完成 → 上传到服务端 → 保存到相册 → Toast 提示 |
| 服务端 | 🟢 接收视频上传(multipart/form-data,≤10MB)→ 存储到 OSS → 写入数据库 → 检查视频数量是否达到5段上限 → 超限则删除最早的1段 |
| 设备端 | ⚪ 不参与(录像在 App 端本地完成,使用 App 自身摄像头和麦克风录制监控画面) |
⭐ 录像来源说明:
| 项目 | 说明 |
|---|---|
| 录像画面来源 | 截取设备监控视频流(App 端解码 H.264 帧并重新编码为 MP4) |
| 录像音频来源 | App 端麦克风采集(环境声音,即宠物和周围环境的声音) |
| 非设备端录音 | 录像中的声音是 App 端设备麦克风采集的声音,不是从设备端扬声器发出的声音 |
| 摄像头通道 | 固定使用当前设备的主码流(设备固件推流通道)进行录制,不可切换到其他通道 |
⭐ 录像上传路径分级策略:
| 阶段 | 存储位置 | 说明 |
|---|---|---|
| 录制中 | App 本地临时文件(.mp4) | 写入 App 临时目录(如 tmp/),防崩溃丢失 |
| 录制完成 | App 本地缓存(.mp4,保留至上传成功) | 上传期间本地保留备份 |
| 上传中 | 服务端 OSS(临时目录) | multipart 分片上传,支持断点续传 |
| 上传完成 | 服务端 OSS(正式目录) | 同时生成视频缩略图(FFmpeg 提取第1秒帧) |
| 用户查看 | CDN 加速分发(缩略图 + 视频流) | CDN URL 下发到 App |
录像断点续传机制:
| 场景 | 处理方式 |
|---|---|
| 上传中途网络断开 | 记录已上传分片 index,下次网络恢复后从断点继续(HTTP Range) |
| App 被系统杀掉 | 重新打开 App 时检测本地未上传完成的文件,自动续传 |
| 上传超过3次失败 | 保留本地文件,向用户提示「录像上传失败,请检查网络后重试」 |
| 每次上传重试间隔 | 30秒 → 1分钟 → 5分钟 |
录像规格:
| 项目 | 规格 |
|---|---|
| 视频格式 | MP4(H.264 视频 / AAC 音频) |
| 分辨率 | 640×480(固定,与视频流标清一致) |
| 帧率 | 15fps |
| 码率 | ~1.5Mbps(录制时实时编码) |
| 最长时长 | 30秒(超过自动截断) |
| 单段大小 | ~5MB |
| 每用户上限 | 5段(超过自动删除最早的,不弹窗) |
| 保存时长 | 3天(每日 04:00 UTC+8 后台清理) |
| 上传方式 | HTTPS POST multipart/form-data(大文件分片,每片1MB) |
| 上传超时 | 60秒(单片),整体上传无超时限制(后台执行) |
| 缩略图生成 | 服务端 FFmpeg 从视频第1秒提取一帧(JPEG,320×240) |
| 本地临时保留 | 上传成功前本地保留,上传成功后删除临时文件 |
7.5 功能 4:双向语音对讲
功能描述:点击「对讲」按钮,弹出对讲面板,支持按住说话将声音从设备端扬声器播放,同时设备端声音(宠物叫声等)传输到 App。
设计稿对应元素:
- 监控控制栏第三个图标按钮「🎤 对讲」(圆形,白色描边)
- 点击后:对讲面板从底部滑出(半透明遮罩 + 圆形说话按钮)
- 说话按钮居中,上方文字「按住说话,松开结束」
- 说话时按钮显示音量波形动画
- 对讲激活时,设备详情页视频画面左上角显示「🎤 对讲中」绿色标签
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击对讲按钮 → 弹出对讲面板 → App→设备方向:按住说话按钮 → 麦克风采集音频(Opus编码,16kHz单声道)→ 实时通过 WebSocket 发送到服务端 → 服务端转发到设备;设备→App方向:接收设备端音频流(WebSocket)→ Opus解码 → 扬声器/耳机播放 |
| 服务端 | 🟢 中转 App 端音频流到设备(WebSocket 连接池)→ 中转设备端音频流到 App → 音频流不存储(即用即弃) |
| 设备端 | 🟢 接收音频流(WebSocket 接收 Opus 包)→ Opus解码 → 通过扬声器播放(音量可调)→ 设备端麦克风采集声音(16kHz单声道)→ Opus编码 → WebSocket 上报到服务端 |
对讲规格:
| 项目 | 规格 |
|---|---|
| 编码格式 | Opus(App↔服务端)/ G.711 ulaw(备选兼容) |
| 采样率 | 16kHz |
| 声道 | 单声道 |
| 码率 | 32kbps(Opus) |
| 传输协议 | WebSocket(全双工实时) |
| 延迟要求 | ≤500ms(端到端) |
| 对讲超时 | 单次最长60秒(防止忘记松手一直占用) |
| 设备端扬声器 | 可在设备设置中关闭(speaker_status=disabled) |
| 设备端麦克风 | 可在设备设置中关闭(microphone_status=disabled) |
⭐ 全双工 vs 半双工:本设计采用半双工(同一时间只能一方说话),避免回声和干扰。设备端检测到环境音量过大(宠物叫声等)时,可自动降低上行音频码率。
7.6 功能 5:全屏模式
功能描述:点击「全屏」按钮,视频画面横屏全屏播放,控制栏隐藏,点击屏幕恢复竖屏。
设计稿对应元素:监控控制栏第四个图标按钮「⛶ 全屏」(圆形,白色描边),点击后屏幕旋转为横屏,视频铺满屏幕,顶部状态栏隐藏。
| 维度 | 说明 |
|---|---|
| App端 | 🟢 触发屏幕旋转为横屏(Landscape)→ 隐藏顶部导航栏和底部Tab栏 → 视频画面铺满屏幕 → 控制栏缩小悬浮在右下角(抓拍/录像图标)→ 点击屏幕任意位置呼出控制栏,3秒无操作再次隐藏 |
| 服务端 | ⚪ 不参与 |
| 设备端 | ⚪ 不参与 |
7.7 功能 6:余粮统计与今日喂食统计
设计稿对应元素:
- 余粮环形进度条(大号,显示百分比数字如「75%」,颜色渐变:>50%绿色,20-50%橙色,<20%红色)
- 下方文字「粮仓余量 / 约750g」(以克为单位展示实际重量)
- 今日统计卡片:今日喂食「3次」+ 总计「85g」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 页面加载时从设备状态数据获取 food_level 和 food_weight_g → 环形进度条按比例显示 → 低于20%时显示橙色警告 + 卡片顶部弹出「余粮不足」提示条 |
| 服务端 | 🟢 设备状态上报时携带 food_level(百分比)和 food_weight_g(实际克数) |
| 设备端 | 🟢 称重传感器实时监测粮仓重量 → MQTT 上报 food_level 和 food_weight_g |
8. 模块四:相册(抓拍与录像)
对应页面名称:相册页(album-page / gallery-page)
设计稿截图说明:顶部导航栏「📷 相册」+ 右上角「筛选」图标。筛选Tab:「全部 / 照片 / 视频」。主体为网格布局(3列),照片显示缩略图(圆角),视频缩略图叠加播放图标(▶)+ 时长标签(如「0:25」)。存储统计栏:「已存 10/50 张照片 · 2/5 段视频」。!image-20260423164016822
8.1 模块概述
相册页面集中管理用户在设备详情页抓拍的照片和录制的视频,提供筛选、预览、删除功能,并展示存储用量统计。
8.2 功能 1:相册列表展示
功能描述:以网格形式展示照片和视频缩略图,支持「全部/照片/视频」三种筛选。
设计稿对应元素:
- 筛选Tab栏(全部/照片/视频)
- 存储统计栏(显示「已存 10/50 张照片 · 2/5 段视频」,HTML 中无此文字元素但布局保留)
- 网格区域(3列,间距4px,照片/视频混合展示,)
- 视频缩略图叠加播放图标(▶)+ 时长标签(如「0:25」)
- 照片缩略图叠加抓拍时间(相对时间,如「3分钟前」)
设计稿对应元素:设备详情页底部「抓拍与录像」入口卡片:
- 左侧图标区(橙色渐变背景,照片图标)+ 标题「抓拍与录像」+ 统计文字「12张照片 · 3个视频」
- 右侧缩略图预览(3张圆形小图)
- 点击跳转到相册页
| 维度 | 说明 |
|---|---|
| App端 | 🟢 请求相册列表 API(GET /api/v1/media?type=all/photo/video&page=1&limit=20)→ 网格展示(3列)→ 视频缩略图叠加播放图标 + 时长 → 下拉刷新、上拉加载更多(20条/页)→ 首次加载显示骨架屏 |
| 服务端 | 🟢 查询当前用户相册记录(按时间倒序,按 media_type 过滤)→ 分页返回 → 视频额外返回缩略图 URL(服务端使用 FFmpeg 从视频第1秒提取帧作为缩略图) |
| 设备端 | ⚪ 不参与 |
数据规格:
| 字段 | 类型 | 说明 |
|---|---|---|
| media_id | UUID | 媒体记录唯一标识 |
| media_type | Enum | photo / video |
| cdn_url | String | CDN 访问 URL(照片原图 / 视频播放地址) |
| thumbnail_url | String | 缩略图 URL(照片小图 / 视频第一帧 JPEG) |
| device_id | String | 来源设备 ID |
| device_name | String | 来源设备名称(用户设置名) |
| duration | Integer | 视频时长(秒,仅 video 类型有值) |
| duration_label | String | 格式化时长标签,如「0:25」 |
| created_at | DateTime | 创建时间 ISO 8601 |
| relative_time | String | 相对时间描述,如「3分钟前」「昨天」 |
| photo_limit | Integer | 用户照片上限(固定50) |
| video_limit | Integer | 用户视频上限(固定5) |
| total_photo | Integer | 当前照片数量 |
| total_video | Integer | 当前视频数量 |
8.3 功能 2:照片预览与删除
功能描述:点击照片进入全屏预览,支持左右滑动切换照片,点击删除按钮并确认后删除。
设计稿对应元素(交互元素由 JS 控制):
- 全屏预览(黑色背景,图片居中,底部半透明信息栏)
- 底部信息栏:设备名称「小贝的喂食器」+ 抓拍时间「2026年4月23日 14:30」
- 右上角删除图标(🗑 红色)
- 左滑/右滑切换照片
- 底部操作栏:分享按钮 / 删除按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击照片 → 全屏预览 → 支持左滑/右滑切换(横向滚动,无限循环)→ 点击右上角删除图标 → 确认弹窗「确定删除这张照片?删除后无法恢复」→ 调用删除 API → 刷新当前列表 |
| 服务端 | 🟢 DELETE /api/v1/photos/{photo_id} → 删除 OSS 文件(异步任务)→ 删除数据库记录 → 返回成功 |
| 设备端 | ⚪ 不参与 |
8.4 功能 3:视频预览与删除
功能描述:点击视频缩略图调用系统播放器全屏播放,点击删除按钮并确认后删除。
设计稿对应元素:
- 点击后直接全屏播放(调用系统播放器,或 App 内嵌 ExoPlayer/AVPlayer)
- 播放界面:视频画面 + 进度条 + 时长显示 + 播放/暂停按钮
- 暂停时右上角显示删除图标(🗑)
- 删除确认弹窗「确定删除这段录像?删除后无法恢复」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击视频 → 调用系统播放器(AVPlayer / ExoPlayer)全屏播放 → 播放完成或点击删除 → 确认弹窗 → 调用删除 API → 刷新列表 |
| 服务端 | 🟢 DELETE /api/v1/videos/{video_id} → 删除 OSS 文件(异步)→ 删除数据库记录 → 返回成功 |
| 设备端 | ⚪ 不参与 |
8.5 功能 4:分享功能
功能描述:照片或视频支持分享到微信、朋友圈、QQ等。
设计稿对应元素:照片/视频预览页底部操作栏「分享」按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击分享 → 调起系统分享面板(ShareSheet)→ 支持分享图片(JPEG URL)或视频(本地文件路径) |
| 服务端 | ⚪ 不参与 |
8.6 存储规格总表(相册模块)
| 媒体类型 | 格式 | 分辨率 | 单文件大小 | 用户上限 | 保存时长 | 自动清理时间 |
|---|---|---|---|---|---|---|
| 照片 | JPEG | 1280×960 | ~200KB | 50张 | 7天 | 每日 03:00 UTC+8 |
| 视频 | MP4 (H.264) | 640×480, 15fps | ~5MB/段 | 5段 | 3天 | 每日 04:00 UTC+8 |
存储超限静默处理:达到上限后自动删除最早的记录,不弹窗提示用户,不打断当前操作流程。
9. 模块五:定时喂食计划
对应页面名称:喂食计划页(feeding-plan-page)
设计稿截图说明:顶部导航栏「⏰ 喂食计划」+ 右上角「+」添加按钮。主体为计划列表,每条计划卡片显示:宠物头像(emoji)/ 默认图标 + 宠物名称 + 喂食时间(加粗大字如「08:00」)+ 喂食份量「30g」+ 重复周期标签(周一至周日图标,高亮今日)+ 开关按钮(ON/OFF)。底部有「+ 添加计划」悬浮按钮。!image-20260423164207392
9.1 模块概述
管理员可创建、编辑、删除定时喂食计划(支持每日重复/按工作日/按指定星期重复)。设备端根据服务端下发的计划自动执行出粮,无需 App 在线。
9.2 功能 1:计划列表
功能描述:展示当前设备的所有喂食计划,显示时间、份量、宠物、重复周期、开关状态。
设计稿对应元素:
- 计划卡片:宠物图标 + 宠物名称 + 时间「08:00」(加粗)+ 份量「30g」+ 重复周期(周一到周日小圆点,当日为实心高亮)+ 开关按钮
- 空列表状态:「暂无喂食计划」+ 图标 + 「点击下方按钮添加」
- 管理员可见:编辑(✏️)和删除(🗑)操作入口
- 成员可见:仅显示列表,无法编辑
| 维度 | 说明 |
|---|---|
| App端 | 🟢 请求计划列表 API(GET /api/v1/feeding-plans?device_id=xxx)→ 列表展示(按时间排序)→ 管理员显示编辑/删除按钮;成员仅可开关计划 |
| 服务端 | 🟢 查询设备关联的计划列表 → 按计划时间排序返回 → 带上用户角色信息供 App 判断操作权限 |
| 设备端 | ⚪ 不参与 |
9.3 功能 2:新建计划
功能描述:管理员填写喂食计划表单,设置时间、宠物、份量、重复周期。
设计稿对应元素(表单页):添加计划页表单:
- 设备选择(如果家庭有多个设备,当前设备默认选中)
- 宠物选择(可跳过,显示「未关联宠物」)
- 喂食时间选择器(时钟样式,滚轮选择「08 : 00」)
- 出粮量选择器(滑块或数字输入,范围 5-200g,步进5g,显示刻度)
- 重复周期选择(周一到周日图标按钮组,点击切换选中状态)
- 保存按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 表单填写 → 验证必填项 → 提交 POST /api/v1/feeding-plans → 成功后返回列表页 |
| 服务端 | 🟢 创建计划记录 → 立即通过 MQTT 推送到设备端(设备本地存储)→ 记录操作日志 |
| 设备端 | 🟢 接收计划 MQTT 消息(topic=device/{device_id}/plan/update)→ 存储到本地 Flash → 按计划定时执行出粮(RTC 唤醒) |
新建计划数据规格:
| 项目 | 规格 |
|---|---|
| 出粮量范围 | 5-200g,步进 5g |
| 时间选择 | 00:00-23:59,精确到分钟 |
| 重复周期 | 周一至周日任意组合,至少选1天 |
| 常用快捷 | 「每天」一键选中周一到周日 / 「工作日」一键选中周一到周五 |
| 宠物关联 | 选填(不选=未关联宠物) |
| 每设备计划上限 | 20个 |
9.4 功能 3:编辑/删除计划
功能描述:管理员可编辑已有计划的任意字段;可删除计划(需二次确认)。
设计稿对应元素:
- 编辑:点击计划卡片或编辑按钮 → 进入编辑表单页(内容同新建,自动填充)
- 删除:点击删除按钮 → 弹出确认框「确定删除「08:00 · 30g」计划?删除后无法恢复」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 编辑:GET 填充表单 → PUT /api/v1/feeding-plans/{id};删除:确认弹窗 → DELETE → 刷新列表 |
| 服务端 | 🟢 更新/删除计划 → 立即 MQTT 通知设备端 |
| 设备端 | 🟢 接收 MQTT → 更新/删除本地 Flash 中对应计划 |
9.5 功能 4:计划开关(成员权限)
功能描述:所有家庭成员(包括普通成员)可开启/关闭某个喂食计划。
设计稿对应元素(每条计划右侧 Toggle Switch)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击开关 → PATCH /api/v1/feeding-plans/{id} {enabled: true/false} → 更新本地状态 → 成功则完成,失败则回滚开关状态 |
| 服务端 | 🟢 更新 enabled 字段 → MQTT 通知设备端 |
| 设备端 | 🟢 接收 MQTT → 更新本地计划 enabled 状态 → enabled=false 时跳过该计划执行 |
⭐ 权限规则:只有管理员可编辑/删除计划,普通成员仅可操作开关(开启/关闭某个计划),不可编辑时间/份量等核心字段。
9.6 功能 5:设备端定时执行
功能描述:设备端根据本地存储的计划,在设定时间到达时自动执行出粮动作。
| 维度 | 说明 |
|---|---|
| 服务端 | 🟢 不直接控制设备,设备自主执行;服务端记录每次计划喂食的执行结果(由设备上报) |
| 设备端 | 🟢 RTC 定时器监控(每分钟唤醒检查一次)→ 时间到达 + 当天 repeat_days 包含当前星期 → 步进电机出粮 → 称重传感器确认出粮量 → 与计划出粮量比对(误差±10g可接受)→ 上报执行结果 MQTT |
断网处理:
- 设备本地存储完整计划列表,断网期间 RTC 仍按计划执行出粮
- 联网后设备端立即上报断网期间的喂食记录(topic=device/{device_id}/feed/batch-report)
- 服务端接收后补录喂食记录,用户可在 App 中查看
卡粮处理:
- 称重传感器检测:出粮后若实际出粮量 < 计划量 - 10g,判定为卡粮
- 设备端自动重试(最多3次,每次间隔10秒)
- 重试仍失败:上报 error_code=201,App 推送告警消息「出粮异常,请检查并清理出粮口」
10. 模块六:宠物管理
对应页面名称:宠物页(pet-page)
设计稿截图说明:顶部导航栏「🐾 我的宠物」+ 右上角「+」添加按钮。主体为宠物卡片列表,每张卡片:宠物头像(大emoji或自定义图片,圆形)+ 宠物名称(加粗)+ 宠物类型/品种「小狗 · 柯基」+ 年龄/性别标签 + 底部操作「🍚 喂食记录」按钮。空列表状态:空白占位图 + 「还没有宠物,点击添加」+ 添加按钮。!image-20260423164501579
10.1 模块概述
管理家庭中的宠物档案(头像、名称、类型、品种、年龄、性别),宠物与喂食计划关联,便于记录每次喂食对应的宠物。
10.2 功能 1:宠物列表
功能描述:展示家庭所有宠物卡片(头像、名称、类型/品种/年龄/性别)。
设计稿对应元素:
- 宠物卡片:圆形头像(emoji 或自定义图片)+ 宠物名称 + 类型/品种行 + 年龄/性别标签
- 卡片底部:「🍚 喂食记录」按钮
- 管理员显示:编辑(✏️)和删除(🗑)操作入口
- 成员显示:仅查看,无法编辑
| 维度 | 说明 |
|---|---|
| App端 | 🟢 请求宠物列表 API(GET /api/v1/pets?family_id=xxx)→ 卡片展示 |
| 服务端 | 🟢 查询家庭关联的宠物列表,按创建时间排序 |
| 设备端 | ⚪ 不参与 |
10.3 功能 2:添加宠物
功能描述:填写宠物档案信息,选择/上传宠物头像。
设计稿对应元素(表单页):
- 头像选择区(顶部居中,圆形大头像选择框)
- 第一行:预设 emoji 头像网格(🐶🐱🐰🐹🐸🐦等12种)
- 第二行:「📷 上传图片」按钮(自定义图片,1MB以内)
- 宠物名称输入框(2-20字符)
- 宠物类型选择(小狗 / 猫咪 / 其他 → 二级选项)
- 品种输入框(选填)
- 生日选择器(选填)
- 性别选择(公 / 母 / 未知)
- 保存按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 选择 emoji 头像或上传自定义图片(JPEG/PNG,1MB以内,App端压缩到200KB)→ 填写表单 → POST /api/v1/pets |
| 服务端 | 🟢 创建宠物记录 → 存储头像图片到 OSS(自定义头像时) |
| 设备端 | ⚪ 不参与 |
10.4 功能 3:编辑宠物
功能描述:编辑已有宠物的档案信息(头像、名称、类型、品种、年龄、性别)。
设计稿对应元素:宠物卡片点击 → 编辑表单页(内容同添加,自动填充现有数据)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 GET 宠物详情 → 填充表单 → PUT /api/v1/pets/{id} |
| 服务端 | 🟢 更新宠物记录 |
| 设备端 | ⚪ 不参与 |
10.5 功能 4:删除宠物
功能描述:删除宠物档案,同时解除与喂食计划的关联(pet_id 置空,不删除计划本身)。
设计稿对应元素:宠物卡片 → 删除按钮 → 确认弹窗「确定删除「小贝」?删除后所有关联的喂食计划将取消与该宠物的关联,但计划本身不会删除。」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 确认弹窗 → DELETE /api/v1/pets/{id} → 刷新列表 |
| 服务端 | 🟢 删除宠物记录 → 解除喂食计划关联(pet_id 置空) |
| 设备端 | ⚪ 不参与 |
10.6 功能 5:宠物喂食记录
功能描述:点击宠物卡片的「🍚 喂食记录」按钮,查看该宠物的历史喂食记录。
设计稿对应元素:喂食记录列表页(时间倒序):
- 每条记录:时间标签「4月23日 08:05」+ 份量「30g」+ 喂食方式标签(手动/定时)+ 设备名称「小贝的喂食器」+ 状态(成功✅/失败❌)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 GET /api/v1/feeding-records?pet_id=xxx → 列表展示 → 分页加载 |
| 服务端 | 🟢 查询 pet_id 关联的喂食记录,按时间倒序分页返回 |
| 设备端 | ⚪ 不参与 |
11. 模块七:设备设置
对应页面名称:设备设置页(device-settings-page)
设计稿截图说明:顶部导航栏「⚙️ 设备设置」+ 返回按钮。设置分组列表:基本设置 / 喂食设置 / 摄像头设置 / 语音设置 / 设备信息 / 底部危险区(解除绑定)。!image-20260423164556958
11.1 模块概述
管理单个设备的配置项,包括基本设置、喂食设置、摄像头设置、语音设置和设备信息展示。
11.2 功能 1:基本设置
功能描述:修改设备名称、设置设备位置、显示供电模式。
设计稿对应元素:
- 设备名称输入框(点击编辑,弹出键盘)
- 设备位置选择器(6个预设选项圆形图标:客厅/卧室/阳台/厨房/其他)
- 供电模式显示(插电图标🔌 或电池图标🔋+百分比)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 点击设备名称 → 编辑 → PUT /api/v1/devices/{id} {device_name};点击位置选项 → PUT /api/v1/devices/{id} {location} |
| 服务端 | 🟢 更新设备配置 → 存储到数据库 → MQTT 下发到设备端(仅 device_name 需下发到设备) |
| 设备端 | 🟢 接收 device_name → 存储到本地 → 设备显示屏/LCD 显示名称(如有) |
11.3 功能 2:喂食设置
功能描述:设置默认出粮量(手动喂食和新建计划的初始值)、喂食声音开关、出粮提醒开关、低粮量提醒阈值。
设计稿对应元素:
- 默认出粮量滑块(范围 5-200g,步进5g,下方显示刻度标签)
- 喂食声音开关(开启时出粮播放提示音)
- 出粮提醒开关(开启时出粮后 App 推送通知)
- 低粮量提醒阈值滑块(范围 5%-50%,默认20%,下方文字「粮量低于此值时发送提醒」)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 调整滑块/开关 → 实时保存(防抖300ms后调用API) |
| 服务端 | 🟢 更新设备配置 → MQTT 即时下发到设备端 |
| 设备端 | 🟢 接收配置 → 存储到本地 Flash → 每次出粮时应用配置 |
11.4 功能 3:摄像头设置
功能描述:设置视频分辨率、红外夜视模式、录像画质。
设计稿对应元素:
- 画面分辨率选项:「标清 640×480」(默认)/「高清 1280×720」
- 红外夜视选项:「自动」(根据光线自动切换)/「始终开启」/「关闭」
- 录像画质选项:「标准画质」(默认)/「高清画质」(仅当分辨率设为高清时可用)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 选择后 PUT /api/v1/devices/{id}/camera {resolution, night_vision_mode, record_quality} |
| 服务端 | 🟢 更新配置 → MQTT 下发到设备端 |
| 设备端 | 🟢 接收配置 → 摄像头模组调整参数(分辨率切换需要短暂重启摄像头预览) |
⭐ 摄像头分辨率切换说明:
| 项目 | 标清模式(默认) | 高清模式 |
|---|---|---|
| 分辨率 | 640×480 | 1280×720 |
| 设备编码码率 | 512kbps(自适应 256k-1M) | 1Mbps(自适应 512k-2M) |
| 设备发热 | 正常 | 可能增加,建议不要长时间使用 |
| App 流量消耗 | ~400MB/小时 | ~800MB/小时 |
| 录像文件大小 | ~5MB/30秒 | ~10MB/30秒 |
| 服务端转码 | 标清 HLS 流 | 高清 HLS 流 |
11.5 功能 4:语音设置
功能描述:调节对讲音量、开关设备端声音(扬声器)、开关设备端麦克风。
设计稿对应元素:
- 对讲音量滑块(0-100,默认80)
- 设备端声音开关(开启后设备可播放 App 发送的语音)
- 设备端麦克风开关(开启后设备可采集声音发送给 App)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 滑块调整实时生效(发送音量值到设备)→ 开关切换调用 API |
| 服务端 | 🟢 更新配置 → MQTT 下发到设备端 |
| 设备端 | 🟢 接收音量值 → 实时应用到扬声器输出;接收开关状态 → 控制是否采集/播放音频 |
11.6 功能 5:设备信息展示
功能描述:展示设备型号、固件版本、设备ID、运行时长、累计喂食统计等只读元信息。
设计稿对应元素:
- 设备型号:PF200(只读文本)
- 设备ID:PF200-ABC123(只读文本,可复制)
- 固件版本:v2.1.0(只读文本,点击进入固件升级页)
- 设备SN:XSW20260408PF200(只读文本)
- 运行时长:12小时(「已稳定运行12小时5分钟」)
- 累计喂食:共128次 / 共3840g(只读文本)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 请求设备详情 API → 展示只读信息(复制按钮调用系统复制功能) |
| 服务端 | 🟢 提供设备详细信息(含固件版本、SN、运行时长、累计统计) |
| 设备端 | 🟢 设备端固件存储版本信息,通过状态上报携带 |
11.7 功能 6:固件升级(OTA)
功能描述:检测新版本固件,下载并升级设备固件。
设计稿对应元素(HTML 第 1900~1920 行,固件升级页):
- 当前版本:v2.1.0(显示)
- 最新版本:v2.2.0(如有新版本,显示)→ 新版本说明「修复了若干bug,提升了稳定性」
- 升级按钮(如有新版本,显示「检查更新」→「立即升级」)
- 升级进度:下载进度条(0-100%)+ 状态文字「正在下载固件…」「正在升级中…请勿断电」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 GET /api/v1/devices/{id}/firmware → 比对版本 → 有新版本时弹窗提示「发现新版本 v2.2.0,是否升级?」→ 用户确认 → 下载固件包(HTTPS 分段下载,支持断点续传)→ 通过 MQTT/TCP 将固件转发到设备 → 显示升级进度 → 设备升级完成重启 → App 检测设备上线 → Toast「升级成功」 |
| 服务端 | 🟢 提供固件版本查询接口 → 提供固件文件下载(CDN 加速,分段下载支持断点续传) |
| 设备端 | 🟢 接收固件包 → 校验签名(RSA-2048 或 AES 校验)→ 写入 Flash 备份区 → 校验通过后切换启动分区 → 重启 → 运行新固件 → MQTT 上报新版本号 |
固件升级规格:
| 项目 | 规格 |
|---|---|
| 固件包格式 | .bin(带 RSA-2048 签名头) |
| 最大固件大小 | 4MB |
| 签名校验 | 设备端验签通过后才写入 Flash,否则丢弃 |
| 升级方式 | App 端下载后通过 MQTT 转发到设备(设备在线时);或设备直连 OTA 服务器下载 |
| 断点续传 | 支持(HTTP Range 请求) |
| 升级期间 | 设备端停止推流和喂食,显示屏显示「升级中…」 |
| 升级失败处理 | 设备自动回滚到旧固件(双分区设计),上报升级失败日志 |
| 升级超时 | 设备端 5 分钟内未完成升级,判定为失败,触发回滚 |
11.8 功能 7:解除绑定
功能描述:将设备从当前家庭中移除,解除账号与设备的绑定关系。
设计稿对应元素:设备设置页底部「🚨 解除绑定」红色按钮(危险操作区),点击后:
- 确认弹窗「确定解除绑定「小贝的喂食器」?解除后您将无法通过此 App 控制该设备,其他家庭成员也将失去访问权限。」
- 二次确认:输入设备名称确认「请输入「小贝的喂食器」确认」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 二次确认输入设备名称 → POST /api/v1/devices/{id}/unbind → 清除本地设备缓存 → 返回首页(设备列表空状态) |
| 服务端 | 🟢 删除设备绑定记录 → 通知设备端清除配对信息(MQTT)→ 设备端清除配对信息后进入配网模式 |
| 设备端 | 🟢 接收解绑通知 → 清除本地用户绑定信息 → 进入配网模式(蓝色快闪) |
12. 模块八:家庭管理
对应页面名称:家庭管理页(family-page)
设计稿截图说明:顶部导航栏「👨👩👧 家庭管理」+ 返回按钮。主体区域:当前家庭信息卡片(家庭名称 + 成员数量)+ 成员列表(头像 + 昵称 + 角色标签「管理员★」/「成员」)+ 右上角「邀请成员」按钮。底部操作区:「编辑家庭信息」+ 「解散家庭」(仅管理员,无其他成员时可见)。!image-20260423164717172
12.1 模块概述
管理家庭单元,包括创建/编辑家庭信息、邀请/移除成员、设置成员角色(管理员/成员)。
12.2 功能 1:创建/编辑家庭
功能描述:创建新家庭(填写名称和地址);管理员可编辑家庭信息。
设计稿对应元素:
- 创建家庭表单:家庭名称输入框(必填,2-20字符)+ 家庭地址输入框(选填)
- 编辑家庭表单:同创建,自动填充现有数据
| 维度 | 说明 |
|---|---|
| App端 | 🟢 填写表单 → POST /api/v1/families 或 PUT /api/v1/families/{id} |
| 服务端 | 🟢 创建家庭记录 → 创建者自动成为管理员(角色=owner);更新时仅允许管理员操作 |
| 设备端 | ⚪ 不参与 |
12.3 功能 2:邀请成员
功能描述:通过二维码/邀请链接邀请他人加入家庭。
设计稿对应元素:
- 邀请页:家庭二维码(居中,可保存到相册)+ 复制链接按钮 + 分享到微信/QQ按钮
- 二维码下方文字:「扫描二维码加入「小贝一家」」「邀请链接有效期7天」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 展示家庭二维码(QRCode 生成,包含邀请链接 URL)→ 提供复制链接分享 |
| 服务端 | 🟢 生成带时效的家庭邀请码(UUID,有效期7天,存入 Redis,TTL=604800s)→ 生成邀请链接 URL → 被邀请人通过邀请链接打开 App → 自动填入邀请码 → 用户确认后加入家庭,角色默认为「成员」 |
| 设备端 | ⚪ 不参与 |
邀请规格:
| 项目 | 规格 |
|---|---|
| 邀请码格式 | UUID v4 |
| 邀请码有效期 | 7天(604800秒) |
| 邀请码使用次数 | 一次性的(加入后立即失效) |
| 邀请方式 | 二维码(URL 包含邀请码)/ 邀请链接 |
| 被邀请人角色 | 默认「成员」(非管理员) |
| 管理员可邀请上限 | 无限制 |
12.4 功能 3:移除成员
功能描述:管理员可移除其他成员(确认弹窗);成员不可移除自己(需联系管理员或退出家庭)。
设计稿对应元素:成员列表每项右侧「移除」按钮(红色文字,管理员操作),点击后:
- 确认弹窗「确定将「{成员昵称}」移出家庭?移出后该成员将无法访问家庭内的所有设备。」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 管理员点击移除 → 确认弹窗 → DELETE /api/v1/family-members/{member_id} |
| 服务端 | 🟢 删除成员关系 → 收回该成员对家庭设备的访问权限 |
| 设备端 | ⚪ 不参与 |
⭐ 权限规则:
- 管理员不可移除自己
- 家庭至少保留 1 名管理员
- 若管理员要退出家庭,必须先转移管理员权限给其他成员
- 成员可主动退出家庭(「退出家庭」按钮在成员个人卡片中)
13. 模块九:消息中心
对应页面名称:消息页(message-page)
设计稿截图说明:顶部导航栏「🔔 消息」+ 右上角「⚙️ 消息设置」按钮。筛选Tab:「全部 / 喂食 / 设备 / 系统」。主体为消息列表,每条消息卡片:左侧图标(🔔喂食/⚠️设备/📢系统)+ 消息标题(加粗)+ 消息摘要(灰色小字)+ 时间标签(右侧「3分钟前」/「昨天」)。未读消息左侧有蓝色竖条标记。!image-20260423164807542
13.1 模块概述
集中展示系统推送通知,包括喂食完成通知、设备告警通知、家庭成员变动通知、系统公告等。
13.2 功能 1:消息列表
功能描述:按时间倒序展示消息,支持按类型筛选(全部/喂食/设备/系统),未读消息有蓝色左侧竖条标记。
设计稿对应元素:
- 消息列表:每条消息卡片 + 未读蓝色竖条 + 标题 + 摘要 + 时间
- 筛选Tab(全部/喂食/设备/系统)
- 消息详情页:点击卡片 → 进入详情页(全屏消息内容+相关操作按钮)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 请求消息列表(GET /api/v1/messages?type=all/feed/device/system&page=1&limit=20)→ 列表展示 → 点击标记已读 → 下拉刷新、上拉加载更多 |
| 服务端 | 🟢 查询用户消息记录(关联 family_id 下的所有消息)→ 按时间倒序分页返回 |
| 设备端 | ⚪ 不参与 |
消息已读策略:
- App 端进入消息列表页时,静默将当前屏所有消息标记为已读(批量 PATCH)
- 进入单条消息详情页时,单独标记该消息为已读
- 底部Tab栏消息图标显示未读数字红点(实时更新)
13.3 功能 2:消息推送触发
功能描述:服务端根据事件类型生成并推送消息,同时通过极光/友盟/自建 Push 通道推送到 App。
| 触发场景 | 消息类型 | 推送标题 | 推送内容示例 | 消息卡片图标 |
|---|---|---|---|---|
| 手动喂食完成 | 喂食 | 🍚 喂食完成 | 「小贝的喂食器已完成出粮 30g」 | 🍚 |
| 定时计划执行完成 | 喂食 | ⏰ 计划喂食 | 「08:00 计划喂食 30g 已完成」 | ⏰ |
| 定时计划执行失败 | 喂食 | ⚠️ 喂食异常 | 「08:00 计划喂食失败:卡粮检测」 | ⚠️ |
| 粮量低于阈值 | 设备告警 | ⚠️ 余粮不足 | 「小贝的喂食器余粮仅剩 15%,请及时补充」 | ⚠️ |
| 设备上线 | 设备状态 | 🟢 设备在线 | 「小贝的喂食器已连接网络」 | 🟢 |
| 设备离线 | 设备状态 | 🔴 设备离线 | 「小贝的喂食器已离线,请检查」 | 🔴 |
| 设备电量低 | 设备告警 | 🔋 电量不足 | 「小贝的喂食器电量仅剩 10%,请充电」 | 🔋 |
| 固件升级完成 | 设备更新 | ✨ 固件升级 | 「小贝的喂食器已升级到 v2.2.0」 | ✨ |
| 新成员加入 | 家庭通知 | 👋 新成员 | 「妈妈 已加入家庭「小贝一家」」 | 👋 |
| 成员被移除 | 家庭通知 | 👋 成员变动 | 「您已被移出家庭「小贝一家」」 | 👋 |
| App 更新 | 系统通知 | 📱 更新提示 | 「App 已更新到最新版本 v1.0.1,点击查看」 | 📱 |
13.4 功能 3:消息设置
功能描述:用户可开关各类消息通知(喂食提醒、低粮量提醒、设备离线提醒、低电量提醒、免打扰模式)。
设计稿对应元素(消息设置页):
- 喂食提醒开关(默认开启)
- 低粮量提醒开关(默认开启)
- 设备状态提醒开关(默认开启)
- 低电量提醒开关(默认开启)
- 免打扰时段开关(默认关闭):开启后显示时间选择器「22:00 - 08:00」
| 维度 | 说明 |
|---|---|
| App端 | 🟢 Switch 开关 → PUT /api/v1/users/{id}/notification-settings |
| 服务端 | 🟢 存储用户通知偏好 → 发送推送时检查用户设置 |
| 设备端 | ⚪ 不参与 |
免打扰时段规格:
- 默认关闭
- 开启后:22:00 - 08:00(可自定义开始和结束时间)
- 免打扰时段内:暂停喂食提醒、设备状态提醒、低电量提醒
- 强制推送例外:低粮量严重告警(<10%)和设备 error_code 为高严重级别时,即使在免打扰时段内也强制推送
14. 模块十:设备配网与绑定
对应页面名称:添加设备页(add-device-page / add-method-page / bluetooth-add-page / wifi-add-page)
设计稿截图说明:顶部导航栏「➕ 添加设备」+ 返回按钮。主体为配网引导页:步骤指示器「① 选择方式 ② 连接设备 ③ 完成绑定」。下方两个大卡片选项:「📡 蓝牙添加(推荐)」+ 「📶 WiFi添加」。
!image-20260423164854799
14.1 模块概述
用户将新设备添加到 App 的过程,支持蓝牙添加(推荐)和 WiFi 添加两种方式。设备配网是用户首次使用的关键流程。
14.2 功能 1:添加方式选择
功能描述:引导用户选择蓝牙添加或 WiFi 添加,推荐蓝牙方式。
设计稿对应元素:
- 两个并列大卡片:「📡 蓝牙添加(推荐)」+ 「📶 WiFi添加」
- 蓝牙卡片带「推荐」标签(绿色小标签)
- 点击卡片进入对应配网流程
| 维度 | 说明 |
|---|---|
| App端 | 🟢 展示两种添加方式卡片 → 检测手机蓝牙状态(未开启时引导开启)→ 用户选择后进入对应流程 |
| 服务端 | ⚪ 不参与 |
| 设备端 | ⚪ 不参与 |
14.3 功能 2:蓝牙添加(推荐)
功能描述:通过 BLE(低功耗蓝牙)搜索附近设备并连接,完成设备配网和账号绑定。
设计稿对应元素:
- 步骤1:设备通电 → 说明「长按设备复位键3秒,指示灯蓝色快闪表示进入配网模式」
- 步骤2:搜索设备 → 显示 BLE 扫描动画(圆形扩散效果)+ 发现的设备列表(名称如「XSW-PF200-AB12」)
- 步骤3:连接中 → 显示进度「正在连接…」「正在配网…」「绑定成功」
- 完成页:设备图片 + 「小贝的喂食器 已添加成功」+ 「去看看」按钮
| 维度 | 说明 |
|---|---|
| App端 | 🟢 BLE 扫描(过滤设备名称前缀 XSW-PF200)→ 用户点击选择设备 → BLE 连接 → 发送配网指令 → 设备连接 WiFi 和 MQTT → App 与设备交换认证信息 → 调用绑定 API |
| 服务端 | 🟢 创建设备绑定记录(device_id + user_id + family_id)→ 下发设备初始配置到 MQTT |
| 设备端 | 🟢 BLE 接收配网指令 → 连接指定 WiFi(SSID/密码由 App 通过 BLE 下发)→ 连接云端 MQTT 服务器 → 验证配对码 → 发送设备认证信息 |
设备指示灯状态(蓝牙添加全程):
| 阶段 | 指示灯状态 | 持续时间 |
|---|---|---|
| 出厂状态(未配网) | 蓝色缓慢闪烁(2Hz) | 持续 |
| BLE 连接中 | 蓝色快速闪烁(5Hz) | 直到 BLE 连接成功 |
| WiFi 连接中 | 蓝色常亮 | 直到 WiFi 连接成功 |
| MQTT 连接中 | 绿色快速闪烁 | 直到 MQTT 连接成功 |
| 绑定成功 | 绿色常亮 | 3秒后熄灭 |
| 绑定失败 | 红色闪烁3次 | 然后恢复出厂状态指示灯 |
14.4 功能 3:WiFi 添加
功能描述:通过设备热点连接 WiFi 网络,完成配网和绑定(蓝牙不可用时的备选方案)。
设计稿对应元素:
- 步骤1:设备通电 → 说明「长按设备复位键3秒,指示灯蓝色快闪」
- 步骤2:连接设备热点 → 说明「在手机 WiFi 设置中连接 XSW-PF200-XXXX 热点」
- 步骤3:选择 WiFi → App 显示手机当前 WiFi 列表,用户选择家庭 WiFi 并输入密码
- 步骤4:配网中 → 进度条「正在配置…」
- 完成页:同蓝牙添加
| 维度 | 说明 |
|---|---|
| App端 | 🟢 引导用户连接设备热点(App 打开系统 WiFi 设置页)→ 获取用户输入的 WiFi SSID/密码 → 通过 HTTP 发送到设备热点 → 设备连接真实 WiFi 后获取 IP → App 检测到设备上线 → 绑定 API |
| 服务端 | 🟢 同蓝牙添加 |
| 设备端 | 🟢 设备开启热点(SoftAP)→ 接收 App 通过 HTTP POST 下发的 WiFi SSID/密码 → 切换到目标 WiFi → 连接 MQTT → 绑定 |
15. 模块十一:我的(个人中心)
对应页面名称:我的页面(profile-page / mine-page)
设计稿截图说明:顶部导航栏「👤 我的」或用户头像+昵称区。主体为菜单列表:消息通知 / 家庭管理 / 账号安全 / 清理缓存 / 关于我们 / 退出登录。底部显示 App 版本号。!image-20260423164929006
15.1 模块概述
展示用户个人信息,提供账号安全、通知设置、缓存清理、关于等辅助功能入口。
15.2 功能 1:个人信息展示
功能描述:展示用户头像、昵称、手机号(脱敏)、家庭数量。
设计稿对应元素:
- 用户头像(圆形,可点击编辑)
- 昵称(加粗)
- 手机号脱敏显示(138****1234)
- 家庭数量统计(「家庭 ×2」)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 请求用户详情 API(GET /api/v1/users/me)→ 展示个人信息 |
| 服务端 | 🟢 返回用户完整信息(头像 URL、昵称、手机号脱敏、家庭列表) |
| 设备端 | ⚪ 不参与 |
15.3 功能 2:账号安全
功能描述:修改密码、绑定微信、设置生物识别登录(见模块一 5.5 账号安全)。
15.4 功能 3:消息通知设置
功能描述:开关各类消息通知(见模块九 13.4 消息设置)。
15.5 功能 4:清理缓存
功能描述:一键清理 App 本地缓存(缩略图、临时文件)。
设计稿对应元素:
- 当前缓存大小显示(如「当前缓存 12.5MB」)
- 「清理缓存」按钮(点击后显示清理进度,清理完成后显示「已清理 0MB」)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 检测本地缓存目录大小 → 用户点击清理 → 删除本地缩略图缓存、临时文件、上传失败的待重试文件 → 显示清理后大小(通常为 0MB 或很小) |
| 服务端 | ⚪ 不参与 |
| 设备端 | ⚪ 不参与 |
清理范围:
| 缓存类型 | 清理策略 |
|---|---|
| 缩略图缓存 | 清理相册缩略图缓存(下次查看时重新下载) |
| 临时文件 | 清理上传失败的录像临时文件(已上传成功的不保留) |
| 抓拍预览缓存 | 清理本地生成的 JPEG 预览文件(已上传成功的不保留) |
| 登录 Token | 不清理(保留登录状态) |
| 本地设备数据 | 不清理(保留设备缓存,下次启动更快) |
15.6 功能 5:关于我们
功能描述:展示 App 版本号、用户协议、隐私政策、客服联系方式。
设计稿对应元素:
- App Logo + 版本号(v1.0.0 build 20260423)
- 用户协议链接
- 隐私政策链接
- 客服邮箱 / 电话
15.7 功能 6:退出登录
功能描述:清除本地登录状态,返回登录页。
设计稿对应元素:底部「退出登录」按钮(红色文字)
| 维度 | 说明 |
|---|---|
| App端 | 🟢 弹出确认弹窗「确定退出登录?」→ 确认后清除本地 Token → 跳转到登录页 |
| 服务端 | 🟢 使当前 refresh_token 失效(Redis 删除 key) |
| 设备端 | ⚪ 不参与 |
附录
A. 视频流与媒体文件关键规格汇总
| 项目 | 规格 |
|---|---|
| 设备推流协议 | RTMP(rtmp://media.xswei.com/live/{device_id}) |
| App 拉流协议 | HLS(.m3u8 + .ts 分片,每片4秒,共8片缓存) |
| 视频标清码率 | 256k-1M(自适应) |
| 视频高清码率 | 512k-2M(自适应) |
| 设备编码 | H.264 Main Profile |
| 音频编码 | AAC-LC 32kbps 单声道 |
| 端到端视频延迟 | ≤3秒(标清)/ ≤4秒(高清) |
| 抓拍图片分辨率 | 1280×960 JPEG,质量70% |
| 抓拍图片大小 | ~200KB |
| 录像分辨率 | 640×480 H.264 + AAC |
| 录像最长时长 | 30秒 |
| 录像文件大小 | ~5MB |
| 录像上传方式 | HTTPS multipart,分片上传,支持断点续传 |
| 照片用户上限 | 50张(超限自动删除最早的) |
| 视频用户上限 | 5段(超限自动删除最早的) |
| 照片保存时长 | 7天 |
| 视频保存时长 | 3天 |
B. MQTT Topic 规范
| Topic 模式 | 方向 | 说明 |
|---|---|---|
device/{device_id}/status |
设备→服务端 | 设备状态定期上报(30秒/次) |
device/{device_id}/feed |
服务端→设备 | 手动喂食指令 |
device/{device_id}/feed/result |
设备→服务端 | 喂食结果上报 |
device/{device_id}/feed/batch-report |
设备→服务端 | 断网期间批量喂食记录上报 |
device/{device_id}/plan/update |
服务端→设备 | 下发喂食计划列表(全量) |
device/{device_id}/plan/delete |
服务端→设备 | 删除某个喂食计划 |
device/{device_id}/config |
服务端→设备 | 下发设备配置更新 |
device/{device_id}/ota |
服务端→设备 | OTA 固件升级指令 |
device/{device_id}/unbind |
服务端→设备 | 解除绑定通知 |
C. 错误码总表
| 错误码 | 说明 | App 处理 |
|---|---|---|
| ERR_PHONE_INVALID | 手机号格式不正确 | 输入框红色提示 |
| ERR_PHONE_NOT_REGISTERED | 该手机号未注册 | Toast 提示「请先注册账号」 |
| ERR_CODE_INVALID | 验证码错误 | 输入框抖动,剩余N次机会提示 |
| ERR_CODE_EXPIRED | 验证码已过期 | Toast 提示「验证码已过期,请重新获取」 |
| ERR_CODE_LOCKED | 操作过于频繁,请15分钟后再试 | 全屏遮罩提示倒计时 |
| ERR_NETWORK | 网络错误 | Toast 提示「网络异常,请检查网络」 |
| ERR_DEVICE_OFFLINE | 设备离线 | Toast 提示「设备离线,请检查网络」 |
| ERR_DEVICE_NO_RESPONSE | 设备无响应 | Toast 提示「设备无响应,请检查网络」 |
| ERR_LOW_FOOD | 余粮不足 | 弹出确认提示「余粮不足,是否继续?」 |
| ERR_PLAN_LIMIT | 计划数量已达上限 | Toast 提示「最多创建20个计划」 |
| ERR_NO_PERMISSION | 无操作权限 | Toast 提示「您没有权限执行此操作」 |