PROBLEM_SUMMARY.md 4.0 KB

商户端角色管理菜单树加载问题 - 完整分析报告

问题现象

商户端访问"系统管理 → 角色管理 → 新增"时,菜单权限树一直显示"加载中,请稍候",无法加载菜单数据。 而平台端相同功能正常。

问题根源

核心原因

商户端用户的角色分配的菜单,其 platform_id 不是 1(商户端),导致查询时被过滤掉。

技术分析

  1. 查询逻辑SysMenuServiceImpl.selectMenuList):

    // 第一步:权限过滤(非超管用户)
    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 = NULL0,没有 platform_id = 1

解决方案

方案 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;

方案 2:将现有菜单改为商户端可用

如果商户端需要的菜单功能和平台端一致,可以将这些菜单的 platform_id 改为 1:

-- 将系统管理相关菜单设为商户端
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. 验证数据

    -- 查看角色菜单的平台分布
    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