💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、概述 现实业务中,存在这样的场景,系统的路由和菜单会根据用户的角色变化而变化,或者路由菜单根据用户的;前端提供了一套完整的异步加载方案, 可以让你很方便的从服务端加载路由和菜单配置,并应用到系统中; ## 二、动态加载路由 ### 1)、开启异步路由设置 在`/config/config.js`文件中设置`asyncRoutes`的值为 true; ![](../../images/screenshot_1610703642191.png) ### 2)、注册路由组件 基础路由组件包含路由基本配置和对应的视图组件,统一在`/router/async/router.map.js`文件中注册它们。它和正常的路由配置基本无异,相当于把完整的路由拆分成单个的路由配置进行注册,为后面的路由动态配置打好基础; 一个单独的路由组件注册示例如下: ~~~ registerName: { //路由组件注册名称,唯一标识 path: 'path', //路由path,可缺省,默认取路由注册名称 registerName 的值 name: '演示页', //路由名称 redirect: '/login', //路由重定向 component: () => import('@/pages/demo'), //路由视图 icon: 'permission', //路由的菜单icon,会注入到路由元数据meta中 invisible: false, //是否隐藏菜单项,true 隐藏,false 不隐藏,会注入到路由元数据meta中。 authority: { //路由权限配置,会注入到路由元数据meta中。可缺省,默认为 ‘*’, 即无权限限制 permission: 'form', //路由需要的权限 role: 'admin' //路由需要的角色。当permission未设置,通过 role 检查权限 }, page: { //路由的页面数据,会注入到路由元数据meta中 title: '演示页', //页面标题 breadcrumb: ['首页', '演示页'] //页面面包屑 } } ~~~ ### 3)、配置基本路由 如果没有任何路由,你的应用是无法访问的,所以我们需要在本地配置一些基本的路由,比如登录页、404、403 等。你可以在`/router/async/config.async.js`文件中配置一些本地必要的路由; ~~~ const routesConfig = [ 'login', //匹配 router.map.js 中注册的 registerName = login 的路由 'root', //匹配 router.map.js 中注册的 registerName = root 的路由 { router: 'exp404', //匹配 router.map.js 中注册的 registerName = exp404 的路由 path: '*', //重写 exp404 路由的 path 属性 name: '404' //重写 exp404 路由的 name 属性 }, { router: 'exp403', //匹配 router.map.js 中注册的 registerName = exp403 的路由 path: '/403', //重写 exp403 路由的 path 属性 name: '403' //重写 exp403 路由的 name 属性 } ] ~~~ 完成配置后,即可通过`routesConfig`和已注册的`routerMap`生成[router.options.routes](https://router.vuejs.org/zh/api/#router-%E6%9E%84%E5%BB%BA%E9%80%89%E9%A1%B9)配置如下; ~~~ const options = { routes: parseRoutes(routesConfig, routerMap) } ~~~ 完成以上设置后,本地就已经有了包含 login、404、403 页面的路由,并且这些路由是可以直接访问的; ### 4)、异步获取路由配置 当用户登录后(或者其它的前提条件),你可能想根据不同用户加载不同的路由和菜单。 那么我们就需要先从后端服务获取异步路由配置,后端返回的异步路由配置`routesConfig`是一个异步路由配置数组, 应当如下格式: ~~~ [{ router: 'root', //匹配 router.map.js 中注册名 registerName = root 的路由 children: [ //root 路由的子路由配置 { router: 'dashboard', //匹配 router.map.js 中注册名 registerName = dashboard 的路由 children: ['workplace', 'analysis'], //dashboard 路由的子路由配置,依次匹配 registerName 为 workplace 和 analysis 的路由 }, { router: 'form', //匹配 router.map.js 中注册名 registerName = form 的路由 children: [ //form 路由的子路由配置 'basicForm', //匹配 router.map.js 中注册名 registerName = basicForm 的路由 'stepForm', //匹配 router.map.js 中注册名 registerName = stepForm 的路由 { router: 'advanceForm', //匹配 router.map.js 中注册名 registerName = advanceForm 的路由 path: 'advance' //重写 advanceForm 路由的 path 属性 } ] }, { router: 'basicForm', //匹配 router.map.js 中注册名 registerName = basicForm 的路由 name: '验权表单', //重写 basicForm 路由的 name 属性 icon: 'file-excel', //重写 basicForm 路由的 icon 属性 authority: 'form' //重写 basicForm 路由的 authority 属性 } ] }] ~~~ 其中`router`属性 对应`router.map.js`中已注册的`基础路由`的注册名称`registerName`,`children`属性为路由的嵌套子路由配置; ### 5)、加载路由并应用 提供了一个路由加载工具,只需调用`/utils/routerUtil.js`中的`loadRoutes`方法加载上一步获取到的`routesConfig`即可,如下: ~~~ getRoutesConfig().then(result => { const routesConfig = result.data.data loadRoutes(routesConfig) }) ~~~ 至此,异步路由的加载就完成了,你可以访问异步加载的路由了。 ## 三、动态加载菜单 前端的菜单,是根据路由配置自动生成的,默认获取根路由`‘/’`下所有子路由作为菜单配置; >[danger] 当你完成了异步路由的加载,菜单也会随之改变,无需你做其它额外的操作。 主要代码如下: ~~~ // 初始化Admin后台菜单数据 const rootRoute = router.options.routes.find(item => item.path === '/') const menuRoutes = rootRoute && rootRoute.children if (menuRoutes) { mergeI18nFromRoutes(i18n, menuRoutes) store.commit('setting/setMenuData', menuRoutes) } ~~~