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)
}
}
-
判断输入参数的状态,是否为空
- 参数不合法,返回
- 参数合法,继续
-
根据请求中的token判断当前用户的登录状态并获取其id,
-
判断action_type类型
-
如果action_type = 1,将评论插入评论表
-
如果action_type = 2,代表用户发起删除评论行为。
-
判断当前用户和评论的用户是否一致
- 一致,删除评论
- 不一致,返回错误提示
-
-
-
调用publish微服务的修改视频评论数的方法
-
结束 获取评论列表接口
// 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,
})
}
-
判断输入的参数是否合法
- video_id <= 0 返回错误信息
- 合法,继续
-
判断token是否存在,
- 不存在,继续
- 存在,解析出user_id
-
根据视频id查询评论id列表
-
根据评论id列表查询用户id列表
-
调用user微服务,根据用户id集合查询user实体集合
-
在缓存中查询userid对应的user是否存在
- 存在,将user加入结果集
- 不存在,在数据库中查,查出的结果加入缓存,加入结果集
-
-
封装视图层comment列表并返回