Files
cmautobuy/docs/task/229-Admin-AI规格匹配失败弹窗与生产密钥配置.md
T

77 lines
4.3 KiB
Markdown
Raw Normal View History

2026-08-14 17:51:55 +08:00
# 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)