import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance, AxiosInterceptorManager } from 'axios' import {store} from '../store' import {ElMessage, ElMessageBox} from 'element-plus' export interface ApiResponse { state: number; message: string; content: T; } export type ApiPromise = Promise> export interface PageList { total:number; rows: [T]; } export interface PageQuery { page: number, rows: number, sort: string, content: T; } interface ApiAxiosInstance extends AxiosInstance { /* 设置泛型T,默认为any,将请求后的结果返回变成AxiosPromise */ (config: AxiosRequestConfig): Promise; interceptors: { request: AxiosInterceptorManager; response: AxiosInterceptorManager>; } } const service: ApiAxiosInstance = axios.create({ timeout: 5000 }) // 请求前的统一处理 service.interceptors.request.use( (config: AxiosRequestConfig) => { const path =store.getters.getContextPath console.log('store.getters.getContextPath=',path) // JWT鉴权处理 config.baseURL = config.baseURL||path const token = store.getters.token; if (token && config && config.headers) { config.headers['Authorization'] = token } return config }, (error: AxiosError) => { console.log(error) // for debug return Promise.reject(error) } ) service.interceptors.response.use( (response: AxiosResponse) => { const res = response.data if(res.state){ if (res.state === 401 || res.state === 403 ) //未授权或者授权过期 { store.dispatch('logout').then(()=>{ if (!store.getters.isRelogin) { store.commit('setIsRelogin', true) ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' } ) .finally(()=>{ store.commit('setIsRelogin', false); location.href = '/#/login' }); } }) return Promise.reject('无效的会话,或者会话已过期,请重新登录。') } else if (res.state === 500) { ElMessage({ message: res.message, type: 'error' }) return Promise.reject(new Error(res.message)) } else if (res.state === 200 || res.state === 0) { return res } else { showError(res) return Promise.reject(res) } } else { return res } }, (error: AxiosError) => { console.log(error) // for debug let { message } = error; const status = error.response?.status if (status === 401 || status === 403 ) //未授权或者授权过期 { store.dispatch('logout') if (!store.getters.isRelogin) { ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }) .finally(() => { store.commit('setIsRelogin', false); location.href = '/#/login' }); } } if (message == "Network Error") { message = "后端接口连接异常"; } else if (message.includes("timeout")) { message = "系统接口请求超时"; } else if (message.includes("Request failed with status code")) { message = "系统接口" + message.substr(message.length - 3) + "异常"; } ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) const badMessage: any = error.message || error const code = parseInt(badMessage.toString().replace('Error: Request failed with status code ', '')) showError({code, message: badMessage}) return Promise.reject(error) } ) // 错误处理 function showError(error: any) { // token过期,清除本地数据,并跳转至登录页面 if (error.state === 403) { // to re-login store.dispatch('logout') } else { ElMessage({ message: error.msg || error.message || '服务异常', type: 'error', duration: 3 * 1000 }) } } export default service