admin_log_router.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. """
  2. 管理员操作日志API路由
  3. 提供操作日志查询和导出API端点
  4. Requirements: 12.3, 12.4
  5. """
  6. from typing import Optional
  7. from datetime import date
  8. from fastapi import APIRouter, Depends, Query
  9. from sqlalchemy.orm import Session
  10. from sqlalchemy.ext.asyncio import AsyncSession
  11. from app.database import get_db
  12. from app.schemas.model_schema import PaginatedResponse
  13. from app.services.operation_log_service import OperationLogService
  14. from app.services.log_service import LogService
  15. from app.dependencies.admin_auth import get_current_admin
  16. from app.models.admin import AdminUser
  17. router = APIRouter(prefix="/api/admin/logs", tags=["操作日志"])
  18. @router.get("", response_model=PaginatedResponse)
  19. def list_operation_logs(
  20. admin_id: Optional[int] = Query(None, description="管理员ID"),
  21. operation_type: Optional[str] = Query(None, description="操作类型"),
  22. module: Optional[str] = Query(None, description="操作模块"),
  23. start_date: Optional[date] = Query(None, description="开始日期"),
  24. end_date: Optional[date] = Query(None, description="结束日期"),
  25. page: int = Query(1, ge=1, description="页码"),
  26. size: int = Query(20, ge=1, le=100, description="每页数量"),
  27. current_admin: AdminUser = Depends(get_current_admin),
  28. db: Session = Depends(get_db)
  29. ):
  30. """查询操作日志"""
  31. service = OperationLogService(db)
  32. logs, total = service.list_logs(
  33. page=page,
  34. size=size,
  35. admin_id=admin_id,
  36. operation_type=operation_type,
  37. module=module,
  38. start_date=start_date,
  39. end_date=end_date
  40. )
  41. # 转换为响应格式
  42. items = []
  43. for log in logs:
  44. items.append({
  45. "id": log.id,
  46. "admin_id": log.admin_id,
  47. "operation_type": log.operation_type,
  48. "module": log.module,
  49. "target_id": log.target_id,
  50. "detail": log.detail,
  51. "ip_address": log.ip_address,
  52. "created_at": log.created_at.isoformat() if log.created_at else None
  53. })
  54. return PaginatedResponse(
  55. items=items,
  56. total=total,
  57. page=page,
  58. page_size=size
  59. )
  60. @router.get("/logins")
  61. def list_login_logs(
  62. user_type: Optional[str] = Query(None, description="用户类型"),
  63. login_result: Optional[str] = Query(None, description="登录结果"),
  64. start_date: Optional[str] = Query(None, description="开始日期"),
  65. end_date: Optional[str] = Query(None, description="结束日期"),
  66. page: int = Query(1, ge=1, description="页码"),
  67. size: int = Query(20, ge=1, le=100, description="每页数量"),
  68. current_admin: AdminUser = Depends(get_current_admin),
  69. db: Session = Depends(get_db)
  70. ):
  71. """查询登录日志"""
  72. service = LogService(db)
  73. result = service.get_login_logs(
  74. start_date=start_date,
  75. end_date=end_date,
  76. user_type=user_type,
  77. login_result=login_result,
  78. page=page,
  79. size=size
  80. )
  81. return {"code": 0, "data": result}
  82. @router.get("/api")
  83. def list_api_logs(
  84. user_id: Optional[str] = Query(None, description="用户ID"),
  85. username: Optional[str] = Query(None, description="用户名称"),
  86. phone: Optional[str] = Query(None, description="用户电话"),
  87. module: Optional[str] = Query(None, description="调用模块"),
  88. api_path: Optional[str] = Query(None, description="API路径"),
  89. start_date: Optional[str] = Query(None, description="开始日期"),
  90. end_date: Optional[str] = Query(None, description="结束日期"),
  91. page: int = Query(1, ge=1, description="页码"),
  92. size: int = Query(20, ge=1, le=100, description="每页数量"),
  93. current_admin: AdminUser = Depends(get_current_admin),
  94. db: Session = Depends(get_db)
  95. ):
  96. """查询API调用日志"""
  97. service = LogService(db)
  98. result = service.get_api_logs(
  99. start_date=start_date,
  100. end_date=end_date,
  101. user_id=user_id,
  102. username=username,
  103. phone=phone,
  104. module=module,
  105. api_path=api_path,
  106. page=page,
  107. size=size
  108. )
  109. return {"code": 0, "data": result}
  110. @router.get("/{log_type}/export")
  111. def export_logs(
  112. log_type: str,
  113. start_date: Optional[str] = Query(None),
  114. end_date: Optional[str] = Query(None),
  115. current_admin: AdminUser = Depends(get_current_admin),
  116. db: Session = Depends(get_db)
  117. ):
  118. """导出日志"""
  119. service = LogService(db)
  120. filters = {"start_date": start_date, "end_date": end_date}
  121. try:
  122. filepath = service.export_logs(log_type, filters)
  123. return {"code": 0, "data": {"download_url": filepath}}
  124. except ValueError as e:
  125. return {"code": 400, "message": str(e)}