合并JWL,WZY,TRM代码

Change-Id: Ifb4fcad3c06733e1e005e7d8d9403e3561010fb4
diff --git a/Merge/back_wzy/models/__init__.py b/Merge/back_wzy/models/__init__.py
new file mode 100644
index 0000000..f7cef7b
--- /dev/null
+++ b/Merge/back_wzy/models/__init__.py
@@ -0,0 +1,12 @@
+# models/__init__.py
+# --------------------------------------------------
+# 绝**对**不要**从** app.py 导入 db!
+# 改成:
+from extensions import db
+
+from .user     import User
+from .topic    import Topic
+from .tag      import Tag
+from .post     import Post, post_tags
+from .behavior import Behavior
+from .comment  import Comment
diff --git a/Merge/back_wzy/models/__pycache__/__init__.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..fa2d5c2
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/__init__.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/__init__.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000..fe53b2a
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/__init__.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/behavior.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/behavior.cpython-310.pyc
new file mode 100644
index 0000000..bd2fdec
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/behavior.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/behavior.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/behavior.cpython-312.pyc
new file mode 100644
index 0000000..71f3757
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/behavior.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/comment.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/comment.cpython-310.pyc
new file mode 100644
index 0000000..550853e
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/comment.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/comment.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/comment.cpython-312.pyc
new file mode 100644
index 0000000..393c6d3
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/comment.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/post.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/post.cpython-310.pyc
new file mode 100644
index 0000000..3131d0b
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/post.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/post.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/post.cpython-312.pyc
new file mode 100644
index 0000000..1d64737
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/post.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/tag.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/tag.cpython-310.pyc
new file mode 100644
index 0000000..649f51e
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/tag.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/tag.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/tag.cpython-312.pyc
new file mode 100644
index 0000000..d76c0e0
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/tag.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/topic.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/topic.cpython-310.pyc
new file mode 100644
index 0000000..7fd8f9e
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/topic.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/topic.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/topic.cpython-312.pyc
new file mode 100644
index 0000000..a779595
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/topic.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/user.cpython-310.pyc b/Merge/back_wzy/models/__pycache__/user.cpython-310.pyc
new file mode 100644
index 0000000..2fc98eb
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/user.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/__pycache__/user.cpython-312.pyc b/Merge/back_wzy/models/__pycache__/user.cpython-312.pyc
new file mode 100644
index 0000000..e3841c7
--- /dev/null
+++ b/Merge/back_wzy/models/__pycache__/user.cpython-312.pyc
Binary files differ
diff --git a/Merge/back_wzy/models/behavior.py b/Merge/back_wzy/models/behavior.py
new file mode 100644
index 0000000..aed413f
--- /dev/null
+++ b/Merge/back_wzy/models/behavior.py
@@ -0,0 +1,13 @@
+# models/behavior.py
+from extensions import db
+from datetime import datetime
+
+class Behavior(db.Model):
+    __tablename__ = 'behaviors'
+
+    id = db.Column(db.BigInteger, primary_key=True)
+    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
+    post_id = db.Column(db.Integer, db.ForeignKey('posts.id', ondelete='CASCADE'), nullable=False)
+    type = db.Column(db.Enum('like', 'comment', 'favorite', 'view', 'share'), nullable=False)
+    value = db.Column(db.Integer, default=1, nullable=False)
+    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
diff --git a/Merge/back_wzy/models/comment.py b/Merge/back_wzy/models/comment.py
new file mode 100644
index 0000000..ce25287
--- /dev/null
+++ b/Merge/back_wzy/models/comment.py
@@ -0,0 +1,24 @@
+# models/comment.py
+from extensions import db
+from datetime import datetime
+
+class Comment(db.Model):
+    __tablename__ = 'comments'
+
+    id = db.Column(db.Integer, primary_key=True)
+    post_id = db.Column(db.Integer, db.ForeignKey('posts.id', ondelete='CASCADE'), nullable=False)
+    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
+    parent_id = db.Column(db.Integer, db.ForeignKey('comments.id', ondelete='CASCADE'))
+    content = db.Column(db.Text, nullable=False)
+    status = db.Column(db.Enum('active', 'deleted'), default='active', nullable=False)
+    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
+    updated_at = db.Column(db.DateTime, default=datetime.utcnow,
+                           onupdate=datetime.utcnow, nullable=False)
+
+    # self-referential replies
+    replies = db.relationship(
+        'Comment',
+        backref=db.backref('parent', remote_side=[id]),
+        lazy='dynamic',
+        cascade='all, delete-orphan'
+    )
diff --git a/Merge/back_wzy/models/post.py b/Merge/back_wzy/models/post.py
new file mode 100644
index 0000000..ab99191
--- /dev/null
+++ b/Merge/back_wzy/models/post.py
@@ -0,0 +1,32 @@
+# models/post.py
+from extensions import db
+from datetime import datetime
+
+# association table for Post <-> Tag
+post_tags = db.Table(
+    'post_tags',
+    db.Column('post_id', db.Integer, db.ForeignKey('posts.id', ondelete='CASCADE'), primary_key=True),
+    db.Column('tag_id', db.Integer, db.ForeignKey('tags.id', ondelete='CASCADE'), primary_key=True)
+)
+
+class Post(db.Model):
+    __tablename__ = 'posts'
+
+    id = db.Column(db.Integer, primary_key=True)
+    user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
+    topic_id = db.Column(db.Integer, db.ForeignKey('topics.id', ondelete='SET NULL'))
+    type = db.Column(db.Enum('text', 'image', 'video', 'document'), default='text', nullable=False)
+    title = db.Column(db.String(255), nullable=False)
+    content = db.Column(db.Text, nullable=False)
+    media_urls = db.Column(db.JSON)
+    status = db.Column(db.Enum('draft', 'pending', 'published', 'deleted', 'rejected'),
+                       default='draft', nullable=False)
+    heat = db.Column(db.Integer, default=0, nullable=False)
+    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
+    updated_at = db.Column(db.DateTime, default=datetime.utcnow,
+                           onupdate=datetime.utcnow, nullable=False)
+
+    # relationships
+    tags = db.relationship('Tag', secondary=post_tags, backref=db.backref('posts', lazy='dynamic'))
+    behaviors = db.relationship('Behavior', backref='post', lazy='dynamic', cascade='all, delete')
+    comments = db.relationship('Comment', backref='post', lazy='dynamic', cascade='all, delete')
diff --git a/Merge/back_wzy/models/tag.py b/Merge/back_wzy/models/tag.py
new file mode 100644
index 0000000..7753a38
--- /dev/null
+++ b/Merge/back_wzy/models/tag.py
@@ -0,0 +1,13 @@
+# models/tag.py
+from extensions import db
+from datetime import datetime
+
+class Tag(db.Model):
+    __tablename__ = 'tags'
+
+    id = db.Column(db.Integer, primary_key=True)
+    name = db.Column(db.String(50), unique=True, nullable=False)
+    description = db.Column(db.String(255))
+    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
+
+    # posts relationship via association table defined in post.py
diff --git a/Merge/back_wzy/models/topic.py b/Merge/back_wzy/models/topic.py
new file mode 100644
index 0000000..d0e5a2e
--- /dev/null
+++ b/Merge/back_wzy/models/topic.py
@@ -0,0 +1,14 @@
+# models/topic.py
+from extensions import db
+from datetime import datetime
+
+class Topic(db.Model):
+    __tablename__ = 'topics'
+
+    id = db.Column(db.Integer, primary_key=True)
+    name = db.Column(db.String(100), unique=True, nullable=False)
+    description = db.Column(db.Text)
+    status = db.Column(db.Enum('active', 'archived'), default='active', nullable=False)
+    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
+
+    posts = db.relationship('Post', backref='topic', lazy='dynamic', cascade='all, delete')
diff --git a/Merge/back_wzy/models/user.py b/Merge/back_wzy/models/user.py
new file mode 100644
index 0000000..f27e7d3
--- /dev/null
+++ b/Merge/back_wzy/models/user.py
@@ -0,0 +1,68 @@
+# models/user.py
+
+from datetime import datetime
+from extensions import db
+
+# 关联表:用户关注关系
+follows = db.Table(
+    'follows',
+    db.Column('follower_id', db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), primary_key=True),
+    db.Column('followee_id', db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), primary_key=True),
+    db.Column('created_at', db.DateTime, default=datetime.utcnow, nullable=False)
+)
+
+class User(db.Model):
+    __tablename__ = 'users'
+
+    id = db.Column(db.Integer, primary_key=True)
+    username = db.Column(db.String(50), unique=True, nullable=False)
+    password = db.Column(db.String(255), nullable=False)
+    email = db.Column(db.String(100), unique=True, nullable=False)
+    avatar = db.Column(db.String(255))
+    role = db.Column(db.Enum('user', 'admin'), default='user', nullable=False)
+    bio = db.Column(db.String(255))
+    status = db.Column(db.Enum('active', 'banned', 'muted'), default='active', nullable=False)
+    created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
+    updated_at = db.Column(
+        db.DateTime,
+        default=datetime.utcnow,
+        onupdate=datetime.utcnow,
+        nullable=False
+    )
+
+    # 用户发布的帖子
+    posts = db.relationship(
+        'Post',
+        backref='author',
+        lazy='dynamic',
+        cascade='all, delete-orphan'
+    )
+
+    # 用户的互动行为
+    behaviors = db.relationship(
+        'Behavior',
+        backref='user',
+        lazy='dynamic',
+        cascade='all, delete-orphan'
+    )
+
+    # 用户发表的评论
+    comments = db.relationship(
+        'Comment',
+        backref='user',
+        lazy='dynamic',
+        cascade='all, delete-orphan'
+    )
+
+    # 用户关注的对象列表
+    following = db.relationship(
+        'User',
+        secondary=follows,
+        primaryjoin=(id == follows.c.follower_id),
+        secondaryjoin=(id == follows.c.followee_id),
+        backref=db.backref('followers', lazy='dynamic'),
+        lazy='dynamic'
+    )
+
+    def __repr__(self):
+        return f"<User {self.username!r} id={self.id}>"