request.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import Vue from 'vue'
  2. import axios from 'axios'
  3. import store from '@/store'
  4. import notification from 'ant-design-vue/es/notification'
  5. import { VueAxios } from './axios'
  6. import { ACCESS_TOKEN } from '@/store/mutation-types'
  7. // 创建 axios 实例
  8. const service = axios.create({
  9. baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url
  10. timeout: 600000 // 请求超时时间
  11. })
  12. // 获取token
  13. const getToken = url => {
  14. let token = ''
  15. const storeToken = Vue.ls.get(ACCESS_TOKEN)
  16. if (url.indexOf('/oauth/token') !== -1 || url.indexOf('/mobile/token') !== -1) {
  17. token = 'Basic ZW5kOmVuZA=='
  18. } else if (storeToken) {
  19. token = 'Bearer ' + storeToken
  20. }
  21. return token
  22. }
  23. const err = (error) => {
  24. if (error.response) {
  25. const data = error.response.data
  26. const token = Vue.ls.get(ACCESS_TOKEN)
  27. if (error.response.status === 403) {
  28. notification.error({
  29. message: '禁止',
  30. description: '没有权限,禁止访问'
  31. })
  32. return Promise.reject(error)
  33. }
  34. if (error.response.status === 401) {
  35. notification.error({
  36. message: '登录失效',
  37. description: '登录已过期'
  38. })
  39. if (token) {
  40. store.dispatch('Logout').then(() => {
  41. setTimeout(() => {
  42. window.location.reload()
  43. }, 1500)
  44. })
  45. }
  46. return Promise.reject(error)
  47. }
  48. notification.error({
  49. message: '请求错误',
  50. description: data.message
  51. })
  52. }
  53. return Promise.reject(error)
  54. }
  55. // request interceptor
  56. service.interceptors.request.use(config => {
  57. const token = getToken(config.url)
  58. if (token) {
  59. config.headers['Authorization'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
  60. }
  61. return config
  62. }, err)
  63. // response interceptor
  64. service.interceptors.response.use((response) => {
  65. const data = response.data
  66. if (data.code === 0) {
  67. return data
  68. } else {
  69. // 特殊处理的 blob下载文件时的提示
  70. if (response.request.responseType === 'blob') {
  71. return response
  72. }
  73. notification.error({
  74. message: '请求错误',
  75. description: data.message
  76. })
  77. return Promise.reject(response)
  78. }
  79. }, err)
  80. const installer = {
  81. vm: {},
  82. install (Vue) {
  83. Vue.use(VueAxios, service)
  84. }
  85. }
  86. export {
  87. installer as VueAxios,
  88. service as axios,
  89. getToken
  90. }