一、待实现功能
要将“黑名单管理”的模块放置在左侧系统管理的导航栏下。
二、问题现象
我在前端的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、全局搜索关键字
Edit--Find--find in path全局搜索“短信模版配置”关键词,前端全部查不到。
4、动态路由配置
怀疑是动态路由,由后端定义并返回路由数据给前端,前端只负责接收和装配展示。
动态路由:前端路由表只包含基础路由(如登录、首页),其他业务模块的路由会在用户登录后,根据后端返回的权限数据动态添加。
如何判断是否为动态路由?
打开 src/permission.js,看看里面是否有 router.addRoutes 或 router.addRoute 的调用。 查看 store/modules 下是否有 permission.js 或 menu.js,里面可能存储了从后端获取的菜单/路由数据。 搜索关键词:getRouters、getMenu、addRoutes,看是否有调用后端接口获取路由的代码
在前端src/permission.js找到了 router.addRoutes 的调用,是根据用户权限动态添加可展示菜单。 查看 store/modules 下 permission.js,里面存储了从后端获取的菜单/路由数据,但是只有相关变量定义和简要的处理逻辑,并没有具体的方法实现内容。
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远程调用。
四、解决方法
由于我是实习生,没有权限看到完整的代码,再加上网址需要拼接上token才能够用postman进行测试,我头实在大,所以打算直接调用这个远程接口,在获取到的数据后拼接上我想要的黑名单管理的路由后返回给前端。
启动断点调试,刷新页面后发现接口返回一个List<Map<String,Object>>对象,每个菜单项是一个Map,里面有一些id、name等等的属性。
所以我打算手动添加Map对象。我按照List数据的格式补充黑名单管理的属性,把它作为Map装配到List内。ok,黑名单管理成功出现在系统管理下面。