123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- package service
- import (
- "context"
- "sort"
- "time"
- "go-common/app/interface/openplatform/article/conf"
- "go-common/app/interface/openplatform/article/dao"
- artmdl "go-common/app/interface/openplatform/article/model"
- )
- func (s *Service) loadCategoriesproc() {
- for {
- time.Sleep(time.Minute * 10)
- s.loadCategories()
- }
- }
- func (s *Service) loadCategories() {
- for {
- c, err := s.dao.Categories(context.TODO())
- if err != nil || len(c) == 0 {
- dao.PromError("service:获取分类")
- time.Sleep(time.Second)
- continue
- }
- s.primaryCategories = transformPrimaryCategory(c)
- removeCategoryBanner(c)
- s.categoriesMap = c
- s.Categories = transformCategory(c)
- s.categoriesReverseMap = transformReverseCategory(c)
- s.categoryParents = transformCategoryParents(c)
- return
- }
- }
- func removeCategoryBanner(cs map[int64]*artmdl.Category) {
- for _, c := range cs {
- c.BannerURL = ""
- }
- }
- // transformPrimaryCategory 生成一级分区列表
- func transformPrimaryCategory(cs map[int64]*artmdl.Category) (res []*artmdl.Category) {
- res = make([]*artmdl.Category, 0, len(cs))
- for _, c := range cs {
- if c.ParentID == 0 {
- nc := new(artmdl.Category)
- *nc = *c
- res = append(res, nc)
- }
- }
- sort.Sort(artmdl.Categories(res))
- if len(res) > 4 {
- res[4].Name = conf.Conf.Article.AppCategoryName
- res[4].BannerURL = conf.Conf.Article.AppCategoryURL
- }
- return
- }
- // 生成一级分类含children的数组
- func transformCategory(cs map[int64]*artmdl.Category) (res artmdl.Categories) {
- newCs := make(map[int64]*artmdl.Category)
- for k, c := range cs {
- n := *c
- newCs[k] = &n
- }
- m := make(map[int64][]*artmdl.Category)
- for _, c := range newCs {
- m[c.ParentID] = append(m[c.ParentID], c)
- }
- for _, x := range m {
- sort.Sort(artmdl.Categories(x))
- }
- res = m[0]
- for id, cate := range newCs {
- if len(m[id]) != 0 {
- cate.Children = m[id]
- }
- }
- return
- }
- // 生成某个分类下的所有子分类
- func transformReverseCategory(cs map[int64]*artmdl.Category) (res map[int64][]*artmdl.Category) {
- res = make(map[int64][]*artmdl.Category)
- for _, c := range cs {
- n := c
- old := c
- for (n != nil) && (n.ParentID != 0) {
- res[n.ParentID] = append(res[n.ParentID], old)
- n = cs[n.ParentID]
- }
- }
- return
- }
- // 生成每个分区的父分区列表(含本分区)
- func transformCategoryParents(cs map[int64]*artmdl.Category) (res map[int64][]*artmdl.Category) {
- res = make(map[int64][]*artmdl.Category)
- for _, c := range cs {
- categories := []*artmdl.Category{c}
- parentID := c.ParentID
- for parentID != 0 {
- if cs[parentID] != nil {
- categories = append(categories, cs[parentID])
- parentID = cs[parentID].ParentID
- continue
- }
- break
- }
- //reverse categories
- for i := len(categories)/2 - 1; i >= 0; i-- {
- opp := len(categories) - 1 - i
- categories[i], categories[opp] = categories[opp], categories[i]
- }
- res[c.ID] = categories
- }
- return
- }
|