request.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. return res
  89. }
  90. },
  91. error => {
  92. console.log('err' + error) // for debug
  93. Message({
  94. message: error.message,
  95. type: 'error',
  96. duration: 5 * 1000
  97. })
  98. return Promise.reject(error)
  99. }
  100. )
  101. export default service
  102. export function zhapi(add, path) {
  103. if (add[add.length - 1] == '/' && path[0] == '/') {
  104. return add + path.substr(1)
  105. }
  106. return add + path
  107. }
  108. // post方式导出文件
  109. export function postBlob(data) {
  110. return new Promise(function (r, j) {
  111. axios({
  112. method: 'post',
  113. url: zhapi(process.env.VUE_APP_BASE_API, data.url), // 后端接口地址
  114. responseType: 'blob', // bolb格式的请求方式
  115. headers: {
  116. 'x-token': getToken() // 请求头
  117. },
  118. data: data.data // 需要传给后端的请求参数体
  119. })
  120. .then(res => {
  121. const BLOB = res.data
  122. const fileReader = new FileReader()
  123. fileReader.readAsDataURL(BLOB) // 对请求返回的文件进行处理
  124. fileReader.onload = e => {
  125. const a = document.createElement('a')
  126. a.download = data.name
  127. a.href = e.target.result
  128. document.body.appendChild(a)
  129. a.click()
  130. document.body.removeChild(a)
  131. }
  132. r()
  133. })
  134. .catch(err => {
  135. console.log(err.message)
  136. j()
  137. })
  138. })
  139. }
  140. // get方式导出文件
  141. export function getBlob(data) {
  142. return new Promise(function (r, j) {
  143. axios({
  144. url: zhapi(process.env.VUE_APP_BASE_API, data.url),
  145. method: 'get',
  146. responseType: 'blob',
  147. params: data.params, // 与post传参方式不同之处
  148. headers: {
  149. 'x-token': getToken() // 请求头
  150. }
  151. })
  152. .then(res => {
  153. var blob = new Blob([res.data], {
  154. type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'
  155. })
  156. var filename = data.name + '.xlsx'
  157. var downloadElement = document.createElement('a')
  158. var href = window.URL.createObjectURL(blob) // 创建下载的链接
  159. downloadElement.style.display = 'none'
  160. downloadElement.href = href
  161. downloadElement.download = filename // 下载后文件名
  162. document.body.appendChild(downloadElement)
  163. downloadElement.click() // 点击下载
  164. document.body.removeChild(downloadElement) // 下载完成移除元素
  165. window.URL.revokeObjectURL(href) // 释放掉blob对象
  166. r()
  167. })
  168. .catch(err => {
  169. console.log(err.message)
  170. j()
  171. })
  172. })
  173. }
  174. /**
  175. * 导入功能
  176. * @param {*} url
  177. * @param {*} formData
  178. * @param {*} id
  179. */
  180. export function handleImport(url, formData, id = '') {
  181. return new Promise((resolve, reject) => {
  182. axios
  183. .post(zhapi(process.env.VUE_APP_BASE_API, url), formData, {
  184. headers: {
  185. 'Content-Type': 'multipart/form-data',
  186. 'x-token': getToken(),
  187. id
  188. }
  189. })
  190. .then(res => {
  191. if (res.data.code !== 200) {
  192. reject(new Error(res.data.message || 'Error'))
  193. return
  194. }
  195. resolve(res.data)
  196. })
  197. .catch(err => {
  198. reject(err)
  199. })
  200. })
  201. }