app.ts 3.1 KB

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