diff --git a/apps/vue/src/enums/httpEnum.ts b/apps/vue/src/enums/httpEnum.ts index 4944af5c2..493916d6c 100644 --- a/apps/vue/src/enums/httpEnum.ts +++ b/apps/vue/src/enums/httpEnum.ts @@ -2,10 +2,9 @@ * @description: Request result set */ export enum ResultEnum { + CODE = '0', SUCCESS = 0, - ERROR = 1, - TIMEOUT = 401, - TYPE = 'success', + MESSAGE = 'OK', } /** diff --git a/apps/vue/src/utils/http/axios/index.ts b/apps/vue/src/utils/http/axios/index.ts index 34d873b0f..455453406 100644 --- a/apps/vue/src/utils/http/axios/index.ts +++ b/apps/vue/src/utils/http/axios/index.ts @@ -7,9 +7,11 @@ import type { AxiosTransform, CreateAxiosOptions } from './axiosTransform'; import { VAxios } from './Axios'; import { checkResponse } from './checkStatus'; import { useGlobSetting } from '/@/hooks/setting'; -import { RequestEnum, ContentTypeEnum } from '/@/enums/httpEnum'; +import { useMessage } from '/@/hooks/web/useMessage'; +import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum'; import { isString } from '/@/utils/is'; import { getToken } from '/@/utils/auth'; +import { useI18n } from '/@/hooks/web/useI18n'; import { setObjToUrlParams, deepMerge } from '/@/utils'; import { useErrorLogStoreWithOut } from '/@/store/modules/errorLog'; import { joinTimestamp, formatRequestDate } from './helper'; @@ -18,6 +20,7 @@ import { Persistent } from '../../cache/persistent'; const globSetting = useGlobSetting(); const urlPrefix = globSetting.urlPrefix; +const { createMessage, createErrorModal } = useMessage(); /** * @description: 数据处理,方便区分多种处理方式 @@ -27,14 +30,39 @@ const transform: AxiosTransform = { * @description: 处理请求数据。如果数据不是预期格式,可直接抛出错误 */ transformRequestHook: (res: AxiosResponse, options: RequestOptions) => { + const { t } = useI18n(); const { isReturnNativeResponse } = options; // 是否返回原生响应头 比如:需要获取响应头时使用该属性 if (isReturnNativeResponse) { return res; } + + const { data } = res; + if (!data) { + // return '[HTTP] Request has no return value'; + throw new Error(t('sys.api.apiRequestFailed')); + } + + // 对包装结果处理 + if (res.headers['_abpwrapresult'] === 'true') { + const { code, result, message, details } = data; + const hasSuccess = data && Reflect.has(data, 'code') && code === ResultEnum.CODE; + if (hasSuccess) { + return result; + } + + const title = details ? message : t('sys.api.errorTip'); + const content = details ? details : message; + if (options.errorMessageMode === 'modal') { + createErrorModal({ title: title, content: content }); + } else if (options.errorMessageMode === 'message') { + createMessage.error(content); + } + + throw new Error(content || t('sys.api.apiRequestFailed')); + } + return res.data; - // 不进行任何处理,直接返回 - // 用于页面代码可能需要直接获取code,data,message这些信息时开启 }, // 请求之前处理config diff --git a/apps/vue/types/axios.d.ts b/apps/vue/types/axios.d.ts index e60187f9f..865aa1a52 100644 --- a/apps/vue/types/axios.d.ts +++ b/apps/vue/types/axios.d.ts @@ -26,9 +26,9 @@ export interface RequestOptions { } export interface Result { - code: number; - type: 'success' | 'error' | 'warning'; + code: number | string; message: string; + details?: string; result: T; }