request.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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 = response.data
  50. // if the custom code is not 20000, it is judged as an error.
  51. if (whiteCodes.indexOf(res.code) < 0) {
  52. if (JSON.parse(response.config.data || '{}')?.returnErr || response.config.params?.returnErr) {
  53. return Promise.reject(res)
  54. }
  55. Message({
  56. message: res.message || 'Error',
  57. type: 'error',
  58. duration: 5 * 1000
  59. })
  60. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
  61. if (res.code === 1001) {
  62. // to re-login
  63. MessageBox.confirm('登录失效,您可以取消停留在此页面,或重新登录', '登录失效', {
  64. confirmButtonText: '重新登录',
  65. cancelButtonText: '取消',
  66. type: 'warning'
  67. }).then(() => {
  68. store.dispatch('user/resetToken').then(() => {
  69. location.reload()
  70. })
  71. })
  72. } else if (res.code === 4004) {
  73. // to re-login
  74. MessageBox.confirm('账号过期,请前往续费', '账号过期', {
  75. confirmButtonText: '去续费',
  76. cancelButtonText: '取消',
  77. type: 'warning'
  78. }).then(() => {
  79. window.location.href = window.location.href.split('#')[0] + '#/setting/personal?isRenew=true'
  80. })
  81. }
  82. return Promise.reject(new Error(res.message || 'Error'))
  83. } else {
  84. console.log(
  85. replaceStringInObject(
  86. res,
  87. 'https://zf-mall-test.oss-cn-shenzhen.aliyuncs.com/',
  88. `${process.env.VUE_APP_BASE_API}img/get?key=`
  89. ),
  90. '------------'
  91. )
  92. return replaceStringInObject(
  93. res,
  94. 'https://zf-mall-test.oss-cn-shenzhen.aliyuncs.com/',
  95. `${process.env.VUE_APP_BASE_API}img/get?key=`
  96. )
  97. // return res
  98. }
  99. },
  100. error => {
  101. console.log('err' + error) // for debug
  102. Message({
  103. message: error.message,
  104. type: 'error',
  105. duration: 5 * 1000
  106. })
  107. return Promise.reject(error)
  108. }
  109. )
  110. export default service
  111. export function zhapi(add, path) {
  112. if (add[add.length - 1] == '/' && path[0] == '/') {
  113. return add + path.substr(1)
  114. }
  115. return add + path
  116. }
  117. // post方式导出文件
  118. export function postBlob(data) {
  119. return new Promise(function (r, j) {
  120. axios({
  121. method: 'post',
  122. url: zhapi(process.env.VUE_APP_BASE_API, data.url), // 后端接口地址
  123. responseType: 'blob', // bolb格式的请求方式
  124. headers: {
  125. 'x-token': getToken() // 请求头
  126. },
  127. data: data.data // 需要传给后端的请求参数体
  128. })
  129. .then(res => {
  130. const BLOB = res.data
  131. const fileReader = new FileReader()
  132. fileReader.readAsDataURL(BLOB) // 对请求返回的文件进行处理
  133. fileReader.onload = e => {
  134. const a = document.createElement('a')
  135. a.download = data.name
  136. a.href = e.target.result
  137. document.body.appendChild(a)
  138. a.click()
  139. document.body.removeChild(a)
  140. }
  141. r()
  142. })
  143. .catch(err => {
  144. console.log(err.message)
  145. j()
  146. })
  147. })
  148. }
  149. // get方式导出文件
  150. export function getBlob(data) {
  151. return new Promise(function (r, j) {
  152. axios({
  153. url: zhapi(process.env.VUE_APP_BASE_API, data.url),
  154. method: 'get',
  155. responseType: 'blob',
  156. params: data.params, // 与post传参方式不同之处
  157. headers: {
  158. 'x-token': getToken() // 请求头
  159. }
  160. })
  161. .then(res => {
  162. var blob = new Blob([res.data], {
  163. type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'
  164. })
  165. var filename = data.name + '.xlsx'
  166. var downloadElement = document.createElement('a')
  167. var href = window.URL.createObjectURL(blob) // 创建下载的链接
  168. downloadElement.style.display = 'none'
  169. downloadElement.href = href
  170. downloadElement.download = filename // 下载后文件名
  171. document.body.appendChild(downloadElement)
  172. downloadElement.click() // 点击下载
  173. document.body.removeChild(downloadElement) // 下载完成移除元素
  174. window.URL.revokeObjectURL(href) // 释放掉blob对象
  175. r()
  176. })
  177. .catch(err => {
  178. console.log(err.message)
  179. j()
  180. })
  181. })
  182. }
  183. /**
  184. * 导入功能
  185. * @param {*} url
  186. * @param {*} formData
  187. * @param {*} id
  188. */
  189. export function handleImport(url, formData, id = '') {
  190. return new Promise((resolve, reject) => {
  191. axios
  192. .post(zhapi(process.env.VUE_APP_BASE_API, url), formData, {
  193. headers: {
  194. 'Content-Type': 'multipart/form-data',
  195. 'x-token': getToken(),
  196. id
  197. }
  198. })
  199. .then(res => {
  200. if (res.data.code !== 200) {
  201. reject(new Error(res.data.message || 'Error'))
  202. return
  203. }
  204. resolve(res.data)
  205. })
  206. .catch(err => {
  207. reject(err)
  208. })
  209. })
  210. }