Industrial-image-management.../src/utils/menuConverter.ts

108 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 菜单数据转换工具将API返回的菜单数据转换为前端使用的格式
*/
// API返回的菜单项类型
export interface ApiMenuItem {
menuId: string;
parentId: string;
menuName: string;
menuType: string; // 'catalog' | 'route'
orderNum: number;
visible: string;
children?: ApiMenuItem[];
[key: string]: any; // 其他可能的字段
}
// 前端需要的菜单项类型
export interface FrontendMenuItem {
id: number | string;
parentId: number | string;
title: string;
type: number; // 1表示目录2表示菜单
path: string;
name: string;
component: string;
icon: string;
isExternal: boolean;
isCache: boolean;
isHidden: boolean;
sort: number;
children?: FrontendMenuItem[];
}
/**
* 转换菜单类型: catalog -> 1, route -> 2
*/
const convertMenuType = (menuType: string): number => {
switch (menuType.toLowerCase()) {
case 'catalog':
return 1;
case 'route':
return 2;
case 'button':
return 3;
default:
// 默认为菜单类型
return 2;
}
}
/**
* 是否隐藏: '0' -> false, '1' -> true
*/
const convertVisible = (visible: string): boolean => {
return visible === '1'; // '1'为隐藏,'0'为显示
}
/**
* 转换单个菜单项
*/
const convertMenuItem = (apiItem: ApiMenuItem): FrontendMenuItem => {
// 根据menuType生成默认的path和component
let path = '';
let component = '';
let name = '';
// 简单的名称生成,去掉空格,保持首字母大写,非首字母小写
const generateName = (menuName: string): string => {
return menuName.replace(/\s+/g, '')
.replace(/^./, (match) => match.toUpperCase())
.replace(/[\u4e00-\u9fa5]/g, ''); // 移除中文字符
};
if (apiItem.menuType.toLowerCase() === 'catalog') {
path = `/${apiItem.menuName.toLowerCase().replace(/\s+/g, '-')}`;
component = 'Layout';
name = generateName(apiItem.menuName);
} else {
// 假设route类型菜单都在某个catalog下
const parentName = apiItem.menuName.toLowerCase().replace(/\s+/g, '-');
path = `/system/${parentName}`;
component = `system/${parentName}/index`;
name = `System${generateName(apiItem.menuName)}`;
}
return {
id: apiItem.menuId,
parentId: apiItem.parentId,
title: apiItem.menuName,
type: convertMenuType(apiItem.menuType),
path: path,
name: name,
component: component,
icon: 'settings', // 默认图标
isExternal: false,
isCache: false,
isHidden: convertVisible(apiItem.visible),
sort: apiItem.orderNum || 0,
children: apiItem.children ? apiItem.children.map(child => convertMenuItem(child)) : []
};
}
/**
* 转换API返回的菜单数据为前端需要的格式
*/
export const convertMenuData = (apiMenuData: ApiMenuItem[]): FrontendMenuItem[] => {
return apiMenuData.map(item => convertMenuItem(item));
}