- 新增小红书前端模块(启动服务、内容分析、爆款创作、发布记录、技能卡片、拟人设置、AI 助手) - 新增 xhs-agent-desktop 独立桌面 Agent,对接 OMS 任务调度 - 登录页重构,整合微信登录与 OMS JWT 认证 - 订单、渠道、用户中心等页面与 API 增强 Co-authored-by: Cursor <cursoragent@cursor.com>
78 lines
2.3 KiB
TypeScript
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
|
|
}
|
|
}
|
|
}
|