http.ts 2.9 KB

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