什么是动态路由?
即是根据用户的权限不同,动态生成路由规则的可访问路由。
为什么要使用动态路由?
一、原因:
- 后台管理系统通常都有多种角色存在,每种角色都有不同的权限;
- 根据用户的权限不同,动态生成路由规则,可以让每个用户看到不同的导航菜单。
二、需求:
- 用户权限不同,看到的导航菜单也不同;
- 用户直接输入url路径试图访问没有权限或不存在的页面将会跳转到404页面;
三、主要利用到的技术
router.addRoutes,可动态添加路由规则
动态路由的实现?
一、思路
- 路由文件包含全部路由(分为公共基础路由publicRouter与导航路由navRouter)、并有权限字段设置;
- 登录获取到权限表authorities,根据权限表与路由权限字段authority匹配,匹配的路由处理为新路由规则addRouters;
- 新的路由规则添加到router中;
- 根据新的路由规则渲染导航菜单。
二、路由文件router.js的设置
- 路由文件分割为公共基础路由publicRouter跟导航路由navRoute
publicRouter为基础路由,与权限无关,每个用户都含有。通常包括:根路径(/)设置、home路由与登录路由。
navRouter为动态导航路由,包含全部与权限控制相关的路由,显示在导航菜单栏。
注:404路由虽然为公共路由,但需要放到路由规则的最后面。 - 具体代码如下
1 | import Vue from 'vue' |
三、vuex管理的路由模块route.js的设置
- route.js是匹配路由规则,生成动态路由的文件。
生成的全部路由将会被addRoutes到router中,并会在导航菜单渲染中使用 - 具体代码如下
1 | import { navRouter, publicRouter } from '@/router/index' |
3、为了方便调用,也是放到vuex的getters中
1 | const getters = { |
四、全局路由拦截permission.js的设置
- 该拦截可实现登录后与强制刷新浏览器都会重新获取self接口,重新设置动态路由。
在此处,需要把匹配好的动态路由通过addRouters添加到router中。 - 具体代码如下
1 | import router from '@/router/index' |
五、home页的设置
目的:
- home页作为登录后的loading页;
- 根路径会默认重定向到该页面;
- 进入到home页后,会跳转到动态路由的第一个路由页面。
具体代码如下:
1 | <template lang="pug"> |
六、导航菜单的设置:
- 导航菜单利用element-ui的el-menu组件实现;
主要需要考虑的是菜单栏的高亮问题,强制刷新浏览器,登录后第一次进入,切花页面。高亮状态的保持与更替需要有仔细的考虑与验证。 - 具体代码如下:
1 | <template lang="pug"> |