1203 lines
20 KiB
Markdown
1203 lines
20 KiB
Markdown
# Airhub 后台接口规范文档
|
||
|
||
> 版本: 1.0.0
|
||
> 更新日期: 2025-02-09
|
||
> 基于 PRD HTML 原型与 airhub_app Flutter 代码分析整理
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [概述](#概述)
|
||
- [通用规范](#通用规范)
|
||
- [接口列表](#接口列表)
|
||
- [1. 用户认证](#1-用户认证)
|
||
- [2. 用户信息](#2-用户信息)
|
||
- [3. 设备管理](#3-设备管理)
|
||
- [4. 角色记忆](#4-角色记忆)
|
||
- [5. 故事模块](#5-故事模块)
|
||
- [6. 音乐模块](#6-音乐模块)
|
||
- [7. 通知模块](#7-通知模块)
|
||
- [8. 系统接口](#8-系统接口)
|
||
- [数据模型](#数据模型)
|
||
- [开发优先级](#开发优先级)
|
||
- [附录:代码对照表](#附录代码对照表)
|
||
|
||
---
|
||
|
||
## 概述
|
||
|
||
本文档定义了 Airhub 智能硬件控制中心 APP 所需的全部后台接口。接口设计基于以下来源:
|
||
|
||
1. **PRD HTML 原型文件** - 根目录下的 `.html` 文件
|
||
2. **airhub_app Flutter 代码** - `airhub_app/lib/` 目录
|
||
3. **已实现的接口调用** - `music-creation.html` 中的实际 API 调用
|
||
|
||
### 技术栈建议
|
||
|
||
- 后端框架: Node.js (Express/Fastify) 或 Python (FastAPI)
|
||
- 数据库: PostgreSQL / MySQL
|
||
- 缓存: Redis
|
||
- 对象存储: 阿里云 OSS
|
||
- 实时通信: SSE (Server-Sent Events)
|
||
|
||
---
|
||
|
||
## 通用规范
|
||
|
||
### 基础 URL
|
||
|
||
```
|
||
开发环境: http://localhost:3000/api
|
||
生产环境: https://api.airhub.com/v1
|
||
```
|
||
|
||
### 请求头
|
||
|
||
```http
|
||
Content-Type: application/json
|
||
Authorization: Bearer {access_token}
|
||
X-Device-Id: {device_uuid}
|
||
X-App-Version: 1.0.0
|
||
```
|
||
|
||
### 响应格式
|
||
|
||
**成功响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "success",
|
||
"data": { ... }
|
||
}
|
||
```
|
||
|
||
**错误响应**
|
||
```json
|
||
{
|
||
"code": 40001,
|
||
"message": "参数错误",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
### 错误码定义
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 0 | 成功 |
|
||
| 40001 | 参数错误 |
|
||
| 40101 | 未授权 (Token 无效) |
|
||
| 40102 | Token 过期 |
|
||
| 40301 | 无权限 |
|
||
| 40401 | 资源不存在 |
|
||
| 50001 | 服务器内部错误 |
|
||
|
||
---
|
||
|
||
## 接口列表
|
||
|
||
### 1. 用户认证
|
||
|
||
#### 1.1 发送验证码
|
||
|
||
```http
|
||
POST /api/auth/send-code
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"phone": "13800138000"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "验证码已发送",
|
||
"data": {
|
||
"expire_in": 60
|
||
}
|
||
}
|
||
```
|
||
|
||
**说明**: 验证码 60 秒内有效,同一手机号 60 秒内只能发送一次
|
||
|
||
---
|
||
|
||
#### 1.2 验证码登录
|
||
|
||
```http
|
||
POST /api/auth/login
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"phone": "13800138000",
|
||
"code": "123456"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "登录成功",
|
||
"data": {
|
||
"access_token": "eyJhbGciOiJIUzI1NiIs...",
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
|
||
"expire_in": 604800,
|
||
"user": {
|
||
"id": "u_12345678",
|
||
"phone": "138****8000",
|
||
"nickname": "用户8000",
|
||
"avatar_url": null
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `AuthRemoteDataSource.loginWithPhone()`
|
||
|
||
---
|
||
|
||
#### 1.3 一键登录
|
||
|
||
```http
|
||
POST /api/auth/one-click-login
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"access_token": "运营商SDK返回的token"
|
||
}
|
||
```
|
||
|
||
**响应**: 同验证码登录
|
||
|
||
**说明**: 使用运营商 SDK (如阿里云号码认证) 获取本机号码
|
||
|
||
**Flutter 代码对应**: `AuthRemoteDataSource.oneClickLogin()`
|
||
|
||
---
|
||
|
||
#### 1.4 刷新 Token
|
||
|
||
```http
|
||
POST /api/auth/refresh-token
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIs..."
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"access_token": "新的access_token",
|
||
"expire_in": 604800
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 1.5 退出登录
|
||
|
||
```http
|
||
POST /api/auth/logout
|
||
```
|
||
|
||
**请求头**: 需要 Authorization
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "已退出登录"
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `AuthRepository.logout()`
|
||
|
||
---
|
||
|
||
#### 1.6 账号注销
|
||
|
||
```http
|
||
DELETE /api/auth/account
|
||
```
|
||
|
||
**请求头**: 需要 Authorization
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "账号注销申请已提交,将在7个工作日内处理"
|
||
}
|
||
```
|
||
|
||
**PRD 来源**: `settings.html` - 账号注销功能
|
||
|
||
---
|
||
|
||
### 2. 用户信息
|
||
|
||
#### 2.1 获取用户资料
|
||
|
||
```http
|
||
GET /api/user/profile
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"id": "u_12345678",
|
||
"phone": "138****8000",
|
||
"nickname": "土豆",
|
||
"avatar_url": "https://oss.airhub.com/avatars/xxx.jpg",
|
||
"gender": "男",
|
||
"birthday": "1994-12-09",
|
||
"created_at": "2025-01-15T10:30:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `profile_page.dart` - 用户卡片显示
|
||
|
||
---
|
||
|
||
#### 2.2 更新用户资料
|
||
|
||
```http
|
||
PUT /api/user/profile
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"nickname": "新昵称",
|
||
"gender": "女",
|
||
"birthday": "1995-06-15"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "保存成功"
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `profile_info_page.dart` - 保存按钮
|
||
|
||
---
|
||
|
||
#### 2.3 上传头像
|
||
|
||
```http
|
||
POST /api/user/avatar
|
||
Content-Type: multipart/form-data
|
||
```
|
||
|
||
**请求参数**
|
||
```
|
||
file: (binary)
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"avatar_url": "https://oss.airhub.com/avatars/xxx.jpg"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `profile_info_page.dart` - `_pickImage()`
|
||
|
||
---
|
||
|
||
### 3. 设备管理
|
||
|
||
#### 3.1 获取设备列表
|
||
|
||
```http
|
||
GET /api/devices
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"devices": [
|
||
{
|
||
"id": "dev_001",
|
||
"name": "毛绒机芯",
|
||
"model": "Airhub_5G",
|
||
"status": "online",
|
||
"battery": 85,
|
||
"firmware_version": "2.1.3",
|
||
"is_ai": true,
|
||
"icon": "Capybara.png"
|
||
},
|
||
{
|
||
"id": "dev_002",
|
||
"name": "电子吧唧 AI",
|
||
"model": "Badge_AI",
|
||
"status": "offline",
|
||
"battery": 0,
|
||
"is_ai": true
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
**设备状态枚举**:
|
||
- `online` - 在线
|
||
- `offline` - 离线
|
||
- `pairing` - 配对中
|
||
- `updating` - 固件更新中
|
||
|
||
**Flutter 代码对应**: `product_selection_page.dart`
|
||
|
||
---
|
||
|
||
#### 3.2 获取设备详情
|
||
|
||
```http
|
||
GET /api/devices/{device_id}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"id": "dev_001",
|
||
"name": "毛绒机芯",
|
||
"model": "Airhub_5G",
|
||
"status": "online",
|
||
"battery": 85,
|
||
"firmware_version": "2.1.3",
|
||
"mac_address": "AA:BB:CC:DD:EE:FF",
|
||
"settings": {
|
||
"nickname": "小毛球",
|
||
"user_name": "土豆",
|
||
"volume": 60,
|
||
"brightness": 85,
|
||
"allow_interrupt": true,
|
||
"privacy_mode": true
|
||
},
|
||
"wifi_list": [
|
||
{
|
||
"ssid": "Home_WiFi",
|
||
"is_connected": true
|
||
}
|
||
],
|
||
"bound_memory_id": "mem_001"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `device_control_page.dart` - 设置页面
|
||
|
||
---
|
||
|
||
#### 3.3 更新设备设置
|
||
|
||
```http
|
||
PUT /api/devices/{device_id}
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"nickname": "新昵称",
|
||
"user_name": "主人称呼",
|
||
"volume": 70,
|
||
"brightness": 90,
|
||
"allow_interrupt": false,
|
||
"privacy_mode": true
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "设置已保存"
|
||
}
|
||
```
|
||
|
||
**PRD 来源**: `device-control.html` - 设备设置面板
|
||
|
||
---
|
||
|
||
#### 3.4 绑定设备
|
||
|
||
```http
|
||
POST /api/devices/{device_id}/bind
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"mac_address": "AA:BB:CC:DD:EE:FF",
|
||
"wifi_ssid": "Home_WiFi",
|
||
"wifi_password": "password123"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "设备绑定成功",
|
||
"data": {
|
||
"device_id": "dev_001",
|
||
"memory_id": "mem_001"
|
||
}
|
||
}
|
||
```
|
||
|
||
**PRD 来源**: `bluetooth.html`, `wifi-config.html`
|
||
|
||
---
|
||
|
||
#### 3.5 解绑设备
|
||
|
||
```http
|
||
DELETE /api/devices/{device_id}/unbind
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "设备已解绑",
|
||
"data": {
|
||
"memory_id": "mem_001",
|
||
"memory_name": "Cloud_Mem_01"
|
||
}
|
||
}
|
||
```
|
||
|
||
**说明**: 解绑后角色记忆自动保存到云端
|
||
|
||
**PRD 来源**: `device-control.html` - 解绑设备弹窗
|
||
|
||
---
|
||
|
||
#### 3.6 配置设备 WiFi
|
||
|
||
```http
|
||
POST /api/devices/{device_id}/wifi
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"ssid": "New_WiFi",
|
||
"password": "password123"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "WiFi 配置成功"
|
||
}
|
||
```
|
||
|
||
**PRD 来源**: `wifi-config.html`
|
||
|
||
---
|
||
|
||
### 4. 角色记忆
|
||
|
||
#### 4.1 获取角色记忆列表
|
||
|
||
```http
|
||
GET /api/agents
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"agents": [
|
||
{
|
||
"id": "mem_001",
|
||
"name": "Airhub_Mem_01",
|
||
"icon": "🧠",
|
||
"nickname": "小毛球",
|
||
"bound_device": {
|
||
"id": "dev_001",
|
||
"name": "Airhub_5G"
|
||
},
|
||
"status": "bound",
|
||
"created_at": "2025-01-15"
|
||
},
|
||
{
|
||
"id": "mem_002",
|
||
"name": "Airhub_Mem_02",
|
||
"icon": "🐾",
|
||
"nickname": "豆豆",
|
||
"bound_device": null,
|
||
"status": "unbound",
|
||
"created_at": "2024-08-22"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
**角色记忆状态**:
|
||
- `bound` - 已绑定设备
|
||
- `unbound` - 未绑定 (可注入)
|
||
|
||
**Flutter 代码对应**: `agent_manage_page.dart`
|
||
|
||
---
|
||
|
||
#### 4.2 解绑角色记忆
|
||
|
||
```http
|
||
POST /api/agents/{agent_id}/unbind
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "已解绑角色记忆,数据已保留在云端"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 4.3 注入角色记忆
|
||
|
||
```http
|
||
POST /api/agents/{agent_id}/inject
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"device_id": "dev_002"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "角色记忆注入成功"
|
||
}
|
||
```
|
||
|
||
**PRD 来源**: `agent-manage.html` - 注入设备按钮
|
||
|
||
---
|
||
|
||
### 5. 故事模块
|
||
|
||
#### 5.1 获取故事列表
|
||
|
||
```http
|
||
GET /api/stories
|
||
```
|
||
|
||
**查询参数**
|
||
```
|
||
shelf_id: 1 # 书架 ID,可选
|
||
page: 1 # 页码
|
||
page_size: 20 # 每页数量
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"stories": [
|
||
{
|
||
"id": "story_001",
|
||
"title": "卡皮巴拉的奇幻漂流",
|
||
"cover_url": "https://oss.airhub.com/covers/xxx.jpg",
|
||
"content": "在一条蜿蜒的小河边...",
|
||
"has_video": true,
|
||
"video_url": "https://oss.airhub.com/videos/xxx.mp4",
|
||
"created_at": "2025-01-20T15:30:00Z"
|
||
}
|
||
],
|
||
"total": 5,
|
||
"page": 1,
|
||
"page_size": 20
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `device_control_page.dart` - `_mockStories`
|
||
|
||
---
|
||
|
||
#### 5.2 获取故事详情
|
||
|
||
```http
|
||
GET /api/stories/{story_id}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"id": "story_001",
|
||
"title": "卡皮巴拉的奇幻漂流",
|
||
"cover_url": "https://oss.airhub.com/covers/xxx.jpg",
|
||
"content": "完整故事内容...",
|
||
"has_video": true,
|
||
"video_url": "https://oss.airhub.com/videos/xxx.mp4",
|
||
"created_at": "2025-01-20T15:30:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `story_detail_page.dart`
|
||
|
||
---
|
||
|
||
#### 5.3 生成故事 (SSE 流式)
|
||
|
||
```http
|
||
POST /api/stories/generate
|
||
Accept: text/event-stream
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"mode": "random",
|
||
"prompt": "关于卡皮巴拉的冒险故事",
|
||
"theme": "adventure"
|
||
}
|
||
```
|
||
|
||
**生成模式**:
|
||
- `random` - 随机生成
|
||
- `keyword` - 关键词生成
|
||
- `theme` - 主题生成
|
||
|
||
**SSE 响应流**
|
||
```
|
||
data: {"stage": "generating", "progress": 10, "message": "正在构思故事大纲..."}
|
||
|
||
data: {"stage": "generating", "progress": 50, "message": "正在撰写故事内容..."}
|
||
|
||
data: {"stage": "done", "progress": 100, "story": {...}}
|
||
```
|
||
|
||
**Flutter 代码对应**: `story_loading_page.dart`
|
||
|
||
---
|
||
|
||
#### 5.4 保存故事
|
||
|
||
```http
|
||
POST /api/stories/{story_id}/save
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"shelf_id": 1
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "故事已保存到书架"
|
||
}
|
||
```
|
||
|
||
**PRD 来源**: `story-detail.html` - 保存故事按钮
|
||
|
||
---
|
||
|
||
#### 5.5 生成动态绘本 (SSE 流式)
|
||
|
||
```http
|
||
POST /api/stories/{story_id}/video
|
||
Accept: text/event-stream
|
||
```
|
||
|
||
**SSE 响应流**
|
||
```
|
||
data: {"stage": "processing", "progress": 20, "message": "正在生成插画..."}
|
||
|
||
data: {"stage": "processing", "progress": 60, "message": "正在合成视频..."}
|
||
|
||
data: {"stage": "done", "progress": 100, "video_url": "https://..."}
|
||
```
|
||
|
||
**说明**: 生成动态绘本消耗 10 SP (积分)
|
||
|
||
**Flutter 代码对应**: `story_detail_page.dart` - `runGenerationProcess()`
|
||
|
||
---
|
||
|
||
#### 5.6 解锁新书架
|
||
|
||
```http
|
||
POST /api/stories/shelves/unlock
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"cost_points": 500
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "解锁成功",
|
||
"data": {
|
||
"shelf_id": 2,
|
||
"remaining_points": 1500
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `device_control_page.dart` - `_showUnlockDialog()`
|
||
|
||
---
|
||
|
||
### 6. 音乐模块
|
||
|
||
> ⚠️ **重要**: 此模块在 `music-creation.html` 中已有实际 API 调用实现
|
||
|
||
#### 6.1 生成音乐 (SSE 流式)
|
||
|
||
```http
|
||
POST /api/create_music
|
||
Accept: text/event-stream
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"text": "水豚在雨中等公交,心情却很平静",
|
||
"mood": "chill"
|
||
}
|
||
```
|
||
|
||
**心情类型**:
|
||
- `chill` - Chill Lofi (慵懒·治愈)
|
||
- `happy` - Happy Funk (活力·奔跑)
|
||
- `sleep` - Deep Sleep (白噪音·助眠)
|
||
- `focus` - Focus Flow (心流·专注)
|
||
- `mystery` - 盲盒惊喜 (AI随机)
|
||
- `custom` - 自由创作
|
||
|
||
**SSE 响应流**
|
||
```
|
||
data: {"stage": "connecting", "progress": 5, "message": "🎼 正在连接 AI..."}
|
||
|
||
data: {"stage": "lyrics", "progress": 20, "message": "🎵 正在生成歌词..."}
|
||
|
||
data: {"stage": "music", "progress": 30, "message": "🎹 正在作曲..."}
|
||
|
||
data: {"stage": "done", "progress": 100, "file_path": "/music/xxx.mp3", "metadata": {"lyrics": "歌词内容..."}}
|
||
```
|
||
|
||
**错误响应**
|
||
```
|
||
data: {"stage": "error", "message": "生成失败,请重试"}
|
||
```
|
||
|
||
**HTML 代码位置**: `music-creation.html:1730`
|
||
|
||
**Flutter 代码对应**: `music_creation_page.dart` - `_mockGenerate()`
|
||
|
||
---
|
||
|
||
#### 6.2 获取播放列表
|
||
|
||
```http
|
||
GET /api/playlist
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"playlist": [
|
||
{
|
||
"id": 1,
|
||
"title": "卡皮巴拉蹦蹦蹦",
|
||
"lyrics": "卡皮巴拉\n啦啦啦啦...",
|
||
"audio_url": "/music/卡皮巴拉蹦蹦蹦.mp3",
|
||
"cover_url": "Capybara.png",
|
||
"mood": "happy",
|
||
"duration": 204,
|
||
"created_at": "2025-01-15T10:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
**HTML 代码位置**: `music-creation.html:2006`
|
||
|
||
**Flutter 代码对应**: `music_creation_page.dart` - `_playlist`
|
||
|
||
---
|
||
|
||
#### 6.3 删除播放列表项
|
||
|
||
```http
|
||
DELETE /api/playlist/{track_id}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "已从播放列表移除"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 6.4 收藏音乐
|
||
|
||
```http
|
||
POST /api/playlist/{track_id}/favorite
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "已收藏"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 7. 通知模块
|
||
|
||
#### 7.1 获取通知列表
|
||
|
||
```http
|
||
GET /api/notifications
|
||
```
|
||
|
||
**查询参数**
|
||
```
|
||
type: all # all, system, activity, device
|
||
page: 1
|
||
page_size: 20
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"notifications": [
|
||
{
|
||
"id": "notif_001",
|
||
"type": "system",
|
||
"title": "系统更新",
|
||
"description": "Airhub V1.2.0 版本更新已准备就绪",
|
||
"content": "<p><strong>更新说明:</strong></p><ul><li>新增喂养指南功能</li></ul>",
|
||
"is_read": false,
|
||
"created_at": "2025-02-09T10:30:00Z"
|
||
},
|
||
{
|
||
"id": "notif_002",
|
||
"type": "activity",
|
||
"title": "新春活动",
|
||
"description": "领取您的新春限定水豚皮肤",
|
||
"image_url": "https://...",
|
||
"is_read": true,
|
||
"created_at": "2025-02-08T09:00:00Z"
|
||
}
|
||
],
|
||
"unread_count": 1
|
||
}
|
||
}
|
||
```
|
||
|
||
**通知类型**:
|
||
- `system` - 系统通知
|
||
- `activity` - 活动通知
|
||
- `device` - 设备通知
|
||
|
||
**Flutter 代码对应**: `notification_page.dart`
|
||
|
||
---
|
||
|
||
#### 7.2 标记通知已读
|
||
|
||
```http
|
||
PUT /api/notifications/{notification_id}/read
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "已标记为已读"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 7.3 标记全部已读
|
||
|
||
```http
|
||
PUT /api/notifications/read-all
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "全部标记为已读"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 8. 系统接口
|
||
|
||
#### 8.1 提交意见反馈
|
||
|
||
```http
|
||
POST /api/feedback
|
||
```
|
||
|
||
**请求参数**
|
||
```json
|
||
{
|
||
"content": "希望增加深色模式功能",
|
||
"contact": "user@email.com"
|
||
}
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "感谢您的反馈!"
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `feedback_dialog.dart`
|
||
|
||
---
|
||
|
||
#### 8.2 检查版本更新
|
||
|
||
```http
|
||
GET /api/version/check
|
||
```
|
||
|
||
**查询参数**
|
||
```
|
||
platform: ios # ios, android
|
||
current_version: 1.0.0
|
||
```
|
||
|
||
**响应**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"data": {
|
||
"latest_version": "1.2.0",
|
||
"current_version": "1.0.0",
|
||
"update_required": false,
|
||
"force_update": false,
|
||
"update_url": "https://apps.apple.com/...",
|
||
"release_notes": "1. 新增喂养指南\n2. 优化连接稳定性"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Flutter 代码对应**: `settings_page.dart` - 检查更新
|
||
|
||
---
|
||
|
||
## 数据模型
|
||
|
||
### User (用户)
|
||
|
||
```typescript
|
||
interface User {
|
||
id: string;
|
||
phone: string; // 脱敏显示
|
||
nickname: string;
|
||
avatar_url: string | null;
|
||
gender: '男' | '女' | null;
|
||
birthday: string | null; // YYYY-MM-DD
|
||
created_at: string;
|
||
}
|
||
```
|
||
|
||
### Device (设备)
|
||
|
||
```typescript
|
||
interface Device {
|
||
id: string;
|
||
name: string;
|
||
model: string;
|
||
status: 'online' | 'offline' | 'pairing' | 'updating';
|
||
battery: number; // 0-100
|
||
firmware_version: string;
|
||
mac_address: string;
|
||
is_ai: boolean;
|
||
settings: DeviceSettings;
|
||
bound_memory_id: string | null;
|
||
}
|
||
|
||
interface DeviceSettings {
|
||
nickname: string; // 设备昵称
|
||
user_name: string; // 用户称呼
|
||
volume: number; // 0-100
|
||
brightness: number; // 0-100
|
||
allow_interrupt: boolean;
|
||
privacy_mode: boolean;
|
||
}
|
||
```
|
||
|
||
### Agent (角色记忆)
|
||
|
||
```typescript
|
||
interface Agent {
|
||
id: string;
|
||
name: string; // Airhub_Mem_01
|
||
icon: string; // Emoji
|
||
nickname: string; // 小毛球
|
||
bound_device: Device | null;
|
||
status: 'bound' | 'unbound';
|
||
created_at: string;
|
||
}
|
||
```
|
||
|
||
### Story (故事)
|
||
|
||
```typescript
|
||
interface Story {
|
||
id: string;
|
||
title: string;
|
||
cover_url: string;
|
||
content: string;
|
||
has_video: boolean;
|
||
video_url: string | null;
|
||
shelf_id: number;
|
||
created_at: string;
|
||
}
|
||
```
|
||
|
||
### Track (音乐)
|
||
|
||
```typescript
|
||
interface Track {
|
||
id: number;
|
||
title: string;
|
||
lyrics: string;
|
||
audio_url: string;
|
||
cover_url: string;
|
||
mood: 'chill' | 'happy' | 'sleep' | 'focus' | 'mystery' | 'custom';
|
||
duration: number; // 秒
|
||
created_at: string;
|
||
}
|
||
```
|
||
|
||
### Notification (通知)
|
||
|
||
```typescript
|
||
interface Notification {
|
||
id: string;
|
||
type: 'system' | 'activity' | 'device';
|
||
title: string;
|
||
description: string;
|
||
content: string | null; // HTML 内容
|
||
image_url: string | null;
|
||
is_read: boolean;
|
||
created_at: string;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 开发优先级
|
||
|
||
| 优先级 | 模块 | 说明 | 依赖 |
|
||
|--------|------|------|------|
|
||
| **P0** | 用户认证 | 登录/注册是基础功能 | 运营商 SDK |
|
||
| **P0** | 设备管理 | 核心业务:设备绑定、配网 | 蓝牙 SDK |
|
||
| **P1** | 音乐模块 | 已有 HTML 实现,需对接 MiniMax API | MiniMax API |
|
||
| **P1** | 故事模块 | 核心功能:AI 生成故事 | LLM API |
|
||
| **P2** | 角色记忆 | 差异化功能 | 设备管理 |
|
||
| **P2** | 用户信息 | 个人中心相关 | 用户认证 |
|
||
| **P3** | 通知模块 | 辅助功能 | 推送 SDK |
|
||
| **P3** | 系统接口 | 反馈、版本检查 | - |
|
||
|
||
---
|
||
|
||
## 附录:代码对照表
|
||
|
||
| 接口 | PRD HTML 文件 | Flutter 代码 |
|
||
|------|---------------|--------------|
|
||
| 登录 | `login.html` | `auth_remote_data_source.dart` |
|
||
| 用户资料 | `profile.html`, `profile-info.html` | `profile_page.dart`, `profile_info_page.dart` |
|
||
| 设备管理 | `products.html`, `device-control.html` | `product_selection_page.dart`, `device_control_page.dart` |
|
||
| 配网 | `bluetooth.html`, `wifi-config.html` | `bluetooth_page.dart`, `wifi_config_page.dart` |
|
||
| 角色记忆 | `agent-manage.html` | `agent_manage_page.dart` |
|
||
| 故事 | `story-detail.html`, `story-loading.html` | `story_detail_page.dart`, `story_loading_page.dart` |
|
||
| 音乐 | `music-creation.html` | `music_creation_page.dart` |
|
||
| 通知 | `notifications.html` | `notification_page.dart` |
|
||
| 设置 | `settings.html` | `settings_page.dart` |
|
||
|
||
---
|
||
|
||
## 更新日志
|
||
|
||
| 版本 | 日期 | 说明 |
|
||
|------|------|------|
|
||
| 1.0.0 | 2025-02-09 | 初版,基于 PRD 和 Flutter 代码分析 |
|
||
|
||
---
|
||
|
||
*本文档由 Claude Code 自动生成,如有问题请联系开发团队。*
|