# 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)