import type { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios' import axios from 'axios' import { router } from '@/router/index' import { useUserStore } from '@/store/user' function buildBaseUrl() { const isProxy = import.meta.env.VITE_APP_PROXY === 'Y' const mode = import.meta.env.MODE const proxyPrefix = import.meta.env.VITE_APP_PROXY_PREFIX const baseURL = import.meta.env.VITE_SERVER_BASEURL if (mode === 'prod') { if (isProxy) { return baseURL + proxyPrefix } else { return baseURL } } else { if (isProxy) { return proxyPrefix } else { return baseURL } } } const axiosInstance: AxiosInstance = axios.create({ baseURL: buildBaseUrl(), timeout: 0, }) const NoFreePaths = [ '/imMessage/**', '/file/**', '/company/getPrivateDetail', ] // 请求拦截器 axiosInstance.interceptors.request.use( (config: InternalAxiosRequestConfig) => { // const router = useRouter() const userStore = useUserStore() const path = config.url || '' const needAuth = matchPaths(path, NoFreePaths) if (needAuth) { if (!userStore.isLogined) { userStore.clear() router.push('/login') return Promise.reject(new Error('尚未登录,请先登录!')) } } config.headers.Authorization = `Bearer ${userStore.token}` config.headers['X-Company-Id'] = userStore.company.id config.headers['X-User-Id'] = userStore.user.id return config }, (error: AxiosError) => { console.log('===ReqError===') return Promise.reject(error) }, ) axiosInstance.interceptors.response.use( (response: AxiosResponse) => { // 判断响应是否为文件下载类型 const isDownload = isDownloadResponse(response.headers) if (isDownload) { return response } if (response.status !== 200) { return Promise.reject(new Error('系统异常')) } const resData = response.data as ResponseData if (resData.code === 401) { router.push('/auth/login') return Promise.reject(response.data) } else if (resData.code === 404) { router.push('/error/404') return Promise.reject(response.data) } else { // 500的话需要做特殊处理 resData.isSuccess = resData.code === 200 return Promise.resolve(response.data) } }, (error: AxiosError) => { console.log(error) if (error.status === 500) { router.push('/error/500') } if (error.status === 404) { router.push('/error/404') } return Promise.reject(error) }, ) function matchPaths(path: string, patterns: string[]): boolean { return patterns.some((pattern) => { const regex = new RegExp( `${pattern .replace(/\/\*\*/g, '(/.*)?') .replace(/\/\*/g, '(/[^/]*)?') .replace(/\./g, '\\.')}$`, ) return regex.test(path) }) } function isDownloadResponse(headers: any): boolean { const contentType = headers['content-type'] return /application\/(?:octet-stream|force-download|pdf|vnd.ms-excel|msexcel|OCTET-STREAM)/.test(contentType || '') } export default axiosInstance