mirror of
https://github.com/m-xlsea/ruoyi-plus-soybean.git
synced 2025-09-24 07:49:47 +08:00
71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import type { RouteRecordRaw } from 'vue-router';
|
|
import type { GlobalMenuOption } from '@/interface';
|
|
import { iconifyRender } from '../common';
|
|
|
|
/** 判断路由是否作为菜单 */
|
|
function asMenu(route: RouteRecordRaw) {
|
|
return !route.meta?.notAsMenu;
|
|
}
|
|
|
|
/** 给菜单添加可选属性 */
|
|
function addPartialProps(menuItem: GlobalMenuOption, icon?: string, children?: GlobalMenuOption[]) {
|
|
const item = { ...menuItem };
|
|
if (icon) {
|
|
Object.assign(item, { icon: iconifyRender(icon) });
|
|
}
|
|
if (children) {
|
|
Object.assign(item, { children });
|
|
}
|
|
return item;
|
|
}
|
|
|
|
/** 将路由转换成菜单 */
|
|
export function transformRouteToMenu(routes: RouteRecordRaw[]) {
|
|
const globalMenu: GlobalMenuOption[] = [];
|
|
routes.forEach(route => {
|
|
const { name, path, meta } = route;
|
|
const routeName = name as string;
|
|
let menuChildren: GlobalMenuOption[] | undefined;
|
|
if (route.children) {
|
|
menuChildren = transformRouteToMenu(route.children as RouteRecordRaw[]);
|
|
}
|
|
const menuItem: GlobalMenuOption = addPartialProps(
|
|
{
|
|
key: routeName,
|
|
label: meta?.title ?? routeName,
|
|
routeName,
|
|
routePath: path
|
|
},
|
|
meta?.icon,
|
|
menuChildren
|
|
);
|
|
if (asMenu(route)) {
|
|
globalMenu.push(menuItem);
|
|
} else if (menuChildren) {
|
|
globalMenu.push(...menuChildren);
|
|
}
|
|
});
|
|
return globalMenu;
|
|
}
|
|
|
|
/** 将路由转换成菜单列表 */
|
|
export function transformRouteToList(routes: RouteRecordRaw[], treeMap: RouteRecordRaw[] = []) {
|
|
if (routes && routes.length === 0) return [];
|
|
return routes.reduce((acc, cur) => {
|
|
if (!cur.meta?.notAsMenu) {
|
|
acc.push(cur);
|
|
}
|
|
if (cur.children && cur.children.length > 0) {
|
|
transformRouteToList(cur.children, treeMap);
|
|
}
|
|
return acc;
|
|
}, treeMap);
|
|
}
|
|
|
|
/** 判断路由是否为Url链接 */
|
|
export function isUrl(path: string): boolean {
|
|
const reg =
|
|
/(((^https?:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
|
|
return reg.test(path);
|
|
}
|