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()