update
This commit is contained in:
parent
c30c864f5b
commit
9006faa3a3
@ -14,6 +14,8 @@ from app.services import user as user_service
|
||||
from app.core.exceptions import BusinessError
|
||||
from app.schemas.user import User
|
||||
from fastapi import Request
|
||||
import random
|
||||
import string
|
||||
# 创建日志记录器
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
@ -41,6 +43,10 @@ async def login(
|
||||
|
||||
return StandardResponse(code=200, message="登录成功", data=User.model_validate(user))
|
||||
|
||||
def generate_user_code():
|
||||
"""生成个人邀请码,6位数字加字母"""
|
||||
return ''.join(random.choices(string.ascii_letters + string.digits, k=6))
|
||||
|
||||
@router.post("/login/wechat", tags=["auth"])
|
||||
async def wechat_login(
|
||||
login_data: WechatLogin,
|
||||
@ -67,17 +73,42 @@ async def wechat_login(
|
||||
logger.info(f"用户状态: 新用户={is_new_user}")
|
||||
|
||||
if is_new_user:
|
||||
# 生成个人邀请码,6位数字加字母
|
||||
user_code = generate_user_code()
|
||||
|
||||
# 创建新用户
|
||||
user_create = UserCreate(
|
||||
openid=openid,
|
||||
unionid=unionid
|
||||
unionid=unionid,
|
||||
tryon_remain_count=settings.TRYON_REMAIN_COUNT,
|
||||
user_code=user_code,
|
||||
avatar=settings.DEFAULT_AVATAR,
|
||||
nickname=f"搭友{user_code}"
|
||||
)
|
||||
|
||||
if login_data.referral_code:
|
||||
user_create.referral_code = login_data.referral_code
|
||||
|
||||
# 获取推荐人,如果推荐人存在,则增加试穿次数
|
||||
if user_create.referral_code:
|
||||
referral_user = await user_service.get_user_by_user_code(db, user_code=user_create.referral_code)
|
||||
if referral_user:
|
||||
referral_user.tryon_remain_count += settings.TRYON_ADDITIONAL_COUNT
|
||||
await user_service.update_user(db, user_id=referral_user.id, user_update=referral_user)
|
||||
|
||||
user = await user_service.create_user(db, user=user_create)
|
||||
logger.info(f"创建新用户: id={user.id}")
|
||||
else:
|
||||
user = existing_user
|
||||
logger.info(f"现有用户登录: id={user.id}")
|
||||
|
||||
if user.user_code is None:
|
||||
user.user_code = generate_user_code()
|
||||
user.nickname = f"搭友{user.user_code}"
|
||||
user.avatar = settings.DEFAULT_AVATAR
|
||||
await user_service.update_user(db, user_id=user.id, user_update=user)
|
||||
|
||||
|
||||
# 创建访问令牌 - 使用openid作为标识
|
||||
access_token = security.create_access_token(subject=openid)
|
||||
|
||||
|
||||
@ -11,6 +11,13 @@ class Settings(BaseSettings):
|
||||
PROJECT_DESCRIPTION: str = "美搭Meida服务后端API"
|
||||
PROJECT_VERSION: str = "0.1.0"
|
||||
|
||||
# 试穿次数
|
||||
TRYON_REMAIN_COUNT: int = 5
|
||||
TRYON_ADDITIONAL_COUNT: int = 3
|
||||
|
||||
# 默认头像
|
||||
DEFAULT_AVATAR: str = "https://aidress-1311994147.cos.ap-chengdu.myqcloud.com/uploads/20250415/a9fecdb0fa3549488f010f7b89fdef1c.png"
|
||||
|
||||
# CORS设置
|
||||
BACKEND_CORS_ORIGINS: List[str] = ["*"]
|
||||
|
||||
|
||||
@ -13,6 +13,9 @@ class User(Base):
|
||||
unionid = Column(String(50), nullable=True, index=True)
|
||||
avatar = Column(String(255), nullable=True, comment="头像")
|
||||
nickname = Column(String(50), nullable=True, comment="昵称")
|
||||
tryon_remain_count = Column(Integer, default=0, nullable=False, comment="剩余试穿次数")
|
||||
user_code = Column(String(20), unique=True, nullable=True, index=True, comment="用户唯一邀请码")
|
||||
referral_code = Column(String(20), nullable=True, index=True, comment="推荐人邀请码")
|
||||
create_time = Column(DateTime, default=func.now(), comment="创建时间")
|
||||
|
||||
# 关系
|
||||
@ -31,5 +34,8 @@ class User(Base):
|
||||
"unionid": self.unionid,
|
||||
"avatar": self.avatar,
|
||||
"nickname": self.nickname,
|
||||
"tryon_remain_count": self.tryon_remain_count,
|
||||
"user_code": self.user_code,
|
||||
"referral_code": self.referral_code,
|
||||
"create_time": self.create_time
|
||||
}
|
||||
@ -4,6 +4,7 @@ from typing import Optional
|
||||
class WechatLogin(BaseModel):
|
||||
"""微信登录请求"""
|
||||
code: str
|
||||
referral_code: Optional[str] = None
|
||||
|
||||
class Token(BaseModel):
|
||||
"""令牌响应"""
|
||||
|
||||
@ -8,6 +8,9 @@ class UserBase(BaseModel):
|
||||
unionid: Optional[str] = None
|
||||
avatar: Optional[str] = None
|
||||
nickname: Optional[str] = None
|
||||
tryon_remain_count: Optional[int] = None
|
||||
referral_code: Optional[str] = None
|
||||
user_code: Optional[str] = None
|
||||
|
||||
class UserCreate(UserBase):
|
||||
"""创建用户请求模型"""
|
||||
|
||||
@ -16,12 +16,19 @@ async def get_users(db: AsyncSession, skip: int = 0, limit: int = 100):
|
||||
result = await db.execute(select(User).offset(skip).limit(limit))
|
||||
return result.scalars().all()
|
||||
|
||||
async def get_user_by_user_code(db: AsyncSession, user_code: str):
|
||||
result = await db.execute(select(User).filter(User.user_code == user_code))
|
||||
return result.scalars().first()
|
||||
|
||||
async def create_user(db: AsyncSession, user: UserCreate):
|
||||
db_user = User(
|
||||
openid=user.openid,
|
||||
unionid=user.unionid,
|
||||
avatar=user.avatar,
|
||||
nickname=user.nickname
|
||||
nickname=user.nickname,
|
||||
user_code=user.user_code,
|
||||
tryon_remain_count=user.tryon_remain_count,
|
||||
referral_code=user.referral_code
|
||||
)
|
||||
db.add(db_user)
|
||||
await db.commit()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user