request.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. debugger
  78. window.location.href = url
  79. return
  80. }
  81. // 登录验证码过期
  82. if (res.code === 60902) {
  83. return Promise.reject(res)
  84. }
  85. if (res.code === 72000) {
  86. // 审核拦截
  87. try {
  88. await Vue.prototype.$confirm('当前操作需要执行审核流程,是否继续', '提示')
  89. const obj = store.getters.workOrder
  90. await instanceWorkflow({
  91. ...res.data,
  92. createUserPageRoute: obj[2] ?? '/work-order/my-order',
  93. approvePageRoute: obj[1] ?? '/work-order/approval'
  94. })
  95. const str = '已发起工作流,请等待审核'
  96. const fn = Vue.prototype.$message.success
  97. Vue.prototype.$message.success = () => {
  98. fn(str)
  99. }
  100. setTimeout(() => {
  101. Vue.prototype.$message.success = fn
  102. })
  103. return Promise.resolve(str)
  104. } catch (error) {
  105. if (error === 'cancel') {
  106. const fn = Vue.prototype.$message.error
  107. Vue.prototype.$message.error = () => {}
  108. setTimeout(() => {
  109. Vue.prototype.$message.error = fn
  110. })
  111. const str = '取消操作'
  112. return Promise.reject(str)
  113. }
  114. return Promise.reject(error)
  115. }
  116. }
  117. if (res.code !== 20000 && res.code !== 200) {
  118. if (res.data && Object.keys(res.data).length) {
  119. return Promise.reject(res)
  120. }
  121. return Promise.reject(res.msg?.error || res.msg || `Error ${res.code}`)
  122. }
  123. return res
  124. },
  125. error => {
  126. // console.error(error)
  127. // error = error.message || error
  128. return Promise.reject(error)
  129. }
  130. )
  131. // 请求方法
  132. const http = {
  133. post (url, params) {
  134. return service.post(url, params, {
  135. transformRequest: [(params) => {
  136. return JSON.stringify(params)
  137. }],
  138. headers: {
  139. 'Content-Type': 'application/json'
  140. }
  141. })
  142. },
  143. get (url, params) {
  144. return service.get(url, {
  145. params: params,
  146. paramsSerializer: (params) => {
  147. return qs.stringify(params)
  148. }
  149. })
  150. },
  151. delete (url, params) {
  152. return service.delete(url)
  153. },
  154. put (url, params) {
  155. return service.put(url, params)
  156. },
  157. formData (url, params) {
  158. return service.post(url, params, {
  159. timeout: 600000,
  160. headers: {
  161. 'Content-Type': 'application/x-www-form-urlencoded'
  162. }
  163. })
  164. },
  165. upload (url, params, options = {}) {
  166. return service.post(url, params, {
  167. timeout: 600000,
  168. headers: {
  169. 'Content-Type': 'multipart/form-data'
  170. },
  171. ...options
  172. })
  173. },
  174. download (url, params) {
  175. return service.post(url, params, {
  176. timeout: 10000,
  177. headers: {
  178. 'Content-Type': 'application/json'
  179. },
  180. responseType: 'blob'
  181. })
  182. }
  183. }
  184. export default http