/** 引入类型 */ import type {Route} from './index.type' /** 引入路由相关的资源 */ import router, {modules} from './index' /** 引入vuex实例 */ import {store} from '../store' /** 动态路由实现基础组件 */ /** 引入全局Layout组件 */ import Layout from '../AppLayout/index.vue' import {getAppModules} from "../api/systemParamters"; /** 引入需要权限的Modules */ import Demo from './modules/demo' import {Store, useStore} from "vuex"; import {RootState} from "../store"; /** 登录后需要动态加入的本地路由 */ const asyncRoutes: Route[] = [ ...Demo, ] /** 登录后需要动态加入的本地路由 */ /** * @name 动态路由的权限新增,供登录后调用 * @other 如果需要进行后端接口控制菜单的话,请在此拿到后端的菜单树与asyncRoutes对比,生成一个新的值 */ function hasCode(menus:any [],code: string) : boolean { if(menus == null ) return false; for(let i=0;i< menus.length;i++) { if(menus[i].path==code) return true; if(menus[i].children && menus[i].children.length>0 && hasCode(menus[i].children,code)) return true; } return false; } function buildAppRoutes(appModules: Route[]) { // const store: Store =useStore(); const appRoot: Route = { path: '/app', component: Layout , redirect: '/404', hideMenu: true, meta: {title: 'message.menu.system.name'}, children: [] } // eslint-disable-next-line no-debugger debugger if(!store.getters.loginInfo?.menus) return appRoot; const menus= store.getters.loginInfo.menus.filter( (i:any) => i.path === store.getters.getModuleCode) const userMenus = menus.length>0?menus[0].children:[]; //const userMenus = store.getters.loginInfo?.menus; const userModules = appModules.filter(r => hasCode(userMenus, r.path)) userModules.forEach(r => { appRoot.children?.push( { path: '/' + r.path, component: r.component, meta: r.meta } ) }) return appRoot; } function addRoutes() { // 已验证完成,下面代码添加的可以实时同步至菜单中去,可以添加setTimeout(() => {}) 模拟异步代码的操作 // 利用前端路由表模拟后端数据问题 const appModules=getAppModules() if(appModules == null){ asyncRoutes.forEach(item => { modules.push(item) router.addRoute(item) }) return } const appRoot = buildAppRoutes(appModules); modules.push(appRoot) router.addRoute(appRoot) asyncRoutes.forEach(item => { modules.push(item) router.addRoute(item) }) } /** * @des 登录了之后会执行这个方法,实现动态路由的功能 */ export function getAuthRoutes() { // 判断token是否存在,存在则调用添加路由的方法 //const store: Store =useStore(); // eslint-disable-next-line no-debugger debugger; if (store.getters.token) { addRoutes() } }