Files
ipam/backend/app/models/audit.py
T
Your Name 845fefd6cf add file
2026-07-20 14:46:47 +08:00

95 lines
2.8 KiB
Python

from sqlalchemy import Column, Integer, String, Text, DateTime, Enum
from sqlalchemy.sql import func
from app.core.database import Base
import enum
class AuditAction(str, enum.Enum):
"""操作类型枚举"""
CREATE = "create"
READ = "read"
UPDATE = "update"
DELETE = "delete"
LOGIN = "login"
LOGOUT = "logout"
SCAN = "scan"
IMPORT = "import"
EXPORT = "export"
OTHER = "other"
# ===== 兼容层:老 AuditAction 字符串字面量别名,值与新枚举对应 =====
# 旧代码(以及当前 AuditService._ACTION_MAP)里硬编码引用这些枚举属性名
NETWORK_CREATE = "create"
NETWORK_UPDATE = "update"
NETWORK_DELETE = "delete"
IP_UPDATE = "update"
IP_RESERVE = "update"
IP_UNRESERVE = "update"
SCAN_TRIGGER = "scan"
SNMP_CRED_CREATE = "create"
SNMP_CRED_UPDATE = "update"
SNMP_CRED_DELETE = "delete"
SNMP_DEVICE_CREATE = "create"
SNMP_DEVICE_UPDATE = "update"
SNMP_DEVICE_DELETE = "delete"
ALERT_ACK = "update"
ALERT_RESOLVE = "update"
USER_LOGIN = "login"
USER_LOGIN_FAILED = "login"
USER_LOGOUT = "logout"
USER_CREATE = "create"
USER_UPDATE_STATUS = "update"
USER_UNLOCK = "update"
USER_RESET_PASSWORD = "update"
USER_DELETE = "delete"
USER_CHANGE_PASSWORD = "update"
class AuditResource(str, enum.Enum):
"""资源类型枚举"""
USER = "user"
NETWORK = "network"
IP_ADDRESS = "ip_address"
SNMP_CREDENTIAL = "snmp_credential"
SNMP_DEVICE = "snmp_device"
ALERT = "alert"
WHITELIST_MAC = "whitelist_mac"
SCAN_TASK = "scan_task"
SYSTEM = "system"
class AuditLog(Base):
"""审计日志表"""
__tablename__ = "audit_logs"
id = Column(Integer, primary_key=True, index=True)
# 操作人信息
user_id = Column(Integer, index=True, nullable=True)
username = Column(String(50), index=True)
real_name = Column(String(50))
user_ip = Column(String(50))
user_agent = Column(String(500))
# 操作信息
action = Column(Enum(AuditAction), nullable=False, index=True)
resource = Column(Enum(AuditResource), nullable=False, index=True)
resource_id = Column(String(100), nullable=True) # 操作的资源ID
# 详细信息
description = Column(String(500)) # 操作描述
old_value = Column(Text) # 修改前的值 (JSON)
new_value = Column(Text) # 修改后的值 (JSON)
changed_fields = Column(String(500)) # 变更的字段列表
# 请求信息
request_method = Column(String(10))
request_path = Column(String(200))
# 结果
success = Column(Integer, default=1) # 1=成功,0=失败
error_message = Column(Text)
# 时间戳
created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)