feat: Admin 生成记录查看提示词原图与生成结果 #72

Closed
opened 2026-08-27 09:31:49 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:功能 / Admin API / 权限安全 / Admin UI
  • 所属 Epic:#3
  • 所属 MVP / 版本:#35 / MVP-2 后续可用性优化
  • 阶段:已完成
  • 关联工单:#24、#65、#69
  • 设计证据:复用 #65 v2 右侧详情抽屉;2026-08-27 用户确认在现有抽屉内增加“提示词原图”和“生成结果”区域,并确认安全媒体接口方案

原始需求

  • 来源:用户对话
  • 提出时间:2026-08-27
  • 用户关键原话(脱敏):“为什么 admin 的生成记录不能查看提示词原图和生成的图片”;在原因和方案说明后确认“建工单,做”。

背景与事实

  • Admin 当前 GET /api/v1/chorus/generations 只返回任务、Prompt、attempt 和时间,不查询 generation_inputs / generation_outputs。
  • Admin 没有媒体读取端点,Admin UI 抽屉也没有图片或文本结果组件。
  • Portal 媒体端点使用终端用户会话/API Key 和用户归属校验,不能复用 Admin JWT。
  • 存储对象包含 owner/generation 元数据;不得把 storage_key 或本地路径返回浏览器。

目标

管理员在生成记录详情中安全查看提示词原图、生成图片和文本输出,用于运营排错;媒体访问继续受 Admin JWT/Casbin 保护,不暴露存储路径,不提供写入、删除或重新生成能力。

已确认方案

接口与数据

  • 保留现有列表接口;新增单条详情 GET /api/v1/chorus/generations/:id,返回任务详情、输入/输出安全元数据和 Admin 媒体 URL。
  • 新增输入原图读取 GET /api/v1/chorus/generations/:id/inputs/:inputID。
  • 新增输出原图与缩略图读取:
    • GET /api/v1/chorus/generations/:id/outputs/:outputID
    • GET /api/v1/chorus/generations/:id/outputs/:outputID/thumbnail
  • 服务端先按 generation/input/output 关系查询数据库,再打开对象;同时校验存储对象的 GenerationID 与 generation 一致。
  • 详情只返回名称、角色、类型、尺寸、分辨率和受控 URL;不返回 storage_key、缩略图 key 或本地绝对路径。
  • 文本输出直接作为详情字段返回;图片内容只通过媒体端点流式读取。
  • 媒体响应设置 Cache-Control: no-store、Pragma: no-cache、X-Content-Type-Options: nosniff,使用已验证 MIME 和安全文件名。

配置与存储

  • 在 Admin settings.extend.chorus.storage_root 增加只读存储根配置;示例只写占位本地路径。
  • Admin 服务只依赖包含 Open 的只读接口,不获得 Put 或 Delete。
  • 本机未跟踪的 admin/config/settings.yml 配置为 Portal 当前使用的同一存储根;不复制凭据。

权限和 migration

  • 新增可逆 migration 10,登记四个 GET API、关联“生成记录”菜单并授予内置 chorus_operator;超级管理员沿用现有全局规则。
  • down 只删除 migration 10 精确登记的菜单/API/Casbin 关联,不修改业务数据。
  • 不使用 AutoMigrate。

Admin UI

  • 点击“查看”或双击后先请求单条详情,不把 100 条记录的图片元数据批量塞入列表。
  • 在现有详情抽屉中,Prompt 后增加“提示词原图”和“生成结果”。
  • 原图和结果图使用缩略图网格;点击打开 Element Plus 图片预览,输出原图使用受保护端点。
  • 文本输出显示为可换行文本块。
  • 覆盖加载、无输入、无输出、对象缺失、403、接口错误、多图和窄屏状态;失败图片不影响其他详情字段。
  • 图片请求通过现有 Admin JWT 请求能力加载,禁止把 Token 拼入 URL。

