用户评论模块 | 青训营

103 阅读3分钟

zyxyelrua5.feishu.cn/docx/RvfAdJ… bytedancecampus1.feishu.cn/docs/doccnD… dzs47lqpfu.feishu.cn/docx/Q48XdJ…

需求分析

用户与视频评论相关的操作有三部分:查看评论、发表评论和删除

这三个操作根据实际情况有不同的需求:

  • 未登录用户可以查看到评论
  • 登录用户才能发表评论
  • 只能对自己发布的评论进行删除

针对这些需求,我们能进行合理的接口设计约束:

  • 获取评论列表接口需要先通过中间件(拦截器)验证用户登录
  • 删除评论接口需要检查操作用户和评论是否相关

接口核心代码解析

评论操作接口(包含发送和删除两个功能)

// CommentAction no practical effect, just check if token is valid
func CommentAction(c *gin.Context) {
   // (通过token验证解析后得到的)user(的引用)
   userP := c.MustGet("authUserObj").(*dao.TableUser)
   // 视频id (注意获取到的是string,要转成int64)
   videoId, _ := strconv.ParseInt(c.Query("video_id"), 10, 64)
   // 1-发布评论,2-删除评论
   actionType := c.Query("action_type")

   if actionType == "1" { // 发布评论
      // 用户填写的评论内容,在action_type=1的时候使用
      commentText := c.Query("comment_text")
      // 创建日期 (格式:mm-dd)
      createDate := time.Now().Format("01-02")
      comment := dao.TableComment{
         VideoId:    videoId,
         UserId:     userP.Id,
         Content:    commentText,
         CreateDate: createDate,
      }
      if dao.AddComment(&comment) { // 提交评论成功
         // content中加入结果
         ...
      } else {
         // content中加入结果
         ...
      }
   } else if actionType == "2" {
      // 要删除的评论id,在action_type=2的时候使用
      commentId, _ := strconv.ParseInt(c.Query("comment_id"), 10, 64)
      dao.DeleteComment(commentId)
   }
}
  1. 判断输入参数的状态,是否为空

    1. 参数不合法,返回
    2. 参数合法,继续
  2. 根据请求中的token判断当前用户的登录状态并获取其id,

  3. 判断action_type类型

    1. 如果action_type = 1,将评论插入评论表

    2. 如果action_type = 2,代表用户发起删除评论行为。

      1. 判断当前用户和评论的用户是否一致

        1. 一致,删除评论
        2. 不一致,返回错误提示
  4. 调用publish微服务的修改视频评论数的方法

  5. 结束 获取评论列表接口

// CommentList all videos have same demo comment list
func CommentList(c *gin.Context) {
   // token (可能不存在或已过期)
   token := c.Query("token")
   // 视频id
   videoId, _ := strconv.ParseInt(c.Query("video_id"), 10, 64)

   // 根据token获取请求方的user
   userP, err := module.JwtParseUser(strings.Fields(token)[1])
   if err != nil {
      log.Printf("%+v\n", err)
   }
   // 获取评论列表
   list, err := dao.GetCommentList(videoId)
   if err != nil {
      log.Printf("[获取评论列表] 产生异常: %+v\n", err)
      c.JSON(http.StatusOK, gin.H{
         "status_code":  1,
         "status_msg":   "数据异常",
         "comment_list": nil,
      })
      return
   }

   // TableComment中只有user_id,没有user完整信息和是否关注,而且Dao查询生成的struct不满足需求,
   //    生成需要转换和查找,这里调用了自定义的函数完成转换和查找的操作,具体实现此处省略
   commentList := toComment(list, userP)
   c.JSON(http.StatusOK, gin.H{
      "status_code":  0,
      "status_msg":   "成功",
      "comment_list": commentList,
   })
}
  1. 判断输入的参数是否合法

    1. video_id <= 0 返回错误信息
    2. 合法,继续
  2. 判断token是否存在,

    1. 不存在,继续
    2. 存在,解析出user_id
  3. 根据视频id查询评论id列表

  4. 根据评论id列表查询用户id列表

  5. 调用user微服务,根据用户id集合查询user实体集合

    1. 在缓存中查询userid对应的user是否存在

      1. 存在,将user加入结果集
      2. 不存在,在数据库中查,查出的结果加入缓存,加入结果集
  6. 封装视图层comment列表并返回