# AirShelf 功能开发对齐文档

> 版本：v0.3  
> 日期：2026-05-29  
> 目的：把 PRD、页面流程定稿、v1 原型、原版补充页面和后端架构统一成一份可开发、可验收、可排期的功能清单，避免实现时遗漏或误用过时逻辑。

## 1. 对齐源优先级

实现时按下面顺序判断，不一致时以上层为准：

| 优先级 | 来源 | 用途 |
| --- | --- | --- |
| 1 | `PRD.md` | 业务范围、V1/V2 边界、核心规则、验收目标 |
| 2 | `电商AI平台/页面流程定稿.md` | 页面流转、交互边界、阶段拆分、哪些能力不做 |
| 3 | `v1/*.html` | 当前核心原型，是在原版基础上的修改和增加；已覆盖页面以 v1 为准 |
| 4 | `电商AI平台/*.html` | 原版完整原型；用于补齐 v1 未覆盖页面、设计系统、登录注册、团队、设置和图片工具 |
| 5 | `core/ARCHITECTURE.md` | 后端架构、任务编排、额度、存储、部署策略 |
| 6 | `account.md` 与环境变量 | 测试资源与真实配置来源，不进入代码和公开文档 |

## 2. 当前必须统一的产品口径

| 口径 | 开发结论 |
| --- | --- |
| 后端技术 | Django + DRF + Celery，MySQL 持久化，Redis 做缓存/任务/锁，TOS 存储文件。 |
| AI 服务 | 全部接火山服务：对话、文生图/图生图、生视频、可能的脚本优化和素材理解。 |
| 60s 生成 | V1 真实实现 `4 x 15s` 多段视频，再进入 Stage5 拼接导出。每段独立任务、独立状态、独立重跑、独立额度记录。 |
| 项目新建 | 新建项目页只选商品和可选项目名。脚本来源、卖点、风格、时长等放到 Stage1。 |
| 分镜 | Stage3 是可选增强能力，不是生成视频的硬阻塞。无分镜时 Stage4 仍可用脚本和基础资产生成视频。 |
| 用户上传视频 | 不进入 Stage4。上传视频只作为 Stage5 的素材池，可用于替换、补位、剪辑和导出。 |
| 额度扣费 | 所有 AI 调用必须先预估、确认、冻结或记账；失败不实际扣费；成功落账可追溯。 |
| 运营后台 | V1 全量真实实现时必须有后台：用户/团队/项目/任务/资产/额度/账单/模型配置/异常重试。 |
| 原型取舍 | 已迁移到 `v1` 的页面以 `v1` 为准；`v1` 未覆盖的页面回看原版。复制项目、归档、批量生成、审核流、爆款复刻、直接发布等仍不进入 V1 主路径，除非 PRD 明确升级。 |

## 3. V1 功能总目标

V1 的目标不是只做静态界面，而是跑通一条真实可计费、可追踪、可运营的 AI 视频生产链路：

1. 用户注册并自动创建团队。
2. 团队管理员配置成员、月度额度、充值或分配额度。
3. 用户创建商品，维护商品图、卖点、品牌、类目等基础资料。
4. 用户基于商品创建项目。
5. 项目进入 5 阶段生产管线：脚本、基础资产、故事板、视频片段、拼接导出。
6. 真实调用火山模型完成脚本、图片、视频生产。
7. 60s 视频按 4 个 15s 段落并发/排队生成，支持失败重试和单段重跑。
8. Stage5 支持轻量剪辑、字幕、BGM、转场、导出 9:16 1080p MP4。
9. 所有产物自动入资产库，支持搜索、筛选、下载、复用。
10. 所有消耗进入额度账本，团队、成员、项目、任务都能追溯。
11. 运营后台可介入排障、补额度、重试任务、管理模型和查看成本。

## 4. 页面与功能地图

