blog_comment.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package blog_comment
  2. import (
  3. "gfast/app/model/admin/user"
  4. "gfast/plugin/blog/model/blog_log"
  5. "github.com/gogf/gf/database/gdb"
  6. "github.com/gogf/gf/errors/gerror"
  7. "github.com/gogf/gf/frame/g"
  8. "github.com/gogf/gf/os/gtime"
  9. )
  10. // AddReq 用于存储新增请求的请求参数
  11. type AddReq struct {
  12. CommentLogId uint `p:"commentLogId" v:"required|min:1#评论所属日志ID不能为空|评论所属日志ID错误"` // 当前评论所属日志id
  13. CommentNickname string `p:"commentNickname" v:"required#评论用户昵称不能为空"` // 评论用户的用户昵称
  14. CommentContent string `p:"commentContent" v:"required#评论内容不能为空"` // 评论内容
  15. CommentPid uint `p:"commentPid"` // 父评论id
  16. ReplyName string `p:"replyName"` // 当前回复对象的昵称
  17. ReplyId uint `p:"replyId"` // 当前回复对象的id
  18. }
  19. // EditReq 用于存储修改请求参数
  20. type EditReq struct {
  21. CommentId int64 `p:"commentId" v:"required|min:1#评论ID不能为空|评论ID错误"`
  22. CommentStatus uint `p:"commentStatus"` // 此评论的状态,0隐藏,1发布
  23. CommentContent string `p:"commentContent" v:"required#评论内容不能为空"` // 评论内容
  24. }
  25. // SelectPageReq 用于存储分页查询的请求参数
  26. type SelectPageReq struct {
  27. CommentNickname string `p:"commentNickname"` // 评论用户昵称
  28. LogTitle string `p:"logTitle"` // 日志标题
  29. CommentLogIds []int // 存储根据日志标题查出来的日志id
  30. PageNum int64 `p:"pageNum"` // 当前页
  31. PageSize int64 `p:"pageSize"` // 每页显示记录数
  32. Status string // 状态:用于控制查询相应状态的评论,0停用,1正常
  33. // 评论在博客页面回复中分两级一级是没有父评论的,二级是有父评论的,一条一级评论下的二级评论的父id值相同,均为该一级评论的id
  34. Flag int // 用于判断查询模式,0:查询不区分评论等级(查询所有),1:只查询一级评论(父id为0的评论)
  35. }
  36. // 用于存储分页查询的数据
  37. type ListEntity struct {
  38. Entity
  39. LogTitle string `orm:"log_title" json:"log_title" ` // 所属日志标题
  40. UserName string `orm:"user_name" json:"user_name" ` // 所属用户的用户名
  41. Children []*Entity
  42. }
  43. // GetChildren 将分页查出的实体切片中每一个元素的子评论查出来并添加进去
  44. func GetChildren(listEntity []*ListEntity) ([]*ListEntity, error) {
  45. for i, v := range listEntity {
  46. children, err := GetChildrenByCommentId(v.CommentId)
  47. if err != nil {
  48. return nil, err
  49. }
  50. listEntity[i].Children = children
  51. }
  52. return listEntity, nil
  53. }
  54. // GetChildrenByCommentId 根据评论id查询该评论所有已审核的回复
  55. func GetChildrenByCommentId(id uint) ([]*Entity, error) {
  56. list, err := Model.Where("comment_pid = ?", id).And("comment_status = ?", 1).All()
  57. if err != nil {
  58. g.Log().Error(err)
  59. return nil, gerror.New("根据评论id查询回复评论出错")
  60. }
  61. return list, nil
  62. }
  63. // GetCommentByID 根据ID查询记录
  64. func GetCommentByID(id int64) (*Entity, error) {
  65. entity, err := Model.FindOne("comment_id", id)
  66. if err != nil {
  67. g.Log().Error(err)
  68. return nil, gerror.New("根据ID查询记录出错!")
  69. }
  70. if entity == nil {
  71. return nil, gerror.New("根据ID未能查询到记录")
  72. }
  73. return entity, nil
  74. }
  75. // 查询并更新回复数
  76. func FindSonCommentCount(id int) error {
  77. i, err := Model.Where("reply_id = ?", id).Count()
  78. if err != nil {
  79. g.Log().Debug(err)
  80. return gerror.New("查询回复数出错")
  81. }
  82. entity, err := GetCommentByID(int64(id))
  83. if err != nil {
  84. return err
  85. }
  86. entity.CommentNum = uint(i)
  87. Model.Save(entity)
  88. return nil
  89. }
  90. // AddSave 添加的方法
  91. func AddSave(req *AddReq) error {
  92. var entity Entity
  93. entity.CommentLogId = req.CommentLogId // 所属日志
  94. entity.CommentNickname = req.CommentNickname // 评论用户昵称
  95. entity.CommentContent = req.CommentContent // 评论内容
  96. entity.CommentPid = req.CommentPid // 父评论id,没有父则为0
  97. entity.ReplyName = req.ReplyName
  98. entity.ReplyId = req.ReplyId
  99. entity.CreateTime = uint(gtime.Timestamp()) // 评论时间
  100. // 保存实体
  101. _, err := entity.Insert()
  102. if err != nil {
  103. g.Log().Error(err)
  104. return gerror.New("添加记录入库失败!")
  105. }
  106. return nil
  107. }
  108. // 批量删除记录
  109. func DeleteByIDs(ids []int) error {
  110. _, err := Model.Delete("comment_id in(?)", ids)
  111. if err != nil {
  112. g.Log().Error(err)
  113. return gerror.New("删除记录失败!")
  114. }
  115. return nil
  116. }
  117. // 根据ID修改记录
  118. func EditSave(req *EditReq) error {
  119. // 先根据ID来查询要修改的记录
  120. entity, err := GetCommentByID(req.CommentId)
  121. if err != nil {
  122. return err
  123. }
  124. // 修改实体
  125. entity.CommentContent = req.CommentContent
  126. entity.CommentStatus = req.CommentStatus
  127. _, err = Model.Save(entity)
  128. if err != nil {
  129. g.Log().Error(err)
  130. return gerror.New("修改记录失败!")
  131. }
  132. return nil
  133. }
  134. // 根据日志标题查询对应的日志id切片(因为评论中只存有日志id没有日志标题)
  135. func FindUserAndLogIds(req *SelectPageReq) (*SelectPageReq, error) {
  136. if req.LogTitle != "" {
  137. logList, err := blog_log.Model.Where("log_title like ?", "%"+req.LogTitle+"%").Fields("log_id").All()
  138. if err != nil {
  139. g.Log().Error(err)
  140. return req, gerror.New("根据日志标题查询日志id时出错")
  141. }
  142. for _, v := range logList {
  143. req.CommentLogIds = append(req.CommentLogIds, v.LogId)
  144. }
  145. }
  146. return req, nil
  147. }
  148. // 分页查询,返回值total总记录数,page当前页
  149. func SelectListByPage(req *SelectPageReq) (total int, page int64, list []*ListEntity, err error) {
  150. model := g.DB().Table(Table + " comment")
  151. if req != nil {
  152. if req.Flag == 1 {
  153. model.Where("comment_pid = ?", 0)
  154. }
  155. if req.Status == "0" {
  156. model.Where("comment.comment_status = ?", 0)
  157. }
  158. if req.Status == "1" {
  159. model.Where("comment.comment_status = ?", 1)
  160. }
  161. if req.CommentNickname != "" {
  162. model.Where("comment.comment_nickname like ?", "%"+req.CommentNickname+"%")
  163. }
  164. if req.CommentLogIds != nil {
  165. model.Where("comment.comment_log_id in(?)", req.CommentLogIds)
  166. }
  167. }
  168. model = model.LeftJoin(blog_log.Table+" log", "log.log_id=comment.comment_log_id")
  169. model = model.LeftJoin(user.Table+" u", "u.id=comment.comment_user_id")
  170. // 查询广告位总记录数(总行数)
  171. total, err = model.Count()
  172. if err != nil {
  173. g.Log().Error(err)
  174. err = gerror.New("获取总记录数失败")
  175. return 0, 0, nil, err
  176. }
  177. if req.PageNum == 0 {
  178. req.PageNum = 1
  179. }
  180. page = req.PageNum
  181. if req.PageSize == 0 {
  182. req.PageSize = 10
  183. }
  184. // 分页排序查询
  185. var res gdb.Result
  186. res, err = model.Fields("comment.*,log.log_title,u.user_name").Page(int(page), int(req.PageSize)).Order("comment.create_time desc,comment.comment_id asc").All()
  187. if err != nil {
  188. g.Log().Error(err)
  189. err = gerror.New("分页查询失败")
  190. return 0, 0, nil, err
  191. }
  192. err = res.Structs(&list)
  193. if err != nil {
  194. g.Log().Error(err)
  195. err = gerror.New("分页查询失败")
  196. return 0, 0, nil, err
  197. }
  198. return total, page, list, nil
  199. }