渲染对应的menu-item其实需要看后端返回什么样的数据结构,我们才来确定用何种方式渲染。然后来添加动态路由。
在注册所有menu-item对应的路由映射
这个方法虽然很简单,但是不能避免用户在浏览器输入框中输入正确的url,渲染出了该角色不具备的menu-item对应的路由。
根据后端返回的不同角色,在前端事先写好每个角色对应的路由映射
我们登录的时候,会返回用户的数据,我们根据该用户的角色,来匹配到前端写好的路由映射。
{ superAdmin: [{path, component}, {...}], others: [{path, component}, {...}], ... }
这种方法,当后端新增了角色,我们就得在前端写好该角色的对应的路由映射数组。
根据后端返回的不同角色,然后请求该角色对应的权限列表。
这个方法,需要后端和后端高度的配合,它需要返回该角色对应的权限列表。内部提供路由映射的url。
[ { "id": 1, "name": "系统管理", "icon": "<tools />", "type": 1, "url": "/main/system", "children": [ { "id": "1-1", "name": "用户管理", "type": 2, "url": "/main/system/user" }, { "id": "1-2", "name": "部门管理", "type": 2, "url": "/main/system/department" }, { "id": "1-3", "name": "菜单管理", "type": 2, "url": "/main/system/menu" }, { "id": "1-4", "name": "角色管理", "type": 2, "url": "/main/system/role" } ] } ]
然后前端提供给url和component的映射文件。
const category = () => import('@/views/main/product/category/category.vue') export default { path: '/main/product/category', name: 'category', component: category, children: [] }
然后自己定义一个工具方法,来根据不同的角色映射不同的路由。
- 先将超级管理员权限中的路由映射收集到一个数组中
- 然后根据不同角色来筛选路由
- 将筛选后的路由动态添加到routes对应的位置中。
import { RouteRecordRaw } from 'vue-router' export default function MapRoute(userMenus: any): RouteRecordRaw[] { const routes: RouteRecordRaw[] = [] // 将该后台管理超级管理员中的url都映射出来,然后根据不用用户来筛选出路由映射 const allRoutes: RouteRecordRaw[] = [] // 表示递归擦选router/main文件下的ts文件。 const routeFiles = require.context('../router/main', true, /\.ts/) routeFiles.keys().forEach((item) => { // console.log('item', item) // 将ts文件导出的route添加到allRoutes const route = require('../router/main' + item.split('.')[1]) allRoutes.push(route.default) }) // 根据userMenus来筛选路由映射,递归 const _recurseGetRoute = (menus: any[]) => { for (const menu of menus) { if (menu.type === 2) { const route = allRoutes.find((route) => route.path === menu.url) if (route) { routes.push(route) } } else { _recurseGetRoute(menu.children) } } } _recurseGetRoute(userMenus) return routes }