request.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 {
  6. instanceWorkflow
  7. } from '@/api/workflow'
  8. import route from '@/router'
  9. import qs from 'qs'
  10. import Vue from 'vue'
  11. import store from '@/store'
  12. // create an axios instance
  13. const service = axios.create({
  14. // baseURL: 'http://192.168.3.162:7654',
  15. baseURL: process.env.VUE_APP_BASE_API,
  16. // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  17. // withCredentials: true, // send cookies when cross-domain requests
  18. timeout: 120000 // request timeout
  19. })
  20. // request interceptor
  21. // 发送请求拦截器
  22. service.interceptors.request.use(
  23. config => {
  24. // do something before request is sent
  25. // if (getToken()) {
  26. // config.headers.token = getToken()
  27. // }
  28. config.headers.token = getToken()
  29. return config
  30. },
  31. error => {
  32. // do something with request error
  33. // console.error(error) // for debug
  34. return Promise.reject(error)
  35. }
  36. )
  37. // response interceptor
  38. // 请求返回之后的拦截器
  39. service.interceptors.response.use(
  40. async response => {
  41. const res = response.data
  42. if (response.request.responseType === 'blob') {
  43. // 返回的文件流当报错时转化成json
  44. if (response.headers['content-type'] === 'application/json') {
  45. try {
  46. const result = await blobToJson(res)
  47. return Promise.reject(result.msg)
  48. } catch (error) {
  49. return Promise.reject(error)
  50. }
  51. }
  52. const name = response.headers['content-disposition']
  53. // console.log(name)
  54. return {
  55. data: res,
  56. name: name ? decodeURI(name.replace('attachment;filename=', '')) : '未命名'
  57. }
  58. }
  59. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
  60. if ([50008, 50012, 50014, 402000, 401].includes(res.code)) {
  61. // Vue.prototype.$message.error('登陆过期,请重新登陆')
  62. const str = '登陆过期,请重新登陆'
  63. try {
  64. checkToken()
  65. } catch (error) {
  66. Vue.prototype.$message.error(error)
  67. }
  68. return Promise.reject(str)
  69. }
  70. if (res.code === 302) {
  71. // const str = '登陆过期,返回登录'
  72. deleteToken()
  73. const url = res.data?.redirectUrl === 'local' ? `/login-local?redirect=${route.history.current.fullPath}` : (res.data?.redirectUrl || '/login-local')
  74. // setTimeout(() => {
  75. // Vue.prototype.$message.error(str)
  76. // })
  77. window.location.href = url
  78. return
  79. }
  80. // 登录验证码过期
  81. if (res.code === 60902) {
  82. return Promise.reject(res)
  83. }
  84. if (res.code === 72000) {
  85. // 审核拦截
  86. try {
  87. await Vue.prototype.$confirm('当前操作需要执行审核流程,是否继续', '提示')
  88. const obj = store.getters.workOrder
  89. await instanceWorkflow({
  90. ...res.data,
  91. createUserPageRoute: obj[2] ?? '/',
  92. approvePageRoute: obj[1] ?? '/'
  93. })
  94. const str = '已发起工作流,请等待审核'
  95. return Promise.reject(str)
  96. } catch (error) {
  97. const str = '取消操作'
  98. return Promise.reject(str)
  99. }
  100. }
  101. if (res.code !== 20000 && res.code !== 200) {
  102. if (res.data && Object.keys(res.data).length) {
  103. return Promise.reject(res)
  104. }
  105. return Promise.reject(res.msg?.error || res.msg || `Error ${res.code}`)
  106. }
  107. return res
  108. },
  109. error => {
  110. // console.error(error)
  111. // error = error.message || error
  112. return Promise.reject(error)
  113. }
  114. )
  115. // 请求方法
  116. const http = {
  117. post (url, params) {
  118. return service.post(url, params, {
  119. transformRequest: [(params) => {
  120. return JSON.stringify(params)
  121. }],
  122. headers: {
  123. 'Content-Type': 'application/json'
  124. }
  125. })
  126. },
  127. get (url, params) {
  128. return service.get(url, {
  129. params: params,
  130. paramsSerializer: (params) => {
  131. return qs.stringify(params)
  132. }
  133. })
  134. },
  135. delete (url, params) {
  136. return service.delete(url)
  137. },
  138. put (url, params) {
  139. return service.put(url, params)
  140. },
  141. formData (url, params) {
  142. return service.post(url, params, {
  143. timeout: 600000,
  144. headers: {
  145. 'Content-Type': 'application/x-www-form-urlencoded'
  146. }
  147. })
  148. },
  149. upload (url, params, options = {}) {
  150. return service.post(url, params, {
  151. timeout: 600000,
  152. headers: {
  153. 'Content-Type': 'multipart/form-data'
  154. },
  155. ...options
  156. })
  157. },
  158. download (url, params) {
  159. return service.post(url, params, {
  160. timeout: 10000,
  161. headers: {
  162. 'Content-Type': 'application/json'
  163. },
  164. responseType: 'blob'
  165. })
  166. }
  167. }
  168. export default http