You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.2 KiB
125 lines
3.2 KiB
package space |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"time" |
|
|
|
"go-common/app/interface/main/app-interface/conf" |
|
accdao "go-common/app/interface/main/app-interface/dao/account" |
|
audiodao "go-common/app/interface/main/app-interface/dao/audio" |
|
bplusdao "go-common/app/interface/main/app-interface/dao/bplus" |
|
memberdao "go-common/app/interface/main/app-interface/dao/member" |
|
paydao "go-common/app/interface/main/app-interface/dao/pay" |
|
reldao "go-common/app/interface/main/app-interface/dao/relation" |
|
sidedao "go-common/app/interface/main/app-interface/dao/sidebar" |
|
"go-common/app/interface/main/app-interface/model" |
|
resmodel "go-common/app/service/main/resource/model" |
|
"go-common/library/log" |
|
) |
|
|
|
// Service is space service |
|
type Service struct { |
|
c *conf.Config |
|
accDao *accdao.Dao |
|
audioDao *audiodao.Dao |
|
relDao *reldao.Dao |
|
bplusDao *bplusdao.Dao |
|
payDao *paydao.Dao |
|
memberDao *memberdao.Dao |
|
sideDao *sidedao.Dao |
|
sectionCache map[string][]*SectionItem |
|
white map[int8][]*SectionURL |
|
redDot map[int8][]*SectionURL |
|
} |
|
|
|
// SectionItem is |
|
type SectionItem struct { |
|
Item *resmodel.SideBar |
|
Limit []*resmodel.SideBarLimit |
|
} |
|
|
|
// SectionURL is |
|
type SectionURL struct { |
|
ID int64 |
|
URL string |
|
} |
|
|
|
// CheckLimit is |
|
func (item *SectionItem) CheckLimit(build int) bool { |
|
for _, l := range item.Limit { |
|
if model.InvalidBuild(build, l.Build, l.Condition) { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
// New new space |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
c: c, |
|
accDao: accdao.New(c), |
|
audioDao: audiodao.New(c), |
|
relDao: reldao.New(c), |
|
bplusDao: bplusdao.New(c), |
|
payDao: paydao.New(c), |
|
memberDao: memberdao.New(c), |
|
sideDao: sidedao.New(c), |
|
sectionCache: map[string][]*SectionItem{}, |
|
white: map[int8][]*SectionURL{}, |
|
redDot: map[int8][]*SectionURL{}, |
|
} |
|
if err := s.loadSidebar(); err != nil { |
|
panic(fmt.Sprintf("load sidebar error(%+v)", err)) |
|
} |
|
go s.tickproc() |
|
return s |
|
} |
|
|
|
// tickproc tick load cache. |
|
func (s *Service) tickproc() { |
|
for { |
|
time.Sleep(time.Duration(s.c.Tick)) |
|
s.loadSidebar() |
|
} |
|
} |
|
|
|
func (s *Service) loadSidebar() (err error) { |
|
var sidebar *resmodel.SideBars |
|
if sidebar, err = s.sideDao.Sidebars(context.TODO()); err != nil { |
|
log.Error("s.sideDao.SideBars error(%v)", err) |
|
return |
|
} |
|
ss := make(map[string][]*SectionItem) |
|
white := make(map[int8][]*SectionURL) |
|
redDot := make(map[int8][]*SectionURL) |
|
for _, item := range sidebar.SideBar { |
|
item.Plat = s.convertPlat(item.Plat) |
|
key := fmt.Sprintf(_initSidebarKey, item.Plat, item.Module) |
|
ss[key] = append(ss[key], &SectionItem{ |
|
Item: item, |
|
Limit: sidebar.Limit[item.ID], |
|
}) |
|
if item.WhiteURL != "" { |
|
white[item.Plat] = append(white[item.Plat], &SectionURL{ID: item.ID, URL: item.WhiteURL}) |
|
} |
|
if item.Red != "" { |
|
redDot[item.Plat] = append(redDot[item.Plat], &SectionURL{ID: item.ID, URL: item.Red}) |
|
} |
|
} |
|
s.sectionCache = ss |
|
s.white = white |
|
s.redDot = redDot |
|
return |
|
} |
|
|
|
func (s *Service) convertPlat(oldPlat int8) (newPlat int8) { |
|
newPlat = oldPlat |
|
if oldPlat == 9 { |
|
newPlat = model.PlatAndroidB |
|
} else if oldPlat == 10 { |
|
newPlat = model.PlatIPhoneB |
|
} |
|
return newPlat |
|
}
|
|
|