index.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import Vue from 'vue'
  2. import axios from 'axios'
  3. import i18n from '../i18n'
  4. import { Message } from 'element-ui'
  5. import store from '../store/index'
  6. import { getToken, getLocale } from '@/utils/auth'
  7. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
  8. // axios.defaults.withCredentials = false
  9. axios.defaults.timeout = 20000
  10. axios.interceptors.request.use(config => {
  11. if (getToken()) {
  12. config.headers['token'] = getToken()
  13. }
  14. if (getLocale()) {
  15. config.headers['locale'] = getLocale()
  16. }
  17. if (config.method === 'post') {
  18. config.params = undefined
  19. }
  20. // 临时打补丁
  21. if (/^\/v1\//.test(config.url)) {
  22. config.url = '/api/admin' + config.url
  23. }
  24. return config
  25. }, error => Promise.resolve(error.response || error)
  26. )
  27. axios.interceptors.response.use(response => {
  28. if (response.data && response.data.code !== 200 && response.data.msg) {
  29. Message.error(response.data.msg)
  30. }
  31. if (response.data && (response.data.code === 403 || response.data.code === 401)) {
  32. store.dispatch('user/logout')
  33. setTimeout(() => {
  34. location.href = '/login'
  35. }, 200)
  36. }
  37. return response
  38. }, error => {
  39. if (error.response && error.response.data.msg) {
  40. Message.error(error.response.data.msg)
  41. } else if (error.message) {
  42. if (error.code && error.code === 'ECONNABORTED') {
  43. Message.error(i18n.t('request.timeout'))
  44. } else {
  45. Message.error(error.message)
  46. }
  47. }
  48. return Promise.resolve(error.response || error)
  49. }
  50. )
  51. export const fetch = (url, data = {}, method = 'post') => {
  52. return new Promise((resolve, reject) => {
  53. axios({
  54. url,
  55. data: method === 'post' ? data : {},
  56. params: method === 'post' ? {} : data,
  57. method
  58. }).then(res => resolve(res.data))
  59. })
  60. }
  61. Vue.prototype.$fetch = fetch