Admin:AI 规格匹配失败弹窗反馈并���齐生产密钥配置 #229

Open
opened 2026-08-14 17:41:15 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#199 / AI规格批量匹配
  • 阶段:生产可用性与失败反馈
  • 依赖:#200、#201、#202

要解决什么

生产部署重启后,/etc/cmautobuy/admin.env 未配置 CMAUTOBUY_AI_SECRETS_PATH,线上也没有独立 AI 密钥文件。采购员提交 SYB AI 规格匹配时,请求在创建批次和调用模型前失败;页面只通过重定向消息反馈,容易被忽略。

复现:

  1. 登录线上 Admin,进入 SYB 数据页面并搜索订单 2608139NVHNBKG。
  2. 勾选商品后点击“AI匹配”并确认。
  3. POST /syb/ai-match 返回 303,批次和决策均未创建;重定向消息提示密钥存储未配置,但没有明确弹窗。

做什么 / 不做什么

  • 做:
    • AI 匹配创建前失败时自动弹出错误提示,保留当前筛选和勾选流程。
    • 已创建批次的整体失败或中断继续在进度弹窗中明确展示错误。
    • 增加前端和 Handler 回归测试,确保错误文字经过模板转义,不泄露 API Key。
    • 在线上 release 之外建立权限为 600 的 AI 密钥文件,在 /etc/cmautobuy/admin.env 配置 CMAUTOBUY_AI_SECRETS_PATH,重启并验证模型连接与指定订单匹配。
  • 不做:
    • 不把 API Key 写入数据库、Git、data/、日志、工单或文档。
    • 不改变 AI 候选、置信度、硬门禁、规格映射和采购任务规则。
    • 不新增数据库迁移或 Client 接口。

怎么做

  • 调整 admin/handler/web/ai_match.go:AI 匹配未开始时用独立、可识别的查询参数回到 SYB 页面,不把普通同步消息误当成 AI 弹窗。
  • 调整 admin/handler/web/others.go、admin/templates/syb/list.html 与 admin/static/js/app.js:服务端传递一次性 AI 错误,页面加载后打开可关闭、可键盘操作的错误弹窗;正文使用 html/template 自动转义。
  • 补充页面/Handler 测试;同步 Admin 界面和部署基线中稳定的配置要求。
  • 生产密钥仍由独立文件保存;部署时只设置路径、属主和权限,不输出密钥内容。

验收标准

  • AI 配置/密钥不可用、批次创建校验失败时,SYB 页面自动弹出明确错误提示。
  • 弹窗可通过按钮、Esc 和点击遮罩关闭,且不会把普通页面消息错误弹为 AI 失败。
  • 已创建批次的失败/中断仍在进度弹窗显示状态和具体非敏感原因。
  • 错误内容经过模板转义,页面、日志、测试输出均不包含 API Key。
  • 线上 CMAUTOBUY_AI_SECRETS_PATH 指向 release/仓库/data/ 之外的 600 文件,服务账号可读写。
  • 重启线上 Admin 后 AI 配置连接测试成功,订单 2608139NVHNBKG 能创建批次并得到逐条结果。
  • 固定 Go 1.23.0 的 build、test、vet 和 JavaScript 语法检查通过。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go build ./...
go test ./... -count=1
go vet ./...
node --check static/js/app.js
Remove-Item Env:GOTOOLCHAIN

生产只读核对环境变量名、密钥文件权限和批次/决策状态;不得打印密钥内容。浏览器验证失败弹窗,并在配置修复后重新提交指定订单。

风险和回退

  • 风险:错误参数被外部构造时可能造成页面内容注入;使用 html/template 文本转义并限制为纯文本展示。
  • 风险:生产密钥文件权限或属主错误会继续导致匹配不可用;部署后以服务账号执行只读检查。
  • 回退:回退页面弹窗代码不影响现有顶部消息;删除环境变量并停用 AI 服务商即可停止新 AI 批次,既有映射和审计不回滚。
