app.ts 3.72 KB
// 运行时配置

import { RequestConfig, history } from '@umijs/max';

import '@inspir/assembly-css/dist/special.css';
import { message } from 'antd';
import { RESPONSE_CODE } from './constants/enum';

import { RunTimeLayoutConfig } from '@umijs/max';
import GlobleHeader from './components/UserHeader';
import './style/global.css';
import { getUserInfo } from './utils';

// 全局初始化数据配置,用于 Layout 用户信息和权限初始化
// 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
export async function getInitialState() {
  return getUserInfo();
}

export const layout: RunTimeLayoutConfig = () => {
  return {
    headerRender: GlobleHeader,
    siderWidth: '190px',

    layout: 'mix',

    // 其他属性见:https://procomponents.ant.design/components/layout#prolayout
  };
};
// export const layout = () => {
//   return {
//     menu: {
//       locale: false,
//       header: GlobleHeader,
//       headerRender:GlobleHeader,
//       rightContentRender: () => GlobleHeader,
//       // footerRender: () => <Footer />,
//     },
//     // collapsed: true,
//     // breakpoint:false
//   };
// };

export const request: RequestConfig = {
  // 错误处理
  errorHandler: (error) => {
    console.log(
      '%c [ error ]-35',
      'font-size:13px; background:pink; color:#bf2c9f;',
      error,
    );
    const { response, data } = error;
    if (response && response.status) {
      // 401重定向
      if (response.status === 401) {
        if (!location.pathname.includes('login')) {
          localStorage.removeItem('token');
          localStorage.removeItem('userInfo');
          message.error('token失效,请重新登录!');
          history.push('/login');
          return null;
        }
      }
    }
    return data;
  },
  // 请求处理
  requestInterceptors: [
    (url: string, options) => {
      const controller = new AbortController(); // create a controller
      const { signal } = controller;

      let authHeader: { Authorization?: string; systemid?: string } = {};
      if (localStorage.getItem('token')) {
        authHeader = {
          Authorization: localStorage.getItem('token') || undefined,
        };
      }

      // const requestOption: AxiosRequestConfig = {
      //   method: options.method || 'get',
      // };

      // if (options.header) {
      //   requestOption.headers = options.header;
      // }

      // if (options.body) {
      //   options.data = options.body;
      // }

      if (options.query) {
        options.params = options.query;
      }

      return {
        url: '/api' + url,
        options: {
          ...options,
          signal,
          interceptors: true,
          headers: authHeader,
        },
      };
    },
  ],
  responseInterceptors: [
    // 一个二元组,第一个元素是 request 拦截器,第二个元素是错误处理
    [
      (response) => {
        // 不再需要异步处理读取返回体内容,可直接在data中读出,部分字段可在 config 中找到
        const { data = {} as any } = response;
        if (
          data.result !== RESPONSE_CODE.SUCCESS &&
          data.result !== undefined
        ) {
          message.error(data.message);
        }

        if (data.result === 401) {
          history.push('/login');
        }

        // do something
        return response;
      },
      (error: any) => {
        if (error?.response?.status === 401) {
          if (!location.pathname.includes('login')) {
            localStorage.removeItem('token');
            localStorage.removeItem('userInfo');
            message.error('token失效,请重新登录!');
            history.push('/login');
          }
        }
        return Promise.reject(error);
      },
    ],
  ],
};