| 页面 | 原型文件 | 后端模块 | 优先级 | 必须实现 |
| --- | --- | --- | --- | --- |
| 登录/注册 | `电商AI平台/login.html`, `电商AI平台/register.html` | `accounts`, `teams` | P0 | 注册、登录、登出、创建团队、JWT/Session、基础权限。 |
| 工作台 | `v1/index.html` | `projects`, `billing`, `assets` | P1 | 项目概览、待处理、最近资产、额度摘要、快速入口。 |
| 商品库 | `v1/products.html` | `products` | P0 | 商品列表、搜索筛选、网格/列表、创建、编辑、删除、详情跳转。 |
| 商品创建 | `电商AI平台/product-create*.html` | `products`, `assets` | P0 | 图片上传、商品信息、卖点、类目、素材绑定、校验。 |
| 商品详情 | `电商AI平台/product-detail.html` | `products`, `assets`, `projects` | P1 | 商品资料、关联素材、关联项目、可编辑。 |
| 项目列表 | `v1/projects.html` | `projects`, `tasks` | P0 | 状态筛选、搜索、排序、项目卡片/列表、继续/查看/重试。 |
| 新建项目 | `v1/projects-new.html` | `projects`, `products` | P0 | 只选择商品与项目名，创建后进入 Stage1。 |
| 生产管线 | `v1/pipeline.html` | `projects`, `tasks`, `ai`, `assets`, `billing` | P0 | 5 阶段完整闭环，真实 AI 调用，状态机和任务编排。 |
| 资产库 | `v1/library.html` | `assets`, `storage` | P0 | 素材分类、搜索、筛选、上传、下载、删除、复用。 |
| 消费/账单 | `v1/account.html` | `billing`, `teams` | P0 | 余额、充值记录、项目账单、成员账单、额度规则、流水。 |
| 团队管理 | `电商AI平台/team.html` | `teams`, `accounts`, `billing` | P1 | 成员、角色、邀请、禁用、月度额度、权限矩阵。 |
| 运营后台 | 无独立静态原型，按 PRD 和架构补齐 | `ops`/Django Admin | P0 | 用户团队、任务、资产、账单、模型配置、失败重试、人工补偿。 |
| 设置/消息 | `电商AI平台/settings.html`, `电商AI平台/messages.html` | `accounts`, `notifications` | P2 | 账户设置、消息中心、通知状态。 |
| 图片工具 | `电商AI平台/asset-factory.html` 等 | `ai`, `assets` | P2 | 可作为后续独立工具，不影响主生产闭环。 |

## 5. P0 主生产闭环

### 5.1 账号与团队

前端需要：

- 注册页、登录页、登出入口。
- 当前用户信息、当前团队信息、当前角色展示。
- 未登录拦截，登录后回跳原目标页。
- 团队额度不足、权限不足、账号禁用等通用提示。

后端需要：

- 用户模型、团队模型、团队成员模型、角色权限。
- 注册时自动创建默认团队，并把注册用户设为团队管理员。
- 登录认证、刷新 token 或 session、密码重置预留。
- 权限中间件：团队隔离、角色能力、资源归属校验。

验收标准：

- 新用户注册后能进入工作台并拥有一个默认团队。
- 同一团队成员能看到团队资源，不同团队不能互相访问。
- 非管理员不能进行充值、成员额度配置、后台敏感操作。

### 5.2 商品库

前端需要：

- 商品列表：网格/列表切换、搜索、类目筛选、时间筛选、排序。
- 商品卡片：封面图、名称、类目、素材数量、关联视频数量、最近更新时间。
- 商品创建/编辑：商品图、标题、品牌、类目、卖点、规格、目标人群、备注。
- 图片上传：本地上传到 TOS，生成可预览 asset。
- 删除保护：有关联项目时给出风险提示。

后端需要：

- `Product`、`ProductImage`、`ProductSellingPoint` 等模型。
- 商品 CRUD API、筛选分页 API。
- TOS 上传签名或后端中转上传。
- 商品与资产、项目的关联关系。

验收标准：

- 商品能创建、编辑、查询、删除。
- 项目创建时只能选择当前团队可用商品。
- 商品图片能进入资产库，并可在 Stage2 作为商品基础资产使用。

### 5.3 项目列表与新建

前端需要：

- 项目列表 tabs：全部、进行中、生成中、已完成、失败。
- 项目搜索、筛选、排序。
- 项目卡片展示：9:16 封面、商品、当前阶段、5 阶段进度、状态、最近更新时间。
- 操作：继续、查看、失败重试。
- 新建项目只选择商品和可选项目名，不放脚本来源、风格、时长等高级配置。

后端需要：

- `Project`、`ProjectStageState`、`ProjectProgress`。
- 项目状态机：草稿、脚本中、资产中、分镜中、视频中、导出中、完成、失败。
- 项目创建 API、项目列表 API、项目详情 API、阶段推进 API。

验收标准：

- 从商品创建项目后进入 Stage1。
- 项目当前阶段和每阶段状态能准确回显。
- 失败项目能看到失败原因，并能按任务粒度重试。

### 5.4 Stage1 脚本

前端需要：

- 中区脚本/读秒分镜工作台。
- 右侧 AI 对话、历史版本。
- 底部 AI 输入框。
- 脚本来源入口：AI 帮我写、我有脚本、一句话生成、复刻爆款入口置灰或隐藏。
- 商品卖点选择在 Stage1 完成。
- 脚本版本：生成、编辑、保存、采用、回滚。

后端需要：

- `ScriptVersion`、`ScriptSegment`。
- 火山对话/文本模型适配器。
- Prompt 模板管理：商品信息、卖点、平台风格、时长目标、脚本结构。
- 脚本生成任务、脚本优化任务、版本记录。
- 消耗预估和账本记录。

验收标准：

- 可从商品信息生成脚本。
- 可手工粘贴脚本并结构化成多个段落。
- 可保存多个版本，采用一个版本进入 Stage2。
- AI 失败不扣费，并可重试。

