Admin:修复 AI 服务商配置新增后未落库 #222

Open
opened 2026-08-14 10:59:25 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#199 / AI规格批量匹配
  • 阶段:1. 管理员 AI 服务商配置缺陷修复

要解决什么

管理员在本地“AI 配置”页面填写有效服务商配置并提交后,页面经过 303 See Other 跳回列表,但看不到新增配置。

已确认 repository.InsertAIProvider 的 INSERT SQL 在固定值 enabled=0、last_test_status='pending' 之后写了 5 个占位符,而剩余字段和实参数量都只有 4 个,导致有效新增请求无法落库。303 本身是正常的 POST/Redirect/GET 流程;校验重定向和保存成功必须能通过 Location 参数区分。

复现步骤:

  1. 以管理员登录本地 Admin,进入“AI 配置”。
  2. 填写合法服务商、HTTPS Base URL、模型、超时、并发和置信度。
  3. 点击“新增”。
  4. 页面跳转后列表仍为空,无法继续保存 API Key、测试和启用。

做什么 / 不做什么

  • 做:
    • 修正新增 AI 服务��� SQL 的占位符数量。
    • 增加不依赖真实 MySQL 的参数数量回归测试,使默认测试也能捕获同类错误。
    • 增加 MySQL _test 集成测试,覆盖新增、审计、列表回显、重名和事务一致性。
    • 增加 Web 跳转语义回归,明确成功使用 msg、校验失败使用 error。
  • 不做:
    • 不修改 MySQL schema 版本或表结构。
    • 不把 API Key 合并进普通配置表单,不改变密钥独立存储方案。
    • 不操作生产数据库,不部署线上 Admin。

怎么做

  • 修改 admin/repository/ai_config.go:将 INSERT 的尾部占位符从 5 个改为 4 个。
  • 在 admin/repository/ 增加轻量假 Execer 测试,核对 SQL 问号数与实参数量,并验证字段参数顺序。
  • 在现有 MySQL 测试框架中增加服务层/仓储层集成用例;没有 CMAUTOBUY_MYSQL_TEST=1 时必须明确跳过。
  • 在 admin/handler/web/ 测试成功与校验失败的 303 Location;非校验数据库错误继续返回 500,不伪装成成功跳转。

验收标准

  • 合法配置提交后成功落库,303 跳回后列表立即显示新增服务商。
  • INSERT 占位符和参数数量、字段顺序有默认单元测试保护。
  • 创建配置与 create 审计同事务成功;失败时不留下半条数据。
  • 重名或输入非法时不新增记录,并显示明确错误。
  • 保存成功的 Location 带 msg,校验失败带 error,数据库异常返回 500。
  • 不改 schema、不影响独立 API Key 保存、测试和启用流程。
  • Go 1.23.0 的 build、test、vet 通过;MySQL _test 集成结果如实记录。

怎么验证

从 admin/ 执行:

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

启用独立 MySQL 8.4 _test 库时执行新增/列表/重名/事务测试;本地浏览器提交合法配置,确认跳转后出现服务商行。

风险和回退

  • 风险:字段顺序修错会把创建人或时间写入错误列;通过假执行器参数顺序断言和真实 MySQL 集成测试控制。
  • 回退:回退本工单代码提交即可。没有 schema 变化;此前失败请求已由事务回滚,不需要数据清理。
