liu
7 天以前 70b7935fc261cd5e8eaaf1cfbc8078b04db576d2
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import type {
  AppRouteRecordRaw,
  ComponentRecordType,
  GenerateMenuAndRoutesOptions,
} from '@vben/types';
 
import { generateAccessible } from '@vben/access';
import { preferences } from '@vben/preferences';
import { useAccessStore } from '@vben/stores';
import { convertServerMenuToRouteRecordStringComponent } from '@vben/utils';
 
import { BasicLayout, IFrameView } from '#/layouts';
import { isAiFeatureEnabled } from '#/utils/features';
 
const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue');
 
function isAiRoute(route: AppRouteRecordRaw) {
  const path = String(route.path || '').toLowerCase();
  const component = String(route.component || '').toLowerCase();
  return (
    path === '/ai' ||
    path.startsWith('/ai/') ||
    component.startsWith('ai/') ||
    component.includes('/views/ai/')
  );
}
 
function filterDisabledAiRoutes(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] {
  if (isAiFeatureEnabled) {
    return routes;
  }
  return routes
    .filter((route) => !isAiRoute(route))
    .map((route) => ({
      ...route,
      children: route.children
        ? filterDisabledAiRoutes(route.children as AppRouteRecordRaw[])
        : route.children,
    }));
}
 
async function generateAccess(options: GenerateMenuAndRoutesOptions) {
  // 轻量版后端不包含 AI 模块,构建阶段即排除 AI 页面,避免生成不可访问的 AI 分包。
  const pageMap: ComponentRecordType = import.meta.glob([
    '../views/**/*.vue',
    '!../views/ai/**/*.vue',
    '!../views/dashboard/analytics/modules/ai-insights.vue',
    '!../views/mes/**/modules/ai/**/*.vue',
    '!../views/mes/qc/components/ai-*.vue',
    '!../views/crm/saleQuotation/modules/ocr-upload.vue',
  ]);
  const accessStore = useAccessStore();
 
  const layoutMap: ComponentRecordType = {
    BasicLayout,
    IFrameView,
  };
 
  return await generateAccessible(preferences.app.accessMode, {
    ...options,
    fetchMenuListAsync: async () => {
      // 由于 yudao 通过 accessStore 读取,所以不在进行 message.loading 提示
      // 补充说明:accessStore.accessMenus 一开始是 AppRouteRecordRaw 类型(后端加载),后面被赋值成 MenuRecordRaw 类型(前端转换)
      const accessMenus = filterDisabledAiRoutes(
        accessStore.accessMenus as AppRouteRecordRaw[],
      );
      return convertServerMenuToRouteRecordStringComponent(accessMenus);
    },
    // 可以指定没有权限跳转403页面
    forbiddenComponent,
    // 如果 route.meta.menuVisibleWithForbidden = true
    layoutMap,
    pageMap,
  });
}
 
export { generateAccess };