admin_user_router.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. """
  2. 管理员用户管理API路由
  3. 提供用户列表、详情、状态变更等API端点
  4. """
  5. from typing import Optional
  6. from datetime import date
  7. from fastapi import APIRouter, Depends, HTTPException, status, Query, Request
  8. from sqlalchemy.orm import Session
  9. from app.database import get_db
  10. from app.schemas.admin_schema import (
  11. UserListItem, UserDetailResponse, UserUsageStats,
  12. UserStatusRequest, ResetPasswordResponse
  13. )
  14. from app.schemas.model_schema import PaginatedResponse
  15. from app.services.admin_user_service import AdminUserService
  16. from app.services.operation_log_service import OperationLogService
  17. from app.dependencies.admin_auth import get_current_admin
  18. from app.models.admin import AdminUser
  19. router = APIRouter(prefix="/api/admin/users", tags=["用户管理"])
  20. ERROR_MESSAGES = {
  21. "USER_NOT_FOUND": "用户不存在",
  22. "STATUS_UNCHANGED": "状态无需变更"
  23. }
  24. @router.get("", response_model=PaginatedResponse)
  25. def list_users(
  26. keyword: Optional[str] = Query(None, description="搜索关键词"),
  27. user_status: Optional[str] = Query(None, alias="status", description="账户状态"),
  28. register_start: Optional[date] = Query(None, description="注册开始日期"),
  29. register_end: Optional[date] = Query(None, description="注册结束日期"),
  30. sort_by: str = Query("created_at", description="排序字段"),
  31. sort_order: str = Query("desc", description="排序方向"),
  32. page: int = Query(1, ge=1, description="页码"),
  33. size: int = Query(20, ge=1, le=100, description="每页数量"),
  34. current_admin: AdminUser = Depends(get_current_admin),
  35. db: Session = Depends(get_db)
  36. ):
  37. """获取用户列表"""
  38. from app.schemas.admin_schema import UserListParams
  39. params = UserListParams(
  40. keyword=keyword,
  41. status=user_status,
  42. register_start=register_start,
  43. register_end=register_end,
  44. sort_by=sort_by,
  45. sort_order=sort_order,
  46. page=page,
  47. size=size
  48. )
  49. service = AdminUserService(db)
  50. users, total = service.list_users(params)
  51. return PaginatedResponse(
  52. items=[u.model_dump() for u in users],
  53. total=total,
  54. page=page,
  55. page_size=size
  56. )
  57. @router.get("/{user_id}", response_model=UserDetailResponse)
  58. def get_user_detail(
  59. user_id: str,
  60. current_admin: AdminUser = Depends(get_current_admin),
  61. db: Session = Depends(get_db)
  62. ):
  63. """获取用户详情"""
  64. service = AdminUserService(db)
  65. user = service.get_user_detail(user_id)
  66. if not user:
  67. raise HTTPException(
  68. status_code=status.HTTP_404_NOT_FOUND,
  69. detail={"code": "USER_NOT_FOUND", "message": "用户不存在"}
  70. )
  71. return user
  72. @router.get("/{user_id}/usage-stats", response_model=UserUsageStats)
  73. def get_user_usage_stats(
  74. user_id: str,
  75. current_admin: AdminUser = Depends(get_current_admin),
  76. db: Session = Depends(get_db)
  77. ):
  78. """获取用户使用统计"""
  79. service = AdminUserService(db)
  80. return service.get_user_usage_stats(user_id)
  81. @router.post("/{user_id}/status")
  82. def update_user_status(
  83. user_id: str,
  84. data: UserStatusRequest,
  85. request: Request,
  86. current_admin: AdminUser = Depends(get_current_admin),
  87. db: Session = Depends(get_db)
  88. ):
  89. """更新用户状态"""
  90. service = AdminUserService(db)
  91. try:
  92. service.update_user_status(user_id, data.status)
  93. # 记录操作日志
  94. log_service = OperationLogService(db)
  95. log_service.create_log(
  96. admin_id=current_admin.id,
  97. operation_type="update",
  98. module="user",
  99. target_id=user_id,
  100. detail={"action": "update_status", "new_status": data.status},
  101. ip_address=request.client.host if request.client else None
  102. )
  103. return {"message": "状态更新成功", "user_id": user_id, "status": data.status}
  104. except ValueError as e:
  105. error_code = str(e)
  106. raise HTTPException(
  107. status_code=status.HTTP_400_BAD_REQUEST if error_code == "STATUS_UNCHANGED" else status.HTTP_404_NOT_FOUND,
  108. detail={"code": error_code, "message": ERROR_MESSAGES.get(error_code, "操作失败")}
  109. )
  110. @router.post("/{user_id}/reset-password", response_model=ResetPasswordResponse)
  111. def reset_user_password(
  112. user_id: str,
  113. request: Request,
  114. current_admin: AdminUser = Depends(get_current_admin),
  115. db: Session = Depends(get_db)
  116. ):
  117. """重置用户密码"""
  118. service = AdminUserService(db)
  119. try:
  120. new_password = service.reset_password(user_id)
  121. # 记录操作日志
  122. log_service = OperationLogService(db)
  123. log_service.create_log(
  124. admin_id=current_admin.id,
  125. operation_type="update",
  126. module="user",
  127. target_id=user_id,
  128. detail={"action": "reset_password"},
  129. ip_address=request.client.host if request.client else None
  130. )
  131. return ResetPasswordResponse(user_id=user_id, new_password=new_password)
  132. except ValueError as e:
  133. raise HTTPException(
  134. status_code=status.HTTP_404_NOT_FOUND,
  135. detail={"code": "USER_NOT_FOUND", "message": "用户不存在"}
  136. )