132 lines
3.1 KiB
TypeScript
132 lines
3.1 KiB
TypeScript
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<any>
|
|
|
|
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
|