Files
workspace/code/link56/link56-frontend-new/src/request/index.ts
T
2025-12-27 17:21:38 +08:00

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