# 商户端角色管理菜单树加载问题 - 完整分析报告 ## 问题现象 商户端访问"系统管理 → 角色管理 → 新增"时,菜单权限树一直显示"加载中,请稍候",无法加载菜单数据。 而平台端相同功能正常。 ## 问题根源 ### 核心原因 **商户端用户的角色分配的菜单,其 `platform_id` 不是 1(商户端),导致查询时被过滤掉。** ### 技术分析 1. **查询逻辑**(`SysMenuServiceImpl.selectMenuList`): ```java // 第一步:权限过滤(非超管用户) if (!LoginHelper.isSuperAdmin(userId)) { wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId)); } // 第二步:平台过滤 int platformId = PlatformUtils.getId(); // 商户端返回 1 wrapper.eq(SysMenu::getPlatformId, platformId); ``` 2. **问题链路**: ``` 商户端用户登录 → 请求头携带 PLATFORM_CODE: "SHANGHUDUAN" → PlatformUtils.getId() 返回 1 → 查询条件: - 用户角色分配的菜单(通过 sys_role_menu) - AND platform_id = 1 → 但角色分配的菜单都是 platform_id = 0 或 NULL → 结果为空 ``` 3. **数据验证结果**: - 数据库中 `platform_id = 0` 有 134 条菜单(平台端) - 数据库中 `platform_id = 1` 有 6 条菜单(商户端) - 商户端用户角色分配的菜单:`platform_id = NULL` 或 `0`,没有 `platform_id = 1` 的 ## 解决方案 ### 方案 1:为商户端角色重新分配菜单(推荐) ```sql -- 1. 确认商户端用户ID和角色ID SET @merchant_user_id = 2038434195944886273; SELECT sur.role_id, sr.role_name FROM sys_user_role sur LEFT JOIN sys_role sr ON sur.role_id = sr.role_id WHERE sur.user_id = @merchant_user_id; -- 2. 删除旧的菜单权限 SET @merchant_role_id = 100; -- 替换为实际的角色ID DELETE FROM sys_role_menu WHERE role_id = @merchant_role_id; -- 3. 为角色分配所有 platform_id=1 的菜单 INSERT INTO sys_role_menu (role_id, menu_id) SELECT @merchant_role_id, menu_id FROM sys_menu WHERE platform_id = 1; ``` ### 方案 2:将现有菜单改为商户端可用 如果商户端需要的菜单功能和平台端一致,可以将这些菜单的 `platform_id` 改为 1: ```sql -- 将系统管理相关菜单设为商户端 UPDATE sys_menu SET platform_id = 1 WHERE menu_id IN ( 1, -- 系统管理 100, -- 用户管理 101, -- 角色管理 102, -- 菜单管理 103, -- 部门管理 -- ... 其他需要的菜单ID ); ``` ### 方案 3:同时支持多平台(修改代码) 如果希望某些菜单在两个平台都可见,需要修改查询逻辑,支持 `platform_id IN (0, 1)` 或引入菜单平台关联表。 ## 验证步骤 1. **执行修复SQL** 2. **验证数据**: ```sql -- 查看角色菜单的平台分布 SELECT sm.platform_id, COUNT(*) as count FROM sys_role_menu srm LEFT JOIN sys_menu sm ON srm.menu_id = sm.menu_id WHERE srm.role_id = @merchant_role_id GROUP BY sm.platform_id; -- 应该显示 platform_id = 1 有数据 ``` 3. **重启后端服务** 4. **清除浏览器缓存** 5. **商户端登录测试**:系统管理 → 角色管理 → 新增 ## 相关文件 - 前端页面:`sj-merchant-web/src/views/system/role/index.vue` - 前端API:`sj-merchant-web/src/api/system/menu/index.ts` - 后端控制器:`ruoyi-system/.../SysMenuController.java:84-89` - 后端服务:`ruoyi-system/.../SysMenuServiceImpl.java:73-93` - 平台工具:`yp-common-platform/.../PlatformUtils.java` - 修复脚本:`script/sql/fix_merchant_role_permission.sql` ## 总结 问题不在于代码逻辑或 `platform_id` 字段缺失,而是**数据配置问题**: - 商户端用户的角色分配的菜单权限(`sys_role_menu`)指向的菜单,其 `platform_id` 不是商户端的值(1) - 查询时先通过角色过滤,再通过平台过滤,两个条件的交集为空 修复方式:确保商户端角色分配的菜单,其 `platform_id = 1`。