商户端访问"系统管理 → 角色管理 → 新增"时,菜单权限树一直显示"加载中,请稍候",无法加载菜单数据。 而平台端相同功能正常。
商户端用户的角色分配的菜单,其 platform_id 不是 1(商户端),导致查询时被过滤掉。
查询逻辑(SysMenuServiceImpl.selectMenuList):
// 第一步:权限过滤(非超管用户)
if (!LoginHelper.isSuperAdmin(userId)) {
wrapper.inSql(SysMenu::getMenuId, baseMapper.buildMenuByUserSql(userId));
}
// 第二步:平台过滤
int platformId = PlatformUtils.getId(); // 商户端返回 1
wrapper.eq(SysMenu::getPlatformId, platformId);
问题链路:
商户端用户登录
→ 请求头携带 PLATFORM_CODE: "SHANGHUDUAN"
→ PlatformUtils.getId() 返回 1
→ 查询条件:
- 用户角色分配的菜单(通过 sys_role_menu)
- AND platform_id = 1
→ 但角色分配的菜单都是 platform_id = 0 或 NULL
→ 结果为空
数据验证结果:
platform_id = 0 有 134 条菜单(平台端)platform_id = 1 有 6 条菜单(商户端)platform_id = NULL 或 0,没有 platform_id = 1 的-- 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;
如果商户端需要的菜单功能和平台端一致,可以将这些菜单的 platform_id 改为 1:
-- 将系统管理相关菜单设为商户端
UPDATE sys_menu SET platform_id = 1
WHERE menu_id IN (
1, -- 系统管理
100, -- 用户管理
101, -- 角色管理
102, -- 菜单管理
103, -- 部门管理
-- ... 其他需要的菜单ID
);
如果希望某些菜单在两个平台都可见,需要修改查询逻辑,支持 platform_id IN (0, 1) 或引入菜单平台关联表。
验证数据:
-- 查看角色菜单的平台分布
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 有数据
重启后端服务
清除浏览器缓存
商户端登录测试:系统管理 → 角色管理 → 新增
sj-merchant-web/src/views/system/role/index.vuesj-merchant-web/src/api/system/menu/index.tsruoyi-system/.../SysMenuController.java:84-89ruoyi-system/.../SysMenuServiceImpl.java:73-93yp-common-platform/.../PlatformUtils.javascript/sql/fix_merchant_role_permission.sql问题不在于代码逻辑或 platform_id 字段缺失,而是数据配置问题:
sys_role_menu)指向的菜单,其 platform_id 不是商户端的值(1)修复方式:确保商户端角色分配的菜单,其 platform_id = 1。