需求分析
使用golang及gorm制作一个用户的评论以及回复评论,同时删除评论后评论数通过递归查询所有的子孙评论发生改变
实现思路
在前端传来用户的数据,即我评论了哪个楼主,我上一级的评论是谁,
评论:先判断是否存在楼主,其次判断是否存在父级评论,之后添加评论,最后增加评论数,储存数据库
删除评论:获取删除评论的楼主树洞,判断是否是本人或者楼主删除评论,判断是否又该评论的父级评论,通过递归算法查询所有的子孙评论,删除子孙评论,评论数减少,最后存入数据库。(在递归中,要查找子评论的子评论,同时删除子评论,减少评论数)
实现代码
递归删除所有的评论的子孙评论
//递归删除所有评论的子评论
func DeleteCommentAndReplays(comment *model.TreeHoleComment) (err error) {
comment, err = mysql.GetTreeHoleCommentByID(int(comment.ID))
if err != nil {
zap.L().Error("数据库查询回复失败", zap.Error(err))
return err
}
for _, replay := range comment.CommentReplays {
err := DeleteCommentAndReplays(replay) //此处递归
if err != nil {
zap.L().Error("递归查询评论失败", zap.Error(err))
return err
}
//删除评论
err = mysql.DeleteTreeHoleComment(int(replay.ID))
if err != nil {
zap.L().Error("删除评论失败", zap.Error(err))
return err
}
//查询顶部树洞
treeHoleByID, err := mysql.GetTreeHoleByID(int(comment.TreeHoleID))
if err != nil {
zap.L().Error("通过id查询树洞错误", zap.Error(err))
return err
}
treeHoleByID.CommentNum--
//存数据库
err = mysql.UpdateTreeHole(treeHoleByID)
if err != nil {
zap.L().Error("数据库更新树洞失败", zap.Error(err))
return err
}
}
return nil
}
结构体
//树洞结构体
type TreeHole struct {
gorm.Model
User User
UserID uint `json:"userID"` //用户ID
Content string `json:"content"` //树洞内容
LikeNum uint

文章描述了一个使用Golang和GORM库构建的评论系统,包括添加评论、删除评论及其子孙评论的功能。删除评论时,通过递归算法查找并删除所有子孙评论,同时更新评论数。涉及到的数据库操作包括查询、更新和删除。
最低0.47元/天 解锁文章
1086





