feat(#558): 微信登录前端 - 授权按钮、回调页、绑定弹窗 #672
Reference in New Issue
Block a user
Delete Branch "feat/558-wechat-login-frontend"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
变更内容
1. API 层 (
src/api/auth.ts)getWechatAuthUrl()— 获取微信授权链接wechatCallback(code, state)— 微信回调登录sendVerificationCode()— 发送验证码(邮箱/手机)bindContact()— 绑定联系方式2. 登录页改造 (
src/pages/auth/Login.tsx)3. 微信回调页 (
src/pages/auth/WechatCallback.tsx)4. 绑定联系方式弹窗 (
src/components/auth/BindContactModal.tsx)5. 路由 (
src/router/index.tsx)/auth/wechat/callback路由依赖后端
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #672 已关闭或合并,对应的预览环境已被清理。
代码审查结果 - PR #672
⚠️ 问题(3个需要修改)
apps/web/src/components/auth/BindContactModal.tsx 第28-36行:倒计时逻辑存在严重内存泄漏和逻辑错误。
useEffect依赖[countdown]。每次countdown减 1 时,Effect 都会重新执行。由于countdown > 0始终为真,代码会不断创建新的setInterval而不清理旧的,导致倒计时速度呈指数级加快,严重时会导致页面卡顿。useRef保存 timer ID,并在 Effect 开始时先清理之前的 timer,或者仅在countdown变为 60 时启动定时器。apps/web/src/pages/auth/WechatCallback.tsx 第28行:
useEffect依赖项包含searchParams可能导致逻辑重复执行。useSearchParams返回的对象在每次渲染时可能被视为新的引用。将其直接放入依赖数组会导致回调逻辑在每次渲染时被触发,可能引发重复的 API 请求。code和state变量,将这两个具体值作为依赖项,或者使用searchParams.toString()。apps/web/src/pages/auth/WechatCallback.tsx 第30-33行:缺少 OAuth
state参数的校验与清理。Login.tsx中将state存入了localStorage,但在回调页WechatCallback.tsx中,仅从 URL 获取了state并直接传给后端,未与本地存储的state进行比对验证,也未在流程结束后清理localStorage。wechat_state可能影响后续登录流程。searchParams.get("state")与localStorage.getItem("wechat_state"),不一致则报错;流程结束后清除 localStorage。💡 建议(2个可选)
apps/web/src/components/auth/BindContactModal.tsx 第98-177行:同一个
form实例被用于两个独立的<Form>组件(邮箱和手机 Tab)。FormInstance,或者在 Tab 切换时手动重置字段。apps/web/src/pages/auth/WechatCallback.tsx 第78-81行:用户取消绑定时的状态清理。
handleBindCancel中,用户点击取消返回登录页。此时access_token已经存入 localStorage(第57行),但用户并未完成绑定。建议在跳转回登录页时清除本次登录产生的 Token,避免出现“已登录但未绑定”的中间态导致后续逻辑冲突。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 10:51:52 | 模型: