Blame view

Yi.Vben5.Vue3/packages/utils/src/helpers/generate-routes-frontend.ts 1.53 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  import type { RouteRecordRaw } from 'vue-router';
  
  import { filterTree, mapTree } from '@vben-core/shared/utils';
  
  /**
   * 动态生成路由 - 前端方式
   */
  async function generateRoutesByFrontend(
    routes: RouteRecordRaw[],
    roles: string[],
    forbiddenComponent?: RouteRecordRaw['component'],
  ): Promise<RouteRecordRaw[]> {
    // 根据角色标识过滤路由表,判断当前用户是否拥有指定权限
    const finalRoutes = filterTree(routes, (route) => {
      return hasAuthority(route, roles);
    });
  
    if (!forbiddenComponent) {
      return finalRoutes;
    }
  
    // 如果有禁止访问的页面,将禁止访问的页面替换为403页面
    return mapTree(finalRoutes, (route) => {
      if (menuHasVisibleWithForbidden(route)) {
        route.component = forbiddenComponent;
      }
      return route;
    });
  }
  
  /**
   * 判断路由是否有权限访问
   * @param route
   * @param access
   */
  function hasAuthority(route: RouteRecordRaw, access: string[]) {
    const authority = route.meta?.authority;
    if (!authority) {
      return true;
    }
    const canAccess = access.some((value) => authority.includes(value));
  
    return canAccess || (!canAccess && menuHasVisibleWithForbidden(route));
  }
  
  /**
   * 判断路由是否在菜单中显示,但是访问会被重定向到403
   * @param route
   */
  function menuHasVisibleWithForbidden(route: RouteRecordRaw) {
    return (
      !!route.meta?.authority &&
      Reflect.has(route.meta || {}, 'menuVisibleWithForbidden') &&
      !!route.meta?.menuVisibleWithForbidden
    );
  }
  
  export { generateRoutesByFrontend, hasAuthority };