feat(#1677): 多视频批量生成前端 — 数量弹窗/批量预览/独立标题配音封面/5步流程 #1704
Reference in New Issue
Block a user
Delete Branch "feat/1677-batch-generation"
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?
关联 Issue
Closes #1677
后端依赖
PR #1701(已合并部署 staging,commit c1763b99):
POST /generation/preview支持preview_count返回{items:[...N变体], total};POST /generation/tasks支持count+titles[]/voice_library_ids[]/cover_urls[](长度1=共用、长度N=独立、空数组=回退旧逻辑)。改动内容
流程:6步 → 5步
模板 → 素材 → 配音 → 标题(含确认生成)→ 封面;删除 Step7ConfirmGenerate / useStep7Generate / SummaryCard 冗余组件。
1. 数量弹窗(Step1)
2. 标题页布局对调 + 合并确认生成(Step4)
3. 批量预览
POST /preview传preview_count=N,对返回的 N 个 task_id 分别GET /preview/{task_id}并行轮询4. 配音(Step3)
5. 封面(Step5)
6. 正式生成
POST /tasks传count=勾选数 +titles[]/voice_library_ids[](仅独立配音)/cover_urls[](按勾选索引映射)验收红线
本地验证
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
handleCountConfirm和useEffect中,多处使用了setState的函数式更新(如setPreviewTitles((prev) => ...)),代码中直接访问了prev[0]、prev[i]或调用prev.map()。如果初始状态(prev)为undefined或null(例如页面刚加载未经过初始化流程,或状态被重置时),这些操作会抛出TypeError: Cannot read properties of undefined导致页面崩溃。prev之前添加默认空数组回退。例如:setPreviewTitles((prev) => { const p = prev || []; ... })setVoiceLibraryIds((prev) => Array.from({ length: count }, (_, i) => (prev || [])[i] ?? ...))setVoiceLibraryIds((prevIds) => (prevIds || []).map(...))💡 改进建议(不阻塞合并)
poster={finalVideo.thumbnail_url || undefined}中的|| undefined是冗余的,当thumbnail_url为 falsy 值时,直接传递该值即可,React 会自动处理。建议简化为poster={finalVideo.thumbnail_url}。✅ 良好实践
useCallback和useMemo对buildPreviewRequest、previewReady等进行优化,避免不必要的重渲染。prevVoiceSyncRef来处理配音同步逻辑,有效避免了useEffect的依赖循环问题。isBatch标志控制,便于维护。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-09-05 00:43:11 | 模型:
- setPreviewTitles/setVoiceLibraryIds/setPreviewCovers/setSelectedVariantIds 函数式更新中 prev 加 (prev || []) 兜底,防御状态重置场景 - 清理 poster={url || undefined} 冗余写法CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1704 已关闭或合并,对应的预览环境已被清理。