import axios from 'axios' import { MessageBox, Message } from 'element-ui' import store from '@/store' import { getToken } from '@/utils/auth' import dayjs from 'dayjs' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // withCredentials: true, // send cookies when cross-domain requests timeout: 20 * 1000 }) service.interceptors.request.use( config => { // do something before request is sent config.params = { ...config?.params, version: process.env.VUE_APP_API_VERSION, apiNo: process.env.VUE_APP_API_API_NO, time: dayjs().format('YYYYMMDDHHmmss'), apiUser: localStorage.getItem('apiUser'), checkSum: localStorage.getItem('checkSum') } if (store.getters.token) { config.headers.token = getToken() } return config }, error => { // do something with request error console.log(error) // for debug return Promise.reject(error) } ) // response interceptor service.interceptors.response.use( response => { const { data: { code, msg } } = response if (code === 0) { return response.data } Message.closeAll() Message({ message: msg ?? 'Error', type: 'error', duration: 3 * 1000 }) // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; if (code === -501) { console.log('登录失效') store.dispatch('user/resetToken').then(() => { location.reload() }) } if (code === 'UNAUTHORIZED') { // to re-login MessageBox.confirm('您已注销,可以取消以保留在该页面上,或者再次登录', '确认退出', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: '警告' }).then(() => { store.dispatch('user/resetToken').then(() => { location.reload() }) }) } return Promise.reject(new ApiError(msg, response)) }, error => { console.dir(error) Message.closeAll() const message = error?.response?.data?.msg ?? error?.msg ?? '请求数据错误, 请稍后重试' Message({ message, type: 'error', duration: 3 * 1000 }) return Promise.reject(new ApiError(message, error?.response)) } ) class ApiError extends Error { constructor(message, response) { super(message) this.message = message this.response = response } } export default service