当前位置:  首页>> 技术小册>> Flask框架入门指南

实战项目十三:构建社交网络(三):朋友圈与评论

在之前的章节中,我们已经成功搭建了一个基础的社交网络框架,包括用户注册、登录、个人信息展示等功能。本章节,我们将进一步深化项目的功能,通过实现朋友圈和评论系统,让用户的交互体验更加丰富和动态。这不仅能够增强用户粘性,也是社交网络中不可或缺的核心功能之一。

一、概述

朋友圈是用户分享生活点滴、表达观点的重要平台,而评论则是用户之间互动的主要方式之一。在本章中,我们将逐步实现以下功能:

  1. 朋友圈发布:用户能够发布文本、图片或视频到个人朋友圈。
  2. 朋友圈展示:所有用户都能看到自己及好友发布的朋友圈内容。
  3. 评论功能:用户可以对自己或他人发布的朋友圈内容进行评论,支持多层嵌套评论。
  4. 点赞与取消点赞:用户可以对朋友圈内容进行点赞,并能取消已点的赞。
  5. 时间线排序:朋友圈内容按发布时间降序排列。

二、数据库设计

首先,我们需要更新数据库模型以支持朋友圈和评论功能。以下是一些关键的数据库表设计:

  1. Posts(朋友圈表)

    • id: 主键,唯一标识
    • user_id: 发布者的用户ID
    • content: 朋友圈内容(文本)
    • image_url: 图片URL(可选)
    • video_url: 视频URL(可选)
    • created_at: 发布时间
    • likes_count: 点赞数
  2. Comments(评论表)

    • id: 主键,唯一标识
    • post_id: 所属朋友圈的ID
    • user_id: 评论者的用户ID
    • content: 评论内容
    • created_at: 评论时间
    • parent_id: 上一级评论的ID(用于实现嵌套评论,若为顶级评论则为NULL)
  3. Likes(点赞表)(可选,视设计复杂度而定,也可通过计算Posts表的点赞数实现)

    • post_id: 被点赞的朋友圈ID
    • user_id: 点赞用户的ID

三、朋友圈发布与展示

1. 朋友圈发布

在前端,我们需要设计一个表单供用户输入朋友圈内容、选择图片或视频文件,并提交至后端。后端接收到数据后,首先进行必要的验证(如内容非空、图片/视频文件大小限制等),然后将数据保存到数据库中,并返回操作结果。

示例代码片段(Flask路由处理)

  1. from flask import request, jsonify, Blueprint
  2. from models import db, Post
  3. posts_bp = Blueprint('posts', __name__)
  4. @posts_bp.route('/posts', methods=['POST'])
  5. def create_post():
  6. data = request.get_json()
  7. user_id = current_user.id # 假设已通过某种方式获取当前用户ID
  8. new_post = Post(user_id=user_id, content=data['content'], image_url=data.get('image_url'), video_url=data.get('video_url'))
  9. db.session.add(new_post)
  10. db.session.commit()
  11. return jsonify({'message': 'Post created successfully', 'post_id': new_post.id}), 201

2. 朋友圈展示

展示朋友圈时,我们需要查询并渲染用户自己的朋友圈以及关注用户的朋友圈。可以通过SQL JOIN操作或多次查询实现,考虑到性能,建议使用分页和缓存技术。

示例查询(SQLAlchemy)

  1. from models import Post
  2. # 假设current_user是当前登录用户
  3. # 假设已有方法get_followed_user_ids()获取当前用户关注的用户ID列表
  4. followed_user_ids = current_user.get_followed_user_ids()
  5. followed_posts = Post.query.filter(Post.user_id.in_(followed_user_ids) | Post.user_id == current_user.id).order_by(Post.created_at.desc()).all()

四、评论功能

1. 发表评论

发表评论的逻辑与发布朋友圈类似,但涉及到对Comments表的操作,并且需要指定post_idparent_id(对于嵌套评论)。

2. 渲染评论

渲染评论时,需要递归地查询和渲染所有子评论。这可以通过在前端递归渲染模板或在后端构建好评论树后传递给前端来实现。

示例代码片段(后端构建评论树)

  1. def build_comment_tree(comments):
  2. comment_dict = {comment.id: comment for comment in comments}
  3. tree = []
  4. for comment in comments:
  5. if comment.parent_id is None:
  6. tree.append(build_tree_node(comment, comment_dict))
  7. return tree
  8. def build_tree_node(comment, comment_dict):
  9. node = {
  10. 'id': comment.id,
  11. 'content': comment.content,
  12. 'user_id': comment.user_id,
  13. 'created_at': comment.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  14. 'children': []
  15. }
  16. for child_id in [c.id for c in comment.children]:
  17. if child_id in comment_dict:
  18. node['children'].append(build_tree_node(comment_dict[child_id], comment_dict))
  19. return node

注意:上述children属性在数据库中并不直接存在,这里仅为示例说明如何构建评论树。实际项目中,可能需要通过SQL查询或ORM提供的特定功能来实现。

五、点赞与取消点赞

点赞和取消点赞功能可以通过修改Posts表中的likes_count字段或使用单独的Likes表来实现。使用Likes表可以更灵活地处理点赞和取消点赞的逻辑,如记录点赞时间、限制点赞次数等。

示例代码片段(使用Likes表)

  1. from models import Like
  2. @posts_bp.route('/posts/<int:post_id>/like', methods=['POST'])
  3. def like_post(post_id):
  4. user_id = current_user.id
  5. like = Like.query.filter_by(post_id=post_id, user_id=user_id).first()
  6. if like:
  7. # 取消点赞
  8. db.session.delete(like)
  9. post = Post.query.get(post_id)
  10. post.likes_count -= 1
  11. else:
  12. # 点赞
  13. new_like = Like(post_id=post_id, user_id=user_id)
  14. db.session.add(new_like)
  15. post = Post.query.get(post_id)
  16. post.likes_count += 1
  17. db.session.commit()
  18. return jsonify({'message': 'Like status updated', 'likes_count': post.likes_count}), 200

六、总结

通过本章节的学习,我们掌握了在Flask框架中构建社交网络中的朋友圈与评论系统的基本方法。这包括数据库设计、朋友圈的发布与展示、评论的发表与渲染、以及点赞与取消点赞功能的实现。这些功能不仅丰富了社交网络的交互性,也为后续更复杂功能的开发打下了坚实的基础。在后续章节中,我们将继续探索更多高级特性,如私信系统、用户关系图谱分析等,进一步提升社交网络的功能性和用户体验。


该分类下的相关小册推荐: