# 菜单为空问题诊断 ## 问题现象 前端控制台显示: ``` 生成菜单数量: 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. 数据库查询结果(角色配置和路由表)