import { PageLoading } from '@ant-design/pro-layout'; import { notification, Modal, message } from 'antd'; import { history, Link, useModel } from 'umi'; import RightContent from '@/components/RightContent'; import Footer from '@/components/Footer'; import { BookOutlined, LinkOutlined } from '@ant-design/icons'; import { getQueryString } from './utils'; import { stringify } from 'querystring'; import { getSubHosp, getMenus } from './services/user'; import iconEnum from './menuIcons'; import { createRef } from 'react'; const layoutActionRef = createRef(); const defaultMenus = [ { path: '/', name: 'welcome', icon: 'smile', children: [ { path: '/welcome', name: 'one', icon: 'smile', children: [ { path: '/welcome/welcome', name: 'two', icon: 'smile', exact: true, }, ], }, ], }, { path: '/responsibilityCenter', name: 'demo', icon: 'heart', }, ]; const { query = {}, pathname } = history.location; const { redirect, hospSign } = query; const isDev = process.env.NODE_ENV === 'development'; const loginParams = localStorage.getItem('loginParams'); //医院标识 let sign = '', isExpired = false; if (loginParams) { const { hospSign, hospId } = JSON.parse(loginParams); sign = hospSign; } const loginPath = `/user/login?hospSign=${hospSign}`; let requestMethod = 'get'; /** 获取用户信息比较慢的时候会展示一个 loading */ export const initialStateConfig = { loading: , }; /** * @see https://umijs.org/zh-CN/plugins/plugin-initial-state * */ export async function getInitialState() { const fetchUserInfo = async () => { const userData = localStorage.getItem('userData'); if (userData) { return JSON.parse(userData); } return undefined; }; // 如果是登录页面,不执行 const getMenuDataFromServer = async () => { const resp = await getMenus(); const { status, data } = resp; if (status == 200) { return data; } else { return []; } }; //医院标识 const sign = getQueryString('hospSign'); const fetchSubHosp = async () => { // try { // const msg = await getSubHosp(sign); // } catch (error) { // } return null } if (history.location.pathname !== loginPath) { const currentUser = await fetchUserInfo(); return { fetchUserInfo, currentUser, settings: {}, isExpired: false, fetchSubHosp, sign, getMenuDataFromServer }; } return { fetchUserInfo, settings: {}, fetchSubHosp, sign, getMenuDataFromServer }; } /** * 退出登录,并且将当前的 url 保存 */ const loginOut = async () => { // await outLogin(); // Note: There may be security issues, please not localStorage.removeItem('userData'); localStorage.removeItem('menus'); if (window.location.pathname !== `/user/login` && !redirect) { history.replace({ pathname: `/user/login`, search: stringify({ redirect: pathname, hospSign: sign }), }); } }; /** * 异常处理程序 200: '服务器成功返回请求的数据。', 201: '新建或修改数据成功。', 202: '一个请求已经进入后台排队(异步任务)。', 204: '删除数据成功。', 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', 401: '用户没有权限(令牌、用户名、密码错误)。', 403: '用户得到授权,但是访问是被禁止的。', 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', 405: '请求方法不被允许。', 406: '请求的格式不可得。', 410: '请求的资源被永久删除,且不会再得到的。', 422: '当创建一个对象时,发生一个验证错误。', 500: '服务器发生错误,请检查服务器。', 502: '网关错误。', 503: '服务不可用,服务器暂时过载或维护。', 504: '网关超时。', //-----English 200: The server successfully returned the requested data. ', 201: New or modified data is successful. ', 202: A request has entered the background queue (asynchronous task). ', 204: Data deleted successfully. ', 400: 'There was an error in the request sent, and the server did not create or modify data. ', 401: The user does not have permission (token, username, password error). ', 403: The user is authorized, but access is forbidden. ', 404: The request sent was for a record that did not exist. ', 405: The request method is not allowed. ', 406: The requested format is not available. ', 410': 'The requested resource is permanently deleted and will no longer be available. ', 422: When creating an object, a validation error occurred. ', 500: An error occurred on the server, please check the server. ', 502: Gateway error. ', 503: The service is unavailable. ', 504: The gateway timed out. ', * @see cd */ //请求拦截器 const authHeaderInterceptor = (url, options) => { const { method } = options; if (method == 'post') { requestMethod = 'post' } else { requestMethod = 'get' } const userData = localStorage.getItem('userData'); let authHeader = {}; if (userData) { const { token } = JSON.parse(userData); authHeader.token = token; } return { url: `${url}`, options: { ...options, interceptors: true, headers: authHeader }, }; }; //响应拦截器 const demoResponseInterceptors = async (response, options) => { // response.headers.append('interceptors', 'yes yo'); // console.log({response}); try { const { status } = response; // console.log({response}); if (status != 200) { const { errorCode, } = response; if (errorCode == 500) { notification.error({ message: '抱歉,服务器出现错误!' }); } if (errorCode == 404) { notification.error({ message: '抱歉,服务器未找到请求!' }); } else { notification.error({ message:`错误 ${status}` }); } } const _response = await response.clone().json(); const { status: dataStatus, msg, errorMessage, errorCode } = _response; const { url } = options; //success返回 if (dataStatus == 200) { if (requestMethod == 'post' && url != '/api/costAccount/login') { message.success('操作成功!'); } return response; } else { // console.log({ isExpired }); if (errorCode == 499 && !isExpired) { isExpired = true; Modal.confirm({ title: '抱歉,登录已过期请重新登录!', onOk: () => { loginOut(); } }); } else { notification.error({ message: errorMessage, duration: 5, }); } } } catch (err) { console.log('catch error:', err) } } export const request = { errorHandler: (error) => { console.log({ error }); throw error; }, // 新增自动添加AccessToken的请求前拦截器 requestInterceptors: [authHeaderInterceptor], responseInterceptors: [demoResponseInterceptors], }; // ProLayout 支持的api https://procomponents.ant.design/components/layout //将服务端获取的菜单 icon 字符串映射为对应的 icon Dom const mappingIcon = menuData => { const mappingMenu = menuData.map(item => ({ ...item, icon: iconEnum[item.icon], children: item.children ? mappingIcon(item.children) : [], })); return mappingMenu; }; export const layout = async ({ initialState }) => { // const localMenus = localStorage.getItem('menus'); // console.log({pathname,localMenus}); // let menus = []; // if(pathname != '/user/login'){ // const {getMenuDataFromServer} = initialState; // const menu = await getMenuDataFromServer(); // menus = mappingIcon(menu); // localStorage.setItem('menus',menus); // } return { rightContentRender: () => , disableContentMargin: false, waterMarkProps: { content: '', }, actionRef: layoutActionRef, footerRender: () =>