diff --git a/app/api/v1/auth.py b/app/api/v1/auth.py index 84975bb..e4565f6 100644 --- a/app/api/v1/auth.py +++ b/app/api/v1/auth.py @@ -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,16 +73,41 @@ 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) diff --git a/app/core/config.py b/app/core/config.py index b2a863c..74ab437 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -10,6 +10,13 @@ class Settings(BaseSettings): PROJECT_NAME: str = "美搭Meida API" 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] = ["*"] diff --git a/app/models/users.py b/app/models/users.py index 2866844..aa5aaca 100644 --- a/app/models/users.py +++ b/app/models/users.py @@ -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 } \ No newline at end of file diff --git a/app/schemas/auth.py b/app/schemas/auth.py index b5d23d0..f1a61f8 100644 --- a/app/schemas/auth.py +++ b/app/schemas/auth.py @@ -4,6 +4,7 @@ from typing import Optional class WechatLogin(BaseModel): """微信登录请求""" code: str + referral_code: Optional[str] = None class Token(BaseModel): """令牌响应""" diff --git a/app/schemas/user.py b/app/schemas/user.py index 91a8de9..2c1eebb 100644 --- a/app/schemas/user.py +++ b/app/schemas/user.py @@ -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): """创建用户请求模型""" diff --git a/app/services/user.py b/app/services/user.py index 4556f90..8237896 100644 --- a/app/services/user.py +++ b/app/services/user.py @@ -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()