- 修复RouteService中错误过滤home路由的问题 - 后端现在正确返回所有用户有权限的路由 - 添加设备管理相关功能(列表、在线监控、电源管理、远程监控) - 添加详细的修复文档和重启脚本 - 更新权限配置脚本 问题根源:后端代码中有逻辑会过滤掉home路由,导致前端收到空数组,无法生成菜单 解决方案:移除过滤home路由的逻辑,让后端返回所有有权限的路由
223 lines
5.0 KiB
Markdown
223 lines
5.0 KiB
Markdown
# 菜单为空问题诊断
|
||
|
||
## 问题现象
|
||
|
||
前端控制台显示:
|
||
```
|
||
生成菜单数量: 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. 数据库查询结果(角色配置和路由表)
|