增加返回部门信息

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(
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)
)

View File

@ -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

View File

@ -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,
)