## 基本信息 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#199 / AI规格批量匹配 - 阶段:1. 管理员 AI 服务商配置缺陷修复 ## 要解决什么 管理员在本地“AI 配置”页面填写有效服务商配置并提交后,页面经过 `303 See Other` 跳回列表,但看不到新增配置。 已确认 `repository.InsertAIProvider` 的 INSERT SQL 在固定值 `enabled=0`、`last_test_status='pending'` 之后写了 5 个占位符,而剩余字段和实参数量都只有 4 个,导致有效新增请求无法落库。`303` 本身是正常的 POST/Redirect/GET 流程;校验重定向和保存成功必须能通过 `Location` 参数区分。 复现步骤: 1. 以管理员登录本地 Admin,进入“AI 配置”。 2. 填写合法服务商、HTTPS Base URL、模型、超时、并发和置信度。 3. 点击“新增”。 4. 页面跳转后列表仍为空,无法继续保存 API Key、测试和启用。 ## 做什么 / 不做什么 - 做: - 修正新增 AI 服务��� SQL 的占位符数量。 - 增加不依赖真实 MySQL 的参数数量回归测试,使默认测试也能捕获同类错误。 - 增加 MySQL `_test` 集成测试,覆盖新增、审计、列表回显、重名和事务一致性。 - 增加 Web 跳转语义回归,明确成功使用 `msg`、校验失败使用 `error`。 - 不做: - 不修改 MySQL schema 版本或表结构。 - 不把 API Key 合并进普通配置表单,不改变密钥独立存储方案。 - 不操作生产数据库,不部署线上 Admin。 ## 怎么做 - 修改 `admin/repository/ai_config.go`:将 INSERT 的尾部占位符从 5 个改为 4 个。 - 在 `admin/repository/` 增加轻量假 `Execer` 测试,核对 SQL 问号数与实参数量,并验证字段参数顺序。 - 在现有 MySQL 测试框架中增加服务层/仓储层集成用例;没有 `CMAUTOBUY_MYSQL_TEST=1` 时必须明确跳过。 - 在 `admin/handler/web/` 测试成功与校验失败的 `303 Location`;非校验数据库错误继续返回 500,不伪装成成功跳转。 ## 验收标准 - [ ] 合法配置提交后成功落库,303 跳回后列表立即显示新增服务商。 - [ ] INSERT 占位符和参数数量、字段顺序有默认单元测试保护。 - [ ] 创建配置与 `create` 审计同事务成功;失败时不留下半条数据。 - [ ] 重名或输入非法时不新增记录,并显示明确错误。 - [ ] 保存成功的 `Location` 带 `msg`,校验失败带 `error`,数据库异常返回 500。 - [ ] 不改 schema、不影响独立 API Key 保存、测试和启用流程。 - [ ] Go 1.23.0 的 build、test、vet 通过;MySQL `_test` 集成结果如实记录。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go build ./... go test ./... -count=1 go vet ./... Remove-Item Env:GOTOOLCHAIN ``` 启用独立 MySQL 8.4 `_test` 库时执行新增/列表/重名/事务测试;本地浏览器提交合法配置,确认跳转后出现服务商行。 ## 风险和回退 - 风险:字段顺序修错会把创建人或时间写入错误列;通过假执行器参数顺序断言和真实 MySQL 集成测试控制。 - 回退:回退本工单代码提交即可。没有 schema 变化;此前失败请求已由事务回滚,不需要数据清理。
Author
Owner

实施进度

已完成根因修复和测试补强:

  • 修正 InsertAIProvider 尾部占位符 5→4,使 11 个参数与 11 个占位符一致;
  • 默认单元测试核对占位符数量、字段参数顺序和固定初始状态;
  • Web 测试覆盖成功/校验失败的 303 参数区分,以及数据库异常返回 500;
  • MySQL _test 集成用例覆盖新增后查询、create 审计、重名拒绝和失败不留半条数据。

固定 Go 1.23.0 的 build、全量 test、vet 已通过。当前未启用独立 MySQL _test,相关真实数据库用例明确跳过,未使用生产库代替。

## 实施进度 已完成根因修复和测试补强: - 修正 `InsertAIProvider` 尾部占位符 5→4,使 11 个参数与 11 个占位符一致; - 默认单元测试核对占位符数量、字段参数顺序和固定初始状态; - Web 测试覆盖成功/校验失败的 303 参数区分,以及数据库异常返回 500; - MySQL `_test` 集成用例覆盖新增后查询、create 审计、重名拒绝和失败不留半条数据。 固定 Go 1.23.0 的 build、全量 test、vet 已通过。当前未启用独立 MySQL `_test`,相关真实数据库用例明确跳过,未使用生产库代替。
Author
Owner

实施完成,待验收

根因已修复:AI 服务商新增 SQL 现在是 11 个占位符对应 11 个参数;没有 schema 变化,也不需要清理此前失败数据。

  • 实现提交:01469f7
  • 归档提交:4d107fb
  • 归档:docs/task/222-Admin修复AI服务商配置新增后未落库.md

验证结果:

  • 固定 go1.23.0 windows/amd64 的 go build ./...:通过
  • go test ./... -count=1:通过
  • go vet ./...:通过
  • 默认 SQL 参数契约测试:通过
  • Web 的成功/校验失败 303 语义和数据库异常 500:通过
  • MySQL 新增、审计、列表回显、重名和事务用例已编写;当前没有启用独立 _test 库,明确跳过,未使用生产库代替

请重新启动或等待 Air 热重载后,再在本地 AI 配置页面提交。成功时跳转 URL 带 msg,新增服务商会出现在下方列表。

工单保持打开,等待用户验收。

## 实施完成,待验收 根因已修复:AI 服务商新增 SQL 现在是 11 个占位符对应 11 个参数;没有 schema 变化,也不需要清理此前失败数据。 - 实现提交:`01469f7` - 归档提交:`4d107fb` - 归档:`docs/task/222-Admin修复AI服务商配置新增后未落库.md` 验证结果: - 固定 `go1.23.0 windows/amd64` 的 `go build ./...`:通过 - `go test ./... -count=1`:通过 - `go vet ./...`:通过 - 默认 SQL 参数契约测试:通过 - Web 的成功/校验失败 303 语义和数据库异常 500:通过 - MySQL 新增、审计、列表回显、重名和事务用例已编写;当前没有启用独立 `_test` 库,明确跳过,未使用生产库代替 请重新启动或等待 Air 热重载后,再在本地 AI 配置页面提交。成功时跳转 URL 带 `msg`,新增服务商会出现在下方列表。 工单保持打开,等待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#222