合并JWL,WZY,TRM代码
Change-Id: Ifb4fcad3c06733e1e005e7d8d9403e3561010fb4
diff --git a/Merge/back_trm/app/models/post.py b/Merge/back_trm/app/models/post.py
new file mode 100644
index 0000000..041e263
--- /dev/null
+++ b/Merge/back_trm/app/models/post.py
@@ -0,0 +1,111 @@
+from .users import User
+from . import Base
+
+from sqlalchemy import (
+ Column, Integer, String, Text, JSON, Enum,
+ TIMESTAMP, ForeignKey, Index, func, text
+)
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import relationship
+
+
+class Post(Base):
+ __tablename__ = 'posts'
+ __table_args__ = (
+ # 索引
+ Index('idx_posts_heat', 'heat'),
+ # MySQL 引擎、字符集、校对规则、表注释
+ {
+ 'mysql_engine': 'InnoDB',
+ 'mysql_charset': 'utf8mb4',
+ 'mysql_collate': 'utf8mb4_general_ci',
+ 'comment': '内容帖子表'
+ }
+ )
+
+ def to_dict(self):
+ return {
+ 'id': self.id if self.id else None,
+ 'user_id': self.user_id if self.user_id else None,
+ 'topic_id': self.topic_id if self.topic_id else None,
+ 'type': self.type if self.type else None,
+ 'title': self.title if self.title else None,
+ 'content': self.content if self.content else None,
+ 'media_urls': self.media_urls if self.media_urls else None,
+ 'status': self.status if self.status else None,
+ 'heat': self.heat if self.heat else None,
+ 'created_at': self.created_at.isoformat() if self.created_at else None,
+ 'updated_at': self.updated_at.isoformat() if self.updated_at else None
+ }
+
+
+ id = Column(
+ Integer,
+ primary_key=True,
+ autoincrement=True,
+ comment='帖子ID'
+ )
+ user_id = Column(
+ Integer,
+ ForeignKey('users.id', ondelete='CASCADE'),
+ nullable=False,
+ index=True,
+ comment='作者ID'
+ )
+ topic_id = Column(
+ Integer,
+ ForeignKey('topics.id', ondelete='SET NULL'),
+ nullable=True,
+ index=True,
+ comment='所属话题ID'
+ )
+ type = Column(
+ Enum('text', 'image', 'video', 'document', name='post_type'),
+ nullable=False,
+ server_default=text("'text'"),
+ comment='内容类型'
+ )
+ title = Column(
+ String(255),
+ nullable=False,
+ comment='标题'
+ )
+ content = Column(
+ Text,
+ nullable=False,
+ comment='正文内容'
+ )
+ media_urls = Column(
+ JSON,
+ nullable=True,
+ comment='媒体资源URL数组'
+ )
+ status = Column(
+ Enum('draft', 'pending', 'published', 'deleted', 'rejected', name='post_status'),
+ nullable=False,
+ server_default=text("'draft'"),
+ comment='状态'
+ )
+ heat = Column(
+ Integer,
+ nullable=False,
+ server_default=text('0'),
+ comment='热度值'
+ )
+ created_at = Column(
+ TIMESTAMP,
+ nullable=True,
+ server_default=func.current_timestamp(),
+ comment='创建时间'
+ )
+ updated_at = Column(
+ TIMESTAMP,
+ nullable=True,
+ server_default=func.current_timestamp(),
+ onupdate=func.current_timestamp(),
+ comment='更新时间'
+ )
+
+ # 可选:与 User/Topic 模型的关系(需要在 User、Topic 中也定义 back_populates)
+ # user = relationship('User', back_populates='posts')
+ # topic = relationship('Topic', back_populates='posts')