# 修复菜单管理「编辑无法保存」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 (无)