增加返回部门信息

This commit is contained in:
silk 2026-06-06 13:08:41 +08:00
parent 9c056ab391
commit 1343dbbdcb
3 changed files with 50 additions and 9 deletions

View File

@ -151,7 +151,7 @@ async def register(
return TokenResponse( return TokenResponse(
access_token=access_token, 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( return TokenResponse(
access_token=access_token, access_token=access_token,
user=UserResponse(**user.dict()) user=await UserService.build_user_response(conn, user)
) )
@auth_router.get("/me", response_model=UserResponse, summary="获取当前用户信息") @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: Args:
current_user: 当前登录用户 current_user: 当前登录用户
conn: 数据库连接
Returns: 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( return TokenResponse(
access_token=access_token, 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( return TokenResponse(
access_token=access_token, 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( return TokenResponse(
access_token=access_token, access_token=access_token,
user=UserResponse(**user.dict()) user=await UserService.build_user_response(conn, user)
) )

View File

@ -81,6 +81,15 @@ class UserLogin(BaseModel):
password: str 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): class UserResponse(BaseModel):
"""用户响应模型(不包含敏感信息)""" """用户响应模型(不包含敏感信息)"""
id: int id: int
@ -98,6 +107,8 @@ class UserResponse(BaseModel):
last_login_at: Optional[datetime] = None last_login_at: Optional[datetime] = None
enterprise_id: Optional[int] = None enterprise_id: Optional[int] = None
department_id: Optional[int] = None department_id: Optional[int] = None
department_name: Optional[str] = None
department: Optional[UserDepartmentInfo] = None
role: str = "employee" role: str = "employee"
is_first_login: bool = True is_first_login: bool = True

View File

@ -5,7 +5,8 @@ from datetime import datetime, timezone
from typing import Optional from typing import Optional
import asyncpg 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 core.security import get_password_hash, verify_password
from logger.logging import get_logger from logger.logging import get_logger
@ -392,3 +393,28 @@ class UserService:
) )
return User(**dict(row)) 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,
)