import { http } from '@/settings/http' import { useUserStore } from '@/stores/user' import axios, { InternalAxiosRequestConfig, type AxiosError, type AxiosResponse } from 'axios' import type { App } from 'vue' import router from '@/router' export interface GlobalError { /** 错误码 */ code: number /** 错误信息 */ message: string } // 获取 HTTP 请求头 export const getHTTPHeaders = (): Record => { const newHeaders: Record = {} const token = useUserStore().token if (token) { newHeaders.Authorization = token } return newHeaders } export function defaultSuccess(data: unknown): void { console.log(data) } export function defaultError(error: { code: string; error?: string }): void { if (error) { router.push({ path: '/message', query: { status: error.code, message: error.error } }) } } const config = { baseURL: http.prefix, timeout: http.timeout, } const _axios = axios.create(config) _axios.interceptors.request.use( (cfg: InternalAxiosRequestConfig) => { cfg.headers = Object.assign(cfg.headers || {}, getHTTPHeaders()) return cfg }, (err: unknown) => { console.warn(err) return Promise.reject(new Error('客户端配置错误!')) }, ) _axios.interceptors.response.use( (response: AxiosResponse) => { // 数据成功 return Promise.resolve(response) }, (error: AxiosError) => { switch (Number(error.response?.status)) { case 403 | 401: return Promise.reject({ code: Number(error.response?.status) }) case 404: { return Promise.reject({ code: '404' }) } case 500: default: return Promise.reject({ code: '500', error: error.response?.data.message }) } }, ) export { _axios as http } export default { install: (app: App) => { app.config.globalProperties.$http = _axios }, }