187 lines
7.5 KiB
Python
187 lines
7.5 KiB
Python
"""
|
|
数据库模型定义
|
|
"""
|
|
|
|
from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, Float, Date
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from datetime import datetime, date
|
|
|
|
Base = declarative_base()
|
|
|
|
class User(Base):
|
|
"""用户模型"""
|
|
__tablename__ = "t_user"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
openid = Column(String(64), nullable=True)
|
|
phone = Column(String(16), unique=True, index=True, nullable=True)
|
|
username = Column(String(64), nullable=True)
|
|
password_hash = Column(String(255), nullable=True)
|
|
nickname = Column(String(64), nullable=True)
|
|
avatar = Column(String(512), nullable=True)
|
|
uid = Column(String(32), nullable=False, unique=True)
|
|
status = Column(Integer, nullable=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
role = Column(Integer, default=1) # 1:普通用户, 2:管理员
|
|
|
|
class Pet(Base):
|
|
"""宠物模型"""
|
|
__tablename__ = "t_pet"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String(64), nullable=False)
|
|
type = Column(String(20), nullable=True)
|
|
avatar = Column(String(512), nullable=False)
|
|
global_prompt = Column(Text, nullable=False)
|
|
tts_voice_id = Column(String(32), nullable=True)
|
|
tts_speed = Column(String(5), nullable=True)
|
|
tts_volume = Column(String(5), nullable=True)
|
|
voice_type = Column(String(50), nullable=True)
|
|
personality = Column(String(100), nullable=True)
|
|
status = Column(Integer, nullable=True)
|
|
show_avatar = Column(Boolean, default=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
# 火山引擎实时语音配置
|
|
volcano_voice_id = Column(String(64), nullable=True)
|
|
volcano_model_version = Column(String(10), nullable=True)
|
|
volcano_speed = Column(String(5), nullable=True)
|
|
volcano_volume = Column(String(5), nullable=True)
|
|
volcano_bot_name = Column(String(64), nullable=True)
|
|
volcano_system_role = Column(Text, nullable=True)
|
|
volcano_character_manifest = Column(Text, nullable=True)
|
|
|
|
class Background(Base):
|
|
"""背景模型"""
|
|
__tablename__ = "t_background"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String(64), nullable=False)
|
|
resource_url = Column(String(512), nullable=False)
|
|
resource_type = Column(Integer, nullable=True)
|
|
visibility = Column(Integer, nullable=True)
|
|
bgm_url = Column(String(512), nullable=True)
|
|
is_locked = Column(Boolean, nullable=True)
|
|
lock_desc = Column(String(255), nullable=True)
|
|
price_points = Column(Integer, nullable=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
category = Column(String(50), default='default')
|
|
description = Column(String(255), nullable=True)
|
|
thumbnail = Column(String(512), nullable=True)
|
|
cover_url = Column(String(512), nullable=True)
|
|
device_type = Column(Integer, nullable=True, default=1) # 1: 电脑背景, 2: 手机背景
|
|
|
|
class ChatLog(Base):
|
|
"""聊天记录模型"""
|
|
__tablename__ = "t_chat_log"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
user_id = Column(Integer, nullable=False)
|
|
trace_id = Column(String(64), nullable=False)
|
|
pet_id = Column(Integer, nullable=False)
|
|
bg_id = Column(Integer, nullable=False)
|
|
user_msg = Column(Text, nullable=True)
|
|
ai_msg = Column(Text, nullable=True)
|
|
tokens_input = Column(Integer, nullable=True)
|
|
tokens_output = Column(Integer, nullable=True)
|
|
duration_ms = Column(Integer, nullable=True)
|
|
conversation_id = Column(String(64), nullable=False)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
class UserWallet(Base):
|
|
"""用户钱包模型"""
|
|
__tablename__ = "t_user_wallet"
|
|
|
|
user_id = Column(Integer, primary_key=True)
|
|
daily_quota = Column(Integer, nullable=True)
|
|
extra_quota = Column(Integer, nullable=True)
|
|
available_tokens = Column(Integer, nullable=True, default=0)
|
|
total_consumed = Column(Integer, nullable=True)
|
|
last_reset_time = Column(Date, nullable=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
class BackgroundPetConfig(Base):
|
|
"""背景宠物绑定配置模型"""
|
|
__tablename__ = "t_background_pet_config"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
background_id = Column(Integer, nullable=False)
|
|
pet_id = Column(Integer, nullable=False)
|
|
coordinate_x = Column(String(5), nullable=False)
|
|
coordinate_y = Column(String(5), nullable=False)
|
|
scale = Column(String(5), nullable=True)
|
|
scene_prompt = Column(Text, nullable=True)
|
|
hello_message = Column(String(255), nullable=True)
|
|
sort_order = Column(Integer, nullable=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
|
|
class UserBackgroundRelation(Base):
|
|
"""用户背景权限关系模型"""
|
|
__tablename__ = "t_user_background_relation"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
user_id = Column(Integer, nullable=False, index=True)
|
|
background_id = Column(Integer, nullable=False, index=True)
|
|
can_view = Column(Boolean, default=True) # 是否允许查看
|
|
can_use = Column(Boolean, default=True) # 是否允许使用
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
|
|
class ModelConfig(Base):
|
|
"""AI模型配置模型"""
|
|
__tablename__ = "t_model_config"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String(64), nullable=False) # 模型名称
|
|
provider = Column(String(32), nullable=False) # 提供商
|
|
model_type = Column(String(32), nullable=False) # 模型类型
|
|
model_key = Column(String(128), nullable=False, unique=True) # 模型标识符
|
|
api_base_url = Column(String(255), nullable=True) # API基础URL
|
|
api_key = Column(String(255), nullable=True) # API密钥
|
|
max_tokens = Column(Integer, default=4096) # 最大输出token数
|
|
context_length = Column(Integer, default=8192) # 上下文长度
|
|
input_price_per_1k = Column(Float, default=0.0) # 输入token价格(每千token)
|
|
output_price_per_1k = Column(Float, default=0.0) # 输出token价格(每千token)
|
|
temperature = Column(Float, default=0.7) # 默认温度参数
|
|
top_p = Column(Float, default=1.0) # Top-p采样参数
|
|
enabled = Column(Boolean, default=True) # 是否启用
|
|
is_default = Column(Boolean, default=False) # 是否为默认模型
|
|
sort_order = Column(Integer, default=0) # 排序
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
|
|
# 初始化数据库
|
|
def init_db():
|
|
"""初始化数据库"""
|
|
from sqlalchemy import create_engine
|
|
from config.settings import settings
|
|
|
|
# 创建同步引擎
|
|
engine = create_engine(settings.DATABASE_URL.replace('+asyncmy', '+pymysql'))
|
|
|
|
# 创建表
|
|
Base.metadata.create_all(bind=engine)
|
|
print("数据库表创建成功")
|
|
|
|
|
|
# 异步初始化数据库
|
|
async def init_db_async():
|
|
"""异步初始化数据库"""
|
|
from sqlalchemy.ext.asyncio import create_async_engine
|
|
from config.settings import settings
|
|
|
|
# 创建异步引擎
|
|
engine = create_async_engine(settings.DATABASE_URL)
|
|
|
|
# 创建表
|
|
async with engine.begin() as conn:
|
|
await conn.run_sync(Base.metadata.create_all)
|
|
print("数据库表创建成功") |