352 lines
17 KiB
Python
352 lines
17 KiB
Python
![]() |
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=3, 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=10000) # 初始化为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
|