request.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { message, notification } from 'antd';
  2. import modal from 'antd/es/modal';
  3. import axios, { AxiosRequestConfig } from 'axios'
  4. import qs from 'qs';
  5. let { weApi } = process.env.CONFIG;
  6. const errorCode: { [x: string]: string } = {
  7. '401': '认证失败,无法访问系统资源',
  8. '403': '当前操作没有权限',
  9. '404': '访问资源不存在',
  10. 'default': '系统未知错误,请反馈给管理员'
  11. }
  12. // 标识登录过期的状态
  13. let expired = false;
  14. (axios.defaults.headers as any)['Content-Type'] = 'application/json;charset=utf-8'
  15. // 创建axios实例
  16. const service = axios.create({
  17. // axios中请求配置有baseURL选项,表示请求URL公共部分
  18. baseURL: weApi,
  19. timeout: 300000
  20. })
  21. // request拦截器
  22. service.interceptors.request.use((config: AxiosRequestConfig<any>) => {
  23. // 是否需要设置 token
  24. const isToken = (config.headers || {}).isToken === false
  25. if (localStorage.getItem('Admin-Token') && !isToken && config?.headers) {
  26. config.headers['Authorization'] = 'Bearer ' + localStorage.getItem('Admin-Token') // 让每个请求携带自定义token 请根据实际
  27. }
  28. // 处理get穿数组
  29. if (config.method === 'get') {
  30. config.paramsSerializer = function (params) {
  31. return qs.stringify(params, { arrayFormat: 'repeat' })
  32. }
  33. }
  34. return config
  35. }, error => {
  36. console.log(error)
  37. Promise.reject(error)
  38. })
  39. // 响应拦截器
  40. service.interceptors.response.use(res => {
  41. // 未设置状态码则默认成功状态
  42. const code = res.data.code || 200;
  43. // 获取错误信息
  44. const msg = errorCode[code] || res.data.msg || errorCode['default']
  45. if (code === 401) {
  46. modal.warning({
  47. title: '系统提示',
  48. content: '登录状态已过期,您可以继续留在该页面,或者重新登录',
  49. onOk: () => {
  50. localStorage.removeItem('Admin-Token')
  51. sessionStorage.removeItem('userId')
  52. window.location.href = window.location.origin + '/#/login'
  53. }
  54. })
  55. } else if (code === 310) {
  56. if (expired) return; // 避免多次触发
  57. expired = true;
  58. localStorage.removeItem('Admin-Token')
  59. sessionStorage.removeItem('userId')
  60. message.error({
  61. content: msg,
  62. duration: 2,
  63. onClose: () => {
  64. window.location.href = window.location.origin + '/#/login'
  65. }
  66. })
  67. return Promise.reject(new Error(msg))
  68. } else if (code === 500) {
  69. message.error(msg)
  70. return Promise.reject(new Error(msg))
  71. } else if (code !== 200) {
  72. notification.error({
  73. message: code,
  74. description: msg
  75. })
  76. return Promise.reject('error')
  77. } else {
  78. return res.data
  79. }
  80. }, error => {
  81. console.log('interceptors.response--->', error)
  82. let { message: msg } = error;
  83. if (msg == "Network Error") {
  84. msg = "后端接口连接异常";
  85. } else if (msg.includes("timeout")) {
  86. msg = "系统接口请求超时";
  87. } else if (msg.includes("Request failed with status code")) {
  88. msg = "系统接口" + msg.substr(msg.length - 3) + "异常";
  89. }
  90. message.error({ content: msg, duration: 5 })
  91. return Promise.reject(error)
  92. })
  93. export default service