| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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;
|