request.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import axios from 'axios'
  2. import { MessageBox, Message } from '@zjlib/element-ui2'
  3. import store from '@/store'
  4. import { getToken } from '@/utils/auth'
  5. export function replaceStringInObject(obj, target, replacement) {
  6. // 将对象转换为字符串
  7. let str = JSON.stringify(obj)
  8. // 替换所有目标字符串为替换字符串
  9. str = str.replace(new RegExp(target, 'g'), replacement)
  10. // 将字符串转换回对象
  11. return JSON.parse(str)
  12. }
  13. // create an axios instance
  14. const service = axios.create({
  15. baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  16. // withCredentials: true, // send cookies when cross-domain requests
  17. timeout: 300000 // request timeout
  18. })
  19. const whiteCodes = [200, 201, 4444]
  20. // request interceptor
  21. service.interceptors.request.use(
  22. config => {
  23. // do something before request is sent
  24. if (store.getters.token) {
  25. // let each request carry token
  26. // ['X-Token'] is a custom headers key
  27. // please modify it according to the actual situation
  28. config.headers['x-token'] = store.getters.token
  29. }
  30. return config
  31. },
  32. error => {
  33. // do something with request error
  34. console.log(error) // for debug
  35. return Promise.reject(error)
  36. }
  37. )
  38. // response interceptor
  39. service.interceptors.response.use(
  40. /**
  41. * If you want to get http information such as headers or status
  42. * Please return response => response
  43. */
  44. /**
  45. * Determine the request status by custom code
  46. * Here is just an example
  47. * You can also judge the status by HTTP Status Code
  48. */ response => {
  49. const res = replaceStringInObject(
  50. response.data,
  51. 'https://zfire-jsm-h.oss-cn-shenzhen.aliyuncs.com/',
  52. `${process.env.VUE_APP_BASE_API}img/get?key=`
  53. )
  54. // if the custom code is not 20000, it is judged as an error.
  55. if (whiteCodes.indexOf(res.code) < 0) {
  56. if (JSON.parse(response.config.data || '{}')?.returnErr || response.config.params?.returnErr) {
  57. return Promise.reject(res)
  58. }
  59. Message({
  60. message: res.message || 'Error',
  61. type: 'error',
  62. duration: 5 * 1000
  63. })
  64. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
  65. if (res.code === 1001) {
  66. // to re-login
  67. MessageBox.confirm('登录失效,您可以取消停留在此页面,或重新登录', '登录失效', {
  68. confirmButtonText: '重新登录',
  69. cancelButtonText: '取消',
  70. type: 'warning'
  71. }).then(() => {
  72. store.dispatch('user/resetToken').then(() => {
  73. location.reload()
  74. })
  75. })
  76. } else if (res.code === 4004) {
  77. // to re-login
  78. MessageBox.confirm('账号过期,请前往续费', '账号过期', {
  79. confirmButtonText: '去续费',
  80. cancelButtonText: '取消',
  81. type: 'warning'
  82. }).then(() => {
  83. window.location.href = window.location.href.split('#')[0] + '#/setting/personal?isRenew=true'
  84. })
  85. }
  86. return Promise.reject(new Error(res.message || 'Error'))
  87. } else {
  88. console.log(res)
  89. return res
  90. }
  91. },
  92. error => {
  93. console.log('err' + error) // for debug
  94. Message({
  95. message: error.message,
  96. type: 'error',
  97. duration: 5 * 1000
  98. })
  99. return Promise.reject(error)
  100. }
  101. )
  102. export default service
  103. export function zhapi(add, path) {
  104. if (add[add.length - 1] == '/' && path[0] == '/') {
  105. return add + path.substr(1)
  106. }
  107. return add + path
  108. }
  109. // post方式导出文件
  110. export function postBlob(data) {
  111. return new Promise(function (r, j) {
  112. axios({
  113. method: 'post',
  114. url: zhapi(process.env.VUE_APP_BASE_API, data.url), // 后端接口地址
  115. responseType: 'blob', // bolb格式的请求方式
  116. headers: {
  117. 'x-token': getToken() // 请求头
  118. },
  119. data: data.data // 需要传给后端的请求参数体
  120. })
  121. .then(res => {
  122. const BLOB = res.data
  123. const fileReader = new FileReader()
  124. fileReader.readAsDataURL(BLOB) // 对请求返回的文件进行处理
  125. fileReader.onload = e => {
  126. const a = document.createElement('a')
  127. a.download = data.name
  128. a.href = e.target.result
  129. document.body.appendChild(a)
  130. a.click()
  131. document.body.removeChild(a)
  132. }
  133. r()
  134. })
  135. .catch(err => {
  136. console.log(err.message)
  137. j()
  138. })
  139. })
  140. }
  141. // get方式导出文件
  142. export function getBlob(data) {
  143. return new Promise(function (r, j) {
  144. axios({
  145. url: zhapi(process.env.VUE_APP_BASE_API, data.url),
  146. method: 'get',
  147. responseType: 'blob',
  148. params: data.params, // 与post传参方式不同之处
  149. headers: {
  150. 'x-token': getToken() // 请求头
  151. }
  152. })
  153. .then(res => {
  154. var blob = new Blob([res.data], {
  155. type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'
  156. })
  157. var filename = data.name + '.xlsx'
  158. var downloadElement = document.createElement('a')
  159. var href = window.URL.createObjectURL(blob) // 创建下载的链接
  160. downloadElement.style.display = 'none'
  161. downloadElement.href = href
  162. downloadElement.download = filename // 下载后文件名
  163. document.body.appendChild(downloadElement)
  164. downloadElement.click() // 点击下载
  165. document.body.removeChild(downloadElement) // 下载完成移除元素
  166. window.URL.revokeObjectURL(href) // 释放掉blob对象
  167. r()
  168. })
  169. .catch(err => {
  170. console.log(err.message)
  171. j()
  172. })
  173. })
  174. }
  175. /**
  176. * 导入功能
  177. * @param {*} url
  178. * @param {*} formData
  179. * @param {*} id
  180. */
  181. export function handleImport(url, formData, id = '') {
  182. return new Promise((resolve, reject) => {
  183. axios
  184. .post(zhapi(process.env.VUE_APP_BASE_API, url), formData, {
  185. headers: {
  186. 'Content-Type': 'multipart/form-data',
  187. 'x-token': getToken(),
  188. id
  189. }
  190. })
  191. .then(res => {
  192. if (res.data.code !== 200) {
  193. reject(new Error(res.data.message || 'Error'))
  194. return
  195. }
  196. resolve(res.data)
  197. })
  198. .catch(err => {
  199. reject(err)
  200. })
  201. })
  202. }