import { createRouter, createWebHistory, NavigationGuardNext, RouteLocationNormalized, Router, RouteRecordRaw } from 'vue-router' import { useSystemStore } from '../store/system' import { useMenuStore } from '../store/menu' import accountRouter from './modules/account' import dynamicRouter from './modules/dynamic' import exceptionRouter from './modules/exception' import homeRouter from './modules/home' import systemRouter from './modules/system' import systemLogRouter from './modules/system-log' /** * 主页路由名称 */ export const HOME_NAME = 'home' /** * 设置路由名称的方法 * @param array */ export const setRouteName = (array: RouteRecordRaw[]): RouteRecordRaw[] => { array.forEach(item => { item.name = item.name || item.path if (item.children) { setRouteName(item.children) } }) return array } /** * 系统路由信息 */ const routes: RouteRecordRaw[] = [ { path: '/', name: HOME_NAME, component: () => import('../views/Index.vue'), children: [...accountRouter, ...dynamicRouter, ...exceptionRouter, ...homeRouter, ...systemRouter, ...systemLogRouter] }, { path: '/login', name: 'login', component: () => import('../views/login/Login.vue') } ] /** * 默认的路由前置守卫 * @param options */ export const defaultBeforeEach = (options?: { beforeCheckLogin?: (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => void afterCheckLogin?: (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => void }) => { return async (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => { // 使用系统存储 const systemStore = useSystemStore() const menuStore = useMenuStore() // 常见页面直接进入 if (['/login', '/404', '/500', '/403'].includes(to.path)) { // 如果是去登录页面, 那么直接切换 next() return } // 验证前钩子 await options?.beforeCheckLogin?.(to, from, next) if (systemStore.isLogin) { // 如果有token, 那么判断是否有权限 const menu = menuStore.menuMap[decodeURI(to.path)] if (menu) { // 如果有menu,那么说明有权限 next() } else { // 没权限,去403 next({ path: '/403' }) } } else { next({ path: '/login' }) } // 验证后钩子 await options?.afterCheckLogin?.(to, from, next) } } /** * 默认的路由信息 */ let router = createRouter({ history: createWebHistory(), routes }) /** * 开启路由前置守卫配置 */ router.beforeEach(defaultBeforeEach()) /** * 设置新的路由信息 * @param newRouter */ export const setRouter = (newRouter: Router) => { router = newRouter } /** * 获取路由信息 */ export const getRouter = (): Router => { return router } export default router