DEBUG_GUIDE.md 4.0 KB

商户端角色管理菜单树加载问题 - 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.developmentVITE_APP_PLATFORM_CODE="SHANGHUDUAN"
  • 请求头: PLATFORM_CODE: SHANGHUDUAN
  • 后端解析: PlatformUtils.getId() → 返回 1(商户端)
  • 平台枚举:
    • ADMIN(0, "PINGTAIDUAN", "平台端")
    • MERCHANT(1, "SHANGHUDUAN", "商户端")

3. 问题代码位置

SysMenuServiceImpl.java:82-87

int platformId = menu.getPlatformId()==null? PlatformUtils.getId() : menu.getPlatformId();
menuList = baseMapper.selectVoList(
    wrapper.eq(SysMenu::getPlatformId, platformId) // ← 这里强制过滤 platform_id

SysMenu.java:104-105

// 平台ID
private Integer platformId;  // ← 实体类有字段

ry_vue_5.X.sql:235-257

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: 执行数据库修复脚本

# 在 MySQL 中执行
mysql -u root -p your_database < script/sql/add_platform_id_to_menu.sql

步骤 2: 为现有菜单分配平台

根据业务需求,决定哪些菜单属于哪个平台:

-- 查看当前所有菜单
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 字段已添加?

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/