Admin 重启失败:#137 菜单排序超过 MySQL TINYINT 范围 #141

Closed
opened 2026-08-29 08:44:37 +08:00 by ila · 3 comments
Owner

所属与来源

  • 关联工单:#137(引入缺陷)、#140(修复第一道迁移阻塞后暴露本缺陷)。
  • 来源:2026-08-29 08:43:33 Admin 再次启动时,#135 迁移已成功,随后 #137 菜单迁移失败。
  • 类型:Server / MySQL 菜单迁移数据范围缺陷。
  • 设计证据:不改变菜单结构、权限、名称、顺序语义或页面,仅把排序值映射到现有字段可表示范围,属于恢复既有设计,不需要新原型。

根因与当前事实

启动日志:

Error 1264 (22003): Out of range value for column 'sort' at row 1
INSERT INTO sys_menu (..., sort, ...) VALUES (..., 130, ...)

sys_menu.sort 在当前 MySQL 8.4 数据库中为有符号 TINYINT,范围 -128~127。#137 的 GoAuto 模块排序值为 100、110、120、130……200,前三个可写入,从 130 开始必然失败。

#137 迁移包裹在事务中,本次失败已整体回滚:

  • 未写入 1787885400000 迁移版本;
  • 未残留 GoAuto 根菜单;
  • 现有系统根菜单排序依次为 10、20、30、40;
  • 没有发现半套菜单或角色绑定残留。

SQLite 使用普通整数列,不会复现 MySQL TINYINT 越界,因此原测试通过。

目标

  1. 所有 GoAuto 根菜单排序值适配现有 sys_menu.sort TINYINT。
  2. 保持 11 个 GoAuto 模块的相对顺序,并排在现有 10/20/30/40 根菜单之后。
  3. #137 迁移在 MySQL 8.4 成功且可重复执行。
  4. 补充字段范围回归测试。

非目标

  • 不扩大或修改 sys_menu.sort 数据类型。
  • 不改变菜单结构、权限矩阵、名称、路由、显示/隐藏规则。
  • 不修改现有系统菜单排序。
  • 不清理或重建菜单表。

实施方案

  • 将 GoAuto 模块排序从 100~200 调整为 50~60,按现有模块顺序逐一递增。
  • 新增测试断言:排序严格递增、全部位于有符号 TINYINT 范围,且首项晚于现有根菜单 40。
  • 保持 #137 迁移事务和幂等 upsert 逻辑不变。
  • 代码验证后等待用户明确授权,再执行本机数据库迁移和 Admin 重启。

数据库与安全门禁

真实执行会新增菜单、API 关系与采购员角色菜单绑定,属于数据库迁移和权限变更。实现与不连接真实数据库的测试可先完成;在本机执行迁移前必须再次获得用户明确授权。

验收标准

  • 11 个模块排序保持既定相对顺序且全部在 50~60。
  • MySQL 不再出现 sort 越界。
  • #137 迁移成功并写入版本 1787885400000。
  • 菜单、API 关系与采购员权限符合 #137 已确认方案。
  • Server 8010、Web 9527 正常启动。
  • 自动化测试、Server 构建和严格检查通过。

文档影响

无新的长期文档影响:#137 已记录菜单与权限结构;本单只修复其排序值的数据库范围兼容性,跳过 Wiki 更新与同步。

状态

实现、自动化验证、本机数据库迁移及 Admin 重启验证均已完成,待用户验收。

## 所属与来源 - 关联工单:#137(引入缺陷)、#140(修复第一道迁移阻塞后暴露本缺陷)。 - 来源:2026-08-29 08:43:33 Admin 再次启动时,#135 迁移已成功,随后 #137 菜单迁移失败。 - 类型:Server / MySQL 菜单迁移数据范围缺陷。 - 设计证据:不改变菜单结构、权限、名称、顺序语义或页面,仅把排序值映射到现有字段可表示范围,属于恢复既有设计,不需要新原型。 ## 根因与当前事实 启动日志: ```text Error 1264 (22003): Out of range value for column 'sort' at row 1 INSERT INTO sys_menu (..., sort, ...) VALUES (..., 130, ...) ``` `sys_menu.sort` 在当前 MySQL 8.4 数据库中为有符号 `TINYINT`,范围 -128~127。#137 的 GoAuto 模块排序值为 100、110、120、130……200,前三个可写入,从 130 开始必然失败。 #137 迁移包裹在事务中,本次失败已整体回滚: - 未写入 `1787885400000` 迁移版本; - 未残留 GoAuto 根菜单; - 现有系统根菜单排序依次为 10、20、30、40; - 没有发现半套菜单或角色绑定残留。 SQLite 使用普通整数列,不会复现 MySQL TINYINT 越界,因此原测试通过。 ## 目标 1. 所有 GoAuto 根菜单排序值适配现有 `sys_menu.sort TINYINT`。 2. 保持 11 个 GoAuto 模块的相对顺序,并排在现有 10/20/30/40 根菜单之后。 3. #137 迁移在 MySQL 8.4 成功且可重复执行。 4. 补充字段范围回归测试。 ## 非目标 - 不扩大或修改 `sys_menu.sort` 数据类型。 - 不改变菜单结构、权限矩阵、名称、路由、显示/隐藏规则。 - 不修改现有系统菜单排序。 - 不清理或重建菜单表。 ## 实施方案 - 将 GoAuto 模块排序从 100~200 调整为 50~60,按现有模块顺序逐一递增。 - 新增测试断言:排序严格递增、全部位于有符号 TINYINT 范围,且首项晚于现有根菜单 40。 - 保持 #137 迁移事务和幂等 upsert 逻辑不变。 - 代码验证后等待用户明确授权,再执行本机数据库迁移和 Admin 重启。 ## 数据库与安全门禁 真实执行会新增菜单、API 关系与采购员角色菜单绑定,属于数据库迁移和权限变更。实现与不连接真实数据库的测试可先完成;在本机执行迁移前必须再次获得用户明确授权。 ## 验收标准 - [ ] 11 个模块排序保持既定相对顺序且全部在 50~60。 - [ ] MySQL 不再出现 `sort` 越界。 - [ ] #137 迁移成功并写入版本 `1787885400000`。 - [ ] 菜单、API 关系与采购员权限符合 #137 已确认方案。 - [ ] Server 8010、Web 9527 正常启动。 - [ ] 自动化测试、Server 构建和严格检查通过。 ## 文档影响 无新的长期文档影响:#137 已记录菜单与权限结构;本单只修复其排序值的数据库范围兼容性,跳过 Wiki 更新与同步。 ## 状态 实现、自动化验证、本机数据库迁移及 Admin 重启验证均已完成,待用户验收。
Author
Owner

