import type { Method } from 'alova' // Custom error class for API errors export class ApiError extends Error { code: number data?: any constructor(message: string, code: number, data?: any) { super(message) this.name = 'ApiError' this.code = code this.data = data } } // Define a type for the expected API response structure interface ApiResponse { code: number msg?: string data?: any success?: boolean total?: number more?: boolean } // Handle successful responses export async function handleAlovaResponse( response: UniApp.RequestSuccessCallbackResult | UniApp.UploadFileSuccessCallbackResult | UniApp.DownloadSuccessData, ) { const globalToast = useGlobalToast() // Extract status code and data from UniApp response const { statusCode, data } = response as UniNamespace.RequestSuccessCallbackResult // 处理401/403错误(如果不是在handleAlovaResponse中处理的) if ((statusCode === 401 || statusCode === 403)) { const { redirectName } = storeToRefs(useUserStore()) useSmqjhCartStore().$reset() // 如果是未授权错误,清除用户信息并跳转到登录页 useUserStore().$reset() redirectName.value = getCurrentPath() // useGlobalMessage().confirm({ // title: '提示', // msg: '登录已过期,请重新登录!', // success: () => { // router.replace({ name: 'smqjh-login' }) // }, // }) throw new ApiError('登录已过期,请重新登录!', statusCode, data) } // Handle HTTP error status codes if (statusCode >= 400) { const datas = data as ApiResponse globalToast.error(datas.msg as string) throw new ApiError(`Request failed with status: ${statusCode}`, statusCode, data) } // The data is already parsed by UniApp adapter const json = data as ApiResponse // Log response in development if (import.meta.env.MODE === 'development') { console.log('[Alova Response]', json) } // Return data for successful responses if (typeof json == 'string') { return JSON.parse(json).data } return json } // Handle request errors export function handleAlovaError(error: any, method: Method) { const globalToast = useGlobalToast() // Log error in development if (import.meta.env.MODE === 'development') { console.error('[Alova Error]', error, method) } // 处理401/403错误(如果不是在handleAlovaResponse中处理的) if (error instanceof ApiError && (error.code === 401 || error.code === 403)) { // 如果是未授权错误,清除用户信息并跳转到登录页 const { redirectName } = storeToRefs(useUserStore()) useSmqjhCartStore().$reset() // 如果是未授权错误,清除用户信息并跳转到登录页 useUserStore().$reset() redirectName.value = getCurrentPath() // useGlobalMessage().confirm({ // title: '提示', // msg: '登录已过期,请重新登录!', // success: () => { // router.replace({ name: 'smqjh-login' }) // }, // }) throw new ApiError('登录已过期,请重新登录!', error.code, error.data) } // Handle different types of errors if (error.name === 'NetworkError') { globalToast.error('网络错误,请检查您的网络连接') } else if (error.name === 'TimeoutError') { globalToast.error('请求超时,请重试') } else if (error instanceof ApiError) { globalToast.error(error.message || '请求失败') } else { globalToast.error('网络异常!请联系客服') } throw error }