PetAgent/backend/models/database.py

187 lines
7.5 KiB
Python
Raw Normal View History

2026-04-12 11:32:37 +08:00
"""
数据库模型定义
"""
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)
2026-04-15 22:33:30 +08:00
cover_url = Column(String(512), nullable=True)
2026-04-12 11:32:37 +08:00
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("数据库表创建成功")