From 6fed499d7853b3942ebaf13e3da1428cff15fb13 Mon Sep 17 00:00:00 2001 From: yangsy Date: Thu, 4 Jun 2026 22:06:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(vimp=E5=AE=A2=E6=88=B7=E7=AB=AF):=20?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=AE=8C=E6=95=B4=E8=AF=B7=E6=B1=82=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=B9=B6=E6=B7=BB=E5=8A=A0=E7=BB=9F=E4=B8=80=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E4=B8=8E=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增VimpRequestOptions配置接口,支持自定义请求、响应及错误拦截器 - 补充get、put、delete请求方法并封装统一响应格式 - 添加默认请求拦截器自动携带公共认证参数 - 实现401错误拦截,超时自动跳转登录页并重置用户状态 --- src/pages/vimp/apis/client/vimp-client.ts | 113 +++++++++++++++++++++- 1 file changed, 110 insertions(+), 3 deletions(-) diff --git a/src/pages/vimp/apis/client/vimp-client.ts b/src/pages/vimp/apis/client/vimp-client.ts index 1ec7176..b7159e2 100644 --- a/src/pages/vimp/apis/client/vimp-client.ts +++ b/src/pages/vimp/apis/client/vimp-client.ts @@ -1,9 +1,59 @@ -import type { AxiosError, AxiosRequestConfig, CreateAxiosDefaults } from 'axios'; -import axios from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; +import axios, { isAxiosError } from 'axios'; import type { VimpResponse, VimpResult } from '../../types'; +import { useUserStore } from '@/stores'; +import { getAppEnvConfig } from '@/utils'; +import router from '@/router'; + +export interface VimpRequestOptions extends CreateAxiosDefaults { + requestInterceptor?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise; + responseInterceptor?: (resp: AxiosResponse) => AxiosResponse | Promise; + responseErrorInterceptor?: (error: any) => any; +} + +export const createVimpClient = (config?: VimpRequestOptions) => { + const defaultRequestInterceptor = (config: InternalAxiosRequestConfig) => config; + const defaultResponseInterceptor = (response: AxiosResponse) => response; + const defaultResponseErrorInterceptor = (error: any) => { + if (isAxiosError(error)) { + if (error.status === 401) { + // 处理 401 错误 + } + if (error.status === 404) { + // 处理 404 错误 + } + } + return Promise.reject(error); + }; + + const requestInterceptor = config?.requestInterceptor ?? defaultRequestInterceptor; + const responseInterceptor = config?.responseInterceptor ?? defaultResponseInterceptor; + const responseErrorInterceptor = config?.responseErrorInterceptor ?? defaultResponseErrorInterceptor; -export const createVimpClient = (config?: CreateAxiosDefaults) => { const instance = axios.create(config); + instance.interceptors.request.use(requestInterceptor); + instance.interceptors.response.use(responseInterceptor, responseErrorInterceptor); + + const vimpGet = (url: string, options?: AxiosRequestConfig & { retRaw?: boolean }): Promise> => { + const { retRaw, ...reqConfig } = options ?? {}; + return new Promise((resolve) => { + instance + .get(url, { + ...reqConfig, + }) + .then((res) => { + if (retRaw) { + resolve([null, res.data as T, null]); + } else { + const resData = res.data as VimpResult; + resolve([null, resData.data, resData]); + } + }) + .catch((err) => { + resolve([err as AxiosError, null, null]); + }); + }); + }; const vimpPost = (url: string, data?: AxiosRequestConfig['data'], options?: Partial> & { retRaw?: boolean; upload?: boolean }): Promise> => { const { retRaw, upload, ...reqConfig } = options ?? {}; @@ -24,9 +74,40 @@ export const createVimpClient = (config?: CreateAxiosDefaults) => { }); }; + const httpPut = (url: string, data?: AxiosRequestConfig['data'], options?: Partial>): Promise> => { + const reqConfig = options ?? {}; + return new Promise((resolve) => { + instance + .put>(url, data, { ...reqConfig }) + .then((res) => { + resolve([null, res.data.data, res.data]); + }) + .catch((err) => { + resolve([err as AxiosError, null, null]); + }); + }); + }; + + const httpDelete = (url: string, idList: string[], options?: Partial>): Promise> => { + const reqConfig = options ?? {}; + return new Promise((resolve) => { + instance + .delete>(url, { ...reqConfig, data: idList }) + .then((res) => { + resolve([null, res.data.data, res.data]); + }) + .catch((err) => { + resolve([err as AxiosError, null, null]); + }); + }); + }; + return { instance, + get: vimpGet, post: vimpPost, + put: httpPut, + delete: httpDelete, }; }; @@ -42,4 +123,30 @@ export const unwrapVimpResponse = (resp: VimpResponse) => { export const vimpClient = createVimpClient({ baseURL: `/vimp/api/client`, + requestInterceptor: (config) => { + const userStore = useUserStore(); + const { lampAuthorization, lampClientId, lampClientSecret } = getAppEnvConfig(); + const newAuthorization = window.btoa(`${lampClientId}:${lampClientSecret}`); + const authorization = lampAuthorization.trim() !== '' ? lampAuthorization : newAuthorization; + config.headers.set('accept-language', 'zh-CN,zh;q=0.9'); + config.headers.set('accept', 'application/json, text/plain, */*'); + config.headers.set('Applicationid', ''); + config.headers.set('Tenantid', '1'); + config.headers.set('Authorization', authorization); + config.headers.set('token', userStore.userLoginResult?.token ?? ''); + return config; + }, + responseInterceptor: (response) => { + return response; + }, + responseErrorInterceptor: (error) => { + const err = error as AxiosError; + if (err.response?.status === 401) { + window.$message.error('登录超时,请重新登录'); + const userStore = useUserStore(); + userStore.resetStore(); + router.push({ path: '/login' }); + } + return Promise.reject(error); + }, });