非目标

  • 不允许管理员编辑、删除、下载打包、重新生成或公开分享图片。
  • 不修改 Portal 媒体权限,不复用终端用户 Cookie/API Key。
  • 不修改生成状态机、worker、Provider、retryable 或历史任务。
  • 不增加内容审核、计费、点数、余额或配额。
  • 不迁移、复制或删除现有图片对象。

验收标准

  • 单条详情正确返回输入、图片输出和文本输出元数据,不返回任何 storage key 或绝对路径。
  • 四个 Admin GET 端点均受 JWT/Casbin 保护,未认证/无权限被拒绝。
  • 输入/输出 ID 必须属于 URL 中的 generation,存储对象 generation 元数据也必须一致。
  • 媒体响应禁止缓存、nosniff,缺失对象返回稳定且不泄露路径的错误。
  • Admin 服务只持有只读存储接口。
  • migration 10 up/down/up 在隔离 MySQL 通过,生产不使用 AutoMigrate。
  • Admin 抽屉能显示多张提示词原图、生成图片和文本输出,并覆盖加载/空/错误/窄屏。
  • 图片请求不把 JWT、Cookie、storage key 或本地路径写入 URL、日志、错误、工单、Wiki 或截图。
  • Go/Admin UI 单元测试、lint、构建及浏览器 E2E 通过。
  • 本机 Supervisor 更新后,真实管理员页面可以查看已有记录媒体;不调用真实 Provider。

风险与回退

  • 风险:管理员获得跨用户媒体查看能力,必须由 JWT/Casbin、generation 关系和存储元数据三层约束。
  • 风险:浏览器 <img> 不会自动附加 Authorization header,需要使用受控请求取得 Blob URL,并在关闭详情时释放。
  • 风险:旧对象缺失或元数据异常时必须局部失败,不泄露磁盘路径。
  • 回退:先回退 Admin UI,再回退 Admin API,最后执行 migration 10 down;不修改 generation 或图片数据。

文档影响

长期配置、Admin API、权限矩阵和排错方式发生变化,需要更新 Wiki 的 Architecture-and-Code-Map、Business-Rules-and-Glossary、Deployment-and-Operations、Local-Development-and-Verification 和 Troubleshooting。

