diff --git a/backend/api/auth.py b/backend/api/auth.py index c20093f..c2010f5 100644 --- a/backend/api/auth.py +++ b/backend/api/auth.py @@ -151,7 +151,7 @@ async def register( return TokenResponse( access_token=access_token, - user=UserResponse(**user.dict()) + user=await UserService.build_user_response(conn, user) ) @@ -188,22 +188,26 @@ async def login( return TokenResponse( access_token=access_token, - user=UserResponse(**user.dict()) + user=await UserService.build_user_response(conn, user) ) @auth_router.get("/me", response_model=UserResponse, summary="获取当前用户信息") -async def get_me(current_user: User = Depends(get_current_user)): +async def get_me( + current_user: User = Depends(get_current_user), + conn: asyncpg.Connection = Depends(get_db), +): """ 获取当前登录用户信息 Args: current_user: 当前登录用户 + conn: 数据库连接 Returns: - UserResponse: 用户信息 + UserResponse: 用户信息(含部门名称等) """ - return UserResponse(**current_user.dict()) + return await UserService.build_user_response(conn, current_user) # ==================== 手机号注册/登录接口 ==================== @@ -297,7 +301,7 @@ async def phone_register( return TokenResponse( access_token=access_token, - user=UserResponse(**user.dict()) + user=await UserService.build_user_response(conn, user) ) @@ -350,7 +354,7 @@ async def phone_login( return TokenResponse( access_token=access_token, - user=UserResponse(**user.dict()) + user=await UserService.build_user_response(conn, user) ) @@ -403,7 +407,7 @@ async def wechat_login( return TokenResponse( access_token=access_token, - user=UserResponse(**user.dict()) + user=await UserService.build_user_response(conn, user) ) diff --git a/backend/models/user.py b/backend/models/user.py index 8f54cb3..e26a1de 100644 --- a/backend/models/user.py +++ b/backend/models/user.py @@ -81,6 +81,15 @@ class UserLogin(BaseModel): password: str +class UserDepartmentInfo(BaseModel): + """用户所属部门信息""" + id: int + name: str + parent_id: Optional[int] = None + leader_user_id: Optional[int] = None + leader_name: Optional[str] = None + + class UserResponse(BaseModel): """用户响应模型(不包含敏感信息)""" id: int @@ -98,6 +107,8 @@ class UserResponse(BaseModel): last_login_at: Optional[datetime] = None enterprise_id: Optional[int] = None department_id: Optional[int] = None + department_name: Optional[str] = None + department: Optional[UserDepartmentInfo] = None role: str = "employee" is_first_login: bool = True diff --git a/backend/services/user_service.py b/backend/services/user_service.py index 9395fd2..6be672d 100644 --- a/backend/services/user_service.py +++ b/backend/services/user_service.py @@ -5,7 +5,8 @@ from datetime import datetime, timezone from typing import Optional import asyncpg -from models.user import User, UserCreate +from models.user import User, UserCreate, UserResponse, UserDepartmentInfo +from services.department_service import DepartmentService from core.security import get_password_hash, verify_password from logger.logging import get_logger @@ -392,3 +393,28 @@ class UserService: ) return User(**dict(row)) + @staticmethod + async def build_user_response(conn: asyncpg.Connection, user: User) -> UserResponse: + """构建含部门信息的用户响应""" + department = None + department_name = None + if user.department_id is not None and user.enterprise_id is not None: + dept = await DepartmentService.get_by_id( + conn, user.department_id, user.enterprise_id + ) + if dept: + department_name = dept["name"] + department = UserDepartmentInfo( + id=dept["id"], + name=dept["name"], + parent_id=dept.get("parent_id"), + leader_user_id=dept.get("leader_user_id"), + leader_name=dept.get("leader_name"), + ) + data = user.model_dump(exclude={"hashed_password"}) + return UserResponse( + **data, + department_name=department_name, + department=department, + ) +