Skip to content

用户修改

用户信息更新

I.请求与响应过程

当用户在用户信息页面点击个人简介时,可以进行用户信息修改操作

flowchart  LR

    subgraph B [后端]
        U[FastAPI服务]
    end

    subgraph A [用户界面]
        direction LR
        F1[用户信息页]
    end

   A -- ① 请求分类<br> /api/user/update --> B
   B -- ② 返回响应 <br> {'code': 200,'message': 'success',data': [{'id': 1,'username': 用户名,'bio':'个人简介'}]}  -->  A

image-20251025140438431

II. 数据校验模型

需要对用户更新的数据进行验证,确保用户信息的准确性

class UserUpdateRequest(BaseModel):
    """
    用户信息更新请求数据模型
    """
    nickname: str = None
    avatar: str = None
    gender: str = None
    bio: str = None
    phone: str = None

    class Config:
        schema_extra = {
            "example": {
                "nickname": "New Nickname",
                "avatar": "https://example.com/new_avatar.jpg",
                "gender": "female",
                "bio": "Updated bio"
            }
        }

image-20251025141050565

III. 路由定义

users.py文件,编写路由解析代码,注意 请求方式是PUT

from schemas.users import UserRegisterRequest,UserLoginRequest,UserUpdateRequest

## ....................
## 其他代码
## ...................

@router.put("/update")
async def update_user_info(
        user_data: UserUpdateRequest,
        authorization: str = Header(...),
        db: AsyncSession = Depends(get_db)
):
    """
    更新用户个人信息

    Args:
        user_data: 用户更新请求数据
        authorization: Authorization请求头
        db: 数据库会话

    Returns:
        dict: 更新成功响应
    """


    # 返回成功响应
    return {
        "code": 200,
        "message": "更新成功",
        "data": '用户信息更新'

    }

image-20251025141254023

main.py文件中已经进行路由注册,无需再注册路由

重启FastAPI服务,运行测试,检查定义的路由接口是否能够处理前端发送的请求。

因为用户已经登录,所有在发送请求时需要携带token信息 Authorization: asdiqowjioqw

1
2
3
4
5
6
7
8
### 用户信息更新
PUT http://127.0.0.1:8000/api/user/update
Content-Type: application/json
Authorization: 597d92a4-2183-49e5-b14e-04fa95b6f6b8

{
  "bio": "新的简介信息"
}

image-20251025141443799

IV. 定义模型类

用户模型类在注册时已经完成,无需再定义

V. 编写ORM数据操作

users.py文件

主要实现以下功能:

  • 验证token信息
from schemas.users import UserRegisterRequest,UserUpdateRequest
from sqlalchemy import update,select
## ................
## 其他代码
## ................

async def update_user(db: AsyncSession, username: str, user_data: UserUpdateRequest) -> User:
    """
    更新用户信息

    Args:
        db: 数据库会话
        username: 用户名
        user_data: 用户更新数据

    Returns:
        User: 更新后的用户对象

    Raises:
        Exception: 数据库操作异常
    """
    try:
        # 构建更新字典,只包含非空字段,可根据实际字段需要修改
        update_data = {}
        if user_data.nickname is not None:
            update_data["nickname"] = user_data.nickname
        if user_data.avatar is not None:
            update_data["avatar"] = user_data.avatar
        if user_data.gender is not None:
            update_data["gender"] = user_data.gender
        if user_data.bio is not None:
            update_data["bio"] = user_data.bio
        if user_data.phone is not None:
            update_data["phone"] = user_data.phone

        # 如果有需要更新的字段,则执行更新操作
        if update_data:
            stmt = update(User).where(User.username == username).values(**update_data)
            await db.execute(stmt)
            await db.commit()

        # 获取更新后的用户信息
        updated_user = await get_user_by_username(db, username)
        return updated_user
    except Exception as e:
        await db.rollback()
        raise e

image-20251025141950419

VI. 路由中实现数据操作

回到对应的路由中,调用刚才编写好的数据处理函数。

@router.put("/update")
async def update_user_info(
        user_data: UserUpdateRequest,
        authorization: str = Header(...),
        db: AsyncSession = Depends(get_db)
):
    """
    更新用户个人信息

    Args:
        user_data: 用户更新请求数据
        authorization: Authorization请求头
        db: 数据库会话

    Returns:
        dict: 更新成功响应
    """
    try:

        token = authorization

        # 根据令牌获取用户
        user = await users.get_user_by_token(db, token)
        if not user:
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="无效的认证令牌或令牌已过期"
            )

        # 更新用户信息
        updated_user = await users.update_user(db, user.username, user_data)

        # 返回成功响应
        return {
            "code": 200,
            "message": "更新成功",
            "data": {
                "id": updated_user.id,
                "username": updated_user.username,
                "nickname": updated_user.nickname,
                "avatar": updated_user.avatar,
                "gender": updated_user.gender,
                "bio": updated_user.bio
            }
        }
    except HTTPException:
        # 重新抛出自定义异常
        raise
    except Exception as e:
        # 处理其他异常
        await db.rollback()
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="更新失败,请稍后重试"
        )

重启FastAPI服务,测试数据是否正常返回,从数据库中获取真实的用户token

image-20251025142055950

启动前端服务检查数据是否正常加载

image-20251025142124790

image-20251025142133358