fix: 打手登录先认身份,默认邀请码改由后端下发

This commit is contained in:
XingQue
2026-07-30 18:05:45 +08:00
parent 3a9b275d0a
commit 7cda8ccbe1
4 changed files with 133 additions and 35 deletions

View File

@@ -512,12 +512,15 @@ class DashouZhuceView(APIView):
def post(self, request):
from jituan.services.api_compat import legacy_miniapp_error
# 1. 获取并验证邀请码参数
yaoqingma = request.data.get('inviteCode')
# 1. 获取并验证邀请码参数(空则用俱乐部默认码)
yaoqingma = (request.data.get('inviteCode') or '').strip()
if not yaoqingma:
from jituan.services.club_resolver import resolve_club_id_for_wechat_request
from jituan.services.default_invite import get_club_default_dashou_invite
yaoqingma = get_club_default_dashou_invite(resolve_club_id_for_wechat_request(request))
if not yaoqingma:
return legacy_miniapp_error(400, '邀请码不能为空')
yaoqingma = yaoqingma.strip()
if len(yaoqingma) > 100:
return legacy_miniapp_error(400, '邀请码长度超过限制')
@@ -813,21 +816,21 @@ class WechatLoginAndDashouRegisterView(APIView):
def post(self, request):
"""
处理微信登录并注册打手请求
顺序:先按 openid 认身份;已是打手则直接登录(不校验邀请码);
仅新注册才要求邀请码(请求体 / 俱乐部默认码)。
"""
try:
from jituan.services.api_compat import legacy_miniapp_error
# 1. 获取并验证参数
# 1. 获取并验证参数(邀请码对新用户才强制)
code = request.data.get('code', '').strip()
yaoqingma = request.data.get('inviteCode', '').strip()
if not code:
return legacy_miniapp_error(1, '微信授权码不能为空')
if not yaoqingma:
return legacy_miniapp_error(2, '邀请码不能为空')
if len(yaoqingma) > 100:
if yaoqingma and len(yaoqingma) > 100:
return legacy_miniapp_error(3, '邀请码长度超过限制')
# 2. 获取微信openid按俱乐部小程序 appid勿用全局星阙配置
@@ -848,11 +851,11 @@ class WechatLoginAndDashouRegisterView(APIView):
# 3. 获取客户端真实IP
kehuduan_ip = self.huoquKehuduanIP(request)
from jituan.constants import CLUB_ID_DEFAULT
from jituan.services.club_user import (
ensure_user_club_id,
resolve_or_create_wx_user,
)
from jituan.services.default_invite import get_club_default_dashou_invite
# 4. 开始数据库事务(确保登录和注册的原子性)
with transaction.atomic():
@@ -870,16 +873,34 @@ class WechatLoginAndDashouRegisterView(APIView):
user_main.UnionID = unionid
user_main.save()
# 4.2 验证邀请码对应的管事(注册逻辑)
ensure_user_club_id(user_main, club_id)
# 4.1 已是打手:直接登录,不校验邀请码
dashou_exists = UserDashou.query.filter(user=user_main).exists()
if dashou_exists:
dashou_profile = UserDashou.query.get(user=user_main)
if int(getattr(dashou_profile, 'zhanghaozhuangtai', 1) or 0) != 1:
reason = (getattr(dashou_profile, 'fengjin_yuanyin', '') or '').strip()
msg = '账号状态异常,您的账号已被封禁'
if reason:
msg = f'{msg}。原因:{reason}'
else:
msg = f'{msg},请联系客服'
return legacy_miniapp_error(4031, msg)
return self.fanhuiDengluZhuceshuju(user_main, dashou_profile)
# 4.2 新用户注册:邀请码优先用请求体,否则用俱乐部默认码
if not yaoqingma:
yaoqingma = get_club_default_dashou_invite(club_id)
if not yaoqingma:
return legacy_miniapp_error(2, '邀请码不能为空')
try:
# 使用select_related获取管事及其关联的主表用户信息
guanshi_profile = UserGuanshi.query.select_related('user').get(yaoqingma=yaoqingma)
except UserGuanshi.DoesNotExist:
ensure_user_club_id(user_main, club_id)
return legacy_miniapp_error(404, '邀请码无效或不存在')
from jituan.services.invite_guard import assert_invite_same_club
from jituan.services.club_resolver import resolve_club_id_for_wechat_request
from jituan.services.club_user import resolve_invite_party_club
ok, invite_msg = assert_invite_same_club(
@@ -895,27 +916,7 @@ class WechatLoginAndDashouRegisterView(APIView):
)
return legacy_miniapp_error(403, invite_msg)
ensure_user_club_id(user_main, resolve_club_id_for_wechat_request(request))
# 验证管事状态
# 4.3 检查用户是否已是打手
dashou_exists = UserDashou.query.filter(user=user_main).exists()
if dashou_exists:
# 用户已是打手,直接返回信息
dashou_profile = UserDashou.query.get(user=user_main)
# 账号封禁:禁止登录发 token前端进入登录页提示
if int(getattr(dashou_profile, 'zhanghaozhuangtai', 1) or 0) != 1:
reason = (getattr(dashou_profile, 'fengjin_yuanyin', '') or '').strip()
msg = '账号状态异常,您的账号已被封禁'
if reason:
msg = f'{msg}。原因:{reason}'
else:
msg = f'{msg},请联系客服'
return legacy_miniapp_error(4031, msg)
return self.fanhuiDengluZhuceshuju(user_main, dashou_profile)
# 4.4 核心:为用户创建所有身份(打手、商家、管事)
# 4.3 创建打手身份
guanshi_yonghuid = guanshi_profile.user.UserUID
# 创建打手扩展表
@@ -1143,10 +1144,16 @@ class WechatLoginAndDashouRegisterView(APIView):
except UserBoss.DoesNotExist:
pass
# 检查各身份状态(已是打手 ≠ 已是商家/管事,必须按表真实查询)
# 检查各身份状态(已是打手 ≠ 已是商家/管事/组长,必须按表真实查询)
dashou_status = 1
shangjia_status = 1 if UserShangjia.query.filter(user=user_main).exists() else 0
guanshi_status = 1 if UserGuanshi.query.filter(user=user_main).exists() else 0
zuzhang_status = 0
try:
zz = UserZuzhang.query.filter(user=user_main).first()
zuzhang_status = 1 if zz and int(getattr(zz, 'zhuangtai', 0) or 0) == 1 else 0
except Exception:
zuzhang_status = 0
# 生成token
refresh = RefreshToken.for_user(user_main)
@@ -1167,6 +1174,7 @@ class WechatLoginAndDashouRegisterView(APIView):
'shangjiastatus': shangjia_status,
'dashoustatus': dashou_status,
'guanshistatus': guanshi_status,
'zuzhangstatus': zuzhang_status,
'dashouqun': group_info.get('dashouqun', ''),
'dashouqunid': group_info.get('dashouqunid', ''),
'guanshiqun': group_info.get('guanshiqun', ''),