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

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

223 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 菜单为空问题诊断
## 问题现象
前端控制台显示:
```
生成菜单数量: 0 去重后: 0
```
这说明前端没有从后端获取到任何路由数据。
## 可能的原因
1. **后端服务没有重启** - 数据库更新后必须重启后端
2. **后端返回空数据** - RouteService 没有正确查询到路由
3. **前端请求失败** - 网络问题或认证问题
4. **路由表为空** - 数据库中没有路由数据
## 诊断步骤
### 步骤1确认后端服务已重启
**重要!** 修改数据库后必须重启后端服务!
```bash
# 停止当前运行的后端
# 然后重新启动
cd backend
mvn spring-boot:run
```
### 步骤2检查后端日志
启动后端后,查看控制台输出,应该能看到:
```
Started AdminApplication in X.XXX seconds
```
登录时应该能看到:
```
=== 用户路由权限调试 ===
用户ID: 1
用户角色: R_SUPER,R_ADMIN
...
```
### 步骤3检查数据库路由表
```sql
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;
```
如果路由表为空,需要运行:
```bash
mysql -u root -proot < backend/src/main/resources/sql/add_all_routes.sql
```
### 步骤4测试后端API
#### 4.1 测试登录接口
打开浏览器开发者工具F12切换到 Network 标签,然后登录。
查找 `/auth/login` 请求,检查响应:
```json
{
"code": "0000",
"msg": "success",
"data": {
"token": "eyJhbGc...",
"refreshToken": "eyJhbGc..."
}
}
```
#### 4.2 测试getUserRoutes接口
登录后,查找 `/route/getUserRoutes` 请求,检查响应:
**正常响应应该是:**
```json
{
"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"
}
}
```
**如果返回空数组:**
```json
{
"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完整重新初始化推荐
```bash
# 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只修复权限配置
如果路由表有数据,只是权限配置有问题:
```bash
# 1. 运行权限修复脚本
fix_403_complete.bat
# 2. 重启后端服务
# 3. 清除浏览器缓存并重新登录
```
## 验证修复
修复后,登录时应该能看到:
1. **浏览器控制台**
```
生成菜单数量: 10 去重后: 10
```
2. **左侧菜单栏**:显示所有有权限的菜单
3. **后端日志**:显示详细的权限调试信息
## 常见问题
### 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. 数据库查询结果(角色配置和路由表)