Commit 9b61e82d7423d3d55c7cea34cc554495098bf1b9

Authored by vben
1 parent dc42d434

refactor: route Module structural transformation

@@ -7,6 +7,5 @@ VITE_GLOB_APP_TITLE = Vben Admin @@ -7,6 +7,5 @@ VITE_GLOB_APP_TITLE = Vben Admin
7 # spa shortname 7 # spa shortname
8 VITE_GLOB_APP_SHORT_NAME = vue_vben_admin_2x 8 VITE_GLOB_APP_SHORT_NAME = vue_vben_admin_2x
9 9
10 -# Menu generation mode BACK|ROLE  
11 -# Need to delete LocalStorage after modification  
12 -VITE_GEN_MENU_MODE=ROLE 10 +# Whether to dynamically load all files in `src/views`
  11 +VITE_DYNAMIC_IMPORT = true
CHANGELOG.zh_CN.md
@@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
11 ### ✨ Refactor 11 ### ✨ Refactor
12 12
13 - 重构由后台生成菜单的逻辑 13 - 重构由后台生成菜单的逻辑
  14 +- Route Module 结构改造
14 15
15 ### ⚡ Performance Improvements 16 ### ⚡ Performance Improvements
16 17
build/vite/plugin/dynamicImport/index.ts
@@ -20,10 +20,11 @@ const dynamicImportTransform = function (env: any = {}): Transform { @@ -20,10 +20,11 @@ const dynamicImportTransform = function (env: any = {}): Transform {
20 return path.includes('/src/utils/helper/dynamicImport.ts'); 20 return path.includes('/src/utils/helper/dynamicImport.ts');
21 }, 21 },
22 transform({ code }) { 22 transform({ code }) {
23 - const { VITE_GEN_MENU_MODE = '' } = env;  
24 - if (VITE_GEN_MENU_MODE !== 'BACK') { 23 + const { VITE_DYNAMIC_IMPORT } = env;
  24 + if (!VITE_DYNAMIC_IMPORT) {
25 return code; 25 return code;
26 } 26 }
  27 +
27 // if (!isBuild) return code; 28 // if (!isBuild) return code;
28 // Only convert the dir 29 // Only convert the dir
29 try { 30 try {
mock/sys/menu.ts
@@ -2,17 +2,15 @@ import { resultSuccess } from '../_util'; @@ -2,17 +2,15 @@ import { resultSuccess } from '../_util';
2 import { MockMethod } from 'vite-plugin-mock'; 2 import { MockMethod } from 'vite-plugin-mock';
3 3
4 const dashboardRoute = { 4 const dashboardRoute = {
5 - layout: {  
6 - path: '/dashboard',  
7 - name: 'Dashboard',  
8 - component: 'PAGE_LAYOUT',  
9 - redirect: '/dashboard/welcome',  
10 - meta: {  
11 - icon: 'ant-design:home-outlined',  
12 - title: 'Dashboard',  
13 - }, 5 + path: '/dashboard',
  6 + name: 'Dashboard',
  7 + component: 'PAGE_LAYOUT',
  8 + redirect: '/dashboard/welcome',
  9 + meta: {
  10 + icon: 'ant-design:home-outlined',
  11 + title: 'Dashboard',
14 }, 12 },
15 - routes: [ 13 + children: [
16 { 14 {
17 path: '/welcome', 15 path: '/welcome',
18 name: 'Welcome', 16 name: 'Welcome',
@@ -86,33 +84,27 @@ const backRoute = { @@ -86,33 +84,27 @@ const backRoute = {
86 ], 84 ],
87 }; 85 };
88 const authRoute = { 86 const authRoute = {
89 - layout: {  
90 - path: '/permission',  
91 - name: 'Permission',  
92 - component: 'PAGE_LAYOUT',  
93 - redirect: '/permission/front/page',  
94 - meta: {  
95 - icon: 'ant-design:home-outlined',  
96 - title: '权限管理',  
97 - }, 87 + path: '/permission',
  88 + name: 'Permission',
  89 + component: 'PAGE_LAYOUT',
  90 + redirect: '/permission/front/page',
  91 + meta: {
  92 + icon: 'ant-design:home-outlined',
  93 + title: '权限管理',
98 }, 94 },
99 -  
100 - routes: [frontRoute, backRoute], 95 + children: [frontRoute, backRoute],
101 }; 96 };
102 97
103 const authRoute1 = { 98 const authRoute1 = {
104 - layout: {  
105 - path: '/permission',  
106 - name: 'Permission',  
107 - component: 'PAGE_LAYOUT',  
108 - redirect: '/permission/front/page',  
109 - meta: {  
110 - icon: 'ant-design:home-outlined',  
111 - title: '权限管理',  
112 - }, 99 + path: '/permission',
  100 + name: 'Permission',
  101 + component: 'PAGE_LAYOUT',
  102 + redirect: '/permission/front/page',
  103 + meta: {
  104 + icon: 'ant-design:home-outlined',
  105 + title: '权限管理',
113 }, 106 },
114 -  
115 - routes: [backRoute], 107 + children: [backRoute],
116 }; 108 };
117 export default [ 109 export default [
118 { 110 {
src/router/types.d.ts
@@ -68,5 +68,7 @@ export interface MenuModule { @@ -68,5 +68,7 @@ export interface MenuModule {
68 68
69 export interface AppRouteModule { 69 export interface AppRouteModule {
70 layout?: AppRouteRecordRaw; 70 layout?: AppRouteRecordRaw;
71 - routes: AppRouteRecordRaw[]; 71 + routes?: AppRouteRecordRaw[];
  72 + children?: AppRouteRecordRaw[];
  73 + component?: any;
72 } 74 }
src/settings/projectSetting.ts
1 import type { ProjectConfig } from '/@/types/config'; 1 import type { ProjectConfig } from '/@/types/config';
2 2
3 import { MenuTypeEnum, MenuThemeEnum, MenuModeEnum, TriggerEnum } from '/@/enums/menuEnum'; 3 import { MenuTypeEnum, MenuThemeEnum, MenuModeEnum, TriggerEnum } from '/@/enums/menuEnum';
4 -import { ContentEnum, RouterTransitionEnum } from '/@/enums/appEnum'; 4 +import { ContentEnum, PermissionModeEnum, RouterTransitionEnum } from '/@/enums/appEnum';
5 import { primaryColor } from '../../build/config/lessModifyVars'; 5 import { primaryColor } from '../../build/config/lessModifyVars';
6 -import { isProdMode, getRoleMode } from '/@/utils/env'; 6 +import { isProdMode } from '/@/utils/env';
7 7
8 // ! You need to clear the browser cache after the change 8 // ! You need to clear the browser cache after the change
9 const setting: ProjectConfig = { 9 const setting: ProjectConfig = {
10 // Whether to show the configuration button 10 // Whether to show the configuration button
11 showSettingButton: true, 11 showSettingButton: true,
12 // 权限模式 12 // 权限模式
13 - permissionMode: getRoleMode(), 13 + permissionMode: PermissionModeEnum.ROLE,
14 // 网站灰色模式,用于可能悼念的日期开启 14 // 网站灰色模式,用于可能悼念的日期开启
15 grayMode: false, 15 grayMode: false,
16 // 色弱模式 16 // 色弱模式
src/utils/env.ts
1 -import { PermissionModeEnum } from '../enums/appEnum';  
2 import type { GlobEnvConfig } from '/@/types/config'; 1 import type { GlobEnvConfig } from '/@/types/config';
3 2
4 export const getGlobEnvConfig = (): GlobEnvConfig => { 3 export const getGlobEnvConfig = (): GlobEnvConfig => {
@@ -47,14 +46,3 @@ export const isProdMode = (): boolean => import.meta.env.PROD; @@ -47,14 +46,3 @@ export const isProdMode = (): boolean => import.meta.env.PROD;
47 * @example: 46 * @example:
48 */ 47 */
49 export const isUseMock = (): boolean => import.meta.env.VITE_USE_MOCK === 'true'; 48 export const isUseMock = (): boolean => import.meta.env.VITE_USE_MOCK === 'true';
50 -  
51 -/**  
52 - * @description: 获取菜单生成方式  
53 - * @param {type}  
54 - * @returns:  
55 - * @example:  
56 - */  
57 -export const getRoleMode = (): PermissionModeEnum =>  
58 - import.meta.env.VITE_GEN_MENU_MODE === PermissionModeEnum.ROLE  
59 - ? PermissionModeEnum.ROLE  
60 - : PermissionModeEnum.BACK;  
src/utils/helper/menuHelper.ts
@@ -48,12 +48,12 @@ export function transformRouteToMenu(routeModList: AppRouteModule[]) { @@ -48,12 +48,12 @@ export function transformRouteToMenu(routeModList: AppRouteModule[]) {
48 const cloneRouteModList = cloneDeep(routeModList); 48 const cloneRouteModList = cloneDeep(routeModList);
49 const routeList: AppRouteRecordRaw[] = []; 49 const routeList: AppRouteRecordRaw[] = [];
50 cloneRouteModList.forEach((item) => { 50 cloneRouteModList.forEach((item) => {
51 - const { layout, routes } = item; 51 + const { layout, routes, children } = item;
52 if (layout) { 52 if (layout) {
53 - layout.children = routes; 53 + layout.children = routes || children;
54 routeList.push(layout); 54 routeList.push(layout);
55 } else { 55 } else {
56 - routeList.push(...routes); 56 + routes && routeList.push(...routes);
57 } 57 }
58 }); 58 });
59 return treeMap(routeList, { 59 return treeMap(routeList, {
src/utils/helper/routeHelper.ts
@@ -8,6 +8,7 @@ import { toRaw } from 'vue'; @@ -8,6 +8,7 @@ import { toRaw } from 'vue';
8 import { PAGE_LAYOUT_COMPONENT } from '/@/router/constant'; 8 import { PAGE_LAYOUT_COMPONENT } from '/@/router/constant';
9 // import { isDevMode } from '/@/utils/env'; 9 // import { isDevMode } from '/@/utils/env';
10 import dynamicImport from './dynamicImport'; 10 import dynamicImport from './dynamicImport';
  11 +import { omit } from 'lodash-es';
11 12
12 let currentTo: RouteLocationNormalized | null = null; 13 let currentTo: RouteLocationNormalized | null = null;
13 14
@@ -23,8 +24,16 @@ export function setCurrentTo(to: RouteLocationNormalized) { @@ -23,8 +24,16 @@ export function setCurrentTo(to: RouteLocationNormalized) {
23 export function genRouteModule(moduleList: AppRouteModule[]) { 24 export function genRouteModule(moduleList: AppRouteModule[]) {
24 const ret: AppRouteRecordRaw[] = []; 25 const ret: AppRouteRecordRaw[] = [];
25 for (const routeMod of moduleList) { 26 for (const routeMod of moduleList) {
26 - const routes = routeMod.routes as any;  
27 - const layout = routeMod.layout; 27 + let routes = [];
  28 + let layout: AppRouteRecordRaw | undefined;
  29 + if (Reflect.has(routeMod, 'routes')) {
  30 + routes = routeMod.routes as any;
  31 + layout = routeMod.layout;
  32 + } else if (Reflect.has(routeMod, 'path')) {
  33 + layout = omit(routeMod, 'children') as any;
  34 + routes = routeMod.children || [];
  35 + }
  36 +
28 const router = createRouter({ routes, history: createWebHashHistory() }); 37 const router = createRouter({ routes, history: createWebHashHistory() });
29 38
30 const flatList = (toRaw(router.getRoutes()).filter( 39 const flatList = (toRaw(router.getRoutes()).filter(
@@ -45,7 +54,8 @@ export function genRouteModule(moduleList: AppRouteModule[]) { @@ -45,7 +54,8 @@ export function genRouteModule(moduleList: AppRouteModule[]) {
45 54
46 // 动态引入 55 // 动态引入
47 // TODO 错误写法 56 // TODO 错误写法
48 -function asyncImportRoute(routes: AppRouteRecordRaw[]) { 57 +function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) {
  58 + if (!routes) return;
49 routes.forEach((item) => { 59 routes.forEach((item) => {
50 const { component } = item; 60 const { component } = item;
51 const { children } = item; 61 const { children } = item;
@@ -60,10 +70,14 @@ function asyncImportRoute(routes: AppRouteRecordRaw[]) { @@ -60,10 +70,14 @@ function asyncImportRoute(routes: AppRouteRecordRaw[]) {
60 // 将后台对象转成路由对象 70 // 将后台对象转成路由对象
61 export function transformObjToRoute(routeList: AppRouteModule[]) { 71 export function transformObjToRoute(routeList: AppRouteModule[]) {
62 routeList.forEach((route) => { 72 routeList.forEach((route) => {
63 - asyncImportRoute(route.routes); 73 + asyncImportRoute(Reflect.has(route, 'routes') ? route.routes : route.children || []);
64 if (route.layout) { 74 if (route.layout) {
65 route.layout.component = 75 route.layout.component =
66 route.layout.component === 'PAGE_LAYOUT' ? PAGE_LAYOUT_COMPONENT : ''; 76 route.layout.component === 'PAGE_LAYOUT' ? PAGE_LAYOUT_COMPONENT : '';
  77 + } else {
  78 + route.component = route.component === 'PAGE_LAYOUT' ? PAGE_LAYOUT_COMPONENT : '';
  79 + const _layout = omit(route, 'children') as any;
  80 + route.layout = _layout;
67 } 81 }
68 }); 82 });
69 return routeList; 83 return routeList;