This commit is contained in:
aaron 2025-04-15 11:07:21 +08:00
parent c30c864f5b
commit 9006faa3a3
6 changed files with 57 additions and 2 deletions

View File

@ -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)

View File

@ -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] = ["*"]

View File

@ -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
}

View File

@ -4,6 +4,7 @@ from typing import Optional
class WechatLogin(BaseModel):
"""微信登录请求"""
code: str
referral_code: Optional[str] = None
class Token(BaseModel):
"""令牌响应"""

View File

@ -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):
"""创建用户请求模型"""

View File

@ -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()