feat: 商品/专区/店铺按俱乐部分离,工单统计与点单手机号认证

商品与专区、店铺增加 club_id(历史默认 xq);列表按俱乐部过滤;工单列表返回待办统计;新增 hqshouji/rzwlsjh 手机号查询与认证接口。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-21 01:55:14 +08:00
parent 7c6e14db01
commit d5b8ff5b8a
15 changed files with 332 additions and 80 deletions

View File

@@ -27,6 +27,8 @@ from .user_info import (
ShangJiaXinXiView,
ShangjiaNichengGengxinView,
UserInfoUpdateView,
GetUserPhoneView,
BindUserPhoneView,
YaoqingmaView,
ZaixianZhuangtaiAPIView,
huoquKehuduanIP,

View File

@@ -1175,4 +1175,107 @@ class LaobanJianquanView(APIView):
'code': 0,
'allow': 0,
'msg': '您暂无订单记录,消息功能暂不可用'
})
})
def _mask_phone(phone):
p = (phone or '').strip()
if len(p) < 7:
return p
return p[:3] + '****' + p[-4:]
def _phone_auth_completed(user):
if bool(getattr(user, 'PhoneVerified', False)):
return True
phone = (getattr(user, 'Phone', None) or '').strip()
return len(phone) >= 11
class GetUserPhoneView(APIView):
"""
点单提交页:查询当前用户手机号认证状态。
POST /yonghu/hqshouji
返回phone / phone_masked / phone_verified / need_auth
"""
permission_classes = [IsAuthenticated]
def post(self, request):
user = request.user
uid = getattr(user, 'UserUID', None)
if uid:
try:
user = User.query.get(UserUID=uid)
except User.DoesNotExist:
pass
verified = _phone_auth_completed(user)
phone = (getattr(user, 'Phone', None) or '').strip()
return Response({
'code': 0,
'msg': 'ok',
'data': {
'phone': phone if verified else '',
'phone_masked': _mask_phone(phone) if verified else '',
'phone_verified': verified,
'need_auth': not verified,
},
})
class BindUserPhoneView(APIView):
"""
点单提交页:一键获取手机号并完成认证(无需头像)。
POST /yonghu/rzwlsjh
参数shoujihao_code微信 getPhoneNumber 返回的 code
"""
permission_classes = [IsAuthenticated]
def post(self, request):
code = (
request.data.get('shoujihao_code')
or request.data.get('code')
or ''
)
if isinstance(code, str):
code = code.strip()
else:
code = str(code or '').strip()
if not code:
return Response({
'code': 6,
'msg': '未收到手机号授权,请重新点击获取手机号',
'data': None,
})
user = request.user
uid = getattr(user, 'UserUID', None)
if uid:
try:
user = User.query.get(UserUID=uid)
except User.DoesNotExist:
pass
# 复用资料页的微信换号逻辑
binder = UserInfoUpdateView()
phone = binder._get_phone_safe(code, request)
if not phone:
return Response({
'code': 6,
'msg': '手机号获取失败,请重新授权',
'data': None,
})
user.Phone = phone
user.PhoneVerified = True
user.save(update_fields=['Phone', 'PhoneVerified'])
return Response({
'code': 0,
'msg': '认证成功',
'data': {
'phone': phone,
'phone_masked': _mask_phone(phone),
'phone_verified': True,
'need_auth': False,
},
})