### 5.5 Stage2 基础资产

前端需要：

- 三类资产顺序：商品、人物、场景。
- 商品资产：商品三联图为一张 16:9 图片，不拆成 3 个独立槽位。
- 人物资产：AI 提取人物、生成 4 张候选肖像、选择 1 张、生成 16:9 三联图、采用。
- 场景资产：生成 4 张候选场景图、选择 1 张、采用。
- 支持重跑、版本历史、采用、预览。
- 人物资产可选择保存到人物库。

后端需要：

- `BaseAssetGroup`、`AssetVersion`、`AssetSelection`。
- 火山生图/图生图模型适配器。
- 图片任务队列、并发限制、失败重试。
- 资产与项目阶段绑定。
- TOS 存储、缩略图、元数据。

验收标准：

- 三类基础资产都能真实生成并保存。
- 每次重跑保留历史，不覆盖已采用版本。
- Stage2 至少采用商品、人物、场景各一组后，可进入 Stage3 或跳过分镜进入 Stage4。

### 5.6 Stage3 故事板

前端需要：

- 故事板为可选阶段。
- 支持按脚本段落生成故事板图。
- Prompt 可编辑，但不做复杂聊天。
- 显示绑定资产标签：商品、人物、场景。
- 当基础资产变更时，提示建议重新生成故事板。
- 支持跳过故事板直接进入 Stage4。

后端需要：

- `StoryboardVersion`、`StoryboardFrame`。
- 脚本段落到故事板帧的映射。
- 火山图片模型任务。
- 故事板版本、采用、重跑。

验收标准：

- 有故事板时，Stage4 默认使用故事板作为视频生成参考。
- 无故事板时，Stage4 能基于脚本和基础资产生成视频。
- 重跑故事板不影响已采用的视频片段，除非用户主动重新生成视频。

### 5.7 Stage4 视频片段

前端需要：

- 展示 4 个 15s 片段槽位，对应 60s 总视频。
- 每段显示状态：未开始、排队、生成中、成功、失败、已采用。
- 每段可编辑 prompt、生成、重跑、查看历史、采用。
- 支持并发生成，但前端必须展示每段独立进度。
- 单次生成一个候选视频，历史版本中保留多次结果。
- 用户上传视频不出现在 Stage4。

后端需要：

- `VideoSegment`、`VideoSegmentVersion`。
- 火山生视频模型适配器。
- Celery 任务：提交、轮询、下载、转存 TOS、回调处理。
- 任务幂等：同一段重试不产生重复扣费。
- 并发控制：团队级、用户级、模型级、全局级。
- 失败原因标准化：额度、模型、超时、内容安全、存储、未知。

验收标准：

- 60s 视频能由 4 段 15s 视频构成。
- 某一段失败时，不影响其他已成功段；可单段重跑。
- 每段成功后自动入资产库，并能被 Stage5 使用。
- 模型失败不实际扣费；模型成功但后处理失败要进入可补偿状态。

### 5.8 Stage5 拼接导出

前端需要：

- 轻量剪辑器：素材池、主轨道、字幕、BGM、转场、预览、导出。
- 素材池包含 AI 视频片段、用户上传视频、资产库视频。
- 单主轨，支持自动放置、拖拽排序、删除、替换、裁剪。
- 支持从脚本生成字幕，并允许编辑样式和文本。
- 支持 BGM 选择、音量设置。
- 导出结果页：预览、下载、复制链接、查看资产、继续编辑、返回项目。

后端需要：

- `Timeline`、`TimelineClip`、`SubtitleTrack`、`BgmTrack`、`ExportJob`。
- FFmpeg 拼接、转码、字幕烧录或外挂字幕策略。
- 输出规格：9:16、1080p、MP4。
- 导出任务队列、进度、失败重试。
- 导出文件转存 TOS，生成资产库记录。

验收标准：

- 4 段视频能拼接成一个 60s 成片。
- 用户上传素材能加入 Stage5 并参与导出。
- 导出成功后自动进入资产库的成片分类。
- 导出失败能保留 timeline 并允许重试。

## 6. P0 额度与账本

前端需要：

- 生成前显示本次预估消耗和账户余额。
- 额度不足时阻止提交，并给管理员充值或申请额度入口。
- 账单页按项目、成员、账单维度查看消耗。
- 团队页可配置成员月度额度。

后端需要：

- 四层额度：团队余额、成员月度额度、项目预算、单任务预估/实扣。
- `CreditAccount`、`CreditLedger`、`QuotaPolicy`、`CreditReservation`。
- 账本必须只追加，不直接覆盖历史。
- 支持预估、冻结、成功扣费、失败释放、人工调整。
- 每条账本关联：团队、用户、项目、任务、模型、输入输出资产。

验收标准：

- 所有 AI 与导出任务都有账本记录。
- 失败任务不会消耗最终余额。
- 管理员能看到团队、成员、项目三个维度的消耗。
- 后台人工补偿、充值、扣减都可追溯。

