""" 故事相关ORM模型 """ from sqlalchemy import Column, Integer, String, Text, Boolean, TIMESTAMP, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.database import Base class Story(Base): """故事主表""" __tablename__ = "stories" id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(100), nullable=False) cover_url = Column(String(255), default="") description = Column(Text) author_id = Column(Integer, default=0) category = Column(String(50), nullable=False) play_count = Column(Integer, default=0) like_count = Column(Integer, default=0) is_featured = Column(Boolean, default=False) status = Column(Integer, default=1) created_at = Column(TIMESTAMP, server_default=func.now()) updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now()) nodes = relationship("StoryNode", back_populates="story", cascade="all, delete-orphan") class StoryNode(Base): """故事节点表""" __tablename__ = "story_nodes" id = Column(Integer, primary_key=True, autoincrement=True) story_id = Column(Integer, ForeignKey("stories.id", ondelete="CASCADE"), nullable=False) node_key = Column(String(50), nullable=False) content = Column(Text, nullable=False) speaker = Column(String(50), default="") background_image = Column(String(255), default="") character_image = Column(String(255), default="") bgm = Column(String(255), default="") is_ending = Column(Boolean, default=False) ending_name = Column(String(100), default="") ending_score = Column(Integer, default=0) ending_type = Column(String(20), default="") sort_order = Column(Integer, default=0) created_at = Column(TIMESTAMP, server_default=func.now()) story = relationship("Story", back_populates="nodes") choices = relationship("StoryChoice", back_populates="node", cascade="all, delete-orphan") class StoryChoice(Base): """故事选项表""" __tablename__ = "story_choices" id = Column(Integer, primary_key=True, autoincrement=True) node_id = Column(Integer, ForeignKey("story_nodes.id", ondelete="CASCADE"), nullable=False) story_id = Column(Integer, nullable=False) text = Column(String(200), nullable=False) next_node_key = Column(String(50), nullable=False) sort_order = Column(Integer, default=0) is_locked = Column(Boolean, default=False) created_at = Column(TIMESTAMP, server_default=func.now()) node = relationship("StoryNode", back_populates="choices")