合并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}>"