mirror of
https://gitee.com/niucloud-team/niucloud-admin.git
synced 2025-12-29 09:50:16 +00:00
179 lines
5.6 KiB
TypeScript
179 lines
5.6 KiB
TypeScript
import axios, { HttpStatusCode } from 'axios'
|
|
import type { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosRequestConfig } from 'axios'
|
|
import { getToken, isUrl } from './common';
|
|
import { ElMessage } from 'element-plus'
|
|
import { t } from '@/lang'
|
|
import useUserStore from '@/stores/modules/user'
|
|
import storage from '@/utils/storage'
|
|
|
|
interface RequestConfig extends AxiosRequestConfig {
|
|
showSuccessMessage?: boolean,
|
|
showErrorMessage?: boolean
|
|
}
|
|
|
|
interface InternalRequestConfig extends InternalAxiosRequestConfig {
|
|
showSuccessMessage?: boolean,
|
|
showErrorMessage?: boolean
|
|
}
|
|
|
|
interface requestResponse extends AxiosResponse {
|
|
config: InternalRequestConfig
|
|
}
|
|
|
|
class Request {
|
|
private instance: AxiosInstance;
|
|
|
|
constructor() {
|
|
this.instance = axios.create({
|
|
baseURL: import.meta.env.VITE_APP_BASE_URL.substr(-1) == '/' ? import.meta.env.VITE_APP_BASE_URL : `${import.meta.env.VITE_APP_BASE_URL}/`,
|
|
timeout: 30000,
|
|
headers: {
|
|
'Content-Type': 'application/json;',
|
|
'lang': storage.get('lang') ?? 'zh-cn'
|
|
}
|
|
});
|
|
|
|
// 全局请求拦截器
|
|
this.instance.interceptors.request.use(
|
|
(config: InternalRequestConfig) => {
|
|
// 携带token
|
|
if (getToken()) {
|
|
config.headers[import.meta.env.VITE_REQUEST_HEADER_TOKEN_KEY] = getToken()
|
|
}
|
|
return config
|
|
},
|
|
(err: any) => {
|
|
return Promise.reject(err)
|
|
}
|
|
)
|
|
|
|
// 全局响应拦截器
|
|
this.instance.interceptors.response.use(
|
|
(response: requestResponse) => {
|
|
if (response.request.responseType != 'blob') {
|
|
const res = response.data
|
|
if (res.code != 1) {
|
|
this.handleAuthError(res.code)
|
|
if (res.code != 401 && response.config.showErrorMessage !== false) ElMessage({ message: res.msg, type: 'error' })
|
|
return Promise.reject(new Error(res.msg || 'Error'))
|
|
} else {
|
|
if (response.config.showSuccessMessage) ElMessage({ message: res.msg, type: 'success' })
|
|
return res
|
|
}
|
|
}
|
|
return response.data
|
|
},
|
|
(err: any) => {
|
|
this.handleNetworkError(err)
|
|
return Promise.reject(err)
|
|
}
|
|
)
|
|
}
|
|
|
|
/**
|
|
* 发送get请求
|
|
* @param url
|
|
* @param config
|
|
* @returns
|
|
*/
|
|
public get<T = any, R = AxiosResponse<T>>(url: string, config?: RequestConfig): Promise<R> {
|
|
return this.instance.get(url, config)
|
|
}
|
|
|
|
/**
|
|
* 发送get请求
|
|
* @param url
|
|
* @param config
|
|
* @returns
|
|
*/
|
|
public post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: RequestConfig): Promise<R> {
|
|
return this.instance.post(url, data, config)
|
|
}
|
|
|
|
/**
|
|
* 发送get请求
|
|
* @param url
|
|
* @param config
|
|
* @returns
|
|
*/
|
|
public put<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: RequestConfig): Promise<R> {
|
|
return this.instance.put(url, data, config)
|
|
}
|
|
|
|
/**
|
|
* 发送get请求
|
|
* @param url
|
|
* @param config
|
|
* @returns
|
|
*/
|
|
public delete<T = any, R = AxiosResponse<T>>(url: string, config?: RequestConfig): Promise<R> {
|
|
return this.instance.delete(url, config)
|
|
}
|
|
|
|
/**
|
|
* 处理网络请求错误
|
|
* @param err
|
|
*/
|
|
private handleNetworkError(err: any) {
|
|
let errMessage = ''
|
|
|
|
if (err.response && err.response.status) {
|
|
const errStatus = err.response.status
|
|
switch (errStatus) {
|
|
case 400:
|
|
errMessage = t('axios.400')
|
|
break
|
|
case 401:
|
|
errMessage = t('axios.401')
|
|
break
|
|
case 403:
|
|
errMessage = t('axios.403')
|
|
break
|
|
case 404:
|
|
const baseURL = isUrl(err.response.config.baseURL) ? err.response.config.baseURL : location.origin
|
|
errMessage = baseURL + t('axios.404')
|
|
break
|
|
case 405:
|
|
errMessage = t('axios.405')
|
|
break
|
|
case 408:
|
|
errMessage = t('axios.408')
|
|
break
|
|
case 409:
|
|
errMessage = t('axios.409')
|
|
break
|
|
case 500:
|
|
errMessage = t('axios.500')
|
|
break
|
|
case 501:
|
|
errMessage = t('axios.501')
|
|
break
|
|
case 502:
|
|
errMessage = t('axios.502')
|
|
break
|
|
case 503:
|
|
errMessage = t('axios.503')
|
|
break
|
|
case 504:
|
|
errMessage = t('axios.504')
|
|
break
|
|
case 505:
|
|
errMessage = t('axios.505')
|
|
break
|
|
}
|
|
}
|
|
err.message.includes('timeout') && (errMessage = t('axios.timeout'))
|
|
err.code == 'ERR_NETWORK' && (errMessage = err.config.baseURL + t('axios.errNetwork'))
|
|
errMessage && ElMessage({ message: errMessage, type: 'error' })
|
|
}
|
|
|
|
private handleAuthError(code: number) {
|
|
switch (code) {
|
|
case 401:
|
|
useUserStore().logout()
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
export default new Request() |