## 基本信息 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#199 / AI规格批量匹配 - 阶段:生产可用性与失败反馈 - 依赖:#200、#201、#202 ## 要解决什么 生产部署重启后,`/etc/cmautobuy/admin.env` 未配置 `CMAUTOBUY_AI_SECRETS_PATH`,线上也没有独立 AI 密钥文件。采购员提交 SYB AI 规格匹配时,请求在创建批次和调用模型前失败;页面只通过重定向消息反馈,容易被忽略。 复现: 1. 登录线上 Admin,进入 SYB 数据页面并搜索订单 `2608139NVHNBKG`。 2. 勾选商品后点击“AI匹配”并确认。 3. POST `/syb/ai-match` 返回 303,批次和决策均未创建;重定向消息提示密钥存储未配置,但没有明确弹窗。 ## 做什么 / 不做什么 - 做: - AI 匹配创建前失败时自动弹出错误提示,保留当前筛选和勾选流程。 - 已创建批次的整体失败或中断继续在进度弹窗中明确展示错误。 - 增加前端和 Handler 回归测试,确保错误文字经过模板转义,不泄露 API Key。 - 在线上 release 之外建立权限为 `600` 的 AI 密钥文件,在 `/etc/cmautobuy/admin.env` 配置 `CMAUTOBUY_AI_SECRETS_PATH`,重启并验证模型连接与指定订单匹配。 - 不做: - 不把 API Key 写入数据库、Git、`data/`、日志、工单或文档。 - 不改变 AI 候选、置信度、硬门禁、规格映射和采购任务规则。 - 不新增数据库迁移或 Client 接口。 ## 怎么做 - 调整 `admin/handler/web/ai_match.go`:AI 匹配未开始时用独立、可识别的查询参数回到 SYB 页面,不把普通同步消息误当成 AI 弹窗。 - 调整 `admin/handler/web/others.go`、`admin/templates/syb/list.html` 与 `admin/static/js/app.js`:服务端传递一次性 AI 错误,页面加载后打开可关闭、可键盘操作的错误弹窗;正文使用 `html/template` 自动转义。 - 补充页面/Handler 测试;同步 Admin 界面和部署基线中稳定的配置要求。 - 生产密钥仍由独立文件保存;部署时只设置路径、属主和权限,不输出密钥内容。 ## 验收标准 - [x] AI 配置/密钥不可用、批次创建校验失败时,SYB 页面自动弹出明确错误提示。 - [x] 弹窗可通过按钮、Esc 和点击遮罩关闭,且不会把普通页面消息错误弹为 AI 失败。 - [x] 已创建批次的失败/中断仍在进度弹窗显示状态和具体非敏感原因。 - [x] 错误内容经过模板转义,页面、日志、测试输出均不包含 API Key。 - [x] 线上 `CMAUTOBUY_AI_SECRETS_PATH` 指向 release/仓库/`data/` 之外的 `600` 文件,服务账号可读写。 - [ ] 重启线上 Admin 后 AI 配置连接测试成功,订单 `2608139NVHNBKG` 能创建批次并得到逐条结果。 - [x] 固定 Go 1.23.0 的 build、test、vet 和 JavaScript 语法检查通过。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go build ./... go test ./... -count=1 go vet ./... node --check static/js/app.js Remove-Item Env:GOTOOLCHAIN ``` 生产只读核对环境变量名、密钥文件权限和批次/决策状态;不得打印密钥内容。浏览器验证失败弹窗,并在配置修复后重新提交指定订单。 ## 风险和回退 - 风险:错误参数被外部构造时可能造成页面内容注入;使用 `html/template` 文本转义并限制为纯文本展示。 - 风险:生产密钥文件权限或属主错误会继续导致匹配不可用;部署后以服务账号执行只读检查。 - 回退:回退页面弹窗代码不影响现有顶部消息;删除环境变量并停用 AI 服务商即可停止新 AI 批次,既有映射和审计不回滚。
Author
Owner

实施记录(2026-08-14)

  • 代码提交:0208dc6,AI 创建前错误改用独立 ai_error 参数,SYB 页面自动打开 alertdialog;普通 msg 不会误触发。
  • 增加 Handler 状态保留测试、模板自动转义测试,并复用公共关闭、Esc、遮罩和焦点规则。
  • 固定 Go 1.23.0:go test ./... -count=1、go build ./...、go vet ./... 均通过;node --check static/js/app.js、git diff --check 通过。
  • 生产发布:/opt/cmautobuy/releases/0208dc6/cmautobuy-admin,systemd active,公网登录页和新 JS 均可访问。
  • 生产密钥:配置为 release、仓库和 data/ 外的专用目录;文件权限 600,服务账号可读写。未在工单、日志或命令输出中记录密钥。
  • 真实模型最小健康请求返回 2xx,启用服务商与密钥文件中的服务商编号一致,运行进程已加载 CMAUTOBUY_AI_SECRETS_PATH。
  • 首次发布验证发现服务器为旧版 systemd,不支持 ProtectSystem=strict / ReadWritePaths;二进制自动回滚成功。随后改用兼容的 ProtectSystem=true / ReadWriteDirectories,补齐 release 的 config.yaml、data 链接后发布成功。

未验证:没有采购员登录会话,未代替用户在浏览器重新点击订单 2608139NVHNBKG;该项保留待用户验收。

## 实施记录(2026-08-14) - 代码提交:`0208dc6`,AI 创建前错误改用独立 `ai_error` 参数,SYB 页面自动打开 `alertdialog`;普通 `msg` 不会误触发。 - 增加 Handler 状态保留测试、模板自动转义测试,并复用公共关闭、Esc、遮罩和焦点规则。 - 固定 Go 1.23.0:`go test ./... -count=1`、`go build ./...`、`go vet ./...` 均通过;`node --check static/js/app.js`、`git diff --check` 通过。 - 生产发布:`/opt/cmautobuy/releases/0208dc6/cmautobuy-admin`,systemd active,公网登录页和新 JS 均可访问。 - 生产密钥:配置为 release、仓库和 `data/` 外的专用目录;文件权限 `600`,服务账号可读写。未在工单、日志或命令输出中记录密钥。 - 真实模型最小健康请求返回 2xx,启用服务商与密钥文件中的服务商编号一致,运行进程已加载 `CMAUTOBUY_AI_SECRETS_PATH`。 - 首次发布验证发现服务器为旧版 systemd,不支持 `ProtectSystem=strict` / `ReadWritePaths`;二进制自动回滚成功。随后改用兼容的 `ProtectSystem=true` / `ReadWriteDirectories`,补齐 release 的 `config.yaml`、`data` 链接后发布成功。 未验证:没有采购员登录会话,未代替用户在浏览器重新点击订单 `2608139NVHNBKG`;该项保留待用户验收。
Author
Owner

归档已提交并推送:

  • 归档提交:cbe8d03
  • 归档文档:docs/task/229-Admin-AI规格匹配失败弹窗与生产密钥配置.md
  • 当前工单状态:实现完成,等待用户登录生产页面重新匹配 2608139NVHNBKG 并验收弹窗/结果。
归档已提交并推送: - 归档提交:`cbe8d03` - 归档文档:`docs/task/229-Admin-AI规格匹配失败弹窗与生产密钥配置.md` - 当前工单状态:实现完成,等待用户登录生产页面重新匹配 `2608139NVHNBKG` 并验收弹窗/结果。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#229