From 7b81d2944af317622d64110acb071eec02738431 Mon Sep 17 00:00:00 2001 From: Admin Date: Mon, 13 Jul 2026 00:52:08 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=95=86=E5=93=81=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E6=9C=AA=E7=99=BB=E5=BD=95=E6=97=B6=E4=B8=8D=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E7=99=BB=E5=BD=95=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - request.ts: 增加 silent 选项支持静默请求 - request.ts: 公开接口 401 不显示消息也不跳转 - ProductDetail.vue: fetchUserCredits 先检查 token,未登录直接跳过请求 --- frontend/src/utils/request.ts | 23 ++++++++++++++++------- frontend/src/views/user/ProductDetail.vue | 8 +++++++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index da5b78c..79a474e 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -25,6 +25,10 @@ api.interceptors.response.use( (response) => response.data, (error) => { const message = error.response?.data?.error || error.message || 'Request failed' + + // 如果请求标记为静默失败,不显示任何消息 + const silent = error.config?.silent + if (error.response?.status === 401) { const isLoginRequest = error.config?.url?.includes('/auth/login') const isRegisterRequest = error.config?.url?.includes('/auth/register') @@ -38,21 +42,26 @@ api.interceptors.response.use( error.config?.url?.includes('/lotteries') if (isLoginRequest || isRegisterRequest) { - ElMessage.error(message) - } else if (!isPublicRequest) { + if (!silent) ElMessage.error(message) + } else if (!isPublicRequest && !silent) { localStorage.removeItem('token') localStorage.removeItem('user') ElMessage.error('请先登录') router.push('/login') - } else { - // 公开接口的 401 错误静默处理,不跳转登录 - console.warn('Public API 401:', error.config?.url) } - } else { + // 公开接口或静默请求的 401 错误不显示消息也不跳转 + } else if (!silent) { ElMessage.error(message) } return Promise.reject(error) }, ) -export default api +// 扩展 axios 类型以支持 silent 选项 +declare module 'axios' { + interface AxiosRequestConfig { + silent?: boolean + } +} + +export default api \ No newline at end of file diff --git a/frontend/src/views/user/ProductDetail.vue b/frontend/src/views/user/ProductDetail.vue index e9ceffe..9b527e3 100644 --- a/frontend/src/views/user/ProductDetail.vue +++ b/frontend/src/views/user/ProductDetail.vue @@ -93,10 +93,16 @@ function hasEnoughCredit(): boolean { // 获取用户资格信息 async function fetchUserCredits() { + // 未登录时静默跳过,不发起请求 + const token = localStorage.getItem('token') + if (!token) return + try { const res: any = await userApi.getProfile() userCredits.value = res.data?.purchase_credits || 0 - } catch {} + } catch { + // 静默处理错误 + } } onMounted(async () => {