request.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import axios from 'axios'
  2. import { getToken, deleteToken } from '@/utils/auth'
  3. import { blobToJson } from '@/utils'
  4. import { checkToken } from '@/api/system'
  5. import route from '@/router'
  6. import qs from 'qs'
  7. import Vue from 'vue'
  8. // create an axios instance
  9. const service = axios.create({
  10. baseURL: window?.g?.VUE_APP_BASE_API ?? process.env.VUE_APP_BASE_API,
  11. // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  12. // withCredentials: true, // send cookies when cross-domain requests
  13. timeout: 120000 // request timeout
  14. })
  15. // request interceptor
  16. // 发送请求拦截器
  17. service.interceptors.request.use(
  18. config => {
  19. // do something before request is sent
  20. // if (getToken()) {
  21. // config.headers.token = getToken()
  22. // }
  23. config.headers.token = getToken()
  24. return config
  25. },
  26. error => {
  27. // do something with request error
  28. // console.error(error) // for debug
  29. return Promise.reject(error)
  30. }
  31. )
  32. // response interceptor
  33. // 请求返回之后的拦截器
  34. service.interceptors.response.use(
  35. async response => {
  36. const res = response.data
  37. if (response.request.responseType === 'blob') {
  38. // 返回的文件流当报错时转化成json
  39. if (response.headers['content-type'] === 'application/json') {
  40. try {
  41. const result = await blobToJson(res)
  42. return Promise.reject(result.msg)
  43. } catch (error) {
  44. return Promise.reject(error)
  45. }
  46. }
  47. const name = response.headers['content-disposition']
  48. // console.log(name)
  49. return {
  50. data: res,
  51. name: name ? decodeURI(name.replace('attachment;filename=', '')) : '未命名'
  52. }
  53. }
  54. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
  55. if ([50008, 50012, 50014, 402000, 401].includes(res.code)) {
  56. // Vue.prototype.$message.error('登陆过期,请重新登陆')
  57. const str = '登陆过期,请重新登陆'
  58. try {
  59. checkToken()
  60. } catch (error) {
  61. Vue.prototype.$message.error(error)
  62. }
  63. return Promise.reject(str)
  64. }
  65. if (res.code === 302) {
  66. const str = '登陆过期,返回登录'
  67. deleteToken()
  68. const url = res.data?.redirectUrl === 'local' ? `/login-local?redirect=${route.history.current.fullPath}` : (res.data?.redirectUrl || '/login-local')
  69. setTimeout(() => {
  70. window.location.href = url
  71. }, 500)
  72. return Promise.reject(str)
  73. }
  74. // 登录验证码过期
  75. if (res.code === 60902) {
  76. return Promise.reject(res)
  77. }
  78. if (res.code !== 20000) {
  79. if (res.data && Object.keys(res.data).length) {
  80. return Promise.reject(res)
  81. }
  82. return Promise.reject(res.msg.error || res.msg)
  83. }
  84. return res
  85. },
  86. error => {
  87. // console.error(error)
  88. // error = error.message || error
  89. return Promise.reject(error)
  90. }
  91. )
  92. // 请求方法
  93. const http = {
  94. post (url, params) {
  95. return service.post(url, params, {
  96. transformRequest: [(params) => {
  97. return JSON.stringify(params)
  98. }],
  99. headers: {
  100. 'Content-Type': 'application/json'
  101. }
  102. })
  103. },
  104. get (url, params) {
  105. return service.get(url, {
  106. params: params,
  107. paramsSerializer: (params) => {
  108. return qs.stringify(params)
  109. }
  110. })
  111. },
  112. formData (url, params) {
  113. return service.post(url, params, {
  114. timeout: 600000,
  115. headers: {
  116. 'Content-Type': 'application/x-www-form-urlencoded'
  117. }
  118. })
  119. },
  120. upload (url, params) {
  121. return service.post(url, params, {
  122. timeout: 600000,
  123. headers: {
  124. 'Content-Type': 'multipart/form-data'
  125. }
  126. })
  127. },
  128. download (url, params) {
  129. return service.post(url, params, {
  130. timeout: 10000,
  131. headers: {
  132. 'Content-Type': 'application/json'
  133. },
  134. responseType: 'blob'
  135. })
  136. }
  137. }
  138. export default http