Ai_Admin/MyApi/models.py
2024-06-05 14:20:46 +08:00

352 lines
17 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
# 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