diff --git a/api/routers/auth.py b/api/routers/auth.py index 65b9ec5..697d72c 100644 --- a/api/routers/auth.py +++ b/api/routers/auth.py @@ -100,6 +100,11 @@ class ChangePhoneRequest(BaseModel): code: str = Field(..., min_length=6, max_length=6, description="验证码(6位)") +class UpdateNicknameRequest(BaseModel): + """更新昵称请求""" + nickname: str = Field(..., min_length=1, max_length=50, description="昵称(1-50个字符)") + + # 响应模型 class TokenResponse(BaseModel): """令牌响应""" @@ -659,25 +664,21 @@ async def login_with_sms( # 如果用户不存在,自动注册 if not user: - # 注册时需要提供昵称 - if not request.nickname or len(request.nickname.strip()) == 0: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="首次登录需要设置昵称" - ) - # 创建新用户 user_id = str(uuid.uuid4()) # 生成一个随机密码(用户不会用到,但数据库要求必填) random_password = secrets.token_urlsafe(32) password_hash = hash_password(random_password) + # 如果提供了昵称就使用,否则使用空字符串(表示需要后续设置) + nickname = request.nickname.strip() if request.nickname else "" + user = User( id=user_id, phone=request.phone, password_hash=password_hash, email=None, - nickname=request.nickname.strip(), + nickname=nickname, subscription_type="free", created_at=datetime.now(timezone.utc) ) @@ -922,6 +923,33 @@ async def change_phone( ) +@router.put("/me/nickname", response_model=UserResponse) +async def update_nickname( + request: UpdateNicknameRequest, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_async_db) +): + """ + 更新用户昵称 + + 用于首次登录后设置昵称,或修改现有昵称 + """ + # 更新昵称 + current_user.nickname = request.nickname.strip() + await db.commit() + await db.refresh(current_user) + + return UserResponse( + id=current_user.id, + phone=current_user.phone, + email=current_user.email, + nickname=current_user.nickname, + avatar_url=current_user.avatar_url, + subscription_type=current_user.subscription_type, + created_at=current_user.created_at.isoformat() + ) + + @router.post("/logout/all") async def logout_all_devices( current_user: User = Depends(get_current_user),