goview_vue/src/api/axios.ts

72 lines
2.0 KiB
TypeScript
Raw Normal View History

import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'
import { ResultEnum, RequestHttpHeaderEnum } from "@/enums/httpEnum"
import { PageEnum, ErrorPageNameMap } from "@/enums/pageEnum"
import { StorageEnum } from '@/enums/storageEnum'
2022-05-20 16:12:27 +08:00
import { axiosPre } from '@/settings/httpSetting'
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
import { redirectErrorPage, getLocalStorage, routerTurnByName } from '@/utils'
import { fetchAllowList } from './axios.config'
import includes from 'lodash/includes'
2022-05-20 16:12:27 +08:00
interface MyResponseType {
code: number;
msg: string;
data: any;
}
const axiosInstance = axios.create({
2022-05-20 16:12:27 +08:00
baseURL: axiosPre,
timeout: ResultEnum.TIMEOUT,
})
axiosInstance.interceptors.request.use(
(config: AxiosRequestConfig) => {
// 白名单校验
if (includes(fetchAllowList, config.url)) return config
// 获取 token
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
// 重新登录
if (!info) return routerTurnByName(PageEnum.BASE_LOGIN_NAME)
config.headers = {
[RequestHttpHeaderEnum.TOKEN]: info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_TOKEN] || ''
}
return config
},
(error: AxiosRequestConfig) => {
Promise.reject(error)
}
)
// 响应拦截器
axiosInstance.interceptors.response.use(
(res: AxiosResponse) => {
const { code } = res.data as { code: number }
// 成功
if (code === ResultEnum.DATA_SUCCESS) {
return Promise.resolve(res.data)
}
// 登录过期
if (code === ResultEnum.SERVER_FORBIDDEN) {
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
return Promise.reject(res.data)
}
// 重定向
if (ErrorPageNameMap.get(code)) {
redirectErrorPage(code)
}
2022-03-21 23:03:10 +08:00
return Promise.resolve(res.data)
},
(err: AxiosResponse) => {
const { code } = err.data as { code: number }
if (ErrorPageNameMap.get(code)) redirectErrorPage(code)
2022-03-21 23:03:10 +08:00
window['$message'].error('接口异常,请检查!')
Promise.reject(err)
}
)
export default axiosInstance