在之前的章节中,我们已经成功搭建了一个基础的社交网络框架,包括用户注册、登录、个人信息展示等功能。本章节,我们将进一步深化项目的功能,通过实现朋友圈和评论系统,让用户的交互体验更加丰富和动态。这不仅能够增强用户粘性,也是社交网络中不可或缺的核心功能之一。
朋友圈是用户分享生活点滴、表达观点的重要平台,而评论则是用户之间互动的主要方式之一。在本章中,我们将逐步实现以下功能:
首先,我们需要更新数据库模型以支持朋友圈和评论功能。以下是一些关键的数据库表设计:
Posts(朋友圈表)
Comments(评论表)
Likes(点赞表)(可选,视设计复杂度而定,也可通过计算Posts表的点赞数实现)
1. 朋友圈发布
在前端,我们需要设计一个表单供用户输入朋友圈内容、选择图片或视频文件,并提交至后端。后端接收到数据后,首先进行必要的验证(如内容非空、图片/视频文件大小限制等),然后将数据保存到数据库中,并返回操作结果。
示例代码片段(Flask路由处理):
from flask import request, jsonify, Blueprint
from models import db, Post
posts_bp = Blueprint('posts', __name__)
@posts_bp.route('/posts', methods=['POST'])
def create_post():
data = request.get_json()
user_id = current_user.id # 假设已通过某种方式获取当前用户ID
new_post = Post(user_id=user_id, content=data['content'], image_url=data.get('image_url'), video_url=data.get('video_url'))
db.session.add(new_post)
db.session.commit()
return jsonify({'message': 'Post created successfully', 'post_id': new_post.id}), 201
2. 朋友圈展示
展示朋友圈时,我们需要查询并渲染用户自己的朋友圈以及关注用户的朋友圈。可以通过SQL JOIN操作或多次查询实现,考虑到性能,建议使用分页和缓存技术。
示例查询(SQLAlchemy):
from models import Post
# 假设current_user是当前登录用户
# 假设已有方法get_followed_user_ids()获取当前用户关注的用户ID列表
followed_user_ids = current_user.get_followed_user_ids()
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_id
和parent_id
(对于嵌套评论)。
2. 渲染评论
渲染评论时,需要递归地查询和渲染所有子评论。这可以通过在前端递归渲染模板或在后端构建好评论树后传递给前端来实现。
示例代码片段(后端构建评论树):
def build_comment_tree(comments):
comment_dict = {comment.id: comment for comment in comments}
tree = []
for comment in comments:
if comment.parent_id is None:
tree.append(build_tree_node(comment, comment_dict))
return tree
def build_tree_node(comment, comment_dict):
node = {
'id': comment.id,
'content': comment.content,
'user_id': comment.user_id,
'created_at': comment.created_at.strftime('%Y-%m-%d %H:%M:%S'),
'children': []
}
for child_id in [c.id for c in comment.children]:
if child_id in comment_dict:
node['children'].append(build_tree_node(comment_dict[child_id], comment_dict))
return node
注意:上述children
属性在数据库中并不直接存在,这里仅为示例说明如何构建评论树。实际项目中,可能需要通过SQL查询或ORM提供的特定功能来实现。
点赞和取消点赞功能可以通过修改Posts
表中的likes_count
字段或使用单独的Likes
表来实现。使用Likes
表可以更灵活地处理点赞和取消点赞的逻辑,如记录点赞时间、限制点赞次数等。
示例代码片段(使用Likes表):
from models import Like
@posts_bp.route('/posts/<int:post_id>/like', methods=['POST'])
def like_post(post_id):
user_id = current_user.id
like = Like.query.filter_by(post_id=post_id, user_id=user_id).first()
if like:
# 取消点赞
db.session.delete(like)
post = Post.query.get(post_id)
post.likes_count -= 1
else:
# 点赞
new_like = Like(post_id=post_id, user_id=user_id)
db.session.add(new_like)
post = Post.query.get(post_id)
post.likes_count += 1
db.session.commit()
return jsonify({'message': 'Like status updated', 'likes_count': post.likes_count}), 200
通过本章节的学习,我们掌握了在Flask框架中构建社交网络中的朋友圈与评论系统的基本方法。这包括数据库设计、朋友圈的发布与展示、评论的发表与渲染、以及点赞与取消点赞功能的实现。这些功能不仅丰富了社交网络的交互性,也为后续更复杂功能的开发打下了坚实的基础。在后续章节中,我们将继续探索更多高级特性,如私信系统、用户关系图谱分析等,进一步提升社交网络的功能性和用户体验。