一、背景
前端框架:Vue 2 + Vue Router + Element UI
后端框架:Sprintboot + MyBatis +Feign
权限控制:前端只保留基础路由,业务菜单由后端动态返回,前端通过 router.addRoute 动态添加
二、问题现象
我在前端的router/index.js内,对黑名单管理进行全局路由配置,但是发现“黑名单管理”模块总是与系统管理平级,无法作为子项出现在“系统管理”模块下
三、排查过程
1、查看全局路由
查看前端的router/index.js全局路由配置文件,发现只有dashboard配置,没有单独的子路由项。子路由也没有定义在children内。片段如下:
{
path: '',
component: Layout,
redirect: 'dashboard',
children: [
{
path:'dashboard',
component:()=>import('@/views/index'),
name:'dashboard',
meta:{
title:'dashboard',
icon:'dashboard' ,
affix:true
}
}
]
}
2、查看子路由定义文件
前端查看router/modules包,尝试查看是不是子路由项放在单独的文件里,这里只是引用。结果没有发现。
3、全局搜索关键字
尝试通过查找“短信模板配置”这个子项的路由配置,仿写我的“黑名单管理”模块路由。
IDEA内Edit--Find--find in path全局搜索“短信模版配置”关键词,前端全部查不到。
4、动态路由配置
怀疑是动态路由,由后端定义并返回路由数据给前端,前端只负责接收和装配展示。
在前端src/permission.js找到了 router.addRoutes 的调用,是根据用户权限动态添加可展示菜单。
查看 store/modules 下 permission.js,里面存储了从后端获取的菜单/路由数据,但是只有相关变量定义和简要的处理逻辑,并没有具体的方法实现内容。
【注:addRoutes 在 Vue Router 4 中已废弃,建议用 addRoute】
5、接口调用排查
因为之前遇到过类似的只有方法调用,找不到方法定义的问题,后来发现是用了feign进行远程接口调用,隐藏了方法定义。所以联想到这个可能,因此想着先找到初始化导航栏的方法,再逐步排查。
开启页面,F12开发者模式,刷新首页。抓到一个接口queryAllMenu。找到他的实现类,实现类逻辑:
先获取当前用户的token并且解析出用户名,然后根据token调用getMenuUrl()接口,从url里的resources获取到对应的功能菜单列表对象并返回。
所以现在问题就变成这个getMenuUrl()接口是什么?它获取到的数据长什么样?
点击getMenuUrl()方法,跳转到一个Bean类,上面有一个注解:
@ConfigurationProperties(prefix="auth-center") ,表明 URL 来自配置文件(如 application.yml)
一翻application.yml,明明白白写了auth-center:一串网址。
ok,就是feign远程调用。
四、解决方法
临时方案:由于我是实习生,没有权限看到完整的后端代码,无法直接修改数据库或配置中心。所以打算直接调用这个远程接口,在获取到的数据后拼接上我想要的黑名单管理的路由后返回给前端。
启动断点调试,刷新页面后发现接口返回一个List<Map<String,Object>>对象,每个菜单项是一个Map,里面有一些id、name等等的属性。
所以我手动添加Map对象,按照List数据的格式补充黑名单管理的属性,把它作为Map装配到List内。
长期方案:联系后端同事在 getMenuUrl() 返回的菜单树中,为“系统管理”增加 children 节点,前端无需改动。
五、总结与反思
1.动态路由:前端路由表只包含基础路由(如登录、首页),其他业务模块的路由会在用户登录后,根据后端返回的权限数据动态添加。
如何判断是否为动态路由?
打开 src/permission.js,看看里面是否有 router.addRoutes 或 router.addRoute 的调用。
查看 store/modules 下是否有 permission.js 或 menu.js,里面可能存储了从后端获取的菜单/路由数据。
搜索关键词:getRouters、getMenu、addRoutes,看是否有调用后端接口获取路由的代码
2.排查技巧:当找不到路由配置时,优先检查 permission.js 和 store 中的菜单管理模块,并抓取 queryAllMenu 这类接口。
3.实习生视角:没有后端权限时,可以通过断点临时验证前端逻辑,但最终应推动后端同学完成配置,避免硬编码。
4.技术更新:Vue Router 4 已不再推荐 addRoutes(批量添加),而是使用 addRoute 逐个添加,注意版本差异。