## 基本信息 - 类型:功能 / Admin API / 权限安全 / Admin UI - 所属 Epic:#3 - 所属 MVP / 版本:#35 / MVP-2 后续可用性优化 - 阶段:已完成 - 关联工单:#24、#65、#69 - 设计证据:复用 #65 v2 右侧详情抽屉;2026-08-27 用户确认在现有抽屉内增加“提示词原图”和“生成结果”区域,并确认安全媒体接口方案 ## 原始需求 - 来源:用户对话 - 提出时间:2026-08-27 - 用户关键原话(脱敏):“为什么 admin 的生成记录不能查看提示词原图和生成的图片”;在原因和方案说明后确认“建工单,做”。 ## 背景与事实 - Admin 当前 `GET /api/v1/chorus/generations` 只返回任务、Prompt、attempt 和时间,不查询 `generation_inputs` / `generation_outputs`。 - Admin 没有媒体读取端点,Admin UI 抽屉也没有图片或文本结果组件。 - Portal 媒体端点使用终端用户会话/API Key 和用户归属校验,不能复用 Admin JWT。 - 存储对象包含 owner/generation 元数据;不得把 `storage_key` 或本地路径返回浏览器。 ## 目标 管理员在生成记录详情中安全查看提示词原图、生成图片和文本输出,用于运营排错;媒体访问继续受 Admin JWT/Casbin 保护,不暴露存储路径,不提供写入、删除或重新生成能力。 ## 已确认方案 ### 接口与数据 - 保留现有列表接口;新增单条详情 `GET /api/v1/chorus/generations/:id`,返回任务详情、输入/输出安全元数据和 Admin 媒体 URL。 - 新增输入原图读取 `GET /api/v1/chorus/generations/:id/inputs/:inputID`。 - 新增输出原图与缩略图读取: - `GET /api/v1/chorus/generations/:id/outputs/:outputID` - `GET /api/v1/chorus/generations/:id/outputs/:outputID/thumbnail` - 服务端先按 generation/input/output 关系查询数据库,再打开对象;同时校验存储对象的 `GenerationID` 与 generation 一致。 - 详情只返回名称、角色、类型、尺寸、分辨率和受控 URL;不返回 `storage_key`、缩略图 key 或本地绝对路径。 - 文本输出直接作为详情字段返回;图片内容只通过媒体端点流式读取。 - 媒体响应设置 `Cache-Control: no-store`、`Pragma: no-cache`、`X-Content-Type-Options: nosniff`,使用已验证 MIME 和安全文件名。 ### 配置与存储 - 在 Admin `settings.extend.chorus.storage_root` 增加只读存储根配置;示例只写占位本地路径。 - Admin 服务只依赖包含 `Open` 的只读接口,不获得 `Put` 或 `Delete`。 - 本机未跟踪的 `admin/config/settings.yml` 配置为 Portal 当前使用的同一存储根;不复制凭据。 ### 权限和 migration - 新增可逆 migration 10,登记四个 GET API、关联“生成记录”菜单并授予内置 `chorus_operator`;超级管理员沿用现有全局规则。 - down 只删除 migration 10 精确登记的菜单/API/Casbin 关联,不修改业务数据。 - 不使用 AutoMigrate。 ### Admin UI - 点击“查看”或双击后先请求单条详情,不把 100 条记录的图片元数据批量塞入列表。 - 在现有详情抽屉中,Prompt 后增加“提示词原图”和“生成结果”。 - 原图和结果图使用缩略图网格;点击打开 Element Plus 图片预览,输出原图使用受保护端点。 - 文本输出显示为可换行文本块。 - 覆盖加载、无输入、无输出、对象缺失、403、接口错误、多图和窄屏状态;失败图片不影响其他详情字段。 - 图片请求通过现有 Admin JWT 请求能力加载,禁止把 Token 拼入 URL。 ## 非目标 - 不允许管理员编辑、删除、下载打包、重新生成或公开分享图片。 - 不修改 Portal 媒体权限,不复用终端用户 Cookie/API Key。 - 不修改生成状态机、worker、Provider、retryable 或历史任务。 - 不增加内容审核、计费、点数、余额或配额。 - 不迁移、复制或删除现有图片对象。 ## 验收标准 - [ ] 单条详情正确返回输入、图片输出和文本输出元数据,不返回任何 storage key 或绝对路径。 - [ ] 四个 Admin GET 端点均受 JWT/Casbin 保护,未认证/无权限被拒绝。 - [ ] 输入/输出 ID 必须属于 URL 中的 generation,存储对象 generation 元数据也必须一致。 - [ ] 媒体响应禁止缓存、nosniff,缺失对象返回稳定且不泄露路径的错误。 - [ ] Admin 服务只持有只读存储接口。 - [ ] migration 10 up/down/up 在隔离 MySQL 通过,生产不使用 AutoMigrate。 - [ ] Admin 抽屉能显示多张提示词原图、生成图片和文本输出,并覆盖加载/空/错误/窄屏。 - [ ] 图片请求不把 JWT、Cookie、storage key 或本地路径写入 URL、日志、错误、工单、Wiki 或截图。 - [ ] Go/Admin UI 单元测试、lint、构建及浏览器 E2E 通过。 - [ ] 本机 Supervisor 更新后,真实管理员页面可以查看已有记录媒体;不调用真实 Provider。 ## 风险与回退 - 风险:管理员获得跨用户媒体查看能力,必须由 JWT/Casbin、generation 关系和存储元数据三层约束。 - 风险:浏览器 `<img>` 不会自动附加 Authorization header,需要使用受控请求取得 Blob URL,并在关闭详情时释放。 - 风险:旧对象缺失或元数据异常时必须局部失败,不泄露磁盘路径。 - 回退:先回退 Admin UI,再回退 Admin API,最后执行 migration 10 down;不修改 generation 或图片数据。 ## 文档影响 长期配置、Admin API、权限矩阵和排错方式发生变化,需要更新 Wiki 的 Architecture-and-Code-Map、Business-Rules-and-Glossary、Deployment-and-Operations、Local-Development-and-Verification 和 Troubleshooting。
Author
Owner

