160 lines
4.1 KiB
TypeScript
160 lines
4.1 KiB
TypeScript
|
|
import { createIcon } from '@/utils/IconUtil';
|
||
|
|
import { MenuDataItem } from '@ant-design/pro-components';
|
||
|
|
import { request } from '@umijs/max';
|
||
|
|
import React, { lazy } from 'react';
|
||
|
|
|
||
|
|
|
||
|
|
let remoteMenu: any = null;
|
||
|
|
|
||
|
|
export function getRemoteMenu() {
|
||
|
|
return remoteMenu;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function setRemoteMenu(data: any) {
|
||
|
|
remoteMenu = data;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function patchRouteItems(route: any, menu: any, parentPath: string) {
|
||
|
|
for (const menuItem of menu) {
|
||
|
|
if (menuItem.component === 'Layout' || menuItem.component === 'ParentView') {
|
||
|
|
if (menuItem.routes) {
|
||
|
|
let hasItem = false;
|
||
|
|
let newItem = null;
|
||
|
|
for (const routeChild of route.routes) {
|
||
|
|
if (routeChild.path === menuItem.path) {
|
||
|
|
hasItem = true;
|
||
|
|
newItem = routeChild;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (!hasItem) {
|
||
|
|
newItem = {
|
||
|
|
path: menuItem.path,
|
||
|
|
routes: [],
|
||
|
|
children: []
|
||
|
|
}
|
||
|
|
route.routes.push(newItem)
|
||
|
|
}
|
||
|
|
patchRouteItems(newItem, menuItem.routes, parentPath + menuItem.path + '/');
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
const names: string[] = menuItem.component.split('/');
|
||
|
|
let path = '';
|
||
|
|
names.forEach(name => {
|
||
|
|
if (path.length > 0) {
|
||
|
|
path += '/';
|
||
|
|
}
|
||
|
|
if (name !== 'index') {
|
||
|
|
path += name.at(0)?.toUpperCase() + name.substr(1);
|
||
|
|
} else {
|
||
|
|
path += name;
|
||
|
|
}
|
||
|
|
})
|
||
|
|
if (!path.endsWith('.tsx')) {
|
||
|
|
path += '.tsx'
|
||
|
|
}
|
||
|
|
if (route.routes === undefined) {
|
||
|
|
route.routes = [];
|
||
|
|
}
|
||
|
|
if (route.children === undefined) {
|
||
|
|
route.children = [];
|
||
|
|
}
|
||
|
|
const newRoute = {
|
||
|
|
element: React.createElement(lazy(() => import('@/pages/' + path))),
|
||
|
|
path: parentPath + menuItem.path,
|
||
|
|
}
|
||
|
|
route.children.push(newRoute);
|
||
|
|
route.routes.push(newRoute);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function patchRouteWithRemoteMenus(routes: any) {
|
||
|
|
if (remoteMenu === null) { return; }
|
||
|
|
let proLayout = null;
|
||
|
|
for (const routeItem of routes) {
|
||
|
|
if (routeItem.id === 'ant-design-pro-layout') {
|
||
|
|
proLayout = routeItem;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
patchRouteItems(proLayout, remoteMenu, '');
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 获取当前的用户 GET /api/getUserInfo */
|
||
|
|
export async function getUserInfo(options?: Record<string, any>) {
|
||
|
|
return request<API.UserInfoResult>('/api/getInfo', {
|
||
|
|
method: 'GET',
|
||
|
|
...(options || {}),
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 刷新方法
|
||
|
|
export async function refreshToken() {
|
||
|
|
return request('/api/auth/refresh', {
|
||
|
|
method: 'post'
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function getRouters(): Promise<any> {
|
||
|
|
return request('/api/getRouters');
|
||
|
|
}
|
||
|
|
|
||
|
|
export function convertCompatRouters(childrens: API.RoutersMenuItem[]): any[] {
|
||
|
|
return childrens.map((item: API.RoutersMenuItem) => {
|
||
|
|
return {
|
||
|
|
path: item.path,
|
||
|
|
icon: createIcon(item.meta.icon),
|
||
|
|
// icon: item.meta.icon,
|
||
|
|
name: item.meta.title,
|
||
|
|
routes: item.children ? convertCompatRouters(item.children) : undefined,
|
||
|
|
hideChildrenInMenu: item.hidden,
|
||
|
|
hideInMenu: item.hidden,
|
||
|
|
component: item.component,
|
||
|
|
authority: item.perms,
|
||
|
|
};
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function getRoutersInfo(): Promise<MenuDataItem[]> {
|
||
|
|
return getRouters().then((res) => {
|
||
|
|
if (res.code === 200) {
|
||
|
|
return convertCompatRouters(res.data);
|
||
|
|
} else {
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getMatchMenuItem(
|
||
|
|
path: string,
|
||
|
|
menuData: MenuDataItem[] | undefined,
|
||
|
|
): MenuDataItem[] {
|
||
|
|
if (!menuData) return [];
|
||
|
|
let items: MenuDataItem[] = [];
|
||
|
|
menuData.forEach((item) => {
|
||
|
|
if (item.path) {
|
||
|
|
if (item.path === path) {
|
||
|
|
items.push(item);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (path.length >= item.path?.length) {
|
||
|
|
const exp = `${item.path}/*`;
|
||
|
|
if (path.match(exp)) {
|
||
|
|
if (item.routes) {
|
||
|
|
const subpath = path.substr(item.path.length + 1);
|
||
|
|
const subItem: MenuDataItem[] = getMatchMenuItem(subpath, item.routes);
|
||
|
|
items = items.concat(subItem);
|
||
|
|
} else {
|
||
|
|
const paths = path.split('/');
|
||
|
|
if (paths.length >= 2 && paths[0] === item.path && paths[1] === 'index') {
|
||
|
|
items.push(item);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
return items;
|
||
|
|
}
|