http.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import axios from 'axios'
  2. import { getTokenInfo, removeTokenInfo } from './storage'
  3. import store from '@/store'
  4. import { MessageFu } from './message'
  5. import { domShowFu } from './domShow'
  6. import { loginOutFu } from '@/components/DingLogin/data'
  7. import history from './history'
  8. // 是否是钉钉登录
  9. export const isDing = isDingTemp
  10. export const envFlag = process.env.NODE_ENV === 'development'
  11. const baseUrlTemp = baseUrlTempOne // 测试环境
  12. // export const baseUrlTemp = 'http://192.168.20.61:8096' // 线下环境
  13. const baseFlag = baseUrlTemp.includes('https://') || !envFlag
  14. // 请求基地址
  15. export const baseURL = envFlag ? `${baseUrlTemp}${baseFlag ? '' : '/api/'}` : baseUrlTemp
  16. // 处理 类型“AxiosResponse<any, any>”上不存在属性“code”
  17. declare module 'axios' {
  18. interface AxiosResponse {
  19. code: number
  20. timestamp: string
  21. // 这里追加你的参数
  22. }
  23. }
  24. // 创建 axios 实例
  25. const http = axios.create({
  26. baseURL: `${baseURL}${baseFlag ? '/api/' : ''}`,
  27. timeout: 10000
  28. })
  29. let axajInd = 0
  30. // 请求拦截器
  31. http.interceptors.request.use(
  32. function (config: any) {
  33. // 发请求前打开加载提示
  34. domShowFu('#AsyncSpinLoding', true)
  35. axajInd++
  36. const { token } = getTokenInfo()
  37. if (token) config.headers.token = token
  38. return config
  39. },
  40. function (err) {
  41. return Promise.reject(err)
  42. }
  43. )
  44. let timeId = -1
  45. // 响应拦截器
  46. http.interceptors.response.use(
  47. function (response) {
  48. // 请求回来的关闭加载提示
  49. axajInd--
  50. if (axajInd === 0) {
  51. domShowFu('#AsyncSpinLoding', false)
  52. }
  53. if (response.data.code === 5001 || response.data.code === 5002) {
  54. removeTokenInfo()
  55. loginOutFu()
  56. clearTimeout(timeId)
  57. timeId = window.setTimeout(() => {
  58. MessageFu.warning('登录失效!')
  59. }, 200)
  60. } else if (response.data.code === 0) {
  61. // MessageFu.success(response.data.msg);
  62. } else if (![3014, 3101].includes(response.data.code)) MessageFu.warning(response.data.msg)
  63. if (response.data.code === -1 && response.data.msg === '对象不存在')
  64. history.replace('/abnormal?k=5')
  65. return response.data
  66. },
  67. async function (err) {
  68. clearTimeout(timeId)
  69. timeId = window.setTimeout(() => {
  70. axajInd = 0
  71. domShowFu('#AsyncSpinLoding', false)
  72. // 如果因为网络原因,response没有,给提示消息
  73. if (!err.response) {
  74. if (store.getState().A0Layout.closeUpFile.state) MessageFu.warning('取消上传!')
  75. else {
  76. MessageFu.error('网络繁忙,请稍后重试!')
  77. history.replace('/abnormal?k=2')
  78. }
  79. } else {
  80. if (
  81. err.response &&
  82. err.response.data &&
  83. err.response.data.msg &&
  84. err.response.data.msg.length < 30
  85. ) {
  86. MessageFu.error(err.response.data.msg)
  87. // 没有权限
  88. if (err.response.data.code === 5003) {
  89. removeTokenInfo()
  90. loginOutFu()
  91. } else history.replace('/abnormal?k=1')
  92. } else {
  93. MessageFu.error('响应错误,请联系管理员!')
  94. history.replace('/abnormal?k=1')
  95. }
  96. }
  97. }, 100)
  98. return Promise.reject(err)
  99. }
  100. )
  101. // 导出 axios 实例
  102. export default http