# 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": "
更新说明: