news.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package cms_service
  2. import (
  3. "gfast/app/model/admin/cms_category"
  4. "gfast/app/model/admin/cms_category_news"
  5. "gfast/app/model/admin/cms_news"
  6. "gfast/app/service/common/com_model_service"
  7. "gfast/library/utils"
  8. "github.com/gogf/gf/container/gvar"
  9. "github.com/gogf/gf/database/gdb"
  10. "github.com/gogf/gf/errors/gerror"
  11. "github.com/gogf/gf/frame/g"
  12. "github.com/gogf/gf/util/gconv"
  13. )
  14. //添加文章操作
  15. func AddNews(req *cms_news.ReqAddParams, cateIds []int, userId uint64) (insId int64, err error) {
  16. cateIds, err = getPubCateIds(cateIds)
  17. if err != nil {
  18. return
  19. }
  20. tx, err := g.DB().Begin()
  21. if err != nil {
  22. g.Log().Error(err)
  23. err = gerror.New("添加事务开启失败")
  24. return
  25. }
  26. insId, err = cms_news.AddNews(req, cateIds, userId, tx)
  27. if err != nil {
  28. tx.Rollback()
  29. return
  30. }
  31. //保存文章模型字段数据
  32. err = handlePostData(cateIds, insId, req.ModelForm, tx, false)
  33. if err != nil {
  34. tx.Rollback()
  35. return
  36. }
  37. tx.Commit()
  38. return
  39. }
  40. //修改文章操作
  41. func EditNews(req *cms_news.ReqEditParams, cateIds []int) (err error) {
  42. cateIds, err = getPubCateIds(cateIds)
  43. if err != nil {
  44. return
  45. }
  46. tx, err := g.DB().Begin()
  47. if err != nil {
  48. g.Log().Error(err)
  49. err = gerror.New("开启事务失败")
  50. return
  51. }
  52. err = cms_news.EditNews(req, cateIds, tx)
  53. if err != nil {
  54. tx.Rollback()
  55. return
  56. }
  57. //保存模型字段数据
  58. err = handlePostData(cateIds, gconv.Int64(req.Id), req.ModelForm, tx, true)
  59. if err != nil {
  60. tx.Rollback()
  61. return
  62. }
  63. tx.Commit()
  64. return
  65. }
  66. func getPubCateIds(cateIds []int) ([]int, error) {
  67. //获取所有栏目
  68. menuList, err := GetMenuList()
  69. if err != nil {
  70. return nil, err
  71. }
  72. pubCateIds := make([]int, 0, len(menuList))
  73. if len(cateIds) > 0 {
  74. //查询可发布栏目id
  75. menuListSlice := gconv.SliceMap(menuList)
  76. for _, cid := range cateIds {
  77. for _, entity := range menuList {
  78. if gconv.Int(entity.Id) == cid && entity.CateType == cms_category.PublishCateType {
  79. pubCateIds = append(pubCateIds, cid)
  80. }
  81. }
  82. mList := make([]*cms_category.Entity, 0)
  83. sonList := utils.FindSonByParentId(menuListSlice, cid, "parent_id", "id")
  84. gconv.Structs(sonList, &mList)
  85. for _, v := range mList {
  86. if v.CateType == cms_category.PublishCateType {
  87. pubCateIds = append(pubCateIds, gconv.Int(v.Id))
  88. }
  89. }
  90. }
  91. if len(pubCateIds) == 0 {
  92. return nil, gerror.New("所选栏目不存在可发布文章的栏目")
  93. }
  94. return pubCateIds, nil
  95. } else {
  96. return nil, gerror.New("所属栏目不能为空")
  97. }
  98. }
  99. //文章列表查询
  100. func NewsListByPage(req *cms_news.ReqListSearchParams) (total, page int, list []*cms_news.NewsList, err error) {
  101. var menuList []*cms_category.Entity
  102. //获取所有栏目
  103. menuList, err = GetMenuList()
  104. if err != nil {
  105. return
  106. }
  107. if len(req.CateId) > 0 {
  108. //查询可发布栏目id
  109. menuListSlice := gconv.SliceMap(menuList)
  110. cateIds := req.CateId
  111. for _, cid := range cateIds {
  112. mList := make([]*cms_category.Entity, 0)
  113. sonList := utils.FindSonByParentId(menuListSlice, cid, "parent_id", "id")
  114. gconv.Structs(sonList, &mList)
  115. for _, v := range mList {
  116. if v.CateType == cms_category.PublishCateType {
  117. req.CateId = append(req.CateId, gconv.Int(v.Id))
  118. }
  119. }
  120. }
  121. }
  122. total, page, list, err = cms_news.ListByPage(req)
  123. if err != nil || len(list) == 0 {
  124. return
  125. }
  126. //匹配文章所属栏目
  127. var cateIds []int
  128. for _, v := range list {
  129. cateIds, err = GetCheckedCategoryIdByNewsId(gconv.Uint64(v.Id))
  130. if err != nil {
  131. return
  132. }
  133. cateNameList := make(map[int]string)
  134. for _, menu := range menuList {
  135. for _, cateId := range cateIds {
  136. if menu.Id == gconv.Uint64(cateId) {
  137. cateNameList[cateId] = menu.Name
  138. }
  139. }
  140. }
  141. cateVal := new(gvar.Var)
  142. if len(cateNameList) > 0 {
  143. cateVal.Set(cateNameList)
  144. }
  145. v.CateList = cateVal
  146. }
  147. return
  148. }
  149. //通过id获取文章信息
  150. func GetNewsById(id int) (news *cms_news.Entity, err error) {
  151. return cms_news.GetById(id)
  152. }
  153. //通过文章id获取关联的栏目id
  154. func GetCheckedCategoryIdByNewsId(newsId uint64) (catIds []int, err error) {
  155. categories, err := GetCategoriesByNewsId(newsId)
  156. if err != nil {
  157. return
  158. }
  159. catIds = make([]int, len(categories))
  160. for k, v := range categories {
  161. catIds[k] = gconv.Int(v.CategoryId)
  162. }
  163. return
  164. }
  165. //通过文章id获取关联栏目信息
  166. func GetCategoriesByNewsId(newsId uint64) (categories []*cms_category_news.Entity, err error) {
  167. return cms_category_news.GetCategoriesByNewsId(newsId)
  168. }
  169. //删除文章数据
  170. func DeleteCmsByIds(ids []int) (err error) {
  171. var tx *gdb.TX
  172. tx, err = g.DB().Begin()
  173. if err != nil {
  174. g.Log().Error(err)
  175. err = gerror.New("开启事务失败")
  176. return
  177. }
  178. //获取对应文章模型ID
  179. for _, id := range ids {
  180. var cateNews []*cms_category_news.Entity
  181. cateNews, err = GetCategoriesByNewsId(gconv.Uint64(id))
  182. if err != nil {
  183. return
  184. }
  185. for _, cn := range cateNews {
  186. var cateInfo *cms_category.Entity
  187. cateInfo, err = GetMenuInfoById(gconv.Int(cn.CategoryId))
  188. if err != nil {
  189. return
  190. }
  191. //删除模型字段数据
  192. err = com_model_service.DeleteModelFieldData(gconv.Int64(cateInfo.ModelId), gconv.Int64(id), tx)
  193. if err != nil {
  194. tx.Rollback()
  195. return
  196. }
  197. }
  198. }
  199. err = cms_news.DeleteByIds(ids, tx)
  200. if err != nil {
  201. tx.Rollback()
  202. }
  203. tx.Commit()
  204. return
  205. }
  206. //处理模型数据
  207. func handlePostData(cateIds []int, insId int64, modelForm g.Map, tx *gdb.TX, isUpdate bool) error {
  208. modelId, err := GetModelIdByCateIds(cateIds)
  209. if err != nil {
  210. return err
  211. }
  212. //保存模型数据
  213. return com_model_service.HandlePostData(gconv.Int64(modelId), modelForm, insId, tx, isUpdate)
  214. }