From 3507cfe9f7aa634883d8d61483102402e0ffecb4 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Wed, 26 Nov 2025 13:16:30 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20=E5=88=A0=E9=99=A4=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mocks/handlers/auth.js | 88 --------------------------- src/mocks/handlers/payment.js | 43 ------------- src/store/slices/subscriptionSlice.js | 16 +++++ 3 files changed, 16 insertions(+), 131 deletions(-) diff --git a/src/mocks/handlers/auth.js b/src/mocks/handlers/auth.js index f511986f..9de78675 100644 --- a/src/mocks/handlers/auth.js +++ b/src/mocks/handlers/auth.js @@ -409,91 +409,3 @@ export const authHandlers = [ }); }) ]; - -// ==================== Mock 调试工具(仅开发环境) ==================== - -/** - * 暴露全局API,方便手动触发微信扫码模拟 - * 使用方式: - * 1. 浏览器控制台输入:window.mockWechatScan() - * 2. 或者在组件中调用:window.mockWechatScan(sessionId) - */ -if (process.env.NODE_ENV === 'development' || process.env.REACT_APP_ENABLE_MOCK === 'true') { - window.mockWechatScan = (sessionId) => { - // 如果没有传入sessionId,尝试获取最新的session - let targetSessionId = sessionId; - - if (!targetSessionId) { - // 获取最新创建的session - const sessions = Array.from(mockWechatSessions.entries()); - if (sessions.length === 0) { - console.warn('[Mock API] 没有活跃的微信session,请先获取二维码'); - return false; - } - // 按创建时间排序,获取最新的 - const latestSession = sessions.sort((a, b) => b[1].createdAt - a[1].createdAt)[0]; - targetSessionId = latestSession[0]; - } - - const session = mockWechatSessions.get(targetSessionId); - - if (!session) { - console.error('[Mock API] Session不存在:', targetSessionId); - return false; - } - - if (session.status !== 'waiting') { - console.warn('[Mock API] Session状态不是waiting,当前状态:', session.status); - return false; - } - - // 立即触发扫码 - session.status = 'scanned'; - console.log(`[Mock API] ✅ 模拟扫码成功: ${targetSessionId}`); - - // 1秒后自动确认登录 - setTimeout(() => { - const session2 = mockWechatSessions.get(targetSessionId); - if (session2 && session2.status === 'scanned') { - session2.status = 'authorized'; // ✅ 使用 'authorized' 状态,与自动扫码流程保持一致 - session2.user = { - id: 999, - nickname: '微信测试用户', - wechat_openid: 'mock_openid_' + targetSessionId, - avatar_url: 'https://ui-avatars.com/api/?name=微信测试用户&size=150&background=4299e1&color=fff', - phone: null, - email: null, - has_wechat: true, - created_at: new Date().toISOString(), - subscription_type: 'free', - subscription_status: 'active', - subscription_end_date: null, - is_subscription_active: true, - subscription_days_left: 0 - }; - session2.user_info = { user_id: session2.user.id }; // ✅ 添加 user_info 字段 - console.log(`[Mock API] ✅ 模拟确认登录: ${targetSessionId}`, session2.user); - } - }, 1000); - - return true; - }; - - // 暴露获取当前sessions的方法(调试用) - window.getMockWechatSessions = () => { - const sessions = Array.from(mockWechatSessions.entries()).map(([id, session]) => ({ - sessionId: id, - status: session.status, - createdAt: new Date(session.createdAt).toLocaleString(), - hasUser: !!session.user - })); - console.table(sessions); - return sessions; - }; - - console.log('%c[Mock API] 微信登录调试工具已加载', 'color: #00D084; font-weight: bold'); - console.log('%c使用方法:', 'color: #666'); - console.log(' window.mockWechatScan() - 触发最新session的扫码'); - console.log(' window.mockWechatScan(sessionId) - 触发指定session的扫码'); - console.log(' window.getMockWechatSessions() - 查看所有活跃的sessions'); -} diff --git a/src/mocks/handlers/payment.js b/src/mocks/handlers/payment.js index 2d2f6213..7ba0f4a8 100644 --- a/src/mocks/handlers/payment.js +++ b/src/mocks/handlers/payment.js @@ -188,46 +188,3 @@ export const paymentHandlers = [ }); }) ]; - -// ==================== Mock 调试工具(仅开发环境) ==================== - -/** - * 暴露全局API,方便手动触发支付成功 - * 使用方式:window.mockPaymentSuccess(orderId) - */ -if (process.env.NODE_ENV === 'development' || process.env.REACT_APP_ENABLE_MOCK === 'true') { - window.mockPaymentSuccess = (orderId) => { - const order = mockOrders.get(orderId); - if (!order) { - console.error('[Mock Payment] 订单不存在:', orderId); - return false; - } - - if (order.status !== 'pending') { - console.warn('[Mock Payment] 订单状态不是待支付:', order.status); - return false; - } - - order.status = 'paid'; - order.paid_at = new Date().toISOString(); - console.log('[Mock Payment] ✅ 支付成功:', orderId); - return true; - }; - - window.getMockOrders = () => { - const orders = Array.from(mockOrders.entries()).map(([id, order]) => ({ - orderId: id, - status: order.status, - amount: order.amount, - plan: `${order.plan_name} - ${order.billing_cycle}`, - createdAt: new Date(order.created_at).toLocaleString() - })); - console.table(orders); - return orders; - }; - - console.log('%c[Mock Payment] 支付调试工具已加载', 'color: #00D084; font-weight: bold'); - console.log('%c使用方法:', 'color: #666'); - console.log(' window.mockPaymentSuccess(orderId) - 手动触发订单支付成功'); - console.log(' window.getMockOrders() - 查看所有模拟订单'); -} diff --git a/src/store/slices/subscriptionSlice.js b/src/store/slices/subscriptionSlice.js index 1f90eee7..4230ba34 100644 --- a/src/store/slices/subscriptionSlice.js +++ b/src/store/slices/subscriptionSlice.js @@ -7,6 +7,7 @@ import { getApiBase } from '../../utils/apiConfig'; /** * 异步 Thunk: 获取用户订阅信息 + * 使用 condition 选项防止同一时刻多个组件重复发起请求 */ export const fetchSubscriptionInfo = createAsyncThunk( 'subscription/fetchInfo', @@ -51,6 +52,21 @@ export const fetchSubscriptionInfo = createAsyncThunk( logger.error('subscriptionSlice', '加载订阅信息失败', error); return rejectWithValue(error.message); } + }, + { + // 防止重复请求:如果已加载或正在加载中,则跳过本次请求 + condition: (_, { getState }) => { + const { subscription } = getState(); + // 如果正在加载或已加载完成,返回 false 阻止请求 + if (subscription.loading || subscription.loaded) { + logger.debug('subscriptionSlice', '跳过重复请求', { + loading: subscription.loading, + loaded: subscription.loaded + }); + return false; + } + return true; + } } );