admin/菜单为空问题诊断.md
lvfengfree b92e1119ae fix: 修复菜单为空问题 - 移除后端过滤home路由的错误逻辑
- 修复RouteService中错误过滤home路由的问题
- 后端现在正确返回所有用户有权限的路由
- 添加设备管理相关功能(列表、在线监控、电源管理、远程监控)
- 添加详细的修复文档和重启脚本
- 更新权限配置脚本

问题根源:后端代码中有逻辑会过滤掉home路由,导致前端收到空数组,无法生成菜单
解决方案:移除过滤home路由的逻辑,让后端返回所有有权限的路由
2026-03-01 09:50:19 +08:00

5.0 KiB
Raw Blame History

菜单为空问题诊断

问题现象

前端控制台显示:

生成菜单数量: 0 去重后: 0

这说明前端没有从后端获取到任何路由数据。

可能的原因

  1. 后端服务没有重启 - 数据库更新后必须重启后端
  2. 后端返回空数据 - RouteService 没有正确查询到路由
  3. 前端请求失败 - 网络问题或认证问题
  4. 路由表为空 - 数据库中没有路由数据

诊断步骤

步骤1确认后端服务已重启

重要! 修改数据库后必须重启后端服务!

# 停止当前运行的后端
# 然后重新启动
cd backend
mvn spring-boot:run

步骤2检查后端日志

启动后端后,查看控制台输出,应该能看到:

Started AdminApplication in X.XXX seconds

登录时应该能看到:

=== 用户路由权限调试 ===
用户ID: 1
用户角色: R_SUPER,R_ADMIN
...

步骤3检查数据库路由表

USE soybean_admin;

-- 检查路由表是否有数据
SELECT COUNT(*) as route_count FROM sys_route WHERE status = 1;

-- 查看所有启用的路由
SELECT name, path, component FROM sys_route WHERE status = 1 ORDER BY order_num;

如果路由表为空,需要运行:

mysql -u root -proot < backend/src/main/resources/sql/add_all_routes.sql

步骤4测试后端API

4.1 测试登录接口

打开浏览器开发者工具F12切换到 Network 标签,然后登录。

查找 /auth/login 请求,检查响应:

{
  "code": "0000",
  "msg": "success",
  "data": {
    "token": "eyJhbGc...",
    "refreshToken": "eyJhbGc..."
  }
}

4.2 测试getUserRoutes接口

登录后,查找 /route/getUserRoutes 请求,检查响应:

正常响应应该是:

{
  "code": "0000",
  "msg": "success",
  "data": {
    "routes": [
      {
        "name": "home",
        "path": "/home",
        "component": "layout.base$view.home",
        "meta": {...}
      },
      {
        "name": "device",
        "path": "/device",
        "component": "layout.base",
        "meta": {...},
        "children": [...]
      }
    ],
    "home": "home"
  }
}

如果返回空数组:

{
  "code": "0000",
  "msg": "success",
  "data": {
    "routes": [],
    "home": "home"
  }
}

这说明后端没有查询到路由数据。

步骤5检查后端日志输出

如果 getUserRoutes 返回空数组,查看后端控制台,应该能看到详细的调试信息:

=== 用户路由权限调试 ===
用户ID: 1
用户角色: R_SUPER,R_ADMIN
查询到的角色数量: 2
角色: R_SUPER - 超级管理员
配置的菜单: home,device,device_list,...
允许访问的菜单: [home, device, device_list, ...]
数据库中的路由总数: X
过滤后的路由数量: X
最终返回的路由数量: X

根据日志输出判断问题:

  • 如果"查询到的角色数量: 0" → 用户没有角色,检查 sys_user 表的 roles 字段
  • 如果"配置的菜单: null 或空" → 角色没有配置菜单,运行 fix_403_complete.bat
  • 如果"数据库中的路由总数: 0" → 路由表为空,运行 add_all_routes.sql
  • 如果"过滤后的路由数量: 0" → 路由名称不匹配,检查路由表的 name 字段

快速修复方案

方案1完整重新初始化推荐

# 1. 停止后端服务

# 2. 重新初始化数据库
mysql -u root -proot < backend/src/main/resources/sql/init.sql
mysql -u root -proot < backend/src/main/resources/sql/add_role_table.sql
mysql -u root -proot < backend/src/main/resources/sql/add_all_routes.sql
mysql -u root -proot < fix_403_complete.sql

# 3. 创建设备表
mysql -u root -proot < backend/src/main/resources/sql/create_device_table.sql

# 4. 重启后端服务
cd backend
mvn spring-boot:run

# 5. 清除浏览器缓存并重新登录

方案2只修复权限配置

如果路由表有数据,只是权限配置有问题:

# 1. 运行权限修复脚本
fix_403_complete.bat

# 2. 重启后端服务

# 3. 清除浏览器缓存并重新登录

验证修复

修复后,登录时应该能看到:

  1. 浏览器控制台
生成菜单数量: 10 去重后: 10
  1. 左侧菜单栏:显示所有有权限的菜单

  2. 后端日志:显示详细的权限调试信息

常见问题

Q1: 后端日志没有调试信息?

A: 确保后端服务已重启,并且使用的是最新的代码。

Q2: getUserRoutes 返回 401 未授权?

A: Token 可能过期,重新登录。

Q3: 路由表有数据,但返回空数组?

A: 检查角色的 menus 字段是否配置正确,运行 fix_403_complete.bat。

Q4: 修复后还是没有菜单?

A:

  1. 确认后端服务已重启
  2. 清除浏览器缓存Ctrl+Shift+Delete
  3. 使用无痕模式测试
  4. 检查浏览器控制台的 Network 标签,查看 API 请求和响应

联系支持

如果以上步骤都无法解决问题,请提供:

  1. 后端控制台完整日志
  2. 浏览器控制台的 Network 标签截图
  3. 数据库查询结果(角色配置和路由表)