| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- """
- 管理员操作日志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)}
|