""" 扫描任务数据模型 """ from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, ForeignKey, Enum from sqlalchemy.sql import func from sqlalchemy.orm import relationship import enum from app.database import Base class ScanStatus(enum.Enum): """扫描状态枚举""" PENDING = "pending" RUNNING = "running" COMPLETED = "completed" FAILED = "failed" CANCELLED = "cancelled" class ScanType(enum.Enum): """扫描类型枚举""" FULL = "full" # 全量扫描 INCREMENTAL = "incremental" # 增量扫描 CUSTOM = "custom" # 自定义扫描 class Scan(Base): """扫描任务模型""" __tablename__ = "scans" id = Column(Integer, primary_key=True, index=True) project_id = Column(Integer, ForeignKey("projects.id"), nullable=False) # 扫描配置 scan_type = Column(Enum(ScanType), default=ScanType.FULL) scan_config = Column(Text) # JSON格式的扫描配置 # 扫描状态 status = Column(Enum(ScanStatus), default=ScanStatus.PENDING) # 扫描统计 total_files = Column(Integer, default=0) scanned_files = Column(Integer, default=0) total_vulnerabilities = Column(Integer, default=0) # 时间戳 started_at = Column(DateTime(timezone=True)) completed_at = Column(DateTime(timezone=True)) created_at = Column(DateTime(timezone=True), server_default=func.now()) # 结果信息 result_summary = Column(Text) # JSON格式的结果摘要 error_message = Column(Text) # 错误信息 # 关联关系 project = relationship("Project", back_populates="scans") vulnerabilities = relationship("Vulnerability", back_populates="scan", cascade="all, delete-orphan") def __repr__(self): return f""