import { NextLoading } from './../plugins/enter-loading/index'; import cloneDeep from 'lodash/cloneDeep' import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'; import { staticRoutes } from './static-routes'; import { dynamicRoutes } from './dynamic-routes'; import { flatten, unflatten } from '@/utils/arr' import store from '@/hooks/useStore'; import { initFrontEndControlRoutes } from './route-util' const router = createRouter({ history: createWebHashHistory(), routes: staticRoutes, }); /** * 定义404界面 * @link 参考:https://next.router.vuejs.org/zh/guide/essentials/history-mode.html#netlify */ const pathMatch = { path: '/:path(.*)*', redirect: '/404', }; /** * 添加动态路由 * @method router.addRoute * @description 此处循环为 dynamicRoutes(/@/router/route)第一个顶级 children 的路由一维数组,非多级嵌套 * @link 参考:https://next.router.vuejs.org/zh/api/#addroute */ export function setAddRoute() { getFilterRoutes().forEach((route: RouteRecordRaw) => { const routeName: any = route.name; if (!router.hasRoute(routeName)) router.addRoute(route); }); } /** * 获取有当前用户权限标识的路由数组,进行对原路由的替换 * @description 替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由 * @returns 返回替换后的路由数组 */ export function getFilterRoutes() { const deepFlattenRoutes = flatten(dynamicRoutes) const auths = [...store.state.userInfo.authPageList] const hasAuthFn = getVerifyAuthFn(auths) const filterFlattenRoutes = deepFlattenRoutes.filter(({ meta }) => { const { auth } = meta return !auth || hasAuthFn(auth) }) // 保存扁平化后的菜单 store.commit('routeList/setFlatRouteList', cloneDeep(filterFlattenRoutes)) // 设置vuex中的tagsViewList的值 const { isCacheTagsView } = store.state.themeConfig const sessionTagsViewList = sessionStorage.getItem('tagsViewList') if (isCacheTagsView && sessionTagsViewList) { store.commit('routeList/setTagsViewList', JSON.parse(sessionTagsViewList)) } else { const tagsViewList = filterFlattenRoutes.filter(({ meta }) => meta.isAffix && !meta.isHide) store.commit('routeList/setTagsViewList', tagsViewList) } const filterRoutes = unflatten(filterFlattenRoutes) as unknown as RouteRecordRaw[] store.commit('routeList/setRoutesList', filterRoutes) return filterRoutes } /** * 查询数组是否有交集 * @param auths * @returns */ export const getVerifyAuthFn = (auths: string[]) => { const obj: Record = {}; const authsMap = auths.reduce((r, i) => (r[i] = true, r), obj); return (menuAuths: string[]) => { return menuAuths.some(auth => authsMap[auth]) }; }; // 初始化添加动态路由 initFrontEndControlRoutes() // 路由加载后 router.afterEach(() => { NextLoading.done(); }); export default router