fix(#1677): AI Review 跟进修复(标题校验/TTS依赖/排序兜底/预览数硬上限) #1712

Merged
auto-approve-bot merged 1 commits from fix/1677-review-followups into develop 2026-09-05 12:56:12 +08:00
Owner

背景

PR #1711 合并后,AI Code Review 的阻塞+建议修复(提交于 20fe447e)未随 PR 合入,本 PR 补上。

修复内容

  1. 阻塞项handleConfirmGenerate 单视频标题校验与 buildPayload.validateGenerateInputs 语义对齐——aiAutoSelect 自动模式允许空标题(后端生成,既有设计),手动模式必填,逻辑显式化避免提交空标题
  2. 建议1:TTS 试听 effect 依赖收窄到 previewTitles[0](variant0Title),批量模式下编辑第 2+ 个变体标题不再触发多余 TTS 请求
  3. 建议2BatchGenerationGrid 排序加 (variantIndex || 0) 兜底,防 undefined 导致 NaN 排序异常
  4. 建议3CanvasPreviewGrid 渲染数加 MAX_PREVIEW_COUNT(10) 硬上限,防止同时播放媒体元素过多导致浏览器卡顿

本地 tsc/eslint/prettier/vitest/build 全绿。

## 背景 PR #1711 合并后,AI Code Review 的阻塞+建议修复(提交于 20fe447e)未随 PR 合入,本 PR 补上。 ## 修复内容 1. **阻塞项**:`handleConfirmGenerate` 单视频标题校验与 `buildPayload.validateGenerateInputs` 语义对齐——aiAutoSelect 自动模式允许空标题(后端生成,既有设计),手动模式必填,逻辑显式化避免提交空标题 2. **建议1**:TTS 试听 effect 依赖收窄到 `previewTitles[0]`(variant0Title),批量模式下编辑第 2+ 个变体标题不再触发多余 TTS 请求 3. **建议2**:`BatchGenerationGrid` 排序加 `(variantIndex || 0)` 兜底,防 undefined 导致 NaN 排序异常 4. **建议3**:`CanvasPreviewGrid` 渲染数加 `MAX_PREVIEW_COUNT`(10) 硬上限,防止同时播放媒体元素过多导致浏览器卡顿 本地 tsc/eslint/prettier/vitest/build 全绿。
xiaoxia added 1 commit 2026-09-05 12:51:12 +08:00
fix(#1677): AI Review 反馈修复——标题校验/TTS依赖收窄/排序健壮性/预览数硬上限
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m40s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m55s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m2s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m14s
AI Code Review / AI Code Review (pull_request) Failing after 2m17s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m15s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m35s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m43s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 4m12s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m22s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 9s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 22s
15c405bfc5
- 单视频标题校验与 buildPayload.validateGenerateInputs 对齐:aiAutoSelect
  自动模式允许空标题(后端生成,既有设计),手动模式必填,逻辑显式化
- TTS 试听 effect 依赖收窄到 previewTitles[0](variant0Title),编辑其他
  变体标题不再触发多余 TTS 请求
- BatchGenerationGrid 排序加 (variantIndex || 0) 兜底防 NaN
- CanvasPreviewGrid 渲染数加 MAX_PREVIEW_COUNT(10) 硬上限,防媒体元素过多卡顿

🚀 预览环境已部署

项目 详情
PR号 #1712
预览链接 https://pr-1712.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1712 | | 预览链接 | [https://pr-1712.preview.xiaoxiajianji.com](https://pr-1712.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:是
  • 阻塞级问题数量:1 个

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

  1. [apps/web/src/pages/generate/components/CanvasPreviewGrid.tsx:45] 逻辑错误:硬编码截断导致功能缺失
    • 问题类型:逻辑bug
    • 问题描述:代码中使用 Math.min(count, MAX_PREVIEW_COUNT) 将渲染数量限制为 10 个。当 count 大于 10 时,索引 10 及之后的预览项将不会渲染。这导致用户无法看到、无法取消选择、也无法与这些隐藏的项目交互,造成 UI 状态与实际数据状态严重脱节(例如用户以为只生成了 10 个,实际可能生成了 20 个)。
    • 修改建议:如果必须限制性能,应实现分页、虚拟滚动,或者在 UI 上明确告知用户当前仅展示前 10 项并提供切换视图的方式。直接在渲染循环中截断数量是不可接受的,必须保证所有数据项都有对应的交互入口,或者在源头限制 count 的最大值。

💡 改进建议(不阻塞合并)

  1. [apps/web/src/pages/generate/GeneratePage.tsx:135] 空指针风险防御

    • 具体内容:代码中 previewTitles[0] 假设 previewTitles 始终是数组。虽然通常情况下如此,但在初始化或异常状态下可能为 null/undefined。建议添加可选链 previewTitles?.[0] 以增强健壮性。
  2. [apps/web/src/pages/generate/components/BatchGenerationGrid.tsx:25] 排序逻辑的类型安全

    • 具体内容:a.variantIndex || 0 的写法虽然处理了 null/undefined,但如果 variantIndex 是字符串类型(例如来自某些 API 的 "1", "2"),减法运算会将其转换为数字,但如果是非数字字符串则会得到 NaN,导致排序不稳定。建议显式转换为数字:Number(a.variantIndex || 0)

良好实践

  • GeneratePage.tsx 中,通过提取 variant0Title 并将其加入 useEffect 依赖,精准地解决了批量模式下编辑非首项标题触发多余 TTS 请求的性能问题,逻辑清晰有效。
  • BatchGenerationGrid.tsx 中,对 variantIndex 进行了 || 0 的兜底处理,防止了因 undefined 导致的排序异常。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-09-05 04:53:28 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/pages/generate/components/CanvasPreviewGrid.tsx:45] 逻辑错误:硬编码截断导致功能缺失** - 问题类型:逻辑bug - 问题描述:代码中使用 `Math.min(count, MAX_PREVIEW_COUNT)` 将渲染数量限制为 10 个。当 `count` 大于 10 时,索引 10 及之后的预览项将不会渲染。这导致用户无法看到、无法取消选择、也无法与这些隐藏的项目交互,造成 UI 状态与实际数据状态严重脱节(例如用户以为只生成了 10 个,实际可能生成了 20 个)。 - 修改建议:如果必须限制性能,应实现分页、虚拟滚动,或者在 UI 上明确告知用户当前仅展示前 10 项并提供切换视图的方式。直接在渲染循环中截断数量是不可接受的,必须保证所有数据项都有对应的交互入口,或者在源头限制 `count` 的最大值。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/GeneratePage.tsx:135] 空指针风险防御** - 具体内容:代码中 `previewTitles[0]` 假设 `previewTitles` 始终是数组。虽然通常情况下如此,但在初始化或异常状态下可能为 `null`/`undefined`。建议添加可选链 `previewTitles?.[0]` 以增强健壮性。 2. **[apps/web/src/pages/generate/components/BatchGenerationGrid.tsx:25] 排序逻辑的类型安全** - 具体内容:`a.variantIndex || 0` 的写法虽然处理了 `null`/`undefined`,但如果 `variantIndex` 是字符串类型(例如来自某些 API 的 "1", "2"),减法运算会将其转换为数字,但如果是非数字字符串则会得到 `NaN`,导致排序不稳定。建议显式转换为数字:`Number(a.variantIndex || 0)`。 ### ✅ 良好实践 - 在 `GeneratePage.tsx` 中,通过提取 `variant0Title` 并将其加入 `useEffect` 依赖,精准地解决了批量模式下编辑非首项标题触发多余 TTS 请求的性能问题,逻辑清晰有效。 - 在 `BatchGenerationGrid.tsx` 中,对 `variantIndex` 进行了 `|| 0` 的兜底处理,防止了因 `undefined` 导致的排序异常。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-09-05 04:53:28 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-09-05 12:53:49 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-09-05 12:53:49 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit fbfd19fbb9 into develop 2026-09-05 12:56:12 +08:00
auto-approve-bot deleted branch fix/1677-review-followups 2026-09-05 12:56:14 +08:00

🗑️ 预览环境已清理

PR #1712 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1712 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.