front/src/utils/rbac-error-handler.ts
zzh 5a26ae0048 feat: 小红书模块迁移、登录重构与 xhs-agent-desktop 桌面 Agent
- 新增小红书前端模块(启动服务、内容分析、爆款创作、发布记录、技能卡片、拟人设置、AI 助手)

- 新增 xhs-agent-desktop 独立桌面 Agent,对接 OMS 任务调度

- 登录页重构,整合微信登录与 OMS JWT 认证

- 订单、渠道、用户中心等页面与 API 增强

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 16:13:13 +08:00

78 lines
2.3 KiB
TypeScript

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<T extends (...args: any[]) => Promise<any>>(
fn: T
): (...args: Parameters<T>) => Promise<ReturnType<T> | undefined> {
return async (...args: Parameters<T>) => {
try {
return await fn(...args)
} catch (error) {
handleApiError(error)
return undefined
}
}
}