hts/admin-v5/src/app.tsx

239 lines
6.8 KiB
TypeScript

import { Settings as LayoutSettings, MenuDataItem } from '@ant-design/pro-layout';
import { SettingDrawer } from '@ant-design/pro-layout';
import { PageLoading } from '@ant-design/pro-layout';
import { RunTimeLayoutConfig } from 'umi';
import { history } from 'umi';
import RightContent from '@/components/RightContent';
import { currentUser as queryCurrentUser } from './services/ant-design-pro/api';
import defaultSettings from '../config/defaultSettings';
import { tree } from "@/utils/utils";
import {
SmileOutlined,
HeartOutlined,
SettingOutlined,
DeleteOutlined,
FrownOutlined,
GiftOutlined,
DollarCircleOutlined,
AlertOutlined,
DatabaseOutlined,
BulbOutlined,
FileAddOutlined,
TagsOutlined,
UserOutlined,
KeyOutlined,
UsergroupDeleteOutlined,
} from '@ant-design/icons';
import { RequestConfig, } from "@@/plugin-request/request";
import { RequestInterceptor, RequestOptionsInit } from 'umi-request';
import { notification } from "antd";
import menuTree from './menuTree';
const IconMap = {
SmileOutlined: <SmileOutlined />,
DatabaseOutlined: <DatabaseOutlined />,
BulbOutlined: <BulbOutlined />,
FileAddOutlined: <FileAddOutlined />,
TagsOutlined: <TagsOutlined />,
UserOutlined: <UserOutlined />,
KeyOutlined: <KeyOutlined />,
UsergroupDeleteOutlined: <UsergroupDeleteOutlined />,
HeartOutlined: <HeartOutlined />,
SettingOutlined: <SettingOutlined />,
DeleteOutlined: <DeleteOutlined />,
FrownOutlined: <FrownOutlined />,
GiftOutlined: <GiftOutlined />,
DollarCircleOutlined: <DollarCircleOutlined />,
AlertOutlined: <AlertOutlined />,
};
const loginPath = '/user/login';
/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
loading: <PageLoading />,
};
/**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
* */
export async function getInitialState(): Promise<{
settings?: Partial<LayoutSettings>;
currentUser?: API.CurrentUser;
loading?: boolean;
fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
const fetchUserInfo = async () => {
try {
// const msg = await queryCurrentUser();
const msg = {
"code": "000000",
"message": "获取个人信息成功",
"avatar": "https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png",
"name": "admin",
...menuTree,
}
localStorage.setItem('menuTree', JSON.stringify(msg.menuTree));
return msg;
} 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,
};
}
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
return {
rightContentRender: () => <RightContent />,
disableContentMargin: false,
waterMarkProps: {
content: initialState?.currentUser?.name,
},
menuDataRender: () => menuDataRender(),
onPageChange: () => {
const { location } = history;
// 如果没有登录,重定向到 login
if (!initialState?.currentUser && location.pathname !== loginPath) {
history.push(loginPath);
}
},
menu: {
locale: false
},
menuHeaderRender: undefined,
// 自定义 403 页面
// unAccessible: <div>unAccessible</div>,
// 增加一个 loading 的状态
childrenRender: (children, props) => {
// if (initialState?.loading) return <PageLoading />;
return (
<>
{children}
{false && !props.location?.pathname?.includes('/login') && (
<SettingDrawer
enableDarkTheme
settings={initialState?.settings}
onSettingChange={(settings) => {
setInitialState((preInitialState) => ({
...preInitialState,
settings,
}));
}}
/>
)}
</>
);
},
...initialState?.settings,
};
};
const menuDataRender: any = () => {
let item = localStorage.getItem('menuTree') + '';
console.log(loopMenuItem(tree(JSON.parse(item), 0, 'parentId')));
return loopMenuItem(tree(JSON.parse(item), 0, 'parentId'));
// return tree(JSON.parse(item), 0, "parent_id");
};
const loopMenuItem = (menus: any[]): MenuDataItem[] =>
menus.map(({ icon, children, ...item }) => {
return {
...item,
icon: icon && IconMap[icon as string],
children: children && loopMenuItem(children),
};
});
const codeMessage = {
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。',
403: '用户得到授权,但是访问是被禁止的。',
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
405: '请求方法不被允许。',
406: '请求的格式不可得。',
410: '请求的资源被永久删除,且不会再得到的。',
422: '当创建一个对象时,发生一个验证错误。',
500: '服务器发生错误,请检查服务器。',
502: '网关错误。',
503: '服务不可用,服务器暂时过载或维护。',
504: '网关超时。',
};
/**
* 异常处理程序
*/
const errorHandler = (error: any) => {
const { response } = error;
if (response && response.status) {
const errorText = codeMessage[response.status] || response.statusText;
const { status, url } = response;
notification.error({
message: `请求错误 ${status}: ${url}`,
description: errorText,
});
}
if (!response) {
notification.error({
description: '您的网络发生异常,无法连接服务器',
message: '网络异常',
});
}
throw error;
};
const addToken: RequestInterceptor = (url: string, options: RequestOptionsInit) => {
options.headers = {
Authorization: 'Bearer ' + localStorage.getItem('token'),
};
return {
url,
options,
};
};
export const request: RequestConfig = {
errorHandler,
requestInterceptors: [addToken],
};
// const consoleError = console.error;
// console.error = function (...args) {
// const message = args.join(' ');
// if (
// typeof message === 'string' &&
// message.startsWith('Warning: ') &&
// !message.includes('Warning: componentWillReceiveProps has been renamed')
// ) {
// return;
// }
// consoleError.apply(console, args);
// };