feat: 修复用户登陆模块

This commit is contained in:
zdl
2025-10-16 15:23:50 +08:00
parent 98ea8f2427
commit 4ac6c4892e
3 changed files with 43 additions and 0 deletions

View File

@@ -159,6 +159,7 @@ export default function AuthFormContent() {
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
credentials: 'include',
body: JSON.stringify({ body: JSON.stringify({
credential, credential,
type: 'phone', type: 'phone',

View File

@@ -14,6 +14,7 @@ import { authService, WECHAT_STATUS, STATUS_MESSAGES } from "../../services/auth
// 配置常量 // 配置常量
const POLL_INTERVAL = 2000; // 轮询间隔2秒 const POLL_INTERVAL = 2000; // 轮询间隔2秒
const BACKUP_POLL_INTERVAL = 3000; // 备用轮询间隔3秒
const QR_CODE_TIMEOUT = 300000; // 二维码超时5分钟 const QR_CODE_TIMEOUT = 300000; // 二维码超时5分钟
export default function WechatRegister() { export default function WechatRegister() {
@@ -26,6 +27,7 @@ export default function WechatRegister() {
// 使用 useRef 管理定时器,避免闭包问题和内存泄漏 // 使用 useRef 管理定时器,避免闭包问题和内存泄漏
const pollIntervalRef = useRef(null); const pollIntervalRef = useRef(null);
const backupPollIntervalRef = useRef(null); // 备用轮询定时器
const timeoutRef = useRef(null); const timeoutRef = useRef(null);
const isMountedRef = useRef(true); // 追踪组件挂载状态 const isMountedRef = useRef(true); // 追踪组件挂载状态
const containerRef = useRef(null); // 容器DOM引用 const containerRef = useRef(null); // 容器DOM引用
@@ -67,6 +69,10 @@ export default function WechatRegister() {
clearInterval(pollIntervalRef.current); clearInterval(pollIntervalRef.current);
pollIntervalRef.current = null; pollIntervalRef.current = null;
} }
if (backupPollIntervalRef.current) {
clearInterval(backupPollIntervalRef.current);
backupPollIntervalRef.current = null;
}
if (timeoutRef.current) { if (timeoutRef.current) {
clearTimeout(timeoutRef.current); clearTimeout(timeoutRef.current);
timeoutRef.current = null; timeoutRef.current = null;
@@ -239,6 +245,40 @@ export default function WechatRegister() {
}; };
}, [clearTimers]); }, [clearTimers]);
/**
* 备用轮询机制 - 防止丢失状态
* 每3秒检查一次仅在获取到二维码URL且状态为waiting时执行
*/
useEffect(() => {
// 只在有auth_url、session_id且状态为waiting时启动备用轮询
if (wechatAuthUrl && wechatSessionId && wechatStatus === WECHAT_STATUS.WAITING) {
console.log('备用轮询:启动备用轮询机制');
backupPollIntervalRef.current = setInterval(() => {
try {
if (wechatStatus === WECHAT_STATUS.WAITING && isMountedRef.current) {
console.log('备用轮询:检查微信状态');
// 添加 .catch() 静默处理异步错误,防止被 ErrorBoundary 捕获
checkWechatStatus().catch(error => {
console.warn('备用轮询检查失败(静默处理):', error);
});
}
} catch (error) {
// 捕获所有同步错误,防止被 ErrorBoundary 捕获
console.warn('备用轮询执行出错(静默处理):', error);
}
}, BACKUP_POLL_INTERVAL);
}
// 清理备用轮询
return () => {
if (backupPollIntervalRef.current) {
clearInterval(backupPollIntervalRef.current);
backupPollIntervalRef.current = null;
}
};
}, [wechatAuthUrl, wechatSessionId, wechatStatus, checkWechatStatus]);
/** /**
* 测量容器尺寸并计算缩放比例 * 测量容器尺寸并计算缩放比例
*/ */
@@ -314,6 +354,7 @@ export default function WechatRegister() {
> >
<iframe <iframe
src={wechatAuthUrl} src={wechatAuthUrl}
title="微信扫码登录"
width="300" width="300"
height="350" height="350"
style={{ style={{

View File

@@ -179,6 +179,7 @@ export default function SignInIllustration() {
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
credentials: 'include',
body: JSON.stringify({ body: JSON.stringify({
credential, credential,
type, type,