最近忙着搭建自己的博客网站忙的焦头烂额,其中就包括文章底下评论以及评论回复的功能实现。在网上找到很多资料并不能解决,最后通过蛛丝马迹和我自己的才华(笑)解决了这个问题,所以今天就像跟大家分享一下此部分功能的踩坑经验。
一、数据库设计
此部分是最难的地方,思考一下,一篇文章有很多评论,一个user对应一句评论,每一句评论底下对应相对的对此评论的回复,每一句回复又与回复对象user相对应。
好吧,总结一下:
- “评论”与“回复”两个表可以用一个,只是对象不同,评论的对象为文章(作者),回复的对象为评论的user
- 每一句“回复”Post对应两个user,一个user是发起者,一个user是回复的对象。
- 文章Articles与“回复”Post一对多关系。
画个图:
二、相应的model代码设计
除了上述问题之外,还要考虑三个基本表的基本属性。另外还需要考虑的:
1.在post表中增加一个布尔类型的字段,以便设置评论是否为私密文章(私密文章后面再考虑)。
2.post表中增加reply_id以对应回复的对象是哪一条评论(post)
3.post表增加timestamp以记录评论的时间
class Post(db.Model):#评论,一个用户对应多个评论
__tablename__='posts'
d = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'),index=True)#外键
user_to_id = db.Column(db.Integer,db.ForeignKey('users.id'),index=True)#外键
content = db.Column(db.String(400))#内容
timestamp = db.Column(db.DateTime, index=True,default=datetime.utcnow)
article_id = db.Column(db.Integer,db.ForeignKey('article.id'),index=True)#外键
is_appear = db.Column(db.Boolean()) #是否显示此评论
reply_id = db.Column(db.Integer,index=True) #回复的是哪一条评论
#reply_to_userid = db.Column(db.Integer,index=True)
class User(UserMixin,db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(320), unique=True)
password_hash = db.Column(db.String(128))
user_to_id=db.relationship('Post',foreign_keys=[Post.user_to_id],backref=db.backref('user_to', lazy='joined'),lazy='dynamic',cascade='all, delete-orphan')
posts=db.relationship('Post',foreign_keys=[Post.user_id],backref=db.backref('userid', lazy='joined'),lazy='dynamic',cascade='all, delete-orphan')
address = db.Column(db.String(80))#网址
def __repr__(self):
return '<User{}>'.format(self.username)
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)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128)) #标题
body=db.Column(db.Text) #原本text格式
body_html = db.Column(db.Text) #转化成html代码后的格式
create_time = db.Column(db.DateTime, index=True, default=datetime.utcnow) #创建时间
seo_link = db.Column(db.String(128)) #文章原链接
pic_path = db.Column(db.String(320)) #封面地址
category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))