http.ts
import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import qs from 'qs'
interface AxiosRequestConfigExt extends AxiosRequestConfig {isAuth?: boolean showLoading?: boolean error401toLogin?: boolean dataType?: string queryData: any
}let timerId: number = 0class Http {axios: AxiosInstance = nullconstructor() {this.axios = axios.create({baseURL: 'http://localhost:5173',timeout: 10000,})this.axios.interceptors.request.use((config: AxiosRequestConfig): AxiosRequestConfig => {return config},(error: any) => {console.log(error)return Promise.reject(error)},)this.axios.interceptors.response.use((response: AxiosResponse) => {return response.data},(error: any) => {console.log(error)let message = '网络错误'if (error.response.status === 401) {message = '未登录或登录已过期,请重新登录'window.location.href = '/login'}if (error.response.status === 403) {message = '权限不足,请联系管理员'}if (error.response.status === 404) {message = '请求地址不存在'}if (error.response.status === 500) {message = '服务器内部错误'}console.log(message)return Promise.reject(error)},)}request<T>(config: AxiosRequestConfigExt): Promise<T> {let {url,queryData = {},isAuth = false,showLoading = false,method = 'GET',dataType = 'json',} = configif (showLoading) {clearTimeout(timerId)timerId = setTimeout(() => {console.log('这里添加显示加载框的代码')}, 200)}if (isAuth) {let token = localStorage.getItem('token')if (!token) {return Promise.reject('未登录')}config.headers['token'] = token}if (method?.toUpperCase() === 'GET') {return this.axios.get(url, { params: queryData })}if (method?.toUpperCase() === 'POST') {if (dataType === 'json') {return this.axios.post(url, queryData, { headers: { 'Content-Type': 'application/json' } })} else if (dataType === 'formData') {let formData = new FormData()Object.keys(queryData).forEach((key) => {formData.append(key, queryData[key])})return this.axios.post(url, formData, {headers: { 'Content-Type': 'multipart/form-data' },})} else if (dataType === 'qs') {return this.axios.post(url, qs.stringify(queryData), {headers: { 'Content-Type': 'application/x-www-form-urlencoded' },})}}return Promise.reject('请求方式不正确')}
}export default new Http()