黑名单管理(2)--路由以及页面导航栏设置

24 阅读4分钟

一、背景

前端框架: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进行远程接口调用,隐藏了方法定义。所以联想到这个可能,因此想着先找到初始化导航栏的方法,再逐步排查。

黑名单管理二排查链路图.png

开启页面,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.jsstore 中的菜单管理模块,并抓取 queryAllMenu 这类接口。

3.实习生视角:没有后端权限时,可以通过断点临时验证前端逻辑,但最终应推动后端同学完成配置,避免硬编码。

4.技术更新:Vue Router 4 已不再推荐 addRoutes(批量添加),而是使用 addRoute 逐个添加,注意版本差异。