找回密码
 立即注册
搜索
热搜: 丝袜 魅魔 黑丝
查看: 13|回复: 0

23243549_韦恩小屁孩-棍撬神奇大骚包~偷袭榨取~神力剥削~惨遭白给~扮演韦恩大播种~沦为肏肉

[复制链接]

13万

主题

343

回帖

22万

积分

管理员

站长

UID
1
积分
224402
余额
13 R
Moe币
84883
在线时间
279 小时
注册时间
2025-12-28
最后登录
2026-11-13
发表于 2026-9-3 23:00:59 | 显示全部楼层 |阅读模式
"""SQLAlchemy 数据库模型 + 会话"""
from sqlalchemy import create_engine, Column, Integer, String, Float, Text, DateTime, Boolean, ForeignKey, text
from sqlalchemy.orm import declarative_base, sessionmaker, relationship
from datetime import datetime
from .config import settings

connect_args = {"check_same_thread": False} if settings.database_url.startswith("sqlite") else {}
engine = create_engine(settings.database_url, connect_args=connect_args)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()


def ensure_user_entitlement_columns():
    """Add entitlement columns for existing SQLite databases without resetting users."""
    if engine.dialect.name != "sqlite":
        return
    with engine.begin() as connection:
        columns = {row["name"] for row in connection.execute(text("PRAGMA table_info(users)")).mappings()}
        additions = {
            "points": "INTEGER DEFAULT 0",
            "subscription_plan": "VARCHAR(32) DEFAULT 'free'",
            "subscription_expires_at": "DATETIME",
        }
        for name, definition in additions.items():
            if name not in columns:
                connection.execute(text(f"ALTER TABLE users ADD COLUMN {name} {definition}"))


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String(64), unique=True, index=True, nullable=False)
    email = Column(String(128), unique=True, index=True)
    hashed_password = Column(String(256), nullable=False)
    full_name = Column(String(64))
    phone = Column(String(32))
    role = Column(String(16), default="user")   # user | admin
    is_active = Column(Boolean, default=True)
    points = Column(Integer, default=0)
    subscription_plan = Column(String(32), default="free")
    subscription_expires_at = Column(DateTime, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow)
    analyses = relationship("AnalysisRecord", back_populates="user")

class AnalysisRecord(Base):
    __tablename__ = "analysis_records"
    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id"))
    prompt = Column(Text)                         # 用户问题
    category = Column(String(64))                 # 模型评测 / 行业分析 / 数据洞察
    result = Column(Text)                         # AI 返回内容
    tokens_used = Column(Integer, default=0)
    cost = Column(Float, default=0.0)             # 本次消耗积分
    created_at = Column(DateTime, default=datetime.utcnow)
    user = relationship("User", back_populates="analyses")
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|M男之家

GMT+8, 2026-11-14 12:30 , Processed in 0.105901 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表