实现已推送,等待数据库/权限写入授权

提交:fc87984 fix(menus): keep sort values in MySQL range (#141)。

  • 11 个 GoAuto 根菜单排序调整为 50~60,保持既定相对顺序并位于现有 10/20/30/40 根菜单之后。
  • 新增回归测试,断言严格递增、范围固定为 50~60且不超过有符号 TINYINT 127。
  • #137 事务、菜单/API upsert、采购员默认授权与 AI 设置硬隐藏逻辑均未改变。
  • 定向测试、Server 全量测试/构建、DevHarness 严格检查和全组件验证全部通过。
  • 当前数据库只读核验:#137 上次失败已完整回滚,1787885400000 未记录且无 GoAuto 根菜单残留。

无新的长期文档影响,跳过 Wiki 更新与同步。下一步真实执行会写入菜单、API 关系和采购员角色菜单绑定,按门禁等待用户明确授权后再迁移并重启 Admin。

## 实现已推送,等待数据库/权限写入授权 提交:`fc87984 fix(menus): keep sort values in MySQL range (#141)`。 - 11 个 GoAuto 根菜单排序调整为 50~60,保持既定相对顺序并位于现有 10/20/30/40 根菜单之后。 - 新增回归测试,断言严格递增、范围固定为 50~60且不超过有符号 TINYINT 127。 - #137 事务、菜单/API upsert、采购员默认授权与 AI 设置硬隐藏逻辑均未改变。 - 定向测试、Server 全量测试/构建、DevHarness 严格检查和全组件验证全部通过。 - 当前数据库只读核验:#137 上次失败已完整回滚,`1787885400000` 未记录且无 GoAuto 根菜单残留。 无新的长期文档影响,跳过 Wiki 更新与同步。下一步真实执行会写入菜单、API 关系和采购员角色菜单绑定,按门禁等待用户明确授权后再迁移并重启 Admin。
Author
Owner

本机迁移、权限写入与 Admin 重启验证完成,待验收

用户于 2026-08-29 明确授权 #140、#141 执行本机数据库迁移、权限写入并重启 Admin。

  • #141 提交:fc87984。
  • 1787885400000 已成功执行并记录,不再出现 sys_menu.sort 越界。
  • 11 个 GoAuto 根菜单排序在线核验为 50~60;父子菜单共 22 条。
  • 11 个子菜单均已绑定各自 API;采购员角色获得 10 个默认模块,AI 规格匹配菜单绑定为 0,硬隐藏边界保持。
  • Server 8010 与 Web 9527 均返回 HTTP 200。
  • Chrome 可视检查确认工作台及 11 个 GoAuto 菜单正常显示,控制台无错误。
  • 全组件验证通过;无新的长期文档影响,未更新 Wiki。

同次启动迁移器还执行了此前待部署的 #133 版本 1787885500000;该事实已单独回写 #133,不在本工单宣称 #133 真机验收通过。

工单进入待验收。

## 本机迁移、权限写入与 Admin 重启验证完成,待验收 用户于 2026-08-29 明确授权 #140、#141 执行本机数据库迁移、权限写入并重启 Admin。 - #141 提交:`fc87984`。 - `1787885400000` 已成功执行并记录,不再出现 `sys_menu.sort` 越界。 - 11 个 GoAuto 根菜单排序在线核验为 50~60;父子菜单共 22 条。 - 11 个子菜单均已绑定各自 API;采购员角色获得 10 个默认模块,AI 规格匹配菜单绑定为 0,硬隐藏边界保持。 - Server 8010 与 Web 9527 均返回 HTTP 200。 - Chrome 可视检查确认工作台及 11 个 GoAuto 菜单正常显示,控制台无错误。 - 全组件验证通过;无新的长期文档影响,未更新 Wiki。 同次启动迁移器还执行了此前待部署的 #133 版本 `1787885500000`;该事实已单独回写 #133,不在本工单宣称 #133 真机验收通过。 工单进入待验收。
Author
Owner

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
ila closed this issue 2026-08-29 20:44:07 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#141