1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| from datetime import datetime, timezone from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash
db = SQLAlchemy()
class User(UserMixin, db.Model): __tablename__ = "users"
id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False, index=True) email = db.Column(db.String(120), unique=True, nullable=False, index=True) password_hash = db.Column(db.String(256), nullable=False) nickname = db.Column(db.String(50)) bio = db.Column(db.Text) avatar_url = db.Column(db.String(256)) is_active = db.Column(db.Boolean, default=True, nullable=False) is_admin = db.Column(db.Boolean, default=False, nullable=False) created_at = db.Column( db.DateTime, default=lambda: datetime.now(timezone.utc), nullable=False ) updated_at = db.Column( db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), )
posts = db.relationship("Post", backref="author", lazy="dynamic") comments = db.relationship("Comment", backref="author", lazy="dynamic")
def set_password(self, password): self.password_hash = generate_password_hash(password)
def check_password(self, password): return check_password_hash(self.password_hash, password)
def __repr__(self): return f"<User {self.username}>"
post_tags = db.Table( "post_tags", db.Column("post_id", db.Integer, db.ForeignKey("posts.id"), primary_key=True), db.Column("tag_id", db.Integer, db.ForeignKey("tags.id"), primary_key=True), )
class Post(db.Model): __tablename__ = "posts"
id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(200), nullable=False) slug = db.Column(db.String(200), unique=True, nullable=False, index=True) content = db.Column(db.Text, nullable=False) summary = db.Column(db.String(500)) is_published = db.Column(db.Boolean, default=False, index=True) view_count = db.Column(db.Integer, default=0) author_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) category_id = db.Column(db.Integer, db.ForeignKey("categories.id")) created_at = db.Column( db.DateTime, default=lambda: datetime.now(timezone.utc), nullable=False, index=True ) updated_at = db.Column( db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), )
comments = db.relationship("Comment", backref="post", lazy="dynamic") tags = db.relationship( "Tag", secondary=post_tags, backref=db.backref("posts", lazy="dynamic") )
def __repr__(self): return f"<Post {self.title}>"
class Category(db.Model): __tablename__ = "categories"
id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True, nullable=False) slug = db.Column(db.String(50), unique=True, nullable=False) description = db.Column(db.String(200))
posts = db.relationship("Post", backref="category", lazy="dynamic")
def __repr__(self): return f"<Category {self.name}>"
class Tag(db.Model): __tablename__ = "tags"
id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True, nullable=False) slug = db.Column(db.String(50), unique=True, nullable=False)
def __repr__(self): return f"<Tag {self.name}>"
class Comment(db.Model): __tablename__ = "comments"
id = db.Column(db.Integer, primary_key=True) content = db.Column(db.Text, nullable=False) is_approved = db.Column(db.Boolean, default=False) post_id = db.Column(db.Integer, db.ForeignKey("posts.id"), nullable=False, index=True) author_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) parent_id = db.Column(db.Integer, db.ForeignKey("comments.id")) created_at = db.Column( db.DateTime, default=lambda: datetime.now(timezone.utc), nullable=False )
replies = db.relationship( "Comment", backref=db.backref("parent", remote_side=[id]), lazy="dynamic" )
def __repr__(self): return f"<Comment {self.id}>"
|