Files
cmautobuy/docs/task/229-Admin-AI规格匹配失败弹窗与生产密钥配置.md
T
2026-08-14 17:51:55 +08:00

77 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 229 Admin:AI 规格匹配失败弹窗反馈并补齐生产密钥配置
- 类型:缺陷
- 父级大工单:#14
- 所属 MVP / 版本:#199 / AI规格批量匹配
- 状态:已完成,待用户验收
- 日期:2026-08-14
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/229
## 背景与目标
生产发布重启后没有加载 `CMAUTOBUY_AI_SECRETS_PATH`,导致顺运宝 AI 规格匹配在
创建批次前失败。页面只把原因放在重定向消息中,采购员容易忽略。本任务补齐生产密钥
存储配置,并让 AI 匹配创建前的失败自动弹窗,明确说明数据没有被改动。
## 最终方案
- AI 服务商、密钥或批次输入在创建前失败时,使用独立 `ai_error` 参数返回顺运宝列表;
普通同步、采集和采购结果继续使用 `msg`,两类反馈不会混淆。
- 顺运宝页面根据 `ai_error` 渲染 `alertdialog` 并自动打开,复用公共的关闭按钮、Esc、
遮罩点击和焦点恢复规则。错误正文继续由 `html/template` 自动转义。
- 生产密钥放在 release、仓库和 `data/` 之外的专用目录,文件权限为 `600`;环境文件只
保存路径。服务账号只获得专用密钥目录的读写权限,不能修改数据库环境文件。
- 服务器使用旧版 systemd,不支持 `ProtectSystem=strict` 和 `ReadWritePaths`。最终 unit
使用兼容的 `ProtectSystem=true` 和 `ReadWriteDirectories`,继续由 Unix 属主和目录权限
隔离 `/etc/cmautobuy/admin.env`。
- 首次部署因旧 systemd 指令和新 release 缺少 `config.yaml`、`data` 链接而触发健康检查
失败,发布脚本自动恢复旧二进制;补齐兼容 unit 和 release 链接后再次发布成功。
## 改了哪些
- `admin/handler/web/ai_match.go`:AI 创建前失败改用独立错误跳转。
- `admin/handler/web/others.go`:向顺运宝模板传递 AI 错误。
- `admin/templates/syb/list.html`:增加自动打开的 AI 错误弹窗。
- `admin/static/js/app.js`:自动打开服务端指定弹窗并复用公共交互。
- `admin/handler/web/others_test.go`、`admin/syb_interaction_template_test.go`:增加跳转状态、
弹窗和 HTML 转义回归测试。
- `admin/deploy/cmautobuy-admin.service`、`admin/config.example.yaml`:补齐旧 systemd 兼容的
密钥目录写白名单和生产路径示例。
- `docs/admin/02-architecture.md`、`docs/admin/05-ui-specification.md`、
`docs/admin/06-quality-security.md`:同步部署、安全和失败反馈基线。
- 生产服务器:发布 `/opt/cmautobuy/releases/0208dc6/cmautobuy-admin`,配置独立密钥目录
和环境路径;密钥内容未进入代码、数据库、日志、工单或本文档。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| AI 创建前失败自动打开明确错误弹窗 | 通过(模板和 Handler 自动化测试) |
| 弹窗支持关闭按钮、Esc、遮罩点击和焦点规则 | 通过(复用现有公共弹窗实现) |
| 普通消息不会误触发 AI 失败弹窗 | 通过 |
| 已创建批次继续显示整体和逐条失败原因 | 通过(原进度弹窗保持并完成全量回归) |
| 错误内容自动转义且不泄露 API Key | 通过 |
| 生产密钥路径、属主、权限和服务进程环境正确 | 通过 |
| 真实模型最小健康请求成功 | 通过 |
| 指定订单从浏览器重新创建批次并显示结果 | 待用户登录后验收 |
| 固定 Go 1.23.0 构建、测试、vet 和 JS 检查 | 通过 |
## 测试
- 执行的命令:
- `$env:GOTOOLCHAIN='go1.23.0'; go test ./... -count=1`
- `$env:GOTOOLCHAIN='go1.23.0'; go build ./...`
- `$env:GOTOOLCHAIN='go1.23.0'; go vet ./...`
- `node --check static/js/app.js`
- `git diff --check`
- 生产 systemd unit 验证、服务健康检查、公网登录页和静态资源检查。
- 生产启用服务商与密钥文件编号一致性检查、真实模型最小健康请求。
- 结果:固定 Go 1.23.0 的全量测试、构建和 vet 通过;JavaScript、差异格式、生产服务、
公网资源和真实模型健康检查通过。
- **没验证到的部分**:没有采购员登录会话,未代替用户在浏览器对订单
`2608139NVHNBKG` 重新点击 AI 匹配;浏览器 1366×768 的人工视觉与键盘验收待用户完成。
## 相关提交
- `0208dc6` fix: 增加 AI 匹配失败弹窗并补齐部署配置 (#229)