request.js 5.2 KB

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