## 7. P0 资产库与存储

前端需要：

- Tabs：人物、场景、商品图、成片、我的上传、未分类。
- 搜索、类型筛选、来源筛选、排序。
- 上传素材、预览、下载、删除。
- 在项目中复用资产。

后端需要：

- `Asset`、`AssetFile`、`AssetTag`、`AssetUsage`。
- 文件类型：image、video、audio、subtitle、document。
- 来源：upload、ai_generated、exported、system。
- TOS object key、bucket、content type、size、duration、resolution、checksum。
- 缩略图、预览地址、临时下载链接。

验收标准：

- AI 生成图、视频片段、最终成片都自动入库。
- 用户上传文件可用于 Stage5。
- 资产被项目使用时有使用记录，删除时能提示风险。

## 8. P0 运营后台

运营后台可以先基于 Django Admin 扩展，后续再做独立后台页面。V1 全量真实 AI 必须具备这些能力：

| 模块 | 必须能力 |
| --- | --- |
| 用户与团队 | 查询、禁用、角色、团队归属、成员额度。 |
| 商品与项目 | 查询、状态查看、异常项目定位。 |
| AI 任务 | 查看入参摘要、模型、状态、耗时、失败原因、重试、取消。 |
| 资产 | 查看文件、归属、来源、TOS key、可用性检查。 |
| 账本 | 充值、扣费、释放、人工补偿、流水审计。 |
| 模型配置 | 模型 endpoint、能力类型、单价、限流、开关、降级策略。 |
| 系统配置 | Prompt 模板、BGM 库、字幕样式、导出参数。 |

验收标准：

- 任一用户反馈“生成失败”时，运营能在后台定位到项目、阶段、任务、模型错误和账本状态。
- 后台能安全重试任务，不产生重复扣费。
- 模型临时不可用时能关闭入口或切换备用配置。

## 9. 状态机与任务状态

项目阶段状态：

| 状态 | 含义 |
| --- | --- |
| `not_started` | 还未进入阶段。 |
| `draft` | 有编辑内容，但未确认提交。 |
| `queued` | 已进入队列。 |
| `running` | 正在执行。 |
| `succeeded` | 当前阶段已完成。 |
| `failed` | 当前阶段失败，可查看原因。 |
| `skipped` | 用户主动跳过，比如 Stage3。 |
| `needs_review` | 任务成功但需要用户选择或确认采用。 |

AI 任务状态：

| 状态 | 含义 |
| --- | --- |
| `created` | 任务已创建但未扣/未冻结。 |
| `reserved` | 已冻结或记录预估额度。 |
| `submitted` | 已提交火山。 |
| `polling` | 等待火山结果。 |
| `postprocessing` | 下载、转存、转码、生成缩略图。 |
| `succeeded` | 完成并落资产。 |
| `failed` | 失败并释放额度。 |
| `compensating` | 外部成功但本地后处理失败，需要补偿。 |
| `cancelled` | 用户或系统取消。 |

状态要求：

- 前端所有按钮必须根据状态禁用或显示正确动作。
- 后端所有阶段推进必须校验前置条件。
- Celery 任务必须幂等，重复执行不会重复创建资产或重复扣费。

## 10. API 开发清单

建议先按下面 API 分组开发，保证前后端可以并行：

| 分组 | API 能力 |
| --- | --- |
| Auth | 注册、登录、登出、当前用户、当前团队。 |
| Team | 团队详情、成员列表、邀请、禁用、角色、月度额度。 |
| Product | 商品 CRUD、图片上传、卖点、详情、关联项目。 |
| Project | 项目 CRUD、列表筛选、详情、阶段状态、失败重试。 |
| Script | 生成脚本、优化脚本、保存版本、采用版本。 |
| Base Assets | 生成商品图/人物/场景、候选列表、采用、重跑。 |
| Storyboard | 生成故事板、编辑 prompt、采用、跳过。 |
| Video | 生成片段、查询进度、重跑、采用、历史版本。 |
| Timeline | 素材池、轨道、字幕、BGM、保存 timeline。 |
| Export | 提交导出、查询进度、下载、复制链接、重试。 |
| Asset | 资产列表、筛选、上传、预览、下载、删除、复用。 |
| Billing | 余额、预估、确认、流水、账单筛选、人工调整。 |
| Ops | 任务查询、模型配置、重试、补偿、系统配置。 |

## 11. 数据模型开发清单

P0 最小模型集合：

- `User`
- `Team`
- `TeamMember`
- `Role`
- `Product`
- `ProductImage`
- `ProductSellingPoint`
- `Project`
- `ProjectStage`
- `ScriptVersion`
- `ScriptSegment`
- `Asset`
- `AssetFile`
- `AssetUsage`
- `BaseAssetGroup`
- `StoryboardVersion`
- `StoryboardFrame`
- `VideoSegment`
- `VideoSegmentVersion`
- `Timeline`
- `TimelineClip`
- `SubtitleTrack`
- `BgmTrack`
- `ExportJob`
- `AITask`
- `ModelProvider`
- `ModelConfig`
- `CreditAccount`
- `CreditLedger`
- `CreditReservation`
- `QuotaPolicy`

