""" 数据库模型定义 """ 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("数据库表创建成功")