Files
xingrin/backend/apps/asset/models/statistics_models.py
2025-12-12 18:04:57 +08:00

83 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from django.db import models
class AssetStatistics(models.Model):
"""
资产统计表
存储预聚合的全局统计数据,避免仪表盘实时 COUNT 大表。
由定时任务Prefect Flow定期刷新。
"""
id = models.AutoField(primary_key=True)
# ==================== 当前统计字段 ====================
total_targets = models.IntegerField(default=0, help_text='目标总数')
total_subdomains = models.IntegerField(default=0, help_text='子域名总数')
total_ips = models.IntegerField(default=0, help_text='IP地址总数')
total_endpoints = models.IntegerField(default=0, help_text='端点总数')
total_websites = models.IntegerField(default=0, help_text='网站总数')
total_vulns = models.IntegerField(default=0, help_text='漏洞总数')
total_assets = models.IntegerField(default=0, help_text='总资产数(子域名+IP+端点+网站)')
# ==================== 上次统计字段(用于计算趋势)====================
prev_targets = models.IntegerField(default=0, help_text='上次目标总数')
prev_subdomains = models.IntegerField(default=0, help_text='上次子域名总数')
prev_ips = models.IntegerField(default=0, help_text='上次IP地址总数')
prev_endpoints = models.IntegerField(default=0, help_text='上次端点总数')
prev_websites = models.IntegerField(default=0, help_text='上次网站总数')
prev_vulns = models.IntegerField(default=0, help_text='上次漏洞总数')
prev_assets = models.IntegerField(default=0, help_text='上次总资产数')
# ==================== 时间字段 ====================
updated_at = models.DateTimeField(auto_now=True, help_text='最后更新时间')
class Meta:
db_table = 'asset_statistics'
verbose_name = '资产统计'
verbose_name_plural = '资产统计'
def __str__(self):
return f'AssetStatistics (updated: {self.updated_at})'
@classmethod
def get_or_create_singleton(cls) -> 'AssetStatistics':
"""获取或创建单例统计记录"""
obj, _ = cls.objects.get_or_create(pk=1)
return obj
class StatisticsHistory(models.Model):
"""
统计历史表(用于折线图)
每天记录一条快照,用于展示趋势。
由定时任务在刷新统计时自动写入。
"""
date = models.DateField(unique=True, help_text='统计日期')
# 各类资产数量
total_targets = models.IntegerField(default=0, help_text='目标总数')
total_subdomains = models.IntegerField(default=0, help_text='子域名总数')
total_ips = models.IntegerField(default=0, help_text='IP地址总数')
total_endpoints = models.IntegerField(default=0, help_text='端点总数')
total_websites = models.IntegerField(default=0, help_text='网站总数')
total_vulns = models.IntegerField(default=0, help_text='漏洞总数')
total_assets = models.IntegerField(default=0, help_text='总资产数')
created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间')
updated_at = models.DateTimeField(auto_now=True, help_text='更新时间')
class Meta:
db_table = 'statistics_history'
verbose_name = '统计历史'
verbose_name_plural = '统计历史'
ordering = ['-date']
indexes = [
models.Index(fields=['date']),
]
def __str__(self):
return f'StatisticsHistory ({self.date})'