diff --git a/src/api/types/account/client.d.ts b/src/api/types/account/client.d.ts index 52cfacb..7cabb6f 100644 --- a/src/api/types/account/client.d.ts +++ b/src/api/types/account/client.d.ts @@ -21,6 +21,9 @@ interface UserItem { id: number; username: string; par_uid: number; + wallet_capital:{ + amount:string + }, created_at: string; // 时间字符串类型 status: number; parent: ParentUser; // 嵌套的父级用户对象 diff --git a/src/components/common/ErrorBoundary.vue b/src/components/common/ErrorBoundary.vue index 88db1a0..aac29e6 100644 --- a/src/components/common/ErrorBoundary.vue +++ b/src/components/common/ErrorBoundary.vue @@ -31,8 +31,8 @@ const hasError = ref(false) const errorMessage = ref('') let unwatchRoute: (() => void) | null = null -// 判断是否为 API 请求错误(这些错误不应该触发错误边界) -const isApiError = (err: any): boolean => { +// 判断是否为 API 请求错误或表单验证错误(这些错误不应该触发错误边界) +const isApiError = (err: any): boolean => { console.log('err:', err); // axios 错误通常有 config 属性 if ((err as any).config) return true @@ -41,9 +41,32 @@ console.log('err:', err); // 超时错误 if (err.message?.includes('timeout') || err.message?.includes('Timeout')) return true // 请求被取消 - if (err.message?.includes('cancel') || err.message?.includes('cancel') || err.name === 'CanceledError') return true + if (err.message?.includes('cancel') || err.name === 'CanceledError') return true // 包含请求相关信息的错误 if (err.message?.includes('request') || err.message?.includes('Request') || err.data || err.msg) return true + + // ========== 表单验证相关错误 ========== + // Element Plus 表单验证错误格式:{ fieldName: [errorMessage], ... } + // 检查是否为普通对象(非 Error 实例)且值为数组(错误信息数组) + if (err && typeof err === 'object' && !err.message && !err.stack) { + const keys = Object.keys(err) + if (keys.length > 0 && keys.every(key => Array.isArray(err[key]))) { + // 这是一个表单验证错误对象 {varietyName: [错误信息], ...} + return true + } + } + // Element Plus 表单验证错误特征 + const errorMessage = err.message || err.msg || '' + // 表单验证错误常见关键词 + const formValidationKeywords = ['validate', 'validation', '校验', '验证', '必填', 'required', 'pattern', '格式'] + if (formValidationKeywords.some(keyword => errorMessage.toLowerCase().includes(keyword.toLowerCase()))) return true + // 表单验证错误对象特征(包含 field、trigger 等属性) + if (err.field || err.fieldName || err.prop || err.validator) return true + // 表单验证错误数组 + if (Array.isArray(err.errors) && err.errors.length > 0) return true + // 自定义表单验证错误类名 + if (err.name === 'ValidationError' || err.name === 'FormValidateError') return true + return true } diff --git a/src/views/profile/user/index.vue b/src/views/profile/user/index.vue index 0fe3dc3..69b2dca 100644 --- a/src/views/profile/user/index.vue +++ b/src/views/profile/user/index.vue @@ -264,6 +264,7 @@ const getClientList = async () => { // 处理表格数据 clientTree.value = data.data.map((item) => ({ ...item, + amount: item.wallet_capital.amount, //注册时间 createdTime: item.created_at, // 映射所属代理用户名 diff --git a/src/views/profile/user/options.ts b/src/views/profile/user/options.ts index 76925b4..801f85b 100644 --- a/src/views/profile/user/options.ts +++ b/src/views/profile/user/options.ts @@ -54,7 +54,7 @@ export const clientTableColumns = [ { prop: 'username', label: '用户名', align: 'center' as const }, { prop: 'createdTime', label: '注册时间', align: 'center' as const }, { prop: 'agentUsername', label: '所属代理', align: 'center' as const }, - { prop: 'wallet_capital.amount', label: '资金', align: 'center' as const, isNumber: true }, + { prop: 'amount', label: '资金', align: 'center' as const, isNumber: true }, { label: '状态', slotName: 'status', align: 'center' as const }, { label: '操作', slotName: 'action', align: 'center' as const }, ]