fix(menu): 修复菜单管理编辑无法保存与新增 500 - 根因一:MenuService create/update 以 snake_case 列名作 Sequelize 写入键而实体属性为 camelCase,导致写入被静默忽略(更新假成功)或 NOT NULL 报错(新增 500),改为 camelCase 属性名;根因二:sys_menu 列默认值指向历史遗留重复序列 sys_menu_id_seq1 且未推进,新增菜单 id 冲突,生产库已一次性 setval 同步(max(id)=64,并核对 sys_role/sys_user 序列),db_seed.sql 全部 setval 改为 pg_get_serial_sequence() 形式兼容不同环境序列名;接口与浏览器端到端验证通过(新增→改名→持久化→清理)

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
This commit is contained in:
wkandClaude Sonnet 4.6 noreply@anthropic.com authored and trae-solo-agent committed 2026-10-24 17:26:43 +08:00
1 parent 44fc9a1d54
commit 7ff2405634
5 files changed
+72 -17

No files matched your search

+31
View File
@@ -0,0 +1,31 @@
# 修复菜单管理「编辑无法保存」Spec
## Why
菜单管理页面点击「编辑」修改菜单名称后点击保存,接口返回「更新菜单成功」但数据未持久化(名称未变);新增菜单则直接返回 500。根因:`MenuService.create/update` 以 snake_case 数据库列名(`menu_name` 等)作为 Sequelize 的取值键,而实体属性是 camelCase(`menuName` 等),Sequelize 无法匹配从而静默忽略(update)或触发 NOT NULL 报错(create)。
## What Changes
- 修正 `server/src/service/menu.service.ts` 中 `create()` 与 `update()`:将写入 Sequelize 的键改为实体 camelCase 属性名(`parentId/menuName/menuPath/component/icon/sortOrder/menuType/permission/visible`),字段映射由实体 `field` 配置负责。
- 前端与接口协议不变(前端已发送 camelCase body,`menu.controller.ts`、`menu.dto.ts`、`client/src/api/menu.ts` 均无需改动)。
- **BREAKING**: 无(仅为内部映射修正,接口行为从「假成功/500」变为「真实持久化」)。
## Impact
- Affected specs: 系统管理域(sys_menu RBAC)
- Affected code: `server/src/service/menu.service.ts`(仅 create/update 两处取值键);连带修复后「新增菜单」「编辑菜单」均恢复可用
## ADDED Requirements
(无新增能力)
## MODIFIED Requirements
### Requirement: 菜单新增与编辑持久化
菜单管理的「新增」与「编辑」操作 SHALL 将表单值真实写入 `sys_menu` 表。
#### Scenario: 编辑菜单名称后保存
- **WHEN** 用户在菜单管理中点击某菜单「编辑」,修改菜单名称并点击确定
- **THEN** 接口返回成功,重新拉取菜单树显示新名称,且刷新页面后名称保持不变
#### Scenario: 新增菜单
- **WHEN** 用户在菜单管理中点击「新增」,填写必填项并确定
- **THEN** 接口返回 200 并持久化,菜单树中出现新菜单(而非 500)
## REMOVED Requirements
(无)