from django.db import models from django.utils import timezone class BaseProcessMonitor(models.Model): """基础进程监控模型""" pid = models.IntegerField(verbose_name='进程ID') process_name = models.CharField(max_length=255, verbose_name='进程名称') is_active = models.BooleanField(default=True, verbose_name='是否活跃') status = models.IntegerField(default=1, verbose_name='进程状态') # 1: 运行中, 0: 已终止 created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') log_file = models.CharField(max_length=255, null=True, blank=True, verbose_name='日志文件路径') class Meta: abstract = True class HighCPUProcess(BaseProcessMonitor): """CPU高占用进程监控""" cpu_usage = models.FloatField(default=0, verbose_name='CPU使用率') cpu_cores = models.IntegerField(default=0, verbose_name='CPU核心数') class Meta: verbose_name = 'CPU高占用进程' verbose_name_plural = verbose_name class HighGPUProcess(BaseProcessMonitor): """GPU高占用进程监控""" gpu_usage = models.FloatField(default=0, verbose_name='GPU使用率') gpu_memory = models.FloatField(default=0, verbose_name='GPU显存使用量(MB)') gpu_index = models.IntegerField(default=0, verbose_name='GPU设备索引') class Meta: verbose_name = 'GPU高占用进程' verbose_name_plural = verbose_name class HighMemoryProcess(BaseProcessMonitor): """内存高占用进程监控""" memory_usage = models.FloatField(default=0, verbose_name='内存使用量(GB)') memory_percent = models.FloatField(default=0, verbose_name='内存使用率') virtual_memory = models.FloatField(default=0, verbose_name='虚拟内存使用量(GB)') swap_usage = models.FloatField(default=0, verbose_name='交换内存使用量(GB)') class Meta: verbose_name = '内存高占用进程' verbose_name_plural = verbose_name class AllResourceProcess(models.Model): """所有资源统计""" pid = models.IntegerField('进程ID') process_name = models.CharField('进程名称', max_length=100) # CPU 相关 cpu_usage = models.FloatField('CPU使用率', default=0) cpu_user_time = models.FloatField('用户态CPU时间', default=0) cpu_system_time = models.FloatField('系统态CPU时间', default=0) # 内存相关 memory_usage = models.FloatField('内存使用量(MB)', default=0) memory_percent = models.FloatField('内存使用率', default=0) virtual_memory = models.FloatField('虚拟内存(MB)', default=0) # GPU 相关 gpu_usage = models.FloatField('GPU使用率', default=0) gpu_memory = models.FloatField('GPU内存使用量(MB)', default=0) # 网络相关 net_io_sent = models.FloatField('网络发送量(MB)', default=0) net_io_recv = models.FloatField('网络接收量(MB)', default=0) # 状态相关 is_active = models.BooleanField('是否活跃', default=True) status = models.IntegerField('状态', default=1) # 1:运行中, 0:已终止 log_file = models.CharField('日志文件路径', max_length=255, null=True) created_at = models.DateTimeField('创建时间', auto_now_add=True) updated_at = models.DateTimeField('更新时间', auto_now=True) class Meta: db_table = 'all_resource_process' verbose_name = '全资源监控' verbose_name_plural = verbose_name class TiktokUserVideos(models.Model): """TikTok用户视频信息""" sec_user_id = models.CharField(max_length=255, unique=True, verbose_name="安全用户ID") unique_id = models.CharField(max_length=255, blank=True, null=True, verbose_name="唯一标识符") nickname = models.CharField(max_length=255, blank=True, null=True, verbose_name="昵称") signature = models.TextField(blank=True, null=True, verbose_name="签名") # 用户统计数据 follower_count = models.IntegerField(default=0, verbose_name="粉丝数") following_count = models.IntegerField(default=0, verbose_name="关注数") video_count = models.IntegerField(default=0, verbose_name="视频数") total_favorited = models.IntegerField(default=0, verbose_name="获赞总数") # 用户资料信息 avatar_url = models.TextField(blank=True, null=True, verbose_name="头像URL") verified = models.BooleanField(default=False, verbose_name="是否认证") private_account = models.BooleanField(default=False, verbose_name="是否私密账号") # 视频存储相关 videos_folder = models.CharField(max_length=255, verbose_name="视频文件夹") # 时间记录 create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = 'TikTok用户视频' verbose_name_plural = 'TikTok用户视频' indexes = [ models.Index(fields=['unique_id']), ] def __str__(self): display_name = self.nickname if self.nickname else self.unique_id if self.unique_id else self.sec_user_id return f"{display_name} ({self.sec_user_id[:8]}...)" def get_stats_summary(self): """获取用户统计数据摘要""" return { 'followers': self.follower_count, 'following': self.following_count, 'videos': self.video_count, 'likes': self.total_favorited, }