2026-08-27 开始实施。前置能力 #24、#65 已完成,#69 待验收但本任务只依赖已运行的生成记录页面与 migration 9,允许继续。当前数据库为 migration 9、dirty=0;工作区既有本地配置和截图保持不纳入提交。代码知识图谱工具在当前会话不可用,按仓库规则回退到定点文件读取。

2026-08-27 开始实施。前置能力 #24、#65 已完成,#69 待验收但本任务只依赖已运行的生成记录页面与 migration 9,允许继续。当前数据库为 migration 9、dirty=0;工作区既有本地配置和截图保持不纳入提交。代码知识图谱工具在当前会话不可用,按仓库规则回退到定点文件读取。
Author
Owner

2026-08-27 实施进展:

  • 已新增只读 Admin 详情及输入/输出/缩略图四个 GET 接口,数据库关系、对象 owner/generation/MIME 三层校验,响应不返回存储键或路径。
  • 已新增 migration 10 并在精确命名的可丢弃 MySQL 8 测试库完成 up/down/up;当前本机开发库已由 9、dirty=0 单步升级到 10、dirty=0,登记 4 个 API 和 4 条 chorus_operator GET 规则。
  • Admin UI 已在现有 #65 v2 抽屉增加提示词原图、生成图片、文本结果、Blob 鉴权加载、对象 URL 回收和加载/空/局部错误/窄屏状态。
  • 首次部署发现 go-admin 扩展配置最终由 JSON reader 扫描,单写 yaml 标签无法解析 storage_root;已在本工单范围内补 json 标签与回归测试,未使用临时环境变量绕过。
  • 已安装 Supervisor 制品并恢复 chorus-user、chorus-admin-api、chorus-admin-ui 三个实例为 Running;Admin UI HTTP 200,未认证详情返回框架约定 JSON code=401。
  • 已更新并在线回读 Architecture-and-Code-Map、Business-Rules-and-Glossary、Deployment-and-Operations、Local-Development-and-Verification、Troubleshooting Wiki,核心镜像提交为 c33c06d、f306c77、e3d2782。
  • 实现提交:71c7142;配置解析修复:5428ad2。均已推送 main。
  • 验证已通过:全量根模块与 Admin 模块 go test/vet/build;定向只读存储与媒体安全测试;migration up/down/up;Admin UI lint 0 error(保留 98 条基线 warning)、17 suites / 67 tests、生产构建;DevHarness strict check。核心 Wiki mirror sync 已完成,sync --check 两次因远端读取长时间无响应被人工停止,未产生未提交镜像差异。

待完成:当前 Chrome 会话已退出登录,等待用户按浏览器安全确认允许向本机 Admin API 提交管理员凭据后,执行真实页面媒体与窄屏验收。未调用 Provider,未读取或导出图片内容到测试、工单、Wiki 或截图。

