import { createRouter, createWebHashHistory } from 'vue-router'; import { systemRoutes } from './route'; import { kuky_Authorization } from '../base/storage'; import { initializeRoutes } from '../utils/permission'; const router = createRouter({ history: createWebHashHistory(), routes: [...systemRoutes], scrollBehavior: () => ({ left: 0, top: 0 }) }); /** * 路由验证有三个级别: * 级别1:任何情况都可进入 * 级别2:在已登录的情况下可以进入 * 级别3:在已登录,并且有权限的情况下可以进入 */ /** 免验证白名单 */ const whiteList = ['/login', '/reg', '/denied', '/']; /** * 需要登录的链接 * 这些路由无需权限判断,但是需要用户登录 */ const require_login_paths = [ '/settings', // '/settings/profile', '/settings/global', '/settings/password' // '/settings/phone', // '/settings/email' ]; /** 是否已经生成过路由表 */ let hasRouteFlag = false; export const resetHasRouteFlag = () => { hasRouteFlag = false; }; // 扁平路由表 let flatRoutes = []; router.beforeEach(async (to, from, next) => { const isAuthorized = kuky_Authorization.get(); // 获取用户授权状态 const isLoginPage = to.path === '/login'; // 判断目标路径是否为登录页 const isInWhiteList = whiteList.includes(to.path); // 检查目标路径是否在白名单中 const isRequireLoginPath = require_login_paths.includes(to.path); // 检查目标路径是否在白名单中 // 用户已授权的情况 if (isAuthorized) { // 用户已登录 // 判断动态路由表是否已经生成,若未生成,则生成动态路由表 if (!hasRouteFlag) { // 路由表未生成,开始生成路由表,并进入目标路由 const { accessRoutes, accessFlatRoutes, firstAccessibleRoute } = await initializeRoutes(); accessRoutes.forEach((route) => { if (route.path && route.component) { router.addRoute(route); // 动态添加可访问路由表 } }); flatRoutes = accessFlatRoutes; hasRouteFlag = true; // 路由表已经生成 // next({ path: firstAccessibleRoute.path, replace: true }); next({ path: to.path, replace: true }); return; } else { // 动态路由表已经生成,根据情况判断是否进入目标路由 } /** * 判断当前目标路由位置 * 如果是登录页面,则重定向到首页 * 如果是需要登录的页面,则直接进入 * 其他情况1: 按断是否有权限进入,如果没有权限,则重定向到无权限页面 */ const has_permission = flatRoutes.some((route) => route.path == to.path); if (isLoginPage) { // 登录页面:重定向到首页 next('/'); } else if (isRequireLoginPath) { // 需要登录的页面:直接进入 next(); } else if (!has_permission && !isInWhiteList) { next('/denied'); // 如果用户无访问权限且不在白名单中,重定向到无权限页面 } else { next(); // 其他情况,正常访问 } } else { if (isRequireLoginPath) { // 需要用户登录 next('/login'); } else { // 无需登录的页面 // 用户未授权的情况 if (isInWhiteList) { // 如果目标路径在免登录白名单中 next(); // 允许进入 } else { next('/login'); // 否则重定向到登录页面 } } } }); export default router;