from django.db import models # Create your models here. from datetime import datetime from django.db import models from django.contrib.auth.hashers import make_password,is_password_usable from django.utils import timezone # 管理员模型 class Administrator(models.Model): username = models.CharField(max_length=150, unique=True) # 用户名,确保唯一性 password = models.CharField(max_length=128) # 密码,将会加密存储 role = models.CharField(max_length=100) # 角色 is_active = models.BooleanField(default=True) # 状态,启用/禁用,默认启用 last_login = models.DateTimeField(null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) # 创建时间,自动设置为当前时间 # 保存模型之前对密码进行加密 def save(self, *args, **kwargs): if not is_password_usable(self.password): self.password = make_password(self.password) super().save(*args, **kwargs) class Meta: db_table = "Administrator" from django.db import models class MembershipType(models.Model): type = models.CharField(max_length=50, unique=True, verbose_name="卡类型") # 卡类型,如天卡、周卡等 coins 额度卡 title = models.CharField(max_length=100, verbose_name="标题") # 卡的标题 description = models.TextField(verbose_name="描述") # 卡的描述 price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格") # 卡的价格 duration_days = models.IntegerField(verbose_name="有效天数") # 卡的有效期,以天为单位 coins = models.IntegerField(default=0, verbose_name="赠送金币数量") # 赠送金币的数量 is_quota = models.BooleanField(default=False, verbose_name="是否为额度充值") # 是否为额度充值 class Meta: db_table = "membership_type" # 设置数据库表名 verbose_name = "会员卡类型" verbose_name_plural = "会员卡类型" def __str__(self): return self.title # 用户模型 class User(models.Model): openid = models.CharField(max_length=150, unique=True) # 用户唯一标识 wxid = models.CharField(max_length=150, blank=True, null=True) # 微信ID wechat_number = models.CharField(max_length=150, blank=True, null=True, verbose_name='微信号') # 微信号 nickname = models.CharField(max_length=150, blank=True, null=True) # 用户标识 gender = models.CharField(max_length=10, blank=True, null=True) # 性别 region = models.CharField(max_length=150, blank=True, null=True) # 地区 email = models.EmailField(blank=True, null=True) # 邮箱 phone = models.CharField(max_length=20, blank=True, null=True) # 号码 password = models.CharField(max_length=128, blank=True, null=True) # 密码 scene = models.CharField(max_length=100, blank=True, null=True) # 用户来源 is_member = models.BooleanField(default=False) # 是否为会员 member_start_time = models.BigIntegerField(blank=True, null=True) # 存储会员开始时间的时间戳 member_end_time = models.BigIntegerField(blank=True, null=True) # 存储会员到期时间的时间戳 is_active = models.BooleanField(default=True) # 状态,启用/禁用,默认启用 usage_count = models.IntegerField(default=0, blank=True, null=True) # 用户使用次数 coins = models.IntegerField(default=30, verbose_name='金币数量') # 用户金币数量 balance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='用户余额') # 用户余额 inviter_nickname = models.CharField(max_length=150, blank=True, null=True, verbose_name='邀请人昵称') # 用户邀请人昵称 invitees_count = models.IntegerField(default=0, verbose_name='邀请人数量') # 邀请人数量 created_at = models.DateTimeField(auto_now_add=True) # 用户创建时间 class Meta: db_table = "User" #添加好友表 class FriendRequest(models.Model): fromusername = models.CharField(max_length=255, verbose_name='微信ID') # 发起请求的微信ID alias = models.CharField(max_length=255, blank=True, null=True, verbose_name='微信号') # 微信号 fromnickname = models.CharField(max_length=255, blank=True, null=True, verbose_name='昵称') # 昵称 country = models.CharField(max_length=255, blank=True, null=True, verbose_name='国家') # 国家 province = models.CharField(max_length=255, blank=True, null=True, verbose_name='省份') # 省份 city = models.CharField(max_length=255, blank=True, null=True, verbose_name='城市') # 城市 sex = models.CharField(max_length=1, blank=True, null=True, verbose_name='性别') # 性别 scene = models.CharField(max_length=255, blank=True, null=True, verbose_name='来源') # 来源 time = models.DateTimeField(verbose_name='申请时间') # 申请时间 towxid = models.CharField(max_length=255, verbose_name='目标微信ID') # 接收好友请求的微信ID class Meta: db_table = "FriendRequest" verbose_name = '添加好友请求' verbose_name_plural = '添加好友请求' def __str__(self): return self.fromnickname or self.fromusername #文案库 from django.db import models class Copywriting(models.Model): openid = models.CharField(max_length=150, blank=True, null=True, verbose_name="openid") nickname = models.CharField(max_length=255, blank=True, null=True, verbose_name="用户标识") text_content = models.TextField(verbose_name="文本内容") source = models.CharField(max_length=255, verbose_name="来源") tag = models.CharField(max_length=255, default=None, verbose_name="标签") popularity = models.IntegerField(default=0, verbose_name="热度") added_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") is_approved = models.BooleanField(default=False, verbose_name="审核通过") # 默认未审核 class Meta: db_table = "Copywriting" verbose_name = "文案库" verbose_name_plural = "文案库" def __str__(self): return self.text_content[:50] # 返回文案的前50个字符作为字符串表示 #视频提取记录 class VideoExtractionRecord(models.Model): extraction_link = models.URLField(verbose_name="提取链接", max_length=2048) source = models.CharField(max_length=100, choices=[('index', 'Index'), ('weixin', 'Weixin')], verbose_name="来源") openid = models.CharField(max_length=150, blank=True, null=True, verbose_name="openid") nickname = models.CharField(max_length=255, blank=True, null=True, verbose_name="用户标识") video_title = models.TextField(blank=True, null=True, verbose_name="视频标题") wxid = models.CharField(max_length=255, blank=True, null=True, verbose_name="微信id") wechat_alias = models.CharField(max_length=255, blank=True, null=True, verbose_name="微信号") is_successful = models.CharField(max_length=255,blank=True, null=True, verbose_name="是否提取成功") exception_reason = models.TextField(blank=True, null=True, verbose_name="异常原因") extraction_time = models.DateTimeField(auto_now_add=True, verbose_name="提取时间") class Meta: db_table = "VideoExtractionRecord" verbose_name = "视频提取记录" verbose_name_plural = "视频提取记录" def __str__(self): return f"{self.user}'s extraction record" #文案提取任务 class TranscriptionTask(models.Model): uuid = models.CharField(max_length=255) video_url = models.TextField() task_id = models.CharField(max_length=255) result = models.TextField(null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = "TranscriptionTask" verbose_name = "文案提取任务" verbose_name_plural = "文案提取任务" def __str__(self): return self.task_id #api调用日志 class ApiCallLog(models.Model): # 用户来源,如'index', 'weixin'等 source = models.CharField(max_length=100, blank=True, null=True, choices=[('index', 'Index'), ('weixin', 'Weixin')], verbose_name="来源") # 用户的OpenID openid = models.CharField(max_length=150, blank=True, null=True, verbose_name="openid") # 用户昵称 nickname = models.CharField(max_length=255, blank=True, null=True, verbose_name="用户标识") # 微信ID wxid = models.CharField(max_length=255, blank=True, null=True, verbose_name="微信id") # 微信号 wechat_alias = models.CharField(max_length=255, blank=True, null=True, verbose_name="微信号") # 调用的API接口名称或路径 api_name = models.CharField(max_length=255, verbose_name="调用接口") # 调用结果,使用BooleanField表示成功或失败 is_successful = models.BooleanField(default=False, verbose_name="是否成功") # 备注信息,可以用来记录失败原因或其他注释信息 remarks = models.TextField(blank=True, null=True, verbose_name="备注") # 调用时间,使用自动设置为当前时间的DateTimeField call_time = models.DateTimeField(auto_now_add=True, verbose_name="调用时间") class Meta: db_table = "api_call_log" verbose_name = "API调用日志" verbose_name_plural = "API调用日志" def __str__(self): return f"{self.nickname} - {self.api_name} at {self.call_time}" #卡密记录 class RedemptionCard(models.Model): code = models.CharField(max_length=100, unique=True, verbose_name="卡密") # 卡密 card_type = models.CharField(max_length=50, choices=(('member', '会员卡'), ('quota', '额度卡')), verbose_name="卡类型") # 卡类型 created_date = models.DateTimeField(auto_now_add=True, verbose_name="生成日期") # 卡密生成日期 expiry_date = models.DateTimeField(verbose_name="到期时间") # 卡密到期时间 is_used = models.BooleanField(default=False, verbose_name="是否已使用") # 是否已被使用 used_by_openid = models.CharField(max_length=150, blank=True, null=True, verbose_name="使用者OpenID") # 使用者的OpenID used_by_nickname = models.CharField(max_length=150, blank=True, null=True, verbose_name="使用者昵称") # 使用者的昵称 card_creation_time = models.DateTimeField(auto_now_add=True, verbose_name="卡密创建时间") # 卡密创建时间 validity_period = models.PositiveIntegerField(default=0, verbose_name="有效期") # 有效期天数或额度数量 class Meta: db_table = "redemption_card" # 设置数据库表名 verbose_name = "兑换卡" verbose_name_plural = "兑换卡" # 充值列表 # 订单记录 class TransactionLog(models.Model): TRANSACTION_STATUS_CHOICES = [ ('pending', '待处理'), ('completed', '完成'), ('failed', '失败') ] TRANSACTION_TYPE_CHOICES = [ ('member', '会员购买'), ('quota', '续费会员') ] transaction_no = models.CharField(max_length=255, unique=True, verbose_name="交易编号") transaction_status = models.CharField(max_length=50, default='pending', choices=TRANSACTION_STATUS_CHOICES, verbose_name="交易状态") user_openid = models.CharField(max_length=150, verbose_name="用户OpenID") transaction_type = models.CharField(max_length=50, verbose_name="交易类型") transaction_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="交易金额") remark = models.TextField(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: db_table = "transaction_log" verbose_name = "交易记录" verbose_name_plural = "交易记录" def __str__(self): return f"{self.transaction_no} - {self.transaction_status}" class IDCounter(models.Model): count = models.IntegerField(default=30000) # 初始化为0或其他你想开始的数字 @classmethod def get_next_id(cls): # 这个方法获取下一个ID,并且自增存储的计数 counter, _ = cls.objects.get_or_create(pk=1) # 假设我们只用一个计数器,其ID为1 counter.count += 1 counter.save() return counter.count class Meta: db_table = "IDCounter" class ChatRecord(models.Model): openid = models.CharField(max_length=150,default=None) # 用户唯一标识 nickname = models.CharField(max_length=150, verbose_name='用户昵称') # 用户昵称 conversation_id = models.CharField(max_length=100, verbose_name='会话ID') # 会话ID role = models.CharField(max_length=100, verbose_name='角色') # 角色 message_content = models.TextField(verbose_name='消息内容') # 消息内容 is_response = models.BooleanField(default=False, verbose_name='是否为AI回复') # 是否为AI回复 timestamp = models.DateTimeField(default=timezone.now, verbose_name='时间戳') # 时间戳 class Meta: db_table = "chat_record" # 数据库表名 ordering = ['-timestamp'] # 默认排序 verbose_name = '聊天记录' verbose_name_plural = '聊天记录' def __str__(self): return f"{self.nickname}: {self.message_content[:20]}" class VideoTask(models.Model): TASK_STATUS_CHOICES = [ ('pending','待处理'), ('failed', '已提交'), ('running','运行中'), ('success', '成功'), ('failed', '失败'), ] openid = models.CharField(max_length=150) # 用户唯一标识 nickname = models.CharField(max_length=150) # 用户昵称 task_id = models.CharField(max_length=255, unique=True) # 任务ID task_type = models.CharField(max_length=50) # 任务类型,例如 'gen2' status = models.CharField(max_length=20, choices=TASK_STATUS_CHOICES, default='pending') # 任务状态 created_at = models.DateTimeField(auto_now_add=True) # 任务创建时间 updated_at = models.DateTimeField(auto_now=True) # 任务更新时间 text_prompt = models.TextField(null=True) # 文本提示 width = models.IntegerField(null=True) # 视频宽度 height = models.IntegerField(null=True) # 视频高度 motion_score = models.IntegerField(null=True) # 动态评分 style = models.CharField(max_length=255, blank=True, null=True) # 风格 seconds = models.IntegerField(null=True) # 视频时长 image_url = models.TextField(blank=True, null=True) # 图生视频的图像URL result_url = models.TextField(blank=True, null=True) # 视频生成结果URL qiniu_url = models.TextField(blank=True, null=True) # 七牛云储存url gif_url = models.TextField(blank=True, null=True) # GIF图片链接 progress = models.FloatField(default=0.0) # 进度百分比 error_message = models.TextField(blank=True, null=True) # 错误信息 description_zh = models.TextField(blank=True, null=True) # 中文描述 is_processing = models.BooleanField(default=False) # 正在处理标志 class Meta: db_table = "video_task" ordering = ['-created_at'] def __str__(self): return self.task_id class AssetLibrary(models.Model): STYLE_CHOICES = [ ('abandoned', '废弃'), ('abstract_sculpture', '抽象'), ('advertising', '广告'), ('anime', '动漫'), ('cine_lens', '电影镜头'), ('cinematic', '电影'), ('concept_art', '艺术'), ('forestpunk', '赛博朋克'), ('frost', '雪'), ('graphite', '石墨'), ('macro_photography', '宏观'), ('pixel_art', '像素艺术'), ('retro_photography', '复古'), ('sci_fi_art', '科幻'), ('thriller', '惊悚'), ('35mm', '35mm'), ('vector', '矢量'), ('watercolor', '水彩'), ] original_url = models.TextField(verbose_name='原始URL', null=True) # 原始URL qiniu_url = models.TextField(blank=True, null=True) # 七牛云储存url duration = models.FloatField(verbose_name='时长') # 视频时长,以秒为单位 category = models.CharField(max_length=50, choices=STYLE_CHOICES, verbose_name='分类', null=True) # 视频分类 description = models.TextField(verbose_name='视频描述', blank=True, null=True) # 视频描述 description_zh = models.TextField(verbose_name='中文描述', blank=True, null=True) # 中文描述 generated_by = models.CharField(null=True, verbose_name='生成用户', max_length=50) # 生成用户 generated_at = models.DateTimeField(default=timezone.now, verbose_name='生成时间', null=True) # 生成时间 download_count = models.IntegerField(default=0, verbose_name='下载次数', null=True) # 下载次数 is_approved = models.BooleanField(default=False, verbose_name='是否审核', null=True) # 是否审核 gif_url = models.TextField(verbose_name='GIF图片URL', blank=True, null=True) # GIF图片URL class Meta: db_table = "asset_library" # 数据库表名 verbose_name = '素材库' verbose_name_plural = '素材库' ordering = ['-generated_at'] # 默认排序 def __str__(self): return self.original_url