| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | 
							- package models
 
- import (
 
- 	"errors"
 
- 	"time"
 
- 	"github.com/beego/beego/v2/client/orm"
 
- 	"github.com/mindoc-org/mindoc/conf"
 
- )
 
- //Comment struct
 
- type Comment struct {
 
- 	CommentId int `orm:"pk;auto;unique;column(comment_id)" json:"comment_id"`
 
- 	Floor     int `orm:"column(floor);type(unsigned);default(0)" json:"floor"`
 
- 	BookId    int `orm:"column(book_id);type(int)" json:"book_id"`
 
- 	// DocumentId 评论所属的文档.
 
- 	DocumentId int `orm:"column(document_id);type(int)" json:"document_id"`
 
- 	// Author 评论作者.
 
- 	Author string `orm:"column(author);size(100)" json:"author"`
 
- 	//MemberId 评论用户ID.
 
- 	MemberId int `orm:"column(member_id);type(int)" json:"member_id"`
 
- 	// IPAddress 评论者的IP地址
 
- 	IPAddress string `orm:"column(ip_address);size(100)" json:"ip_address"`
 
- 	// 评论日期.
 
- 	CommentDate time.Time `orm:"type(datetime);column(comment_date);auto_now_add" json:"comment_date"`
 
- 	//Content 评论内容.
 
- 	Content string `orm:"column(content);size(2000)" json:"content"`
 
- 	// Approved 评论状态:0 待审核/1 已审核/2 垃圾评论/ 3 已删除
 
- 	Approved int `orm:"column(approved);type(int)" json:"approved"`
 
- 	// UserAgent 评论者浏览器内容
 
- 	UserAgent string `orm:"column(user_agent);size(500)" json:"user_agent"`
 
- 	// Parent 评论所属父级
 
- 	ParentId     int `orm:"column(parent_id);type(int);default(0)" json:"parent_id"`
 
- 	AgreeCount   int `orm:"column(agree_count);type(int);default(0)" json:"agree_count"`
 
- 	AgainstCount int `orm:"column(against_count);type(int);default(0)" json:"against_count"`
 
- 	Index        int `orm:"-" json:"index"`
 
- 	ShowDel      int `orm:"-" json:"show_del"`
 
- }
 
- // TableName 获取对应数据库表名.
 
- func (m *Comment) TableName() string {
 
- 	return "comments"
 
- }
 
- // TableEngine 获取数据使用的引擎.
 
- func (m *Comment) TableEngine() string {
 
- 	return "INNODB"
 
- }
 
- func (m *Comment) TableNameWithPrefix() string {
 
- 	return conf.GetDatabasePrefix() + m.TableName()
 
- }
 
- func NewComment() *Comment {
 
- 	return &Comment{}
 
- }
 
- // 是否有权限删除
 
- func (m *Comment) CanDelete(user_memberid int, user_bookrole conf.BookRole) bool {
 
- 	return user_memberid == m.MemberId || user_bookrole == conf.BookFounder || user_bookrole == conf.BookAdmin
 
- }
 
- // 根据文档id查询文档评论
 
- func (m *Comment) QueryCommentByDocumentId(doc_id, page, pagesize int, member *Member) (comments []*Comment, count int64, ret_page int) {
 
- 	doc, err := NewDocument().Find(doc_id)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	o := orm.NewOrm()
 
- 	count, _ = o.QueryTable(m.TableNameWithPrefix()).Filter("document_id", doc_id).Count()
 
- 	if -1 == page { // 请求最后一页
 
- 		var total int = int(count)
 
- 		if total%pagesize == 0 {
 
- 			page = total / pagesize
 
- 		} else {
 
- 			page = total/pagesize + 1
 
- 		}
 
- 	}
 
- 	offset := (page - 1) * pagesize
 
- 	ret_page = page
 
- 	o.QueryTable(m.TableNameWithPrefix()).Filter("document_id", doc_id).OrderBy("comment_date").Offset(offset).Limit(pagesize).All(&comments)
 
- 	// 需要判断未登录的情况
 
- 	var bookRole conf.BookRole
 
- 	if member != nil {
 
- 		bookRole, _ = NewRelationship().FindForRoleId(doc.BookId, member.MemberId)
 
- 	}
 
- 	for i := 0; i < len(comments); i++ {
 
- 		comments[i].Index = (i + 1) + (page-1)*pagesize
 
- 		if member != nil && comments[i].CanDelete(member.MemberId, bookRole) {
 
- 			comments[i].ShowDel = 1
 
- 		}
 
- 	}
 
- 	return
 
- }
 
- func (m *Comment) Update(cols ...string) error {
 
- 	o := orm.NewOrm()
 
- 	_, err := o.Update(m, cols...)
 
- 	return err
 
- }
 
- //Insert 添加一条评论.
 
- func (m *Comment) Insert() error {
 
- 	if m.DocumentId <= 0 {
 
- 		return errors.New("评论文档不存在")
 
- 	}
 
- 	if m.Content == "" {
 
- 		return ErrCommentContentNotEmpty
 
- 	}
 
- 	o := orm.NewOrm()
 
- 	if m.CommentId > 0 {
 
- 		comment := NewComment()
 
- 		//如果父评论不存在
 
- 		if err := o.Read(comment); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	document := NewDocument()
 
- 	//如果评论的文档不存在
 
- 	if _, err := document.Find(m.DocumentId); err != nil {
 
- 		return err
 
- 	}
 
- 	book, err := NewBook().Find(document.BookId)
 
- 	//如果评论的项目不存在
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	//如果已关闭评论
 
- 	if book.CommentStatus == "closed" {
 
- 		return ErrCommentClosed
 
- 	}
 
- 	if book.CommentStatus == "registered_only" && m.MemberId <= 0 {
 
- 		return ErrPermissionDenied
 
- 	}
 
- 	//如果仅参与者评论
 
- 	if book.CommentStatus == "group_only" {
 
- 		if m.MemberId <= 0 {
 
- 			return ErrPermissionDenied
 
- 		}
 
- 		rel := NewRelationship()
 
- 		if _, err := rel.FindForRoleId(book.BookId, m.MemberId); err != nil {
 
- 			return ErrPermissionDenied
 
- 		}
 
- 	}
 
- 	if m.MemberId > 0 {
 
- 		member := NewMember()
 
- 		//如果用户不存在
 
- 		if _, err := member.Find(m.MemberId); err != nil {
 
- 			return ErrMemberNoExist
 
- 		}
 
- 		//如果用户被禁用
 
- 		if member.Status == 1 {
 
- 			return ErrMemberDisabled
 
- 		}
 
- 	} else if m.Author == "" {
 
- 		m.Author = "[匿名用户]"
 
- 	}
 
- 	m.BookId = book.BookId
 
- 	_, err = o.Insert(m)
 
- 	return err
 
- }
 
- // 删除一条评论
 
- func (m *Comment) Delete() error {
 
- 	o := orm.NewOrm()
 
- 	_, err := o.Delete(m)
 
- 	return err
 
- }
 
- func (m *Comment) Find(id int, cols ...string) (*Comment, error) {
 
- 	o := orm.NewOrm()
 
- 	if err := o.QueryTable(m.TableNameWithPrefix()).Filter("comment_id", id).One(m, cols...); err != nil {
 
- 		return m, err
 
- 	}
 
- 	return m, nil
 
- }
 
 
  |