2026-08-27 实施进展: - 已新增只读 Admin 详情及输入/输出/缩略图四个 GET 接口,数据库关系、对象 owner/generation/MIME 三层校验,响应不返回存储键或路径。 - 已新增 migration 10 并在精确命名的可丢弃 MySQL 8 测试库完成 up/down/up;当前本机开发库已由 9、dirty=0 单步升级到 10、dirty=0,登记 4 个 API 和 4 条 chorus_operator GET 规则。 - Admin UI 已在现有 #65 v2 抽屉增加提示词原图、生成图片、文本结果、Blob 鉴权加载、对象 URL 回收和加载/空/局部错误/窄屏状态。 - 首次部署发现 go-admin 扩展配置最终由 JSON reader 扫描,单写 yaml 标签无法解析 storage_root;已在本工单范围内补 json 标签与回归测试,未使用临时环境变量绕过。 - 已安装 Supervisor 制品并恢复 chorus-user、chorus-admin-api、chorus-admin-ui 三个实例为 Running;Admin UI HTTP 200,未认证详情返回框架约定 JSON code=401。 - 已更新并在线回读 Architecture-and-Code-Map、Business-Rules-and-Glossary、Deployment-and-Operations、Local-Development-and-Verification、Troubleshooting Wiki,核心镜像提交为 c33c06d、f306c77、e3d2782。 - 实现提交:71c7142;配置解析修复:5428ad2。均已推送 main。 - 验证已通过:全量根模块与 Admin 模块 go test/vet/build;定向只读存储与媒体安全测试;migration up/down/up;Admin UI lint 0 error(保留 98 条基线 warning)、17 suites / 67 tests、生产构建;DevHarness strict check。核心 Wiki mirror sync 已完成,sync --check 两次因远端读取长时间无响应被人工停止,未产生未提交镜像差异。 待完成:当前 Chrome 会话已退出登录,等待用户按浏览器安全确认允许向本机 Admin API 提交管理员凭据后,执行真实页面媒体与窄屏验收。未调用 Provider,未读取或导出图片内容到测试、工单、Wiki 或截图。
Author
Owner

2026-08-27 用户真实页面验收发现:最新成功图片任务在详情中错误显示“没有提示词原图 / 尚无生成结果 / 尚无尝试记录”。

根因已确认:Admin API 与数据库数据正确,最新任务实际含 2 条 attempts 和 1 条 image output;Admin UI 复用了仅接受数组的 dataOf 列表解析器,详情对象被转换为空数组。

修复:

  • 新增严格的 detailOf 对象响应解析器;
  • 生成详情使用 detailOf,无效响应进入明确错误状态;
  • 补充对象/数组/null 回归测试。

验证:Admin UI lint 0 error(98 条基线 warning),17 suites / 68 tests 全部通过,双 bundle 生产构建通过。提交 e4f95a6 已推送 main,chorus-admin-ui 已重启并为 Running。该修复不涉及数据库、API、权限或长期文档事实,无需新增 Wiki 修改。无需重新生成,刷新页面后重新打开最新记录即可读取已有 output 和 attempts。

2026-08-27 用户真实页面验收发现:最新成功图片任务在详情中错误显示“没有提示词原图 / 尚无生成结果 / 尚无尝试记录”。 根因已确认:Admin API 与数据库数据正确,最新任务实际含 2 条 attempts 和 1 条 image output;Admin UI 复用了仅接受数组的 `dataOf` 列表解析器,详情对象被转换为空数组。 修复: - 新增严格的 `detailOf` 对象响应解析器; - 生成详情使用 `detailOf`,无效响应进入明确错误状态; - 补充对象/数组/null 回归测试。 验证:Admin UI lint 0 error(98 条基线 warning),17 suites / 68 tests 全部通过,双 bundle 生产构建通过。提交 `e4f95a6` 已推送 main,`chorus-admin-ui` 已重启并为 Running。该修复不涉及数据库、API、权限或长期文档事实,无需新增 Wiki 修改。无需重新生成,刷新页面后重新打开最新记录即可读取已有 output 和 attempts。
Author
Owner

用户验收通过

  • 验收时间:2026-08-27 14:57:05 +08:00
  • 验收人:用户
  • 结论:用户明确确认本工单通过验收,接受当前实现、部署与已记录的验证结果。
  • 文档:沿用工单中已经完成的 Wiki/镜像处理;没有新的长期事实变化。
  • 状态:已完成,关闭工单。
## 用户验收通过 - 验收时间:2026-08-27 14:57:05 +08:00 - 验收人:用户 - 结论:用户明确确认本工单通过验收,接受当前实现、部署与已记录的验证结果。 - 文档:沿用工单中已经完成的 Wiki/镜像处理;没有新的长期事实变化。 - 状态:已完成,关闭工单。
ila closed this issue 2026-08-27 14:57:23 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#72