127 lines
5.8 KiB
Python
127 lines
5.8 KiB
Python
![]() |
from django.db import models
|
|||
|
import uuid
|
|||
|
from django.utils import timezone
|
|||
|
from apps.knowledge_base.models import KnowledgeBase, KnowledgeBaseDocument
|
|||
|
from apps.accounts.models import User
|
|||
|
|
|||
|
# Create your models here.
|
|||
|
|
|||
|
# 我们可以在这里添加额外的模型或关系,但现在使用user_management中的现有模型
|
|||
|
|
|||
|
# 从user_management迁移过来的模型
|
|||
|
class OperatorAccount(models.Model):
|
|||
|
"""运营账号信息表"""
|
|||
|
|
|||
|
id = models.AutoField(primary_key=True) # 保留自动递增的ID字段
|
|||
|
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')
|
|||
|
|
|||
|
POSITION_CHOICES = [
|
|||
|
('editor', '编辑'),
|
|||
|
('planner', '策划'),
|
|||
|
('operator', '运营'),
|
|||
|
('admin', '管理员'),
|
|||
|
]
|
|||
|
|
|||
|
username = models.CharField(max_length=100, unique=True, verbose_name='用户名')
|
|||
|
password = models.CharField(max_length=255, verbose_name='密码')
|
|||
|
real_name = models.CharField(max_length=50, verbose_name='真实姓名')
|
|||
|
email = models.EmailField(verbose_name='邮箱')
|
|||
|
phone = models.CharField(max_length=15, verbose_name='电话')
|
|||
|
position = models.CharField(max_length=20, choices=POSITION_CHOICES, verbose_name='工作定位')
|
|||
|
department = models.CharField(max_length=50, verbose_name='部门')
|
|||
|
is_active = models.BooleanField(default=True, verbose_name='是否在职')
|
|||
|
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
|||
|
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
|||
|
|
|||
|
class Meta:
|
|||
|
verbose_name = '运营账号'
|
|||
|
verbose_name_plural = '运营账号'
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return f"{self.real_name} ({self.username})"
|
|||
|
|
|||
|
class PlatformAccount(models.Model):
|
|||
|
"""平台账号信息表"""
|
|||
|
|
|||
|
STATUS_CHOICES = [
|
|||
|
('active', '正常'),
|
|||
|
('restricted', '限流'),
|
|||
|
('suspended', '封禁'),
|
|||
|
('inactive', '未激活'),
|
|||
|
]
|
|||
|
|
|||
|
PLATFORM_CHOICES = [
|
|||
|
('youtube', 'YouTube'),
|
|||
|
('tiktok', 'TikTok'),
|
|||
|
('twitter', 'Twitter/X'),
|
|||
|
('instagram', 'Instagram'),
|
|||
|
('facebook', 'Facebook'),
|
|||
|
('bilibili', 'Bilibili'),
|
|||
|
]
|
|||
|
|
|||
|
operator = models.ForeignKey(OperatorAccount, on_delete=models.CASCADE, related_name='platform_accounts', verbose_name='关联运营')
|
|||
|
platform_name = models.CharField(max_length=20, choices=PLATFORM_CHOICES, verbose_name='平台名称')
|
|||
|
account_name = models.CharField(max_length=100, verbose_name='账号名称')
|
|||
|
account_id = models.CharField(max_length=100, verbose_name='账号ID')
|
|||
|
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active', verbose_name='账号状态')
|
|||
|
followers_count = models.IntegerField(default=0, verbose_name='粉丝数')
|
|||
|
account_url = models.URLField(verbose_name='账号链接')
|
|||
|
description = models.TextField(blank=True, null=True, verbose_name='账号描述')
|
|||
|
|
|||
|
# 新增字段
|
|||
|
tags = models.CharField(max_length=255, blank=True, null=True, verbose_name='标签', help_text='用逗号分隔的标签列表')
|
|||
|
profile_image = models.URLField(blank=True, null=True, verbose_name='头像URL')
|
|||
|
last_posting = models.DateTimeField(blank=True, null=True, verbose_name='最后发布时间')
|
|||
|
|
|||
|
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
|||
|
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
|||
|
last_login = models.DateTimeField(blank=True, null=True, verbose_name='最后登录时间')
|
|||
|
|
|||
|
class Meta:
|
|||
|
verbose_name = '平台账号'
|
|||
|
verbose_name_plural = '平台账号'
|
|||
|
unique_together = ('platform_name', 'account_id')
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return f"{self.account_name} ({self.platform_name})"
|
|||
|
|
|||
|
class Video(models.Model):
|
|||
|
"""视频信息表"""
|
|||
|
|
|||
|
STATUS_CHOICES = [
|
|||
|
('draft', '草稿'),
|
|||
|
('scheduled', '已排期'),
|
|||
|
('published', '已发布'),
|
|||
|
('failed', '发布失败'),
|
|||
|
('deleted', '已删除'),
|
|||
|
]
|
|||
|
|
|||
|
platform_account = models.ForeignKey(PlatformAccount, on_delete=models.CASCADE, related_name='videos', verbose_name='发布账号')
|
|||
|
title = models.CharField(max_length=200, verbose_name='视频标题')
|
|||
|
description = models.TextField(blank=True, null=True, verbose_name='视频描述')
|
|||
|
video_url = models.URLField(blank=True, null=True, verbose_name='视频地址')
|
|||
|
local_path = models.CharField(max_length=255, blank=True, null=True, verbose_name='本地路径')
|
|||
|
thumbnail_url = models.URLField(blank=True, null=True, verbose_name='缩略图地址')
|
|||
|
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='draft', verbose_name='发布状态')
|
|||
|
views_count = models.IntegerField(default=0, verbose_name='播放次数')
|
|||
|
likes_count = models.IntegerField(default=0, verbose_name='点赞数')
|
|||
|
comments_count = models.IntegerField(default=0, verbose_name='评论数')
|
|||
|
shares_count = models.IntegerField(default=0, verbose_name='分享数')
|
|||
|
tags = models.CharField(max_length=500, blank=True, null=True, verbose_name='标签')
|
|||
|
publish_time = models.DateTimeField(blank=True, null=True, verbose_name='发布时间')
|
|||
|
scheduled_time = models.DateTimeField(blank=True, null=True, verbose_name='计划发布时间')
|
|||
|
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
|||
|
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
|||
|
|
|||
|
class Meta:
|
|||
|
verbose_name = '视频'
|
|||
|
verbose_name_plural = '视频'
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return self.title
|
|||
|
|
|||
|
def save(self, *args, **kwargs):
|
|||
|
if self.status == 'published' and not self.publish_time:
|
|||
|
self.publish_time = timezone.now()
|
|||
|
super().save(*args, **kwargs)
|