
管理员
站长
- UID
- 1
- 积分
- 224402
- 余额
- 13 R
- Moe币
- 84883
- 在线时间
- 279 小时
- 注册时间
- 2025-12-28
- 最后登录
- 2026-11-13
|
"""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")
|
|