You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
7.0 KiB
TypeScript

import { AvatarDropdown, AvatarName, Footer, Question, SelectLang } from '@/components';
2 years ago
import { LinkOutlined } from '@ant-design/icons';
import type { Settings as LayoutSettings } from '@ant-design/pro-components';
import { SettingDrawer } from '@ant-design/pro-components';
import { Link, RunTimeLayoutConfig, getLocale, history, useIntl } from '@umijs/max';
import { RequestConfig } from 'umi';
2 years ago
import defaultSettings from '../config/defaultSettings';
import { errorConfig } from './requestErrorConfig';
const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/user/login';
// @ts-ignore
import { SelectRole } from '@/components/RightContent';
import zhCN from '@/locales/zh-CN';
import { postMenuGetMenu } from '@/services/system/Menu';
import { getUserGetUserInfo } from '@/services/system/User';
import fixMenuItemIcon from '@/utils/FixMenuItemIcon';
import { getAllRouteNameTile } from '@/utils/common';
import { addLocale } from '@@/plugin-locale';
import { MenuDataItem } from '@ant-design/pro-layout';
2 years ago
import cookie from 'react-cookies';
/**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
* */
// 自定义路由路径集合
const isCustomPageTitlePaths : string[]= ['/resource/algorithm-model-detail']
2 years ago
export async function getInitialState(): Promise<{
settings?: Partial<LayoutSettings>;
currentUser?: API.UserView;
loading?: boolean;
fetchUserInfo?: any;
menuData?: MenuDataItem[];
}> {
const fetchUserInfo = async () => {
try {
const msg = await getUserGetUserInfo();
return msg.data.userInfo;
} catch (error) {
history.push(loginPath);
}
return undefined;
};
// 如果不是登录页面,执行
const { location } = history;
if (location.pathname !== loginPath && localStorage.getItem('access')) {
const currentUser = await fetchUserInfo();
const menus = await postMenuGetMenu();
if (getLocale() === 'zh-CN') {
let localData = getAllRouteNameTile(menus.data.routes, '');
let localRes: any = {};
localData.forEach((v) => {
// console.log(v.title,'localData_v')
localRes[`menu${v.name}`] = v.title;
});
console.log(localRes, 'getAllRouteNameTile');
addLocale('zh-CN', localRes, {
momentLocale: 'zh-CN',
antd: zhCN,
2 years ago
});
}
return {
fetchUserInfo,
currentUser,
settings: defaultSettings as Partial<LayoutSettings>,
menuData: menus.data.routes,
};
}
return {
fetchUserInfo,
settings: defaultSettings as Partial<LayoutSettings>,
};
}
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
2 years ago
return {
actionsRender: () => [
<SelectRole key="selectRole" />,
<Question key="doc" />,
<SelectLang key="SelectLang" />,
],
2 years ago
avatarProps: {
src: SERVER_HOST + initialState?.currentUser?.avatarUrl,
title: <AvatarName />,
render: (_, avatarChildren) => {
// console.log(avatarChildren,'')
2 years ago
return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
},
},
pageTitleRender: () => {
console.log(history, 'pageTitleRender');
// TODO 目前使用路由path全匹配后续改成从接口字段读取
let isCustom: boolean = false
for(let i=0; i<isCustomPageTitlePaths.length; i++){
const item = isCustomPageTitlePaths[i]
if(history.location.pathname.includes(item)){
isCustom = true
break;
} else {
isCustom = false
}
}
return isCustom ? ("") : (undefined)
// 默认不进行重定义 使用null即可
},
2 years ago
waterMarkProps: {
// content: initialState?.currentUser?.name,
},
menu: {
loading: initialState?.loading || false,
locale: true,
params: {
userId: initialState?.currentUser?.id,
},
request: async () => {
// console.log(initialState?.menuData,'initialState_menuData')
return initialState?.menuData || [];
},
2 years ago
},
footerRender: () => <Footer />,
onPageChange: () => {
const { location } = history;
// 如果没有登录,重定向到 login
if (!initialState?.currentUser && location.pathname !== loginPath) {
history.push(loginPath);
}
},
menuDataRender: () => {
if (initialState?.menuData !== undefined) {
return fixMenuItemIcon(initialState?.menuData || []);
2 years ago
}
},
layoutBgImgList: [
{
src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
left: 85,
bottom: 100,
height: '303px',
},
{
src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
bottom: -68,
right: -45,
height: '303px',
},
{
src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
bottom: 0,
left: 0,
width: '331px',
},
],
links: isDev
? [
<Link key="openapi" to="/umi/plugin/openapi" target="_blank">
<LinkOutlined />
<span>OpenAPI </span>
</Link>,
]
: [],
menuHeaderRender: undefined,
// 自定义 403 页面
// unAccessible: <div>unAccessible</div>,
// 增加一个 loading 的状态
childrenRender: (children) => {
// if (initialState?.loading) return <PageLoading />;
return (
<>
{children}
{isDev && (
<SettingDrawer
disableUrlParams
enableDarkTheme
settings={initialState?.settings}
onSettingChange={(settings) => {
setInitialState((preInitialState) => ({
...preInitialState,
settings,
}));
}}
/>
)}
</>
);
},
...initialState?.settings,
};
};
const csrfAndJwtHeaderInterceptor = (url: string, options: RequestConfig) => {
const csrfHeader = { 'X-CSRFToken': cookie.load('csrftoken') };
let bearerToken = {};
const access = localStorage.getItem('access');
2 years ago
if (access) {
bearerToken = { 'X-Token': `${access}` };
2 years ago
}
let locale = getLocale();
2 years ago
return {
url: `${url}`,
options: {
...options,
interceptors: true,
headers: { ...csrfHeader, ...bearerToken, 'Accept-Language': locale },
},
2 years ago
};
};
const responseHeaderInterceptor = (response: Response) => {
if ('new-token' in response.headers) {
localStorage.setItem('access', (response.headers['new-token'] || '') as string);
window.location.reload();
}
return response;
};
/**
* @name request
* axios ahooks useRequest
* @doc https://umijs.org/docs/max/request#配置
*/
export const request = {
...errorConfig,
requestInterceptors: [csrfAndJwtHeaderInterceptor],
responseInterceptors: [responseHeaderInterceptor],
};