fix(cover): 模板缩略图渲染 + 自动生成封面404修复 #2053

Merged
auto-approve-bot merged 3 commits from fix/cover-thumb-and-404-20260926 into develop 2026-09-26 18:25:09 +08:00

3 Commits

Author SHA1 Message Date
xiaoxia 6becc7beca revert(backend): 撤回 #2053 后端改动,让前端PR先合入
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 8s
CI/CD Pipeline / PR Build Worker Image (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 / 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 / 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 / PR Build Web Image (pull_request) Successful in 1m27s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m23s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m43s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m36s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m21s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m16s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 4m54s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 5m17s
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 0s
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 4m29s
AI Code Review / AI Code Review (pull_request) Successful in 6m43s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 33s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 34s
按方案1拆分:撤回 generation_cover.py 的 template_id 可选改动和
dependencies.py 的 get_draft_plan_id_optional 新增依赖。PR#2053 现在只包含
前端修复(模板缩略图渲染 + 不传 "default" 魔法字符串 + 真实模板id解析)。

后端改动(让 /generate-cover 支持 template_id 为空自动兜底默认模板)后续
会在独立 PR 中跟进,配合单测更新一起合。

前端已处理的向后兼容:
- api/generation/cover.ts: templateId 为空或 'default' 时不传 template_id
  参数。当前后端 template_id 是必填 Query,会返回 422 Validation Error,
  这比之前传 'default' 返回 404 '模板不存在' 更明确;
- useSharedCover 挂载时会自动拉模板列表把 'default' 占位符解析为第一个
  系统模板的真实 id,因此绝大多数正常路径(选过模板/默认系统模板)不会
  触发空 template_id 分支;
- useBatchCovers 同样使用解析后的真实模板 id 或空串,空串情况只发生在
  用户删除全部模板后的极端兜底场景,届时用户会看到 422 错误提示需要
  新建模板,属于可接受的退化行为。
2026-09-26 18:18:40 +08:00
xiaoxia a989670d83 fix(cover): 修复 #2053 单测失败 — plan_id 直接返回以兼容测试直接调用
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
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 / Build Staging 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 / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
CI 报错 17 个用例失败:
  ValidationError: GenerateCoverResponse.plan_id Input should be a valid string
  input_value=<MagicMock id='...'>

原因:上一版把 plan_id 参数默认值改为 "" 后,在函数体内用 resolve_draft_plan_id
的返回值覆盖了 plan_id。单测直接调用函数时虽然显式传入了 plan_id="plan-x",
但 resolve_draft_plan_id 未被 mock,会把 services=(mock_tpl, mock_plan) 中的
MagicMock 当作 tpl_svc 调用并返回 MagicMock,最终覆盖传入的字符串。

修复:在函数体内加判断 if not plan_id: 才走 resolve_draft_plan_id;单测显式
传入 plan_id 字符串时直接用,HTTP 调用默认空串才触发模板解析。
同时把两处函数内 from-import 提升到模块顶层 import resolve_draft_plan_id,
并在 templates_editor/dependencies.py 新增 get_draft_plan_id_optional 依赖
(供其他端点复用,本次未实际引用但保留供将来使用)。

PR Build API Image 的失败是 CI 基础设施 DNS 解析超时
(xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com i/o timeout),
与代码无关,push 后重试即可。
2026-09-26 18:16:37 +08:00
xiaoxia 0a6473e5d7 fix(cover): 模板缩略图渲染 + 自动生成封面404修复
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m4s
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 / Build Staging 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 / PR Build Web Image (pull_request) Successful in 1m47s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m57s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m54s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m12s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m17s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m35s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m43s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m7s
AI Code Review / AI Code Review (pull_request) Successful in 6m35s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 8m12s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
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
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 9m12s
CI/CD Pipeline / CI Gate (pull_request) Failing after 0s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m14s
问题1:模板卡片不显示预览图
- 之前写死渐变色+🖼️emoji,完全没用 thumbnail_url 字段
- 新增 TemplateThumb 子组件:优先渲染 tpl.thumbnail_url(object-fit:cover),
  图片加载失败或无URL时回退到按模板id哈希的柔和渐变色占位
- 选中态✓覆盖在图片上层

问题2:自动生成封面 POST /generation/generate-cover 返回404
根因:前端用魔法字符串 "default" 作为 template_id 发给后端,但后端
模板库中不存在 id="default" 的记录,resolve_draft_plan_id 返回404。

修复:
1. 前端 useSharedCover:挂载时拉模板列表,把初始 "default" 占位符自动
   解析为第一个系统模板的真实id;用户未选模板时传空串给API层
2. 前端 api/generation/cover.ts:templateId 为空或 "default" 时不传
   template_id query 参数(而非传 "default")
3. 后端 generation_cover.py:
   - template_id Query 改为可选(默认空串)
   - 移除原来强依赖 get_draft_plan_id(auto_create_default=False) 的 Depends
   - 在函数体内手动 resolve:空串时 auto_create_default=True 自动兜底到
     用户默认模板;非空时走原校验逻辑
4. useBatchCovers:批量一键生成同样不传 "default"
5. Step6CoverSettings:透传原始 selectedTemplateId 给 useBatchCovers
6. 保留 selectedTemplateId==="default" 的UI展示分支("默认模板"文案)
   用于首次挂载模板列表加载完成前的过渡态

验证:
- tsc --noEmit ✅
- eslint --max-warnings=0 ✅
- prettier ✅
- vite build ✅
- 后端 Python 语法检查 ✅
- 未修改 CI 配置
2026-09-26 16:12:57 +08:00