关键约束：

- 所有业务表必须带 `team_id`，必要时带 `created_by`。
- 所有 AI 产物必须能追溯到 `project_id`、`task_id`、`model_config_id`。
- 所有费用必须通过账本记录，不直接修改余额后丢失原因。
- 所有 TOS 文件必须有资产记录或临时文件清理机制。

## 12. 前端实现清单

前端不应该直接复制静态 HTML，而应该抽象为真实组件：

正式产品入口必须是 React History 路由，不使用 `*.html` 作为业务页面地址。当前 `/exact/*.html` 的用途是保存设计稿镜像、跑像素级视觉回归和子页面校对；真实页面使用 `/login`、`/register`、`/dashboard`、`/products`、`/products/new`、`/products/:id`、`/projects`、`/projects/new`、`/pipeline/:id` 等 React 路由。

| 组件/区域 | 开发要求 |
| --- | --- |
| App Shell | 顶部/侧边导航、当前团队、用户菜单、未读消息、额度提示。 |
| Resource Picker | 商品选择、资产选择、项目素材选择复用同一交互。 |
| Stage Stepper | 5 阶段进度，支持点击已完成阶段回看。 |
| Task Progress | 轮询任务状态，显示排队、进度、失败原因、重试。 |
| Version Panel | 脚本、图片、故事板、视频都复用版本历史/采用模式。 |
| Quota Modal | 生成前统一确认额度，不在每个页面重复造逻辑。 |
| Upload Widget | 图片/视频/音频上传到 TOS，支持进度和失败重试。 |
| Asset Card | 资产预览、类型、来源、下载、删除、复用。 |
| Timeline Editor | Stage5 主轨、素材池、字幕、BGM、导出。 |
| Empty/Error States | 首次使用、无数据、额度不足、模型失败、网络失败。 |

原型差异注意：

- 已迁移到 `v1` 的页面，视觉与信息层级优先参考 `v1`。
- `v1` 未覆盖的登录注册、商品详情、团队、设置、消息、图片工具等，参考 `电商AI平台` 原版页面补齐。
- 如果 `v1/projects-new.html` 仍保留旧的多步配置，开发时按页面流程定稿收敛，只保留商品和项目名。
- 复制、归档、批量、审核流等非 V1 主路径能力，不因原型里出现就默认开发。
- `pipeline.html` 的视觉和结构可参考，但真实实现必须以 API 状态为准。
- 图片工具页可以复用模型能力，但不能阻塞主生产链路。

## 13. 后端实现清单

后端优先级：

1. Django 项目基础、环境配置、MySQL、Redis、Celery、TOS、日志。
2. 账号、团队、权限、商品、资产、项目基础模型和 API。
3. 额度账本与任务系统先落地，再接火山模型。
4. 火山模型适配层：文本、图片、视频统一接口，支持模型配置化。
5. 生产管线状态机：Stage1 到 Stage5 的前置校验、推进和回滚。
6. Celery 异步任务：AI 提交/轮询/转存/后处理/账本落账。
7. Stage5 FFmpeg 导出服务。
8. Django Admin 运营后台增强。
9. 审计日志、告警、失败补偿、清理任务。

企业级要求：

- AI 调用不能写死模型名和价格，必须走 `ModelConfig`。
- 任务必须幂等，支持重试、取消和补偿。
- 额度扣费和任务成功必须在事务边界内保持一致。
- TOS 转存成功但数据库失败时，要有补偿或清理。
- 所有后台操作必须有审计日志。
- 所有外部 API key 只从环境变量读取。

## 14. 验收矩阵

| 编号 | 验收项 | 结果要求 |
| --- | --- | --- |
| A01 | 注册登录 | 新用户注册后自动创建团队并进入工作台。 |
| A02 | 商品创建 | 可上传商品图、填写信息、保存并在商品库搜索到。 |
| A03 | 项目创建 | 选择商品后创建项目，进入 Stage1。 |
| A04 | 脚本生成 | 调火山文本模型生成脚本，支持保存版本和采用。 |
| A05 | 基础资产 | 商品、人物、场景三类资产真实生成并采用。 |
| A06 | 故事板 | 可生成、采用、跳过，跳过不阻塞视频生成。 |
| A07 | 60s 视频 | 生成 4 个 15s 片段，支持单段失败重试。 |
| A08 | 拼接导出 | 4 段视频导出为 9:16 1080p MP4。 |
| A09 | 资产入库 | AI 图片、视频片段、成片自动进入资产库。 |
| A10 | 上传素材 | 用户上传视频能进入 Stage5 并参与导出。 |
| A11 | 额度预估 | 每次 AI 生成前展示预估消耗并校验余额。 |
| A12 | 失败不扣费 | 模型失败、超时、内容拦截时不最终扣费。 |
| A13 | 账单追溯 | 能按团队、成员、项目、任务查看费用流水。 |
| A14 | 后台排障 | 后台能查任务失败原因并安全重试。 |
| A15 | 团队隔离 | 不同团队无法访问彼此商品、项目、资产和账单。 |

