feat: 添加更新昵称功能 backend
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user