art_repo.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package repositories
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "xorm.io/xorm"
  7. "xps/datamodel"
  8. "xps/viewmodel"
  9. )
  10. type ArtRepo struct {
  11. engine *xorm.Engine
  12. }
  13. func NewArtRepo(engine *xorm.Engine) *ArtRepo {
  14. return &ArtRepo{
  15. engine: engine,
  16. }
  17. }
  18. func (d *ArtRepo) GetPage(m map[string]interface{}) (*viewmodel.PageResult, error) {
  19. limit, ok1 := m["limit"].(int)
  20. page, ok2 := m["page"].(int)
  21. if !ok1 || !ok2 {
  22. return nil, errors.New("分页参数不完整")
  23. }
  24. sqlSelect := ` SELECT A.* ,
  25. B.art_cat_title `
  26. sqlFrom := ` FROM art AS A
  27. LEFT JOIN art_cat AS B ON (A.oc_id = B.oc_id AND A.art_cat_id = B.art_cat_id)
  28. LEFT JOIN account AS C ON (A.oc_id = C.oc_id AND A.editor_id = C.account_id) `
  29. sqlWhere := ` WHERE A.deleted_flag = 0 `
  30. if ocId, ok:= m["ocId"]; ok {
  31. sqlWhere += fmt.Sprintf(" AND A.oc_id = %d ", ocId)
  32. }
  33. if status, ok:= m["status"]; ok {
  34. sqlWhere += fmt.Sprintf(" AND A.status = %d ", status)
  35. }
  36. if editorId, ok:= m["editorId"]; ok {
  37. sqlWhere += fmt.Sprintf(" AND A.editor_id = %d ", editorId)
  38. }
  39. nodeLeft, ok1 := m["nodeLeft"]
  40. nodeRight, ok2 := m["nodeRight"]
  41. if ok1 && ok2 {
  42. sqlWhere += fmt.Sprintf(" AND B.node_left >= %d", nodeLeft)
  43. sqlWhere += fmt.Sprintf(" AND B.node_right <= %d", nodeRight)
  44. }
  45. if keywords, ok:= m["keywords"]; ok {
  46. sqlWhere += " AND A.art_title like '%" + fmt.Sprintf("%s", keywords) + "%'"
  47. }
  48. sqlCount := ` SELECT COUNT(*) `
  49. total, err1 := d.engine.SQL(sqlCount + sqlFrom + sqlWhere).Count(new(datamodel.Art))
  50. if err1 != nil {
  51. return nil, err1
  52. }
  53. sqlOrderBy := " ORDER BY A.issued_at DESC "
  54. pageStart := (page - 1) * limit
  55. sqlLimit := fmt.Sprintf(" LIMIT %d OFFSET %d ", limit, pageStart)
  56. datalist := make([]datamodel.Art, 0)
  57. err2 := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy + sqlLimit).Find(&datalist)
  58. if err2 != nil {
  59. return nil, err2
  60. }
  61. pageResult := &viewmodel.PageResult{}
  62. pageResult.Data = datalist
  63. pageResult.Total = total
  64. pageResult.PageSize = limit
  65. pageResult.Page = page
  66. return pageResult, nil
  67. }
  68. func (d *ArtRepo) GetList(m map[string]interface{}) ([]viewmodel.ArtInfo, error) {
  69. sqlSelect := ` SELECT A.* ,
  70. B.art_cat_title `
  71. sqlFrom := ` FROM art AS A
  72. LEFT JOIN art_cat AS B ON (A.oc_id = B.oc_id AND A.art_cat_id = B.art_cat_id)
  73. LEFT JOIN account AS C ON (A.oc_id = C.oc_id AND A.editor_id = C.account_id) `
  74. sqlWhere := ` WHERE A.deleted_flag = 0 `
  75. if ocId, ok:= m["ocId"]; ok {
  76. sqlWhere += fmt.Sprintf(" AND A.oc_id = %d ", ocId)
  77. }
  78. if status, ok:= m["status"]; ok {
  79. sqlWhere += fmt.Sprintf(" AND A.status = %d ", status)
  80. }
  81. if editorId, ok:= m["editorId"]; ok {
  82. sqlWhere += fmt.Sprintf(" AND A.editor_id = %d ", editorId)
  83. }
  84. nodeLeft, ok1 := m["nodeLeft"]
  85. nodeRight, ok2 := m["nodeRight"]
  86. if ok1 && ok2 {
  87. sqlWhere += fmt.Sprintf(" AND B.node_left >= %d", nodeLeft)
  88. sqlWhere += fmt.Sprintf(" AND B.node_right <= %d", nodeRight)
  89. }
  90. if keywords, ok:= m["keywords"]; ok {
  91. sqlWhere += " AND A.art_title like '%" + fmt.Sprintf("%s", keywords) + "%'"
  92. }
  93. sqlOrderBy := " ORDER BY A.issued_at DESC "
  94. datalist := make([]viewmodel.ArtInfo, 0)
  95. err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy).Find(&datalist)
  96. if err != nil {
  97. return nil, err
  98. }
  99. return datalist, nil
  100. }
  101. func (d *ArtRepo) GetById(ocId, artId int64) (*viewmodel.ArtInfo, error) {
  102. sqlSelect := ` SELECT A.* ,
  103. B.art_cat_title `
  104. sqlFrom := ` FROM art AS A
  105. LEFT JOIN art_cat AS B ON (A.oc_id = B.oc_id AND A.art_cat_id = B.art_cat_id)
  106. LEFT JOIN account AS C ON (A.oc_id = C.oc_id AND A.editor_id = C.account_id) `
  107. sqlWhere := ` WHERE A.deleted_flag = 0`
  108. sqlWhere += fmt.Sprintf(" AND A.oc_id = %d", ocId)
  109. sqlWhere += fmt.Sprintf(" AND A.art_id = %d", artId)
  110. data := &viewmodel.ArtInfo{}
  111. ok, err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere).Limit(1).Get(data)
  112. if !ok && err == nil {
  113. return nil, err
  114. } else {
  115. return data, nil
  116. }
  117. }
  118. func (d *ArtRepo) Create(data *datamodel.Art) error {
  119. data.CreatedAt = time.Now()
  120. _, err := d.engine.Insert(data)
  121. return err
  122. }
  123. func (d *ArtRepo) Update(data *datamodel.Art) error {
  124. artId := data.ArtId
  125. data.UpdatedAt = time.Now()
  126. _, err := d.engine.Where("art_id = ?", artId).Update(data)
  127. return err
  128. }
  129. func (d *ArtRepo) Delete(m map[string]interface{}) error {
  130. artId := m["artId"].(int64)
  131. deletedBy := m["deletedBy"].(int64)
  132. data := &datamodel.Art{}
  133. data.DeletedFlag = 1
  134. data.DeletedBy = deletedBy
  135. data.DeletedAt = time.Now()
  136. _, err := d.engine.Where("art_id = ?", artId).Update(data)
  137. return err
  138. }