""" 管理员操作日志API路由 提供操作日志查询和导出API端点 Requirements: 12.3, 12.4 """ from typing import Optional from datetime import date from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.schemas.model_schema import PaginatedResponse from app.services.operation_log_service import OperationLogService from app.services.log_service import LogService from app.dependencies.admin_auth import get_current_admin from app.models.admin import AdminUser router = APIRouter(prefix="/api/admin/logs", tags=["操作日志"]) @router.get("", response_model=PaginatedResponse) def list_operation_logs( admin_id: Optional[int] = Query(None, description="管理员ID"), operation_type: Optional[str] = Query(None, description="操作类型"), module: Optional[str] = Query(None, description="操作模块"), start_date: Optional[date] = Query(None, description="开始日期"), end_date: Optional[date] = Query(None, description="结束日期"), page: int = Query(1, ge=1, description="页码"), size: int = Query(20, ge=1, le=100, description="每页数量"), current_admin: AdminUser = Depends(get_current_admin), db: Session = Depends(get_db) ): """查询操作日志""" service = OperationLogService(db) logs, total = service.list_logs( page=page, size=size, admin_id=admin_id, operation_type=operation_type, module=module, start_date=start_date, end_date=end_date ) # 转换为响应格式 items = [] for log in logs: items.append({ "id": log.id, "admin_id": log.admin_id, "operation_type": log.operation_type, "module": log.module, "target_id": log.target_id, "detail": log.detail, "ip_address": log.ip_address, "created_at": log.created_at.isoformat() if log.created_at else None }) return PaginatedResponse( items=items, total=total, page=page, page_size=size ) @router.get("/logins") def list_login_logs( user_type: Optional[str] = Query(None, description="用户类型"), login_result: Optional[str] = Query(None, description="登录结果"), start_date: Optional[str] = Query(None, description="开始日期"), end_date: Optional[str] = Query(None, description="结束日期"), page: int = Query(1, ge=1, description="页码"), size: int = Query(20, ge=1, le=100, description="每页数量"), current_admin: AdminUser = Depends(get_current_admin), db: Session = Depends(get_db) ): """查询登录日志""" service = LogService(db) result = service.get_login_logs( start_date=start_date, end_date=end_date, user_type=user_type, login_result=login_result, page=page, size=size ) return {"code": 0, "data": result} @router.get("/api") def list_api_logs( user_id: Optional[str] = Query(None, description="用户ID"), username: Optional[str] = Query(None, description="用户名称"), phone: Optional[str] = Query(None, description="用户电话"), module: Optional[str] = Query(None, description="调用模块"), api_path: Optional[str] = Query(None, description="API路径"), start_date: Optional[str] = Query(None, description="开始日期"), end_date: Optional[str] = Query(None, description="结束日期"), page: int = Query(1, ge=1, description="页码"), size: int = Query(20, ge=1, le=100, description="每页数量"), current_admin: AdminUser = Depends(get_current_admin), db: Session = Depends(get_db) ): """查询API调用日志""" service = LogService(db) result = service.get_api_logs( start_date=start_date, end_date=end_date, user_id=user_id, username=username, phone=phone, module=module, api_path=api_path, page=page, size=size ) return {"code": 0, "data": result} @router.get("/{log_type}/export") def export_logs( log_type: str, start_date: Optional[str] = Query(None), end_date: Optional[str] = Query(None), current_admin: AdminUser = Depends(get_current_admin), db: Session = Depends(get_db) ): """导出日志""" service = LogService(db) filters = {"start_date": start_date, "end_date": end_date} try: filepath = service.export_logs(log_type, filters) return {"code": 0, "data": {"download_url": filepath}} except ValueError as e: return {"code": 400, "message": str(e)}