book.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. package models
  2. import (
  3. "time"
  4. "github.com/astaxie/beego/orm"
  5. "github.com/lifei6671/godoc/conf"
  6. "github.com/astaxie/beego/logs"
  7. "strings"
  8. )
  9. // Book struct .
  10. type Book struct {
  11. BookId int `orm:"pk;auto;unique;column(book_id)" json:"book_id"`
  12. // BookName 项目名称.
  13. BookName string `orm:"column(book_name);size(500)" json:"book_name"`
  14. // Identify 项目唯一标识.
  15. Identify string `orm:"column(identify);size(100);unique" json:"identify"`
  16. OrderIndex int `orm:"column(order_index);type(int);default(0)" json:"order_index"`
  17. // Description 项目描述.
  18. Description string `orm:"column(description);size(2000)" json:"description"`
  19. Label string `orm:"column(label);size(500)" json:"label"`
  20. // PrivatelyOwned 项目私有: 0 公开/ 1 私有
  21. PrivatelyOwned int `orm:"column(privately_owned);type(int);default(0)" json:"privately_owned"`
  22. // 当项目是私有时的访问Token.
  23. PrivateToken string `orm:"column(private_token);size(500);null" json:"private_token"`
  24. //评论状态:0 正常/1 已删除
  25. Status int `orm:"column(status);type(int);default(0)" json:"status"`
  26. //默认的编辑器.
  27. Editor string `orm:"column(editor);size(50)" json:"editor"`
  28. // DocCount 包含文档数量.
  29. DocCount int `orm:"column(doc_count);type(int)" json:"doc_count"`
  30. // CommentStatus 评论设置的状态:open 为允许所有人评论,closed 为不允许评论, group_only 仅允许参与者评论 ,registered_only 仅允许注册者评论.
  31. CommentStatus string `orm:"column(comment_status);size(20);default(open)" json:"comment_status"`
  32. CommentCount int `orm:"column(comment_count);type(int)" json:"comment_count"`
  33. //封面地址
  34. Cover string `orm:"column(cover);size(1000)" json:"cover"`
  35. //主题风格
  36. Theme string `orm:"columen(theme);size(255);default(default)" json:"theme"`
  37. // CreateTime 创建时间 .
  38. CreateTime time.Time `orm:"type(datetime);column(create_time);auto_now_add" json:"create_time"`
  39. MemberId int `orm:"column(member_id);size(100)" json:"member_id"`
  40. ModifyTime time.Time `orm:"type(datetime);column(modify_time);null;auto_now" json:"modify_time"`
  41. Version int64 `orm:"type(bigint);column(version)" json:"version"`
  42. }
  43. // TableName 获取对应数据库表名.
  44. func (m *Book) TableName() string {
  45. return "books"
  46. }
  47. // TableEngine 获取数据使用的引擎.
  48. func (m *Book) TableEngine() string {
  49. return "INNODB"
  50. }
  51. func (m *Book) TableNameWithPrefix() string {
  52. return conf.GetDatabasePrefix() + m.TableName()
  53. }
  54. func NewBook() *Book {
  55. return &Book{}
  56. }
  57. func (m *Book) Insert() error {
  58. o := orm.NewOrm()
  59. o.Begin()
  60. _,err := o.Insert(m)
  61. if err == nil {
  62. relationship := NewRelationship()
  63. relationship.BookId = m.BookId
  64. relationship.RoleId = 0
  65. relationship.MemberId = m.MemberId
  66. err = relationship.Insert()
  67. if err != nil {
  68. logs.Error("插入项目与用户关联 => ",err)
  69. o.Rollback()
  70. return err
  71. }
  72. document := NewDocument()
  73. document.BookId = m.BookId
  74. document.DocumentName = "空白文档"
  75. document.MemberId = m.MemberId
  76. err = document.InsertOrUpdate()
  77. if err != nil{
  78. o.Rollback()
  79. return err
  80. }
  81. o.Commit()
  82. }
  83. o.Rollback()
  84. return err
  85. }
  86. func (m *Book) Find(id int) (*Book,error) {
  87. if id <= 0 {
  88. return m,ErrInvalidParameter
  89. }
  90. o := orm.NewOrm()
  91. err := o.QueryTable(m.TableNameWithPrefix()).Filter("book_id",id).One(m)
  92. return m,err
  93. }
  94. func (m *Book) Update(cols... string) error {
  95. o := orm.NewOrm()
  96. _,err := o.Update(m,cols...)
  97. return err
  98. }
  99. //根据指定字段查询结果集.
  100. func (m *Book) FindByField(field string,value interface{}) ([]*Book,error) {
  101. o := orm.NewOrm()
  102. var books []*Book
  103. _,err := o.QueryTable(m.TableNameWithPrefix()).Filter(field,value).All(&books)
  104. return books,err
  105. }
  106. //根据指定字段查询一个结果.
  107. func (m *Book) FindByFieldFirst(field string,value interface{})(*Book,error) {
  108. o := orm.NewOrm()
  109. err := o.QueryTable(m.TableNameWithPrefix()).Filter(field,value).One(m)
  110. return m,err
  111. }
  112. //分页查询指定用户的项目
  113. func (m *Book) FindToPager(pageIndex, pageSize ,memberId int) (books []*BookResult,totalCount int,err error){
  114. relationship := NewRelationship()
  115. o := orm.NewOrm()
  116. qb, _ := orm.NewQueryBuilder("mysql")
  117. qb.Select("COUNT(book.book_id) AS total_count").
  118. From(m.TableNameWithPrefix() + " AS book").
  119. LeftJoin(relationship.TableNameWithPrefix() + " AS rel").
  120. On("book.book_id=rel.book_id").
  121. Where("rel.member_id=?")
  122. err = o.Raw(qb.String(),memberId).QueryRow(&totalCount)
  123. if err != nil {
  124. return
  125. }
  126. offset := (pageIndex - 1) * pageSize
  127. qb2,_ := orm.NewQueryBuilder("mysql")
  128. qb2.Select("book.*,rel.member_id","rel.role_id","m.account as create_name").
  129. From(m.TableNameWithPrefix() + " AS book").
  130. LeftJoin(relationship.TableNameWithPrefix() + " AS rel").
  131. On("book.book_id=rel.book_id").
  132. LeftJoin(NewMember().TableNameWithPrefix() + " AS m").On("rel.member_id=m.member_id AND rel.role_id=0").
  133. Where("rel.member_id=?").
  134. OrderBy("book.order_index DESC ","book.book_id").Desc().
  135. Limit(pageSize).
  136. Offset(offset)
  137. //logs.Info("",qb2.String())
  138. _,err = o.Raw(qb2.String(),memberId).QueryRows(&books)
  139. if err != nil {
  140. logs.Error("分页查询项目列表 => ",err)
  141. return
  142. }
  143. sql := "SELECT m.account,doc.modify_time FROM md_documents AS doc LEFT JOIN md_members AS m ON doc.modify_at=m.member_id WHERE book_id = ? LIMIT 1 ORDER BY doc.modify_time DESC"
  144. if err == nil && len(books) > 0{
  145. for index,book := range books {
  146. var text struct{
  147. Account string
  148. ModifyTime time.Time
  149. }
  150. err1 := o.Raw(sql,book.BookId).QueryRow(&text)
  151. if err1 == nil {
  152. books[index].LastModifyText = text.Account + " 于 " + text.ModifyTime.Format("2006-01-02 15:04:05")
  153. }
  154. if book.RoleId == 0{
  155. book.RoleName = "创始人"
  156. }else if book.RoleId == 1 {
  157. book.RoleName = "管理员"
  158. }else if book.RoleId == 2 {
  159. book.RoleName = "编辑者"
  160. }else if book.RoleId == 3 {
  161. book.RoleName = "观察者"
  162. }
  163. }
  164. }
  165. return
  166. }
  167. // 彻底删除项目.
  168. func (m *Book) ThoroughDeleteBook(id int) error {
  169. if id <= 0{
  170. return ErrInvalidParameter
  171. }
  172. o := orm.NewOrm()
  173. m.BookId = id
  174. if err := o.Read(m); err != nil {
  175. return err
  176. }
  177. o.Begin()
  178. sql1 := "DELETE FROM " + NewComment().TableNameWithPrefix() + " WHERE book_id = ?"
  179. _,err := o.Raw(sql1,m.BookId).Exec()
  180. if err != nil {
  181. o.Rollback()
  182. return err
  183. }
  184. sql2 := "DELETE FROM " + NewDocument().TableNameWithPrefix() + " WHERE book_id = ?"
  185. _,err = o.Raw(sql2,m.BookId).Exec()
  186. if err != nil {
  187. o.Rollback()
  188. return err
  189. }
  190. sql3 := "DELETE FROM " + m.TableNameWithPrefix() + " WHERE book_id = ?"
  191. _,err = o.Raw(sql3,m.BookId).Exec()
  192. if err != nil {
  193. o.Rollback()
  194. return err
  195. }
  196. sql4 := "DELETE FROM " + NewRelationship().TableNameWithPrefix() + " WHERE book_id = ?"
  197. _,err = o.Raw(sql4,m.BookId).Exec()
  198. if err != nil {
  199. o.Rollback()
  200. return err
  201. }
  202. return o.Commit()
  203. }
  204. func (m *Book) FindForHomeToPager(pageIndex, pageSize ,member_id int) (books []*BookResult,totalCount int,err error) {
  205. o := orm.NewOrm()
  206. offset := (pageIndex - 1) * pageSize
  207. //如果是登录用户
  208. if member_id > 0 {
  209. sql1 := "SELECT COUNT(*) FROM md_books AS book LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.member_id = ? WHERE relationship_id > 0 OR book.privately_owned = 0"
  210. err = o.Raw(sql1,member_id).QueryRow(&totalCount)
  211. if err != nil {
  212. return
  213. }
  214. sql2 := `SELECT book.*,rel1.*,member.account AS create_name FROM md_books AS book
  215. LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.member_id = ?
  216. LEFT JOIN md_relationship AS rel1 ON rel1.book_id = book.book_id AND rel1.role_id = 0
  217. LEFT JOIN md_members AS member ON rel1.member_id = member.member_id
  218. WHERE rel.relationship_id > 0 OR book.privately_owned = 0 ORDER BY order_index DESC ,book.book_id DESC LIMIT ?,?`
  219. _,err = o.Raw(sql2,member_id,offset,pageSize).QueryRows(&books)
  220. return
  221. }else{
  222. count,err1 := o.QueryTable(m.TableNameWithPrefix()).Filter("privately_owned",0).Count()
  223. if err1 != nil {
  224. err = err1
  225. return
  226. }
  227. totalCount = int(count)
  228. sql := `SELECT book.*,rel.*,member.account AS create_name FROM md_books AS book
  229. LEFT JOIN md_relationship AS rel ON rel.book_id = book.book_id AND rel.role_id = 0
  230. LEFT JOIN md_members AS member ON rel.member_id = member.member_id
  231. WHERE book.privately_owned = 0 ORDER BY order_index DESC ,book.book_id DESC LIMIT ?,?`
  232. _,err = o.Raw(sql,offset,pageSize).QueryRows(&books)
  233. return
  234. }
  235. }
  236. func (book *Book) ToBookResult() *BookResult {
  237. m := NewBookResult()
  238. m.BookId = book.BookId
  239. m.BookName = book.BookName
  240. m.Identify = book.Identify
  241. m.OrderIndex = book.OrderIndex
  242. m.Description = strings.Replace(book.Description, "\r\n", "<br/>", -1)
  243. m.PrivatelyOwned = book.PrivatelyOwned
  244. m.PrivateToken = book.PrivateToken
  245. m.DocCount = book.DocCount
  246. m.CommentStatus = book.CommentStatus
  247. m.CommentCount = book.CommentCount
  248. m.CreateTime = book.CreateTime
  249. m.ModifyTime = book.ModifyTime
  250. m.Cover = book.Cover
  251. m.Label = book.Label
  252. m.Status = book.Status
  253. m.Editor = book.Editor
  254. m.Theme = book.Theme
  255. return m
  256. }