## 15. 首轮开发建议

为了最快证明系统可行，建议第一轮只做一条“真实最小闭环”，但所有核心架构都按全量方案预留：

1. 登录/注册、团队、商品、资产、项目基础。
2. Stage1 真实脚本生成。
3. Stage2 真实生成一组商品/人物/场景基础资产。
4. Stage4 真实生成 1 个 15s 视频片段。
5. Stage5 用 1 个片段导出 MP4。
6. 额度账本贯穿上述每一步。
7. 运营后台能查看和重试任务。

第二轮扩展到完整 60s：

1. Stage4 扩展为 4 个片段并行/排队生成。
2. Stage5 拼接 4 段并支持字幕、BGM、转场。
3. 补齐 Stage3 故事板。
4. 补齐项目列表、账单页、团队管理、资产库高级筛选。

## 16. 开发完成后的真实数据测试计划

本节参考 `/Users/maidong/Desktop/zyc/github/AI-Express/项目角色agent/test-agent.md` 的测试 Agent 规范，并结合 AirShelf 的真实 AI、额度、TOS、Celery 异步任务场景做项目化落地。

开发完成后的验收不能只看接口和页面静态效果，必须用测试环境真实资源、真实数据、真实浏览器点击，把主流程跑穿。这里的“真实”指：

- 使用测试 MySQL、Redis、TOS、火山模型，不用 mock 代替核心外部依赖。
- 用 Playwright 或同类工具启动真实浏览器，按用户视角点击、输入、上传、等待和下载。
- 每次测试生成独立 `run_id`，数据库记录、TOS object key、日志、账本、任务都能追踪到同一轮测试。
- 测试脚本不能直接调用业务 API 把项目状态改到下一步；只允许用 seed/cleanup 脚本准备和清理测试数据。

### 16.0 测试 Agent 执行规范

测试执行时按代码测试、浏览器实操、真实端到端、浏览器真实模拟、测试报告五层推进：

| 层级 | 名称 | 目标 | AirShelf 要求 |
| --- | --- | --- | --- |
| A | 代码层测试 | 验证后端、前端、任务代码基本正确。 | Django/DRF 单元测试、API 测试、Celery 任务测试、前端组件测试。 |
| B | 浏览器实操 | 打开真实页面，点击、输入、hover、拖拽、移动端检查。 | 每次关键操作后检查 console error/warning 并截图。 |
| D | 真实端到端 | 验证真实环境和真实数据流通。 | MySQL、Redis、TOS、火山模型、FFmpeg、Celery 全部接真实测试资源。 |
| E | Playwright 真实模拟 | 验证用户在浏览器里实际看到和操作的结果。 | 禁止 mock API；用真实账号、真实商品、真实上传、真实 AI 结果。 |
| C | 测试报告 | 输出可复查证据和 Bug 清单。 | 没有截图、trace、控制台日志、任务 ID 和账本 ID 的结论不算通过。 |

执行硬规则：

- 代码测试通过不等于测试完成；必须有 Playwright 浏览器截图验证。
- 每次点击、输入、提交、状态切换后都要检查控制台错误。
- 截图必须人工或视觉模型审查，不能只判断 DOM 存在。
- 初始判定默认是 `NEEDS WORK`，只有证据充分才给 `PASS`。
- 报告里如果声称 0 问题，需要追加一轮复测。
- P0 Bug 发现后立即反馈开发修复，不等全量测试跑完。
- 同一个模块最多测试 3 轮；第 3 轮仍失败则进入升级处理。

本机执行建议：

- 优先复用全局 Playwright CLI，不要重复项目级安装。
- 跑测试前先确认 `playwright --version` 和浏览器驱动是否存在。
- 缺浏览器驱动时只安装必需浏览器，优先 `chromium`。
- 可回归测试写成 Playwright spec；探索性排查可用 Playwright MCP 或交互式工具。

### 16.1 测试环境要求

| 类型 | 要求 |
| --- | --- |
| 数据库 | 使用 `account.md` 中的测试 MySQL 配置，单独测试库或测试 schema。 |
| Redis | 使用测试 Redis，按正式 DB index 规划区分 cache、Celery broker、result backend、lock。 |
| TOS | 使用测试 bucket 或测试前缀，例如 `e2e/{run_id}/...`，测试结束可清理。 |
| 火山模型 | 使用真实 ARK/生图/生视频配置，模型名、endpoint、价格来自 `ModelConfig`。 |
| Worker | Celery worker、Celery beat、FFmpeg、回调或轮询任务必须真实启动。 |
| 前端 | 使用接近正式构建的前端产物，不用开发模式里的假数据。 |
| 日志 | 后端日志、Celery 日志、浏览器 trace、截图、视频、导出文件都要保留到测试报告。 |

