import { Message } from '@arco-design/web-vue' import { ApiError } from '@/api/rbac/generated/core/ApiError' import router from '@/router' import { useRbacUserStore } from '@/store/modules/rbac-user' /** * 全局错误处理器 */ export function handleApiError(error: any): void { if (error instanceof ApiError) { const { status, body } = error // 尝试从响应体中提取 message let errorMessage = '请求失败' if (body) { // 后端可能返回的格式:{ message: '错误信息' } 或 { Message: '错误信息' } errorMessage = body.message || body.Message || body.error || body.Error || errorMessage } switch (status) { case 400: Message.error(errorMessage || '请求参数错误') break case 401: Message.error('未授权,请重新登录') localStorage.removeItem('token') localStorage.removeItem('userInfo') // 清除所有RBAC相关存储 localStorage.removeItem('rbac_token') localStorage.removeItem('rbac_access_token') localStorage.removeItem('rbac_refresh_token') localStorage.removeItem('rbac_token_expires_at') localStorage.removeItem('rbac_userInfo') // 跳转到登录页 const rbacUserStore = useRbacUserStore() router.replace({ name: rbacUserStore.getLoginRouteName(), query: { redirect: router.currentRoute.value.fullPath, }, }) break case 403: Message.error(errorMessage || '没有权限访问') break case 404: Message.error(errorMessage || '请求的资源不存在') break case 500: Message.error(errorMessage || '服务器错误') break default: Message.error(errorMessage) } } else if (error?.message) { Message.error(error.message) } else { Message.error('未知错误') } } /** * 包装异步函数,自动处理错误 */ export function withErrorHandler Promise>( fn: T ): (...args: Parameters) => Promise | undefined> { return async (...args: Parameters) => { try { return await fn(...args) } catch (error) { handleApiError(error) return undefined } } }