app.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // 运行时配置
  2. import { RunTimeLayoutConfig, RequestConfig } from '@umijs/max';
  3. import { message } from 'antd';
  4. import UserDropdown from '@/components/UserDropdown';
  5. import { getToken } from '@/utils/utils';
  6. // 全局初始化数据配置,用于 Layout 用户信息和权限初始化
  7. // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
  8. export async function getInitialState(): Promise<{ name: string }> {
  9. return { name: 'admin' };
  10. }
  11. export const layout: RunTimeLayoutConfig = (initialState) => {
  12. return {
  13. navTheme: 'light',
  14. layout: 'top',
  15. contentWidth: 'Fluid',
  16. fixedHeader: true,
  17. fixSiderbar: true,
  18. rightRender(initialState, setInitialState, runtimeConfig) {
  19. return <UserDropdown />;
  20. },
  21. logo: null,
  22. };
  23. };
  24. // axios配置
  25. export const request: RequestConfig = {
  26. errorConfig: {
  27. errorThrower(res: any) {
  28. // const { data, code, msg } = res;
  29. // if (code !== 200) {
  30. // const error: any = new Error(msg);
  31. // error.name = 'AjaxError';
  32. // error.info = { code, msg, data };
  33. // throw error;
  34. // }
  35. console.log('errorThrower', res);
  36. },
  37. errorHandler(error: any, opts: any) {
  38. if (opts?.skipErrorHandler) throw error;
  39. // errorThrower 抛出的错误。
  40. if (error.name === 'AjaxError') {
  41. // 校验是否token失效
  42. if (tokenExpiredHandle(error.info.code)) return;
  43. const errorInfo: any = error.info;
  44. // const inLoginPage = window.GT_APP.funcLogin.IsActive;
  45. // if (!inLoginPage && errorInfo) {
  46. // message.error(errorInfo.msg || errorInfo.data);
  47. // }
  48. } else if (error.response) {
  49. // http错误,校验token是否失效
  50. if (tokenExpiredHandle(error.response.status)) return;
  51. // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
  52. message.error(`网络连接错误,请稍后重试(${error.response.status})`);
  53. } else if (error.request) {
  54. // 请求已经成功发起,但没有收到响应
  55. // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
  56. // 而在node.js中是 http.ClientRequest 的实例
  57. message.error('网络连接错误,请稍后重试(服务器未返回数据)。');
  58. } else {
  59. // 发送请求时出了点问题
  60. message.error('网络连接错误,请稍后重试(请求发送失败)。');
  61. }
  62. },
  63. },
  64. requestInterceptors: [
  65. (config: any) => {
  66. if (!config.headers) config.headers = {};
  67. config.headers['JWT-TOKEN'] = getToken();
  68. return config;
  69. },
  70. ],
  71. responseInterceptors: [
  72. (res: any) => {
  73. const resData = res.data;
  74. const { code, msg, data } = resData;
  75. if (code !== 200) {
  76. const error: any = new Error(msg);
  77. error.name = 'AjaxError';
  78. error.info = { code, msg, data };
  79. throw error;
  80. }
  81. return res;
  82. },
  83. ],
  84. };
  85. let tokenFlag: boolean = false;
  86. // token失效校验
  87. const tokenExpiredHandle = (code: number) => {
  88. if ([401, 601, 602, 603].includes(code)) {
  89. if (tokenFlag) return true;
  90. tokenFlag = true;
  91. setTimeout(() => {
  92. tokenFlag = false;
  93. }, 50000);
  94. message.error('token失效,请重新登录');
  95. return true;
  96. } else {
  97. return false;
  98. }
  99. };