### 16.2 真实测试数据

每轮 E2E 测试用 seed 脚本准备下面数据：

| 数据 | 内容 |
| --- | --- |
| 测试团队 | `E2E Team {run_id}`，包含 owner、member、no_quota_user、disabled_user。 |
| 测试额度 | owner 有足够额度；member 有月度额度；no_quota_user 额度为 0。 |
| 测试商品 | 至少 3 个真实商品样例：护肤品、小家电、服饰；每个包含真实商品图、标题、品牌、类目、卖点。 |
| 测试素材 | 上传 1 个短视频、1 张商品图、1 张场景图、1 个 BGM 样例。 |
| 模型配置 | 文本、图片、视频、导出任务均有启用状态、单价、限流和能力类型。 |
| 管理员账号 | 可登录 Django Admin 或运营后台，验证任务、账本和补偿。 |

测试数据要求：

- 商品图片和上传视频必须是真文件，能上传到 TOS 并回显预览。
- 商品标题、卖点、脚本输入要覆盖中文、数字、标点和较长文本。
- 所有 seed 数据带 `run_id`，避免和人工测试数据混在一起。

### 16.3 浏览器 E2E 主流程

这些用例必须通过真实浏览器点击完成：

| 编号 | 场景 | 浏览器动作 | 验收结果 |
| --- | --- | --- | --- |
| E01 | 注册登录 | 打开注册页，填写账号，提交，进入工作台。 | 自动创建团队，导航和当前用户信息正确。 |
| E02 | 创建商品 | 进入商品库，点击新建，上传商品图，填写信息并保存。 | 商品出现在商品库，图片可预览，数据库和 TOS 有记录。 |
| E03 | 创建项目 | 从项目列表点击新建，选择商品，填写项目名，提交。 | 创建项目并进入 Stage1，项目绑定正确商品。 |
| E04 | 生成脚本 | 在 Stage1 选择卖点，输入需求，点击 AI 生成，采用脚本版本。 | 真实调用文本模型，脚本版本落库，账本有预估和实扣。 |
| E05 | 生成基础资产 | 在 Stage2 依次生成商品、人物、场景资产，选择候选并采用。 | 真实生成图片，TOS 有文件，资产库有记录，项目阶段可推进。 |
| E06 | 故事板 | Stage3 生成故事板并采用；另跑一条项目验证跳过故事板。 | 生成和跳过两条路径都能进入 Stage4。 |
| E07 | 生成 60s 视频 | Stage4 点击生成 4 个 15s 片段，等待完成，失败段单独重试。 | 4 段视频独立状态正确，成功片段入库，失败不扣最终费用。 |
| E08 | 拼接导出 | Stage5 自动放置片段，上传额外视频，添加字幕/BGM，点击导出。 | 导出 9:16 1080p MP4，能预览、下载、复制链接。 |
| E09 | 资产回查 | 进入资产库，按成片/视频/图片筛选，搜索本轮项目名。 | AI 产物、上传素材、最终成片都能找到并下载。 |
| E10 | 账单回查 | 进入消费页，按项目和成员筛选本轮流水。 | 每个 AI 任务和导出任务都有账本记录，余额变化正确。 |
| E11 | 团队权限 | 用 member、no_quota_user、disabled_user 分别登录访问同一流程。 | 权限、额度不足、账号禁用提示正确，不能越权。 |
| E12 | 运营后台 | 管理员打开后台，搜索本轮项目和任务，查看日志并触发安全重试。 | 能定位任务、资产、账本，重试不会重复扣费。 |

浏览器测试规则：

- 使用 Chromium 作为必跑浏览器；上线前增加 WebKit/Safari 兼容验证。
- 桌面视口必跑，移动视口至少覆盖项目列表、生产管线、资产库、账单页。
- 每次关键操作后检查 console error/warning。
- 每个关键阶段保存截图；失败时保存 Playwright trace、console log、network log。
- 截图中出现空白、错位、遮挡、placeholder 数据、异常报错，一律判失败。
- 长任务要通过 UI 轮询等待，不允许测试脚本直接改数据库状态。
- 下载的最终 MP4 要用 `ffprobe` 校验分辨率、时长、编码和文件大小。

### 16.4 异步任务与失败恢复测试

必须单独测试这些异常路径：

| 场景 | 验收要求 |
| --- | --- |
| 火山文本失败 | Stage1 显示失败原因，账本释放，支持重试。 |
| 图片生成超时 | Stage2 单项失败不污染已采用资产，支持重跑。 |
| 视频单段失败 | Stage4 只重跑失败段，其他段保持成功状态。 |
| TOS 转存失败 | 任务进入 `compensating` 或 `failed`，后台可补偿处理。 |
| Celery worker 重启 | 已提交任务能继续轮询或恢复，不能重复扣费。 |
| Redis 锁过期 | 同一任务重复提交时保持幂等。 |
| 导出失败 | Timeline 保存不丢失，用户可重新导出。 |
| 额度不足 | 前端阻止提交，后台没有创建实际 AI 任务。 |

