refactor: 重构backMenuToVbenMenu

This commit is contained in:
dap 2024-10-20 12:39:00 +08:00
parent 86950953ff
commit 29ec264dcd

View File

@ -19,40 +19,46 @@ import { localMenuList } from './routes/local';
const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue'); const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue');
const NotFoundComponent = () => import('#/views/_core/fallback/not-found.vue'); const NotFoundComponent = () => import('#/views/_core/fallback/not-found.vue');
async function generateAccess(options: GenerateMenuAndRoutesOptions) { /**
const pageMap: ComponentRecordType = import.meta.glob('../views/**/*.vue');
const layoutMap: ComponentRecordType = {
BasicLayout,
IFrameView,
NotFoundComponent,
};
/**
* vben路由 * vben路由
*
* todo
* @param menuList * @param menuList
* @param parentPath * @param parentPath
* @returns vben路由 * @returns vben路由
*/ */
function backMenuToVbenMenu( function backMenuToVbenMenu(
menuList: Menu[], menuList: Menu[],
parentPath = '', parentPath = '',
): RouteRecordStringComponent[] { ): RouteRecordStringComponent[] {
const resultList: RouteRecordStringComponent[] = []; const resultList: RouteRecordStringComponent[] = [];
menuList.forEach((menu) => { menuList.forEach((menu) => {
// 根目录为菜单形式 // 根目录为菜单形式
// 固定有一个children children为当前菜单 // 固定有一个children children为当前菜单
if (menu.path === '/' && menu.children && menu.children.length === 1) { if (menu.path === '/' && menu.children && menu.children.length === 1) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (!menu.children || !menu.children[0]) {
menu.meta = menu.children[0]!.meta; return;
/**
* todo
*/
menu.path = '/root_menu';
menu.component = 'RootMenu';
} }
// 需要处理根目录为内嵌的情况 不会带InnerLink
if (/^https?:\/\//.test(menu.children[0].path)) {
menu.children[0].component = 'InnerLink';
menu.children[0].path = menu.children[0].path
.replaceAll(/^https?:\/\//g, '')
.replaceAll('/#/', '')
.replaceAll('#', '')
.replaceAll(/[?&]/g, '');
}
// 取子路径作为父级路径
const path = menu.children[0].path;
// 取子菜单的meta作为当前菜单的meta
menu.meta = menu.children[0].meta;
// 由于在一级路由 父级路径需要加上/
menu.path = `/${path}`;
menu.component = 'RootMenu';
// 将子路径设置为''
menu.children[0].path = '';
}
// 外链: http开头 & 组件为Layout || ParentView // 外链: http开头 & 组件为Layout || ParentView
// 正则判断是否为http://或者https://开头 // 正则判断是否为http://或者https://开头
if ( if (
@ -61,16 +67,21 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
) { ) {
menu.component = 'Link'; menu.component = 'Link';
} }
// 内嵌iframe 组件为InnerLink // 内嵌iframe 组件为InnerLink
if (menu.meta?.link && menu.component === 'InnerLink') { if (menu.meta?.link && menu.component === 'InnerLink') {
menu.component = 'IFrameView'; menu.component = 'IFrameView';
} }
// path /**
if (parentPath) { * path
* menu.path为''()
*/
if (parentPath && menu.path) {
menu.path = `${parentPath}/${menu.path}`; menu.path = `${parentPath}/${menu.path}`;
} }
// 创建vben路由对象
const vbenRoute: RouteRecordStringComponent = { const vbenRoute: RouteRecordStringComponent = {
component: menu.component, component: menu.component,
meta: { meta: {
@ -99,10 +110,6 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
* *
*/ */
switch (menu.component) { switch (menu.component) {
case 'Layout': {
vbenRoute.component = 'BasicLayout';
break;
}
/** /**
* iframe内嵌 * iframe内嵌
*/ */
@ -117,19 +124,16 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
* aaa.com/?bbb=xxx * aaa.com/?bbb=xxx
* # * #
*/ */
/** vbenRoute.path = vbenRoute.path
* todo // 替换https:// 或者 http://
*/ .replaceAll(/^https?:\/\//g, '')
if (vbenRoute.path.includes('/#/')) { .replaceAll('/#/', '')
vbenRoute.path = vbenRoute.path.replace('/#/', ''); .replaceAll('#', '')
} .replaceAll(/[?&]/g, '');
if (vbenRoute.path.includes('#')) { break;
vbenRoute.path = vbenRoute.path.replace('#', '');
}
if (vbenRoute.path.includes('?') || vbenRoute.path.includes('&')) {
vbenRoute.path = vbenRoute.path.replace('?', '');
vbenRoute.path = vbenRoute.path.replace('&', '');
} }
case 'Layout': {
vbenRoute.component = 'BasicLayout';
break; break;
} }
/** /**
@ -142,6 +146,14 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
vbenRoute.component = 'BasicLayout'; vbenRoute.component = 'BasicLayout';
break; break;
} }
/**
* component为ParentView
* layout BasicLayout
*/
case 'ParentView': {
vbenRoute.component = '';
break;
}
/** /**
* *
*/ */
@ -152,13 +164,6 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
vbenRoute.component = 'BasicLayout'; vbenRoute.component = 'BasicLayout';
break; break;
} }
/**
* layout BasicLayout
*/
case 'ParentView': {
vbenRoute.component = '';
break;
}
/** /**
* system/user/index / * system/user/index /
*/ */
@ -172,11 +177,20 @@ async function generateAccess(options: GenerateMenuAndRoutesOptions) {
if (menu.children && menu.children.length > 0) { if (menu.children && menu.children.length > 0) {
vbenRoute.children = backMenuToVbenMenu(menu.children, menu.path); vbenRoute.children = backMenuToVbenMenu(menu.children, menu.path);
} }
// 添加
resultList.push(vbenRoute); resultList.push(vbenRoute);
}); });
return resultList; return resultList;
} }
async function generateAccess(options: GenerateMenuAndRoutesOptions) {
const pageMap: ComponentRecordType = import.meta.glob('../views/**/*.vue');
const layoutMap: ComponentRecordType = {
BasicLayout,
IFrameView,
NotFoundComponent,
};
return await generateAccessible(preferences.app.accessMode, { return await generateAccessible(preferences.app.accessMode, {
...options, ...options,