From 8787d5ddb75b7446986cb96f4fd54ee8abaafd38 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Tue, 28 Oct 2025 13:45:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E5=90=88register=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=BF=9B=E5=85=A5login=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 76 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/app.py b/app.py index c48734e0..1f32b243 100755 --- a/app.py +++ b/app.py @@ -2679,13 +2679,16 @@ def wechat_callback(): return redirect('/home?bind=failed') user = None + is_new_user = False + if unionid: user = User.query.filter_by(wechat_union_id=unionid).first() if not user: user = User.query.filter_by(wechat_open_id=openid).first() if not user: - # 创建新用户 + # 创建新用户(自动注册) + is_new_user = True # 先清理微信昵称 raw_nickname = user_info.get('nickname', '微信用户') # 创建临时用户实例以使用清理方法 @@ -2709,27 +2712,33 @@ def wechat_callback(): db.session.add(user) db.session.commit() - # 更新最后登录时间 - user.update_last_seen() - - # 设置session - session.permanent = True - session['user_id'] = user.id - session['username'] = user.username - session['logged_in'] = True - session['wechat_login'] = True # 标记是微信登录 - - # Flask-Login 登录 - login_user(user, remember=True) - - # 清理微信session(仅登录/注册流程清理;绑定流程在上方已处理,不在此处清理) + # 更新 wechat_qr_sessions 状态,供前端轮询检测 if state in wechat_qr_sessions: - # 仅当不是绑定流程,或没有模式信息时清理 - if not wechat_qr_sessions[state].get('mode'): - del wechat_qr_sessions[state] + session_item = wechat_qr_sessions[state] + # 不是绑定模式才更新为登录状态 + if not session_item.get('mode'): + session_item['status'] = 'register_ready' if is_new_user else 'login_ready' + session_item['user_info'] = { + 'user_id': user.id, + 'is_new_user': is_new_user + } - # 直接跳转到首页 - return redirect('/home') + # 返回一个简单的成功页面(前端轮询会检测到状态变化) + return ''' + + 授权成功 + +

微信授权成功

+

请返回原页面继续操作...

+ + + + ''', 200 except Exception as e: print(f"❌ 微信登录失败: {e}") @@ -2747,16 +2756,16 @@ def login_with_wechat(): return jsonify({'success': False, 'error': 'session_id不能为空'}), 400 # 验证session - session = wechat_qr_sessions.get(session_id) - if not session: + wechat_session = wechat_qr_sessions.get(session_id) + if not wechat_session: return jsonify({'success': False, 'error': '会话不存在或已过期'}), 400 # 检查session状态 - if session['status'] not in ['login_ready', 'register_ready']: + if wechat_session['status'] not in ['login_ready', 'register_ready']: return jsonify({'success': False, 'error': '会话状态无效'}), 400 # 检查是否有用户信息 - user_info = session.get('user_info') + user_info = wechat_session.get('user_info') if not user_info or not user_info.get('user_id'): return jsonify({'success': False, 'error': '用户信息不完整'}), 400 @@ -2768,18 +2777,33 @@ def login_with_wechat(): # 更新最后登录时间 user.update_last_seen() - # 清除session + # 设置 Flask session + session.permanent = True + session['user_id'] = user.id + session['username'] = user.username + session['logged_in'] = True + session['wechat_login'] = True # 标记是微信登录 + + # Flask-Login 登录 + login_user(user, remember=True) + + # 判断是否为新用户 + is_new_user = user_info.get('is_new_user', False) + + # 清除 wechat_qr_sessions del wechat_qr_sessions[session_id] # 生成登录响应 response_data = { 'success': True, - 'message': '登录成功' if session['status'] == 'login_ready' else '注册并登录成功', + 'message': '注册成功' if is_new_user else '登录成功', + 'isNewUser': is_new_user, 'user': { 'id': user.id, 'username': user.username, 'nickname': user.nickname or user.username, 'email': user.email, + 'phone': user.phone, 'avatar_url': user.avatar_url, 'has_wechat': True, 'wechat_open_id': user.wechat_open_id,