From dbabce77bf8976ff7614e059c8b5602c3ab267ee Mon Sep 17 00:00:00 2001 From: penghanyuan Date: Thu, 29 Jan 2026 18:40:16 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=98=B5=E7=A7=B0=E5=8A=9F=E8=83=BD=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/routers/auth.py | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) 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),