### 16.5 账本一致性测试

每轮 E2E 完成后必须自动核对：

- 团队余额 = 初始余额 + 充值/调整 - 成功任务实扣。
- `CreditLedger` 每条流水都有 team、user、project、task、model 或 export job。
- 失败任务没有最终扣费；如果有冻结记录，必须有释放记录。
- 重试任务不能重复扣同一次失败费用。
- 后台人工补偿必须产生审计日志。
- 页面展示余额、数据库余额、账本汇总三者一致。

### 16.6 文件与成片质量测试

每个生成文件都要校验：

- TOS object 存在，content type 正确，文件大小大于 0。
- 图片能打开，缩略图能显示。
- 视频片段能播放，时长接近 15s。
- 最终成片为 9:16、1080p、MP4，60s 成片时长允许合理浮动。
- 下载链接有过期时间，不暴露永久私有地址。
- 删除测试数据后，TOS 测试前缀可被清理，不留下大量临时文件。

### 16.7 发布前测试门禁

进入正式部署前，必须满足：

- P0 浏览器 E2E 全部通过。
- P0 API 集成测试全部通过。
- 账本一致性核对为 0 差异。
- 没有 `compensating`、`running`、`reserved` 状态的遗留测试任务。
- TOS 没有孤儿文件，或孤儿文件已进入清理队列。
- 后台可查到本轮测试的项目、任务、资产、账本和导出记录。
- 测试报告包含：run_id、测试账号、项目 ID、任务 ID、账本 ID、导出文件地址、截图和失败 trace。

### 16.8 测试报告与交接格式

每轮测试必须产出可追溯报告，建议目录：

- `test-reports/{run_id}/summary.md`
- `test-reports/{run_id}/screenshots/`
- `test-reports/{run_id}/traces/`
- `test-reports/{run_id}/videos/`
- `test-reports/{run_id}/logs/`

报告必须包含：

| 模块 | 内容 |
| --- | --- |
| 测试概览 | run_id、环境、前端版本、后端版本、测试账号、测试时间。 |
| 数据策略 | 全真实、真实+seed、mock 降级；必须说明原因。 |
| 服务状态 | 前端、后端、MySQL、Redis、Celery、TOS、火山模型、FFmpeg。 |
| 用例结果 | E01-E12 每一步的通过/失败、截图、任务 ID、账本 ID。 |
| 控制台错误 | 页面、操作、错误内容、严重度、截图。 |
| 网络/API 错误 | URL、状态码、响应摘要、复现步骤。 |
| Bug 清单 | 严重度、描述、定位、复现步骤、截图或 trace。 |
| 账本核对 | 初始余额、预估、冻结、实扣、释放、最终余额。 |
| 文件核对 | TOS key、文件大小、content type、视频时长、分辨率。 |
| 结论 | `QA PASS`、`QA FAIL`、`INCOMPLETE` 或 `ESCALATION`。 |

判定标准：

- `QA PASS`：P0/P1 全部通过，账本 0 差异，浏览器截图和 trace 证据完整。
- `QA FAIL`：存在阻塞 Bug，必须带复现步骤和证据返回开发。
- `INCOMPLETE`：环境未跑通、缺截图、缺真实数据、或跳过浏览器测试。
- `ESCALATION`：同一模块第 3 轮仍失败，或外部服务/架构问题阻塞继续测试。

交接给开发时，最后必须附结构化摘要：

```xml
<task-completion>
<status>completed | partial | failed</status>
<summary>一句话说明本轮测试结论</summary>
<deliverables>
- summary.md: done | partial | skipped
- screenshots: done | partial | skipped
- traces: done | partial | skipped
</deliverables>
<self-check-results>
- [x] 真实浏览器点击: PASS
- [x] 控制台错误检查: PASS
- [x] 真实数据验证: PASS
- [x] 账本一致性核对: PASS
</self-check-results>
<escalations>无，或列出需要上报的问题</escalations>
</task-completion>
```

## 17. 待确认项

这些项不阻塞开发，但进入正式计费和对外交付前需要确认：

- 火山各模型的正式 endpoint、并发限制、回调能力、计费口径。
- 60s 视频默认脚本分段策略：固定 4 段，还是按脚本语义自动切 4 段。
- 失败重试的免费次数和计费边界。
- BGM 来源：系统内置、用户上传、还是第三方库。
- 字幕样式默认模板数量。
- 成片是否加水印，测试环境和正式环境是否不同。
- 内容安全策略：由火山模型拦截、平台自审、还是两者结合。
- 导出文件保留周期和临时文件清理周期。
