Flask Vue.js全栈开发|第13章:喜欢文章
Synopsis: 用户在浏览别人发布的文章时,可以将中意的文章添加到自己的 喜欢列表 中,以便于以后查看。同时,会发送动态通知给文章的作者,提醒有新用户喜欢了他的文章
代码已上传到 https://github.com/wangy8961/flask-vuejs-madblog/tree/v0.13 ,欢迎star
1. 数据库模型
用户收藏别人的文章,跟用户点赞别人的评论原理是完全一样的,所以是 多对多
关系
修改 back-end/app/models.py
:
# 喜欢文章 posts_likes = db.Table( 'posts_likes', db.Column('user_id', db.Integer, db.ForeignKey('users.id')), db.Column('post_id', db.Integer, db.ForeignKey('posts.id')), db.Column('timestamp', db.DateTime, default=datetime.utcnow) ) class User(PaginatedAPIMixin, db.Model): ... # 用户最后一次查看 收到的文章被喜欢 页面的时间,用来判断哪些喜欢是新的 last_posts_likes_read_time = db.Column(db.DateTime) ... def new_posts_likes(self): '''用户收到的文章被喜欢的新计数''' last_read_time = self.last_posts_likes_read_time or datetime(1900, 1, 1) # 当前用户发布的文章当中,哪些文章被喜欢了 posts = self.posts.join(posts_likes).all() # 新的喜欢记录计数 new_likes_count = 0 for p in posts: # 获取喜欢时间 for u in p.likers: if u != self: # 用户自己喜欢自己的文章不需要被通知 res = db.engine.execute("select * from posts_likes where user_id={} and post_id={}".format(u.id, p.id)) timestamp = datetime.strptime(list(res)[0][2], '%Y-%m-%d %H:%M:%S.%f') # 判断本条喜欢记录是否为新的 if timestamp > last_read_time: new_likes_count += 1 return new_likes_count class Post(PaginatedAPIMixin, db.Model): ... # 博客文章与喜欢/收藏它的人是多对多关系 likers = db.relationship('User', secondary=posts_likes, backref=db.backref('liked_posts', lazy='dynamic')) ... def is_liked_by(self, user): '''判断用户 user 是否已经收藏过该文章''' return user in self.likers def liked_by(self, user): '''收藏''' if not self.is_liked_by(user): self.likers.append(user) def unliked_by(self, user): '''取消收藏''' if self.is_liked_by(user): self.likers.remove(user)
数据库迁移:
未经允许不得转载: LIFE & SHARE - 王颜公子 » Flask Vue.js全栈开发|第13章:喜欢文章
0 条评论
评论者的用户名
评论时间暂时还没有评论.