import Footer from '@/components/Footer';
import RightContent from '@/components/RightContent';
import type { Settings as LayoutSettings } from '@ant-design/pro-components';
import { PageLoading, SettingDrawer } from '@ant-design/pro-components';
import type { RunTimeLayoutConfig } from 'umi';
import { history } from 'umi';
import defaultSettings from '../config/defaultSettings';
import { currentUser as queryCurrentUser } from './services/ant-design-pro/api';
import { message } from 'antd';
import { queryMenu } from '@/services/menu';
import Icon from '@ant-design/icons';
import * as icons from '@ant-design/icons';
const loginPath = '/user/login';
/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
loading: ,
};
/**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
* */
export async function getInitialState(): Promise<{
settings?: Partial;
currentUser?: API.CurrentUser;
loading?: boolean;
fetchUserInfo?: () => Promise;
}> {
const fetchUserInfo = async () => {
try {
const msg: any = await queryCurrentUser(localStorage.getItem('token'));
return {
name: msg.data.user_name,
};
} catch (error) {
history.push(loginPath);
}
return undefined;
};
// 如果不是登录页面,执行
if (history.location.pathname !== loginPath) {
const currentUser = await fetchUserInfo();
return {
fetchUserInfo,
currentUser,
settings: defaultSettings,
};
}
return {
fetchUserInfo,
settings: defaultSettings,
};
}
/**
* 映射菜单对应的图标
* */
const loopMenuItem: any = (menus: any[]) =>
menus.map(({ icon, routes, ...item }) => ({
...item,
icon: icon && ,
routes: routes && loopMenuItem(routes),
}));
const permissionsMenu = (routers: any[], data: any) => {
data.forEach((item: any) => {
let menu: any;
if (item.children && item.children.length > 0) {
// 还有下级
menu = {
path: item.router,
routes: [],
name: item.name,
icon: item.icon,
};
} else {
// 最后一级
menu = {
path: item.router,
name: item.name,
icon: item.icon,
};
}
if (item.children) {
permissionsMenu(menu.routes, item.children);
}
routers.push(menu);
});
};
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
return {
rightContentRender: () => ,
disableContentMargin: false,
waterMarkProps: {
content: initialState?.currentUser?.name,
},
footerRender: () => ,
onPageChange: () => {
const { location } = history;
if (location.pathname === '/DataBoard') {
return;
}
// // 如果没有登录,重定向到 login
// if (!initialState?.currentUser?.name && location.pathname !== loginPath) {
// history.push(loginPath);
// }
},
menu: {
locale: false,
params: initialState?.currentUser,
request: async () => {
const menuData = await queryMenu({ q: 'tree', query_all: 1 });
const routers: any[] = [];
permissionsMenu(routers, menuData.data.list);
return loopMenuItem(routers);
},
},
menuHeaderRender: undefined,
// 自定义 403 页面
// unAccessible: unAccessible
,
// 增加一个 loading 的状态
childrenRender: (children: any, props: { location: { pathname: string | string[] } }) => {
// if (initialState?.loading) return ;
return (
<>
{children}
{!props.location?.pathname?.includes('/login') && (
{
setInitialState((preInitialState: any) => ({
...preInitialState,
settings,
}));
}}
/>
)}
>
);
},
...initialState?.settings,
};
};
const addToken = async (url: any, options: any) => {
// 此处为拦截器,每次发送请求之前判断能否取到token
if (localStorage.getItem('token')) {
const headers = {
Authorization: `${localStorage.getItem('token')}`,
};
return {
url,
options: { ...options, headers },
};
}
return false;
};
const MainResponseInterceptors = (response: { status: number }) => {
if (response.status === 401) {
message.warn('帐号登录过期,请重新登录');
history.push(loginPath);
}
return response;
};
export const request = {
errorConfig: {
adaptor: (resData: any) => {
return {
showType: resData.code ? 2 : 0,
errorMessage: resData.message,
};
},
},
requestInterceptors: [addToken],
responseInterceptors: [MainResponseInterceptors],
};