# 商户端角色管理菜单树加载问题 - Debug 指南 ## 问题现象 商户端访问"角色管理-新增"时,菜单权限树一直显示"加载中,请稍候",无法正常加载菜单数据。 ## 根本原因 **数据库 `sys_menu` 表缺少 `platform_id` 字段**,导致后端查询时 SQL 报错或返回空结果。 ## 技术分析 ### 1. 接口调用链 ``` 前端: sj-merchant-web/src/views/system/role/index.vue → handleAdd() 方法 → getMenuTreeselect() → API: GET /system/menu/treeselect 后端: SysMenuController.treeselect() → SysMenuServiceImpl.selectMenuList() → 查询条件包含: .eq(SysMenu::getPlatformId, platformId) ``` ### 2. 平台识别机制 - 前端配置: `.env.development` 中 `VITE_APP_PLATFORM_CODE="SHANGHUDUAN"` - 请求头: `PLATFORM_CODE: SHANGHUDUAN` - 后端解析: `PlatformUtils.getId()` → 返回 1(商户端) - 平台枚举: - `ADMIN(0, "PINGTAIDUAN", "平台端")` - `MERCHANT(1, "SHANGHUDUAN", "商户端")` ### 3. 问题代码位置 **SysMenuServiceImpl.java:82-87** ```java int platformId = menu.getPlatformId()==null? PlatformUtils.getId() : menu.getPlatformId(); menuList = baseMapper.selectVoList( wrapper.eq(SysMenu::getPlatformId, platformId) // ← 这里强制过滤 platform_id ``` **SysMenu.java:104-105** ```java // 平台ID private Integer platformId; // ← 实体类有字段 ``` **ry_vue_5.X.sql:235-257** ```sql create table sys_menu ( menu_id bigint(20) not null, menu_name varchar(50) not null, -- ... 其他字段 remark varchar(500) default '', -- ❌ 缺少 platform_id 字段 primary key (menu_id) ); ``` ## 解决方案 ### 步骤 1: 执行数据库修复脚本 ```bash # 在 MySQL 中执行 mysql -u root -p your_database < script/sql/add_platform_id_to_menu.sql ``` ### 步骤 2: 为现有菜单分配平台 根据业务需求,决定哪些菜单属于哪个平台: ```sql -- 查看当前所有菜单 SELECT menu_id, menu_name, parent_id FROM sys_menu ORDER BY menu_id; -- 方案 A: 所有菜单都设为平台端(管理端和商户端共享) UPDATE sys_menu SET platform_id = 0; -- 方案 B: 区分平台(根据实际业务调整) -- 平台端菜单(租户管理、系统监控等) UPDATE sys_menu SET platform_id = 0 WHERE menu_id IN (6, 2, 109, 113); -- 商户端菜单(用户管理、角色管理等) UPDATE sys_menu SET platform_id = 1 WHERE menu_id IN (1, 100, 101, 102, 103, 104, 105); ``` ### 步骤 3: 验证修复 1. 重启后端服务 2. 清除浏览器缓存 3. 商户端登录 → 系统管理 → 角色管理 → 新增 4. 检查菜单树是否正常加载 ## Debug 断点位置 如需进一步调试,可在以下位置打断点: 1. **控制器层** - `SysMenuController.java:87` - 查看返回的菜单列表 2. **服务层** - `SysMenuServiceImpl.java:83` - 查看 SQL 查询条件 - `SysMenuServiceImpl.java:87` - 查看 platformId 值 3. **平台工具类** - `PlatformUtils.java:8` - 查看请求头中的 PLATFORM_CODE - `Platform.java:38` - 查看平台 ID 转换逻辑 ## 常见问题 ### Q1: 执行脚本后仍然加载不出来? 检查后端日志,查看是否有 SQL 异常或权限问题。 ### Q2: 如何确认 platform_id 字段已添加? ```sql DESC sys_menu; -- 或 SHOW COLUMNS FROM sys_menu LIKE 'platform_id'; ``` ### Q3: 商户端应该看到哪些菜单? 根据业务设计,通常商户端只能看到 `platform_id = 1` 的菜单。如果需要共享某些菜单,可以考虑: - 复制菜单数据,分别设置不同的 platform_id - 或修改后端逻辑,支持 `platform_id IN (0, 1)` 的查询 ## 相关文件 - 前端接口定义: `sj-merchant-web/src/api/system/menu/index.ts` - 前端页面: `sj-merchant-web/src/views/system/role/index.vue` - 后端控制器: `ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java` - 后端服务: `ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java` - 平台工具: `yp-common-platform/src/main/java/org/dromara/common/platform/`