CommentModel.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package models
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/mindoc-org/mindoc/conf"
  7. )
  8. // Comment struct
  9. type Comment struct {
  10. CommentId int `orm:"pk;auto;unique;column(comment_id)" json:"comment_id"`
  11. Floor int `orm:"column(floor);type(unsigned);default(0)" json:"floor"`
  12. BookId int `orm:"column(book_id);type(int)" json:"book_id"`
  13. // DocumentId 评论所属的文档.
  14. DocumentId int `orm:"column(document_id);type(int)" json:"document_id"`
  15. // Author 评论作者.
  16. Author string `orm:"column(author);size(100)" json:"author"`
  17. //MemberId 评论用户ID.
  18. MemberId int `orm:"column(member_id);type(int)" json:"member_id"`
  19. // IPAddress 评论者的IP地址
  20. IPAddress string `orm:"column(ip_address);size(100)" json:"ip_address"`
  21. // 评论日期.
  22. CommentDate time.Time `orm:"type(datetime);column(comment_date);auto_now_add" json:"comment_date"`
  23. //Content 评论内容.
  24. Content string `orm:"column(content);size(2000)" json:"content"`
  25. // Approved 评论状态:0 待审核/1 已审核/2 垃圾评论/ 3 已删除
  26. Approved int `orm:"column(approved);type(int)" json:"approved"`
  27. // UserAgent 评论者浏览器内容
  28. UserAgent string `orm:"column(user_agent);size(500)" json:"user_agent"`
  29. // Parent 评论所属父级
  30. ParentId int `orm:"column(parent_id);type(int);default(0)" json:"parent_id"`
  31. AgreeCount int `orm:"column(agree_count);type(int);default(0)" json:"agree_count"`
  32. AgainstCount int `orm:"column(against_count);type(int);default(0)" json:"against_count"`
  33. Index int `orm:"-" json:"index"`
  34. ShowDel int `orm:"-" json:"show_del"`
  35. Avatar string `orm:"-" json:"avatar"`
  36. }
  37. // TableName 获取对应数据库表名.
  38. func (m *Comment) TableName() string {
  39. return "comments"
  40. }
  41. // TableEngine 获取数据使用的引擎.
  42. func (m *Comment) TableEngine() string {
  43. return "INNODB"
  44. }
  45. func (m *Comment) TableNameWithPrefix() string {
  46. return conf.GetDatabasePrefix() + m.TableName()
  47. }
  48. func NewComment() *Comment {
  49. return &Comment{}
  50. }
  51. // 是否有权限删除
  52. func (m *Comment) CanDelete(user_memberid int, user_bookrole conf.BookRole) bool {
  53. return user_memberid == m.MemberId || user_bookrole == conf.BookFounder || user_bookrole == conf.BookAdmin
  54. }
  55. // 根据文档id查询文档评论
  56. func (m *Comment) QueryCommentByDocumentId(doc_id, page, pagesize int, member *Member) (comments []*Comment, count int64, ret_page int) {
  57. doc, err := NewDocument().Find(doc_id)
  58. if err != nil {
  59. return
  60. }
  61. o := orm.NewOrm()
  62. count, _ = o.QueryTable(m.TableNameWithPrefix()).Filter("document_id", doc_id).Count()
  63. if -1 == page { // 请求最后一页
  64. var total int = int(count)
  65. if total%pagesize == 0 {
  66. page = total / pagesize
  67. } else {
  68. page = total/pagesize + 1
  69. }
  70. }
  71. offset := (page - 1) * pagesize
  72. ret_page = page
  73. o.QueryTable(m.TableNameWithPrefix()).Filter("document_id", doc_id).OrderBy("comment_date").Offset(offset).Limit(pagesize).All(&comments)
  74. // 需要判断未登录的情况
  75. var bookRole conf.BookRole
  76. if member != nil {
  77. bookRole, _ = NewRelationship().FindForRoleId(doc.BookId, member.MemberId)
  78. }
  79. for i := 0; i < len(comments); i++ {
  80. comments[i].Index = (i + 1) + (page-1)*pagesize
  81. if member != nil && comments[i].CanDelete(member.MemberId, bookRole) {
  82. comments[i].ShowDel = 1
  83. comments[i].Avatar = member.Avatar
  84. }
  85. }
  86. return
  87. }
  88. func (m *Comment) Update(cols ...string) error {
  89. o := orm.NewOrm()
  90. _, err := o.Update(m, cols...)
  91. return err
  92. }
  93. // Insert 添加一条评论.
  94. func (m *Comment) Insert() error {
  95. if m.DocumentId <= 0 {
  96. return errors.New("评论文档不存在")
  97. }
  98. if m.Content == "" {
  99. return ErrCommentContentNotEmpty
  100. }
  101. o := orm.NewOrm()
  102. if m.CommentId > 0 {
  103. comment := NewComment()
  104. //如果父评论不存在
  105. if err := o.Read(comment); err != nil {
  106. return err
  107. }
  108. }
  109. document := NewDocument()
  110. //如果评论的文档不存在
  111. if _, err := document.Find(m.DocumentId); err != nil {
  112. return err
  113. }
  114. book, err := NewBook().Find(document.BookId)
  115. //如果评论的项目不存在
  116. if err != nil {
  117. return err
  118. }
  119. //如果已关闭评论
  120. if book.CommentStatus == "closed" {
  121. return ErrCommentClosed
  122. }
  123. if book.CommentStatus == "registered_only" && m.MemberId <= 0 {
  124. return ErrPermissionDenied
  125. }
  126. //如果仅参与者评论
  127. if book.CommentStatus == "group_only" {
  128. if m.MemberId <= 0 {
  129. return ErrPermissionDenied
  130. }
  131. rel := NewRelationship()
  132. if _, err := rel.FindForRoleId(book.BookId, m.MemberId); err != nil {
  133. return ErrPermissionDenied
  134. }
  135. }
  136. if m.MemberId > 0 {
  137. member := NewMember()
  138. //如果用户不存在
  139. if _, err := member.Find(m.MemberId); err != nil {
  140. return ErrMemberNoExist
  141. }
  142. //如果用户被禁用
  143. if member.Status == 1 {
  144. return ErrMemberDisabled
  145. }
  146. } else if m.Author == "" {
  147. m.Author = "[匿名用户]"
  148. }
  149. m.BookId = book.BookId
  150. _, err = o.Insert(m)
  151. return err
  152. }
  153. // 删除一条评论
  154. func (m *Comment) Delete() error {
  155. o := orm.NewOrm()
  156. _, err := o.Delete(m)
  157. return err
  158. }
  159. func (m *Comment) Find(id int, cols ...string) (*Comment, error) {
  160. o := orm.NewOrm()
  161. if err := o.QueryTable(m.TableNameWithPrefix()).Filter("comment_id", id).One(m, cols...); err != nil {
  162. return m, err
  163. }
  164. return m, nil
  165. }