- 修复RouteService中错误过滤home路由的问题 - 后端现在正确返回所有用户有权限的路由 - 添加设备管理相关功能(列表、在线监控、电源管理、远程监控) - 添加详细的修复文档和重启脚本 - 更新权限配置脚本 问题根源:后端代码中有逻辑会过滤掉home路由,导致前端收到空数组,无法生成菜单 解决方案:移除过滤home路由的逻辑,让后端返回所有有权限的路由
5.0 KiB
5.0 KiB
菜单为空问题诊断
问题现象
前端控制台显示:
生成菜单数量: 0 去重后: 0
这说明前端没有从后端获取到任何路由数据。
可能的原因
- 后端服务没有重启 - 数据库更新后必须重启后端
- 后端返回空数据 - RouteService 没有正确查询到路由
- 前端请求失败 - 网络问题或认证问题
- 路由表为空 - 数据库中没有路由数据
诊断步骤
步骤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. 清除浏览器缓存并重新登录
验证修复
修复后,登录时应该能看到:
- 浏览器控制台:
生成菜单数量: 10 去重后: 10
-
左侧菜单栏:显示所有有权限的菜单
-
后端日志:显示详细的权限调试信息
常见问题
Q1: 后端日志没有调试信息?
A: 确保后端服务已重启,并且使用的是最新的代码。
Q2: getUserRoutes 返回 401 未授权?
A: Token 可能过期,重新登录。
Q3: 路由表有数据,但返回空数组?
A: 检查角色的 menus 字段是否配置正确,运行 fix_403_complete.bat。
Q4: 修复后还是没有菜单?
A:
- 确认后端服务已重启
- 清除浏览器缓存(Ctrl+Shift+Delete)
- 使用无痕模式测试
- 检查浏览器控制台的 Network 标签,查看 API 请求和响应
联系支持
如果以上步骤都无法解决问题,请提供:
- 后端控制台完整日志
- 浏览器控制台的 Network 标签截图
- 数据库查询结果(角色配置和路由表)