feat: generate-cover 支持 cover_type=upload + /generate 传递 custom_title/cover_url #1410
Reference in New Issue
Block a user
Delete Branch "feat/upload-cover-and-title-in-generate"
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?
改动
generate-cover 支持 cover_type=upload
/generate 传递 custom_title 和 cover_url
测试
关联
🚀 预览环境已部署
f6068a5c0dto978d5743a5861913f977to164e96b935【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/api/app/api/routes/generation_cover.py: 100] 潜在的 KeyError 异常风险
normalized["cover"]访问字典键。如果normalize_plan_config函数内部逻辑严格(例如基于 Pydantic 模型验证),可能会过滤掉未在模型中定义的cover字段,导致此处抛出KeyError,进而引发 500 错误。.get("cover")安全访问,或者在调用normalize_plan_config前确认该函数支持保留cover字段。如果必须存在,应捕获异常或添加断言。[apps/api/app/api/routes/templates_editor/generation.py: 98] 标题复用逻辑存在键顺序敏感问题
json.dumps(title_config_reuse)生成字符串并与数据库中的existing_custom_title进行对比。Python 3.7+ 虽然维护字典插入顺序,但如果前端传入的 JSON 字段顺序与数据库中存储的历史顺序不一致(例如{"text": "a", "size": 1}vs{"size": 1, "text": "a"}),即使语义完全相同,字符串比较也会不相等,导致reusable_task被错误置空,从而触发不必要的重复渲染任务。existing_custom_title反序列化为字典,然后对比两个字典对象;或者在序列化时使用sort_keys=True保证一致性。💡 改进建议(不阻塞合并)
[apps/api/app/api/routes/templates_editor/generation.py: 98, 191] JSON 序列化缺乏异常保护
title_config的类型定义为Dict[str, Any]。虽然通常前端传入的是标准 JSON 类型,但如果Any中混入了不可序列化的对象(如某些特殊类型的内部对象,尽管在标准 API 请求中较少见),json.dumps会抛出TypeError。建议添加try-except块捕获序列化异常,或者将 Schema 中的Any改为更具体的类型定义。[apps/api/app/api/routes/generation_cover.py: 52] 缺少 cover_url 格式校验
cover_url字段仅定义为Optional[str],没有添加 URL 格式校验或域名白名单校验。虽然注释说明是“上传的封面图片 URL”,但用户可篡改请求传入任意字符串(如file:///etc/passwd或内网地址)。如果后续渲染服务会请求此 URL,存在 SSRF(服务端请求伪造)风险。建议添加 Pydantic 的HttpUrl类型校验或自定义正则校验。✅ 良好实践
generation.py中添加了request: Optional[...] = None并通过req = request or ...处理,很好地保持了向后兼容性。generation_cover.py中对cover_url进行了截断处理([:80])再记录日志,防止日志过长,是个好习惯。🤖 由 AI 代码审查机器人自动生成 | 2026-08-17 14:28:51 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1410 已关闭或合并,对应的预览环境已被清理。