From 1dbdee155e3f5af2023a294266a7f45d8e67ac50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=98=E9=A3=8E?= Date: Mon, 1 Dec 2025 16:58:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AB=98=E9=A2=91=E8=BD=AE?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3=E7=99=BD=E5=90=8D=E5=8D=95=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AF=B7=E6=B1=82=E6=88=AA=E6=B5=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E6=94=AF=E6=8C=81=E7=89=B9=E5=AE=9A=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E7=9A=84=E6=97=A0=E6=88=AA=E6=B5=81=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E3=80=82=E5=85=81=E8=AE=B8=E9=80=9A=E8=BF=87=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=88=AA=E6=B5=81=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=AF=B7=E6=B1=82=E5=A4=84=E7=90=86=E7=9A=84?= =?UTF-8?q?=E7=81=B5=E6=B4=BB=E6=80=A7=E5=92=8C=E7=94=A8=E6=88=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Touchkebao/src/api/request.ts | 37 +++++++++++++++++++++++++--------- Touchkebao/src/api/request2.ts | 34 +++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/Touchkebao/src/api/request.ts b/Touchkebao/src/api/request.ts index adfa7ea5..35e7bbe5 100644 --- a/Touchkebao/src/api/request.ts +++ b/Touchkebao/src/api/request.ts @@ -10,6 +10,13 @@ const { token } = useUserStore.getState(); const DEFAULT_DEBOUNCE_GAP = 1000; const debounceMap = new Map(); +// 需要高频轮询、不走截流的接口白名单(按实际接口路径调整) +const NO_DEBOUNCE_URLS = [ + "/wechat/friend/list", // 好友列表 + "/wechat/group/list", // 群组列表 + "/wechat/message/list", // 消息列表 +]; + const instance: AxiosInstance = axios.create({ baseURL: (import.meta as any).env?.VITE_API_BASE_URL || "/api", timeout: 20000, @@ -64,21 +71,31 @@ export function request( url: string, data?: any, method: Method = "GET", - config?: AxiosRequestConfig, + // 允许通过 config.debounce 控制是否开启截流,默认开启 + config?: AxiosRequestConfig & { debounce?: boolean }, debounceGap?: number, ): Promise { const gap = typeof debounceGap === "number" ? debounceGap : DEFAULT_DEBOUNCE_GAP; - const key = `${method}_${url}_${JSON.stringify(data)}`; - const now = Date.now(); - const last = debounceMap.get(key) || 0; - if (gap > 0 && now - last < gap) { - // Toast.show({ content: '请求过于频繁,请稍后再试', position: 'top' }); - return Promise.reject("请求过于频繁,请稍后再试"); - } - debounceMap.set(key, now); - const axiosConfig: AxiosRequestConfig = { + const enableDebounce = config?.debounce !== false; + const isInNoDebounceList = NO_DEBOUNCE_URLS.some(pattern => + url.includes(pattern), + ); + const shouldDebounce = enableDebounce && !isInNoDebounceList; + + if (shouldDebounce) { + const key = `${method}_${url}_${JSON.stringify(data)}`; + const now = Date.now(); + const last = debounceMap.get(key) || 0; + if (gap > 0 && now - last < gap) { + // Toast.show({ content: '请求过于频繁,请稍后再试', position: 'top' }); + return Promise.reject("请求过于频繁,请稍后再试"); + } + debounceMap.set(key, now); + } + + const axiosConfig: AxiosRequestConfig & { debounce?: boolean } = { url, method, ...config, diff --git a/Touchkebao/src/api/request2.ts b/Touchkebao/src/api/request2.ts index deb3d9bf..13732be0 100644 --- a/Touchkebao/src/api/request2.ts +++ b/Touchkebao/src/api/request2.ts @@ -9,11 +9,20 @@ import { useUserStore } from "@/store/module/user"; const DEFAULT_DEBOUNCE_GAP = 1000; const debounceMap = new Map(); +// 需要高频轮询、不走截流的接口白名单(按实际接口路径调整) +const NO_DEBOUNCE_URLS = [ + "/wechat/friend/list", + "/wechat/group/list", + "/wechat/message/list", +]; + interface RequestConfig extends AxiosRequestConfig { - headers: { + headers?: { Client?: string; "Content-Type"?: string; }; + // 是否开启截流,默认开启 + debounce?: boolean; } const instance: AxiosInstance = axios.create({ @@ -63,14 +72,23 @@ export function request( ): Promise { const gap = typeof debounceGap === "number" ? debounceGap : DEFAULT_DEBOUNCE_GAP; - const key = `${method}_${url}_${JSON.stringify(data)}`; - const now = Date.now(); - const last = debounceMap.get(key) || 0; - if (gap > 0 && now - last < gap) { - // Toast.show({ content: '请求过于频繁,请稍后再试', position: 'top' }); - return Promise.reject("请求过于频繁,请稍后再试"); + + const enableDebounce = config?.debounce !== false; + const isInNoDebounceList = NO_DEBOUNCE_URLS.some(pattern => + url.includes(pattern), + ); + const shouldDebounce = enableDebounce && !isInNoDebounceList; + + if (shouldDebounce) { + const key = `${method}_${url}_${JSON.stringify(data)}`; + const now = Date.now(); + const last = debounceMap.get(key) || 0; + if (gap > 0 && now - last < gap) { + // Toast.show({ content: '请求过于频繁,请稍后再试', position: 'top' }); + return Promise.reject("请求过于频繁,请稍后再试"); + } + debounceMap.set(key, now); } - debounceMap.set(key, now); const axiosConfig: RequestConfig = { url,