refactor: 后端从Node.js重写为Python FastAPI
This commit is contained in:
66
server/app/models/story.py
Normal file
66
server/app/models/story.py
Normal file
@@ -0,0 +1,66 @@
|
||||
"""
|
||||
故事相关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")
|
||||
Reference in New Issue
Block a user