refactor: 后端从Node.js重写为Python FastAPI
This commit is contained in:
2
server/app/models/__init__.py
Normal file
2
server/app/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from app.models.story import Story, StoryNode, StoryChoice
|
||||
from app.models.user import User, UserProgress, UserEnding
|
||||
BIN
server/app/models/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
server/app/models/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
server/app/models/__pycache__/story.cpython-310.pyc
Normal file
BIN
server/app/models/__pycache__/story.cpython-310.pyc
Normal file
Binary file not shown.
BIN
server/app/models/__pycache__/user.cpython-310.pyc
Normal file
BIN
server/app/models/__pycache__/user.cpython-310.pyc
Normal file
Binary file not shown.
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")
|
||||
58
server/app/models/user.py
Normal file
58
server/app/models/user.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
用户相关ORM模型
|
||||
"""
|
||||
from sqlalchemy import Column, Integer, String, Boolean, TIMESTAMP, ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.sql import func
|
||||
from app.database import Base
|
||||
|
||||
|
||||
class User(Base):
|
||||
"""用户表"""
|
||||
__tablename__ = "users"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
openid = Column(String(100), unique=True, nullable=False)
|
||||
nickname = Column(String(100), default="")
|
||||
avatar_url = Column(String(255), default="")
|
||||
gender = Column(Integer, default=0)
|
||||
total_play_count = Column(Integer, default=0)
|
||||
total_endings = Column(Integer, default=0)
|
||||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
class UserProgress(Base):
|
||||
"""用户进度表"""
|
||||
__tablename__ = "user_progress"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
|
||||
story_id = Column(Integer, ForeignKey("stories.id", ondelete="CASCADE"), nullable=False)
|
||||
current_node_key = Column(String(50), default="start")
|
||||
is_completed = Column(Boolean, default=False)
|
||||
ending_reached = Column(String(100), default="")
|
||||
is_liked = Column(Boolean, default=False)
|
||||
is_collected = Column(Boolean, default=False)
|
||||
play_count = Column(Integer, default=1)
|
||||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||||
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
|
||||
|
||||
__table_args__ = (
|
||||
UniqueConstraint('user_id', 'story_id', name='uk_user_story'),
|
||||
)
|
||||
|
||||
|
||||
class UserEnding(Base):
|
||||
"""用户结局收集表"""
|
||||
__tablename__ = "user_endings"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
|
||||
story_id = Column(Integer, ForeignKey("stories.id", ondelete="CASCADE"), nullable=False)
|
||||
ending_name = Column(String(100), nullable=False)
|
||||
ending_score = Column(Integer, default=0)
|
||||
unlocked_at = Column(TIMESTAMP, server_default=func.now())
|
||||
|
||||
__table_args__ = (
|
||||
UniqueConstraint('user_id', 'story_id', 'ending_name', name='uk_user_ending'),
|
||||
)
|
||||
Reference in New Issue
Block a user