schangxiang@126.com
2024-09-03 a635f1bbbaf5ebacde78f9d1bcb9b34bc2359902
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import Vue from 'vue'
import axios from 'axios'
import store from '@/store'
// import router from './router'
import { message, Modal, notification } from 'ant-design-vue' /// es/notification
import { VueAxios } from './axios'
import { ACCESS_TOKEN } from '@/store/mutation-types'
 
// 创建 axios 实例
const service = axios.create({
  //  baseURL: process.env.VUE_APP_API_BASE_URL + '/api', // api base_urls
    baseURL: window.VUE_BASE_URL + '/api',
  timeout: 6000 // 请求超时时间
})
 
const err = error => {
  if (error.response) {
    const data = error.response.data
    const token = Vue.ls.get(ACCESS_TOKEN)
 
    if (error.response.status === 403) {
      notification.error({
        message: 'Forbidden',
        description: data.message
      })
    }
    if (error.response.status === 500) {
      if (data.message && data.message.length > 0) {
        message.error(data.message)
      }
    }
    if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
      notification.error({
        message: 'Unauthorized',
        description: 'Authorization verification failed'
      })
      if (token) {
        store.dispatch('Logout').then(() => {
          setTimeout(() => {
            window.location.reload()
          }, 1500)
        })
      }
    }
  }
  return Promise.reject(error)
}
 
// request interceptor
service.interceptors.request.use(config => {
    // console.log(init.baseUrl,'baseUrl')
  const token = Vue.ls.get(ACCESS_TOKEN)
  const refreshToken = Vue.ls.get('X-Access-Token')
  if (token) {
    config.headers['Authorization'] = 'Bearer ' + token
  }
  if (refreshToken) {
    config.headers['X-Authorization'] = 'Bearer ' + refreshToken
  }
  return config
}, err)
 
const _requestErrAlert = function(msg, callback, oktext = '确认') {
  Modal.error({
    title: '系统提示:',
    content: msg,
    keyboard: false,
    okText: oktext,
    onOk: () => {
      callback && callback()
    }
  })
}
 
const requerstErrMsg = function(msg) {
 
}
 
/**
 * response interceptor
 * 所有请求统一返回
 */
service.interceptors.response.use(response => {
  // LocalStorage 存储的 token 和 refreshToken,不设定过期时间,由服务端统一处理
  if (response.headers['access-token'] && response.headers['access-token'] !== 'invalid_token') {
    Vue.ls.set(ACCESS_TOKEN, response.headers['access-token'] /*, 7 * 24 * 60 * 60 * 1000 */)
    store.commit('SET_TOKEN', response.headers['access-token'])
  }
  if (response.headers['x-access-token']) {
    Vue.ls.set('X-Access-Token', response.headers['x-access-token'] /*, 7 * 24 * 60 * 60 * 1000 */)
  }
  if (response.request.responseType === 'blob') {
    return response
  }
 
  if (response.status === 200) {
    const resData = response.data
    const code = response.data.code
    if (resData.success && ((code && code === 200) || (response.data.repCode === '0000'))) {
      return resData
    } else if (!store.state.app.hasError && code === 401) {
      _requestErrAlert(resData.message, () => {
        store.dispatch('SetHasError', false)
        window.location.reload()
      }, '重新登录')
 
      // 授权过期,清理本地缓存的记录,不论 Modal.error 的 onOk 是否确认,先清理
      // 否则会在没按 OK 时,刷新网页或者重新访问,都会弹出“未授权的提示框”
      // 这样的调整后,TOKEN 为空直接重定向,SetHasError 的设置和判断其实已经用不上
      Vue.ls.remove(ACCESS_TOKEN)
      Vue.ls.remove('X-Access-Token')
      store.dispatch('SetHasError', true)
      return resData
    } else {
      let msg = resData.message
      if (!msg) msg = '网络错误,请稍后再尝试!'
      message.error(msg)
      console.log(response)
      return Promise.reject(response)
    }
  } else {
    message.error('网络错误,请稍后再尝试!')
    console.log(response)
    return Promise.reject(response)
  }
}, err)
 
const installer = {
  vm: {},
  install(Vue) {
    Vue.use(VueAxios, service)
  }
}
 
export { installer as VueAxios, service as axios }