import type { Method } from 'alova' import type { AxiosError } from 'axios' import { axiosRequestAdapter } from '@alova/adapter-axios' import { createAlova } from 'alova' import { useNavStore } from '@/store/navigation' import { useUserStore } from '@/store/user' import { toast } from '@/utils/toast' enum HttpCode { Success = 200, Unauthorized = 401, Fail = 500, } // 仅保留「无需登录」接口 const WhiteList = [ '/auth/login/**', ] function isWhiteListed(url: string) { return WhiteList.some((pattern) => { if (pattern.endsWith('/**')) { const base = pattern.slice(0, -3) return url.startsWith(base) } return url === pattern }) } const alovaInstance = createAlova({ baseURL: 'http://192.168.5.6:8086/app', // baseURL: 'http://192.168.1.137:8086/app', requestAdapter: axiosRequestAdapter(), timeout: 5000, cacheFor: null, responded: { onSuccess: async (response, method: Method) => { const resData = response.data as ResponseData const result = { ...resData, isSuccess: resData.code === HttpCode.Success, } if (resData.code === HttpCode.Unauthorized) { useUserStore.getState().clear() useNavStore.getState().navigateToAuth() return Promise.reject(new Error('登录已失效')) } return result }, onError: (error: AxiosError) => { const status = error.status const config = error.config console.warn(`[HTTP ${status}] ${config?.method?.toUpperCase()} ${config?.url}`) switch (status) { case 400: toast.show({ title: '请求错误,请检查输入参数' }) break case 401: toast.show({ title: '未授权,请重新登录' }) break case 403: toast.show({ title: '没有权限访问该资源' }) break case 404: toast.show({ title: '请求丢失啦,请稍后再试!' }) break case 500: toast.show({ title: '服务器出错啦,请稍后重试' }) break case 502: toast.show({ title: '网关错误,请稍后重试' }) break case 503: toast.show({ title: '服务暂不可用,请稍后再试' }) break case 504: toast.show({ title: '网关超时,请稍后再试' }) break default: toast.show({ title: '服务器出错啦,请稍后重试' }) break } return Promise.reject(error) }, }, beforeRequest(method) { // 白名单接口直接放行 if (isWhiteListed(method.url)) return const userStore = useUserStore.getState() // 未登录直接拦截 if (!userStore.isLoggedIn()) { useNavStore.getState().navigateToAuth() return Promise.reject(new Error('未登录')) } // 注入 JWT method.config.headers.Token = userStore.userInfo!.token }, }) export default alovaInstance