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; } // 根据后台配置的菜单路径获取本地路由 const getLocalRoute = (route: any, menuItem: any) => { for (const routeChild of route.routes) { if (routeChild.path === menuItem.path) { return routeChild; } } return null; }; function patchRouteItems(route: any, menu: any, parentPath: string) { for (const menuItem of menu) { if (menuItem.component === 'Layout' || menuItem.component === 'ParentView') { if (menuItem.routes) { let newItem = getLocalRoute(route, menuItem); if (!newItem) { newItem = { path: menuItem.path, routes: [], }; route.children = route.routes; route.routes.push(newItem); } patchRouteItems(newItem, menuItem.routes, parentPath + menuItem.path + '/'); } } else { if (getLocalRoute(route, menuItem)) { continue; } 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.substring(1); } else { path += name; } }); if (!path.endsWith('.tsx')) { path += '.tsx'; } if (route.routes === undefined) { route.routes = []; route.children = route.routes; } const newRoute = { element: React.createElement(lazy(() => import('@/pages/' + path))), path: parentPath + menuItem.path, }; 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) { return request('/api/system/user/getInfo', { method: 'GET', ...(options || {}), }); } // 刷新方法 export async function refreshToken() { return request('/api/auth/refresh', { method: 'post', }); } export function convertCompatRouters(childrens: API.RoutersMenuItem[]): any[] { return childrens.map((item: API.RoutersMenuItem) => { return { path: item.path, icon: item.meta?.icon ? 'icon-' + item.meta.icon : undefined, 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 { return request('/api/system/menu/getRouters').then((res: any) => { 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') { // console.log(item); items.push(item); } } } } } }); return items; }