app.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. import { history } from 'umi';
  7. import logo from '@/assets/logo.png';
  8. // 全局初始化数据配置,用于 Layout 用户信息和权限初始化
  9. // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
  10. export async function getInitialState(): Promise<{ name: string }> {
  11. return { name: 'admin' };
  12. }
  13. export const layout: RunTimeLayoutConfig = (initialState) => {
  14. return {
  15. navTheme: 'light',
  16. layout: 'side',
  17. contentWidth: 'Fluid',
  18. title: '金科环境数字化管理平台',
  19. token: {
  20. sider: {
  21. colorMenuBackground: '#292f33',
  22. // colorMenuItemDivider: '#dfdfdf',
  23. // colorBgMenuItemHover: '#f6f6f6',
  24. // colorTextMenu: '#dfdfdf',
  25. // colorTextMenuSelected: '#fff',
  26. // colorTextMenuActive: 'rgba(255,255,255,0.85)',
  27. // colorBgMenuItemCollapsedHover: '#fff',
  28. // colorTextMenuItemHover: '#dfdfdf',
  29. colorBgCollapsedButton: '#fff',
  30. colorTextCollapsedButtonHover: 'rgba(0,0,0,0.65)',
  31. colorTextCollapsedButton: 'rgba(0,0,0,0.45)',
  32. colorBgMenuItemCollapsedHover: 'rgba(0,0,0,0.06)',
  33. colorBgMenuItemCollapsedSelected: 'rgba(0,0,0,0.15)',
  34. colorBgMenuItemCollapsedElevated: 'rgba(0,0,0,0.85)',
  35. colorMenuItemDivider: 'rgba(255,255,255,0.15)',
  36. colorBgMenuItemHover: 'rgba(0,0,0,0.06)',
  37. colorBgMenuItemSelected: 'rgba(0,0,0,0.15)',
  38. colorTextMenuSelected: '#fff',
  39. colorTextMenuItemHover: 'rgba(255,255,255,0.75)',
  40. colorTextMenu: 'rgba(255,255,255,0.75)',
  41. colorTextMenuSecondary: 'rgba(255,255,255,0.65)',
  42. colorTextMenuTitle: 'rgba(255,255,255,0.95)',
  43. colorTextMenuActive: 'rgba(255,255,255,0.95)',
  44. colorTextSubMenuSelected: '#fff',
  45. },
  46. },
  47. // fixedHeader: true,
  48. // fixSiderbar: true,
  49. rightRender(initialState, setInitialState, runtimeConfig) {
  50. return <UserDropdown />;
  51. },
  52. logo: logo,
  53. };
  54. };
  55. // axios配置
  56. export const request: RequestConfig = {
  57. errorConfig: {
  58. errorThrower(res: any) {
  59. // const { data, code, msg } = res;
  60. // if (code !== 200) {
  61. // const error: any = new Error(msg);
  62. // error.name = 'AjaxError';
  63. // error.info = { code, msg, data };
  64. // throw error;
  65. // }
  66. console.log('errorThrower', res);
  67. },
  68. errorHandler(error: any, opts: any) {
  69. if (opts?.skipErrorHandler) throw error;
  70. // errorThrower 抛出的错误。
  71. if (error.name === 'AjaxError') {
  72. // 校验是否token失效
  73. if (tokenExpiredHandle(error.info.code)) return;
  74. const errorInfo: any = error.info;
  75. if (errorInfo) {
  76. message.error(errorInfo.msg || errorInfo.data);
  77. }
  78. } else if (error.response) {
  79. // http错误,校验token是否失效
  80. if (tokenExpiredHandle(error.response.status)) return;
  81. // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
  82. message.error(`网络连接错误,请稍后重试(${error.response.status})`);
  83. } else if (error.request) {
  84. // 请求已经成功发起,但没有收到响应
  85. // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
  86. // 而在node.js中是 http.ClientRequest 的实例
  87. message.error('网络连接错误,请稍后重试(服务器未返回数据)。');
  88. } else {
  89. // 发送请求时出了点问题
  90. message.error('网络连接错误,请稍后重试(请求发送失败)。');
  91. }
  92. },
  93. },
  94. requestInterceptors: [
  95. (config: any) => {
  96. if (!config.headers) config.headers = {};
  97. config.headers['JWT-TOKEN'] = getToken();
  98. return config;
  99. },
  100. ],
  101. responseInterceptors: [
  102. (res: any) => {
  103. const resData = res.data;
  104. const { code, msg, data } = resData;
  105. if (code !== 200) {
  106. const error: any = new Error(msg);
  107. error.name = 'AjaxError';
  108. error.info = { code, msg, data };
  109. // throw error;
  110. return Promise.reject(error);
  111. }
  112. return res;
  113. },
  114. ],
  115. };
  116. let tokenFlag: boolean = false;
  117. // token失效校验
  118. const tokenExpiredHandle = (code: number) => {
  119. if ([401, 601, 602, 603].includes(code)) {
  120. if (tokenFlag) return true;
  121. tokenFlag = true;
  122. setTimeout(() => {
  123. tokenFlag = false;
  124. }, 50000);
  125. message.error('token失效,请重新登录');
  126. history.push('/login');
  127. return true;
  128. } else {
  129. return false;
  130. }
  131. };