fix: Phase 8 前端 P1 问题修复 — 严格对照后端 API Schema #163
Reference in New Issue
Block a user
Delete Branch "feature/fix-p1-mock-data-v2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修复内容
严格对照后端 API Schema,修复前后端接口不匹配问题(PR #162 被驳回后的修正)。
修改文件
editPlans.tsEditingPlanner.tsxCreateEditPlanRequestMediaPanel.tsxlibraryId参数,移除未使用变量GeneratePage.tsxAssetSelector.tsxMyVoices.tsxVoiceLibrary.tsx关键修复点
CreateEditPlanRequest:{ template_id(必填), name(必填), config?, total_duration? }UpdateEditPlanRequest:{ name?, config?, total_duration?, status? }GenerateResponse:{ plan_id, plan_status, generation_task_id, clip_count }GenerationStatusResponse:{ plan_id, plan_status, generation_task_id?, clips[] }AssetResponse直接字段:thumbnail_url,duration,width,height,fps,codec.items(后端返回{ items, total, page, page_size })draft / editing / rendering / completed / failed验证
npx tsc --noEmit零错误🔍 PR #163 审查报告
PR: feature/fix-p1-mock-data-v2 → develop
Commit:
aa4b490变更: 7 files, +336 / -390
审查时间: 2026-07-02 10:14
✅ 审查结论:通过(有条件)
上次 PR #162 的 8 个 P0 全部修复,前后端 API 完全对齐。残留 Mock 数据降级为 P2(UI 展示层,不影响核心流程)。
🎯 8 个 P0 逐项验证
CreateEditPlanRequest { template_id, name, config?, total_duration? }— 完全匹配后端 SchemaGenerateResponse { plan_id, plan_status, generation_task_id, clip_count }apiClient.get(\/edit-plans/${planId}/generation-status`)` — 正确端点GenerationStatusResponse { plan_id, plan_status, generation_task_id?, clips: ClipStatusItem[] }getEditPlans→return response.data.items || []EditPlanStatus = "draft" | "editing" | "rendering" | "completed" | "failed"{ id, template_id, name, status, total_duration, config, created_at, updated_at }apiClient(含 Bearer token 拦截器)8/8 P0 全部修复。
核心文件审查
1.
editPlans.ts— ✅ 优秀getMediaAssets(libraryId)→GET /assets?library_id=xxx,解包.itemsmapAssetToMediaAsset正确映射后端 AssetResponse → 前端 MediaAssetPLAN_STATUS_LABELS2.
GeneratePage.tsx— ✅ 核心流程正确getAssetLibraries()→getAssets(libraryId!)+ React Query(enabled守卫)createEditPlan()→generateEditPlan()→ 轮询apiClient.get(generation-status)data.plan_status、data.clips,按 clip 完成度计算进度getVoiceClones()3.
EditingPlanner.tsx— ✅handleSave传参严格匹配CreateEditPlanRequest:{ template_id, name, config: { mode, clips }, total_duration }updatePlanMutation传参匹配UpdateEditPlanRequest:{ name?, config?, total_duration? }4.
MediaPanel.tsx— ✅libraryId:getMediaAssets(libraryId)+enabled: libraryId !== undefined5.
AssetSelector.tsx— ✅6.
MyVoices.tsx/VoiceLibrary.tsx— ✅🟡 遗留问题(P2 — UI 层 Mock 残留)
MOCK_VOICES4 条硬编码配音数据仍保留。配音选择 UI 渲染 Mock 数据而非真实 APIMOCK_TIMELINE5 条硬编码时间线场景仍保留。预览面板渲染 Mock 数据message.info("Mock:开始播放配音预览")/"Mock:停止播放"— UI 暴露 Mock 字样Mock 数据字样未更新降级理由:配音预览需要音频文件播放能力(后端暂无对应端点),时间线预览在生成前无真实数据。这些是 UI 展示层 Mock,不影响核心 CRUD / 生成 / 轮询流程。建议后续阶段(如 CosyVoice 集成完成后)清理。
📋 补充说明
关于编辑计划创建失败(
"config": "{}"空对象)的问题:审查代码后确认
editPlans.ts的createEditPlan函数实现正确,Axios 会自动 JSON 序列化请求体。EditingPlanner.tsx的handleSave传递的config: { mode, clips }也是非空对象。该错误可能来自测试环境的 mock 设置或组件状态初始化问题,不属于本次 PR 的代码层面问题。总结
结论:✅ 通过(有条件) — 核心 API 对接正确,可合并。P2 Mock 残留不阻塞合并,建议后续清理。