刘涛 8c0a5f489d Initial commit: hulai admin API backend
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 22:01:23 +08:00

101 行
4.0 KiB
Python

from __future__ import annotations
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.database import Base
class VersionConfig(Base):
__tablename__ = "version_config"
id = Column(Integer, primary_key=True, autoincrement=True)
stats_iterations = Column(Integer)
stats_years = Column(Integer)
stats_guests = Column(String(50))
quote_text = Column(Text)
quote_author = Column(String(200))
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
upgrades = relationship("VersionUpgrade", back_populates="config", cascade="all, delete-orphan", order_by="VersionUpgrade.sort_order")
highlights = relationship("VersionHighlight", back_populates="config", cascade="all, delete-orphan", order_by="VersionHighlight.sort_order")
compare = relationship("VersionCompare", back_populates="config", uselist=False, cascade="all, delete-orphan")
timeline = relationship("VersionTimeline", back_populates="config", cascade="all, delete-orphan", order_by="VersionTimeline.sort_order")
philosophy = relationship("VersionPhilosophy", back_populates="config", cascade="all, delete-orphan", order_by="VersionPhilosophy.sort_order")
class VersionUpgrade(Base):
__tablename__ = "version_upgrades"
id = Column(Integer, primary_key=True, autoincrement=True)
config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False)
tag = Column(String(50))
name = Column(String(200))
description = Column(Text)
reason = Column(Text)
sort_order = Column(Integer, default=0)
config = relationship("VersionConfig", back_populates="upgrades")
class VersionHighlight(Base):
__tablename__ = "version_highlights"
id = Column(Integer, primary_key=True, autoincrement=True)
config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False)
label = Column(String(50))
text = Column(Text)
sort_order = Column(Integer, default=0)
config = relationship("VersionConfig", back_populates="highlights")
class VersionCompare(Base):
__tablename__ = "version_compare"
id = Column(Integer, primary_key=True, autoincrement=True)
config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False)
headers = Column(JSON)
rows = Column(JSON)
config = relationship("VersionConfig", back_populates="compare")
class VersionTimeline(Base):
__tablename__ = "version_timeline"
id = Column(Integer, primary_key=True, autoincrement=True)
config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False)
version = Column(String(20), nullable=False)
date = Column(String(20))
title = Column(String(200))
reason = Column(Text)
sort_order = Column(Integer, default=0)
config = relationship("VersionConfig", back_populates="timeline")
changes = relationship("VersionTimelineChange", back_populates="timeline", cascade="all, delete-orphan", order_by="VersionTimelineChange.sort_order")
class VersionTimelineChange(Base):
__tablename__ = "version_timeline_changes"
id = Column(Integer, primary_key=True, autoincrement=True)
timeline_id = Column(Integer, ForeignKey("version_timeline.id", ondelete="CASCADE"), nullable=False)
type = Column(Enum("add", "update", "remove"), nullable=False)
text = Column(Text, nullable=False)
sort_order = Column(Integer, default=0)
timeline = relationship("VersionTimeline", back_populates="changes")
class VersionPhilosophy(Base):
__tablename__ = "version_philosophy"
id = Column(Integer, primary_key=True, autoincrement=True)
config_id = Column(Integer, ForeignKey("version_config.id", ondelete="CASCADE"), nullable=False)
label = Column(String(50))
text = Column(Text)
sort_order = Column(Integer, default=0)
config = relationship("VersionConfig", back_populates="philosophy")