/*
* @Author: your name
* @Date: 2021-09-03 14:28:27
* @LastEditors: code4eat awesomedema@gmail.com
* @Description: In User Settings Edit
* @FilePath: /MedicalWisdomCheckSys/src/app.tsx
*/
import type { Settings as LayoutSettings } from '@ant-design/pro-layout';
import { RunTimeLayoutConfig } from 'umi';
import { history, Link } from 'umi';
import { notification, Modal } from 'antd';
// import 'yet-another-abortcontroller-polyfill'
import RightContent from '@/components/RightContent';
import { BookOutlined, LinkOutlined } from '@ant-design/icons';
import iconEnum from './menuIcons';
import { loginOut } from '@/utils';
import logoIcon from '../public/logo.png';
import { getMenus } from './services/user';
import { updateUserInfo } from '@/pages/user/Login/service';
import type { RequestOptionsInit, Context } from 'umi-request';
const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/user/login';
let hospSign: any = '';
let ifStopNextRequet: boolean = false; // 控制当出现token过期阻止后面弹窗提示
if (history) {
hospSign = history.location.query?.hospSign;
if (!hospSign) {
hospSign = localStorage.getItem('hospSign');
}
}
/** 获取用户信息比较慢的时候会展示一个 loading */
// export const initialStateConfig = {
// loading: ,
// };
export type menuDataItemType = {
path: string,
name: string,
icon: any,
component: string,
softUrl?: string, // 帆软url
children?: menuDataItemType[]
}
/**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
* */
export async function getInitialState(): Promise<{
settings?: Partial;
currentUser?: API.CurrentUserData;
logo?: string;
isDev?: boolean,
spacicalPageParamsType?: any[];
goSetting?: boolean,// 设置栏触发
resetPasswordHandle?: (formData: any) => Promise,
fetchUserMenu?: () => Promise,
menu?: menuDataItemType[],
clearUserData?: () => Promise; // 清空用户数据
fetchUserInfo?: () => Promise;
postDataToTop?: (data: any) => Promise,
}> {
const fetchUserInfo = async () => {
try {
const userData = localStorage.getItem('userData');
if (userData) {
return JSON.parse(userData);
}
throw Error;
} catch (error) {
// history.push(`${loginPath}?hospSign=${hospSign}`);
}
return undefined;
};
const fetchUserMenu = async () => {
const localMasterData = localStorage.getItem('initialState');
if (localMasterData) {
const { openedSysLists } = JSON.parse(localMasterData);
const currentSys = openedSysLists.filter((t:any) => t.name == '评审管理');
const systemId = currentSys.length > 0 ? currentSys[0].id : 0;
const menu = await getMenus(systemId);
if (menu) {
return menu;
}
}
return [];
}
const resetPasswordHandle = async (data: API.EditUserInfoType) => {
const resp = await updateUserInfo(data);
if (resp) {
return Promise.resolve(true);
}
return Promise.resolve(false);
}
const clearUserData = () => {
localStorage.removeItem('userData');
return Promise.resolve(true);
};
// 如果是登录页面,不执行
if (history.location.pathname !== loginPath) {
const currentUser = await fetchUserInfo();
return {
fetchUserInfo,
currentUser,
logo: logoIcon,
clearUserData,
menu: [],
fetchUserMenu,
resetPasswordHandle,
isDev: process.env.NODE_ENV == 'development',
settings: {
navTheme: 'light',
layout: 'side'
},
};
}
return {
fetchUserInfo,
settings: {},
};
}
const authHeaderInterceptor = (url: string, options: RequestOptionsInit) => {
const userData = localStorage.getItem('userData');
const authHeader = { token: '' };
if (userData) {
const { token }: API.CurrentUserData = JSON.parse(userData);
authHeader.token = token;
}
return {
url: `${url}`,
options: { ...options, interceptors: true, headers: authHeader },
};
};
interface responseInterceptorsOptions extends RequestOptionsInit {
isCloseNotify?: boolean, // 是否关闭POST请求后反馈
responseSpecifyFeedback?: {
successMessage: string,
errorMessage: string,
isShow: boolean, // 是否启用
}
}
const responseInterceptors = async (response: Response, options: responseInterceptorsOptions) => {
// console.log({response,options});
const requestMethod = options.method;
const { url, responseSpecifyFeedback, isCloseNotify = false } = options;
try {
const { status } = response;
if (status == 200) {
// 网络请求成功
const _response = await response.clone().json();
const restext = await response.clone().text();
console.log({restext});
const { status: dataStatus, errorCode, errorMessage, data } = _response;
if (dataStatus == 200) {
// 接口请求成功
if (requestMethod == 'POST' && url != "/api/pfm/login" && !isCloseNotify) {
if (responseSpecifyFeedback && responseSpecifyFeedback.isShow) {
// 当指定了请求成功反馈时
console.log({ responseSpecifyFeedback });
console.log(responseSpecifyFeedback.successMessage);
notification.success({
message: responseSpecifyFeedback.successMessage
});
} else {
// 否则用默认提示
notification.success({
message: '操作成功!'
});
}
}
if (data) {
return data;
}
return true;
} if (errorCode == 499) {
if (!ifStopNextRequet) {
Modal.confirm({
title: '抱歉,登录已过期请重新登录!',
onOk: () => {
ifStopNextRequet = false;
loginOut();
}
});
}
ifStopNextRequet = true;
} else {
// 接口请求信息错误
notification.error({
message: errorMessage
});
}
} else {
// 网络请求失败
notification.error({
message: '服务器错误!'
});
throw Error;
}
} catch (error) {
console.log({ error });
}
};
const demo1Middleware = async (ctx: Context, next: () => void) => {
await next();
};
type RequestConfig = Record
export const request: RequestConfig = {
// 新增自动添加AccessToken的请求前拦截器
errorHandler: (error: any) => {
console.log({ error });
throw error;
},
middlewares: [demo1Middleware],
requestInterceptors: [authHeaderInterceptor],
responseInterceptors: [responseInterceptors],
};
// 将服务端获取的菜单 icon 字符串映射为对应的 icon Dom
const mappingIcon = (menuData: menuDataItemType[]) => {
if (menuData.length == 0) {
return [
{
path: '',
name: '',
icon: '',
component: './404',
}
]
}
const mappingMenu: menuDataItemType[] = menuData.map(item => ({
...item,
icon: item.icon && iconEnum[item.icon],
children: item.children ? mappingIcon(item.children) : [],
}));
return mappingMenu;
};
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
return {
logo: initialState?.logo,
rightContentRender: () => ,
disableContentMargin: false,
menuProps:{
// onClick:({ key, keyPath, domEvent })=>{
// console.log({ key, keyPath, domEvent});
// history.push('/reports/a?w=1')
// }
},
menu: {
params: {
currentUser: initialState?.currentUser
},
request: async () => {
// initialState.currentUser 中包含了所有用户信息
if (initialState) {
const { currentUser, isDev } = initialState;
if (false) {
// 开发环境
return []
}
if (currentUser) {
const currentSelectedTab = localStorage.getItem('currentSelectedTab');
if (currentSelectedTab) {
const { menuId } = JSON.parse(currentSelectedTab);
const systemId = menuId;
const data: any[] = await getMenus(systemId);
if (data) {
await setInitialState(t => ({ ...t, menu: data }));
/**
*
* 菜单跳转报表临时处理,后期统一换成中台调用
*/
const getVFromTree = (data: any[], key: string) => {
let result: any[] = [];
function looper(data: any[], key: string) {
data.forEach((t) => {
if (t[key] && t[key] != 0) {
//非一般页面
result.push({
contentType: t[key],
path: t['path'],
reportId: t['reportId'],
url: t['youshuUrl'],
});
}
if (t.children && t.children.length > 0) {
looper(t.children, key);
}
});
}
looper(data, key);
return result;
};
const _menu = getVFromTree(data, 'contentType');
setInitialState((t) => ({ ...t, spacicalPageParamsType: _menu }));
/////////////////////////////--------临时处理----------///////////////////////////////////////////////
return mappingIcon(data);
}
}
} else {
return [
{
component: './404',
}
]
}
}
return []
},
},
links: isDev
? [
OpenAPI 文档
,
业务组件文档
,
]
: [],
menuHeaderRender: undefined,
// 自定义 403 页面
// unAccessible: unAccessible
,
...initialState?.settings,
};
};