123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package banner
- import (
- "context"
- "strings"
- "time"
- "go-common/app/interface/main/app-show/conf"
- resdao "go-common/app/interface/main/app-show/dao/resource"
- "go-common/app/interface/main/app-show/model"
- "go-common/app/interface/main/app-show/model/banner"
- resource "go-common/app/service/main/resource/model"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "go-common/library/stat/prom"
- )
- var (
- _banners = map[string]map[string]map[int8]int{
- "discover": map[string]map[int8]int{
- "bottom": map[int8]int{
- model.PlatIPhone: 452,
- model.PlatIPad: 800,
- model.PlatIPhoneI: 1085,
- model.PlatIPadI: 1255,
- },
- },
- "mine": map[string]map[int8]int{
- "top": map[int8]int{
- model.PlatIPhone: 449,
- model.PlatIPad: 801,
- model.PlatIPhoneI: 1089,
- model.PlatIPadI: 1259,
- },
- "center": map[int8]int{
- model.PlatIPhone: 450,
- model.PlatIPad: 802,
- model.PlatIPhoneI: 1093,
- model.PlatIPadI: 1263,
- },
- "bottom": map[int8]int{
- model.PlatIPhone: 451,
- model.PlatIPad: 803,
- model.PlatIPhoneI: 1097,
- model.PlatIPadI: 1267,
- },
- },
- }
- _bannersPlat = map[int8]string{
- model.PlatIPhone: "452,499,450,451",
- model.PlatIPad: "800,801,802,803",
- model.PlatIPhoneI: "1085,1089,1093,1097",
- model.PlatIPadI: "1255,1259,1263,1267",
- }
- )
- // Service is banner service.
- type Service struct {
- // dao *bndao.Dao
- res *resdao.Dao
- tick time.Duration
- bannerCache map[int8]map[int][]*resource.Banner
- // prom
- prmobi *prom.Prom
- }
- // New new a banner service.
- func New(c *conf.Config) (s *Service) {
- s = &Service{
- // dao: bndao.New(c),
- res: resdao.New(c),
- tick: time.Duration(c.Tick),
- bannerCache: map[int8]map[int][]*resource.Banner{},
- // prom
- prmobi: prom.BusinessInfoCount,
- }
- s.load()
- go s.loadproc()
- return
- }
- // Display get banner.
- func (s *Service) Display(c context.Context, plat int8, build int, channel, module, position, mobiApp string) (res map[string][]*banner.Banner) {
- ip := metadata.String(c, metadata.RemoteIP)
- res = s.getCache(c, plat, build, channel, module, position, ip)
- s.prmobi.Incr("banner_plat_" + mobiApp)
- return
- }
- // getCahce get banner from cache.
- func (s *Service) getCache(c context.Context, plat int8, build int, channel, module, position, ip string) (res map[string][]*banner.Banner) {
- res = map[string][]*banner.Banner{}
- var (
- resIDs = _bannersPlat[plat]
- err error
- resbs map[int][]*resource.Banner
- plm = s.bannerCache[plat]
- resID int
- )
- if resbs, err = s.res.ResBanner(c, plat, build, 0, resIDs, channel, ip, "", "", "", "", "", false); err != nil || len(resbs) == 0 {
- log.Error("s.res.ResBanner is null or err(%v)", err)
- resbs = plm
- }
- mds := strings.Split(module, ",")
- poss := strings.Split(position, ",")
- for _, md := range mds {
- for _, pos := range poss {
- resID = _banners[md][pos][plat]
- res[md+"_"+pos] = s.resBanners(resbs[resID])
- }
- }
- return
- }
- // resBannersplat
- func (s *Service) resBanners(rbs []*resource.Banner) (res []*banner.Banner) {
- for _, rb := range rbs {
- b := &banner.Banner{}
- b.ResChangeBanner(rb)
- res = append(res, b)
- }
- return
- }
- // load load all banner.
- func (s *Service) load() {
- var (
- resbs = map[int8]map[int][]*resource.Banner{}
- )
- for plat, resIDStr := range _bannersPlat {
- mobiApp := model.MobiApp(plat)
- res, err := s.res.ResBanner(context.TODO(), plat, 515007, 0, resIDStr, "master", "", "", "", mobiApp, "", "", false)
- if err != nil || len(res) == 0 {
- log.Error("s.res.ResBanner is null or err(%v)", err)
- return
- }
- resbs[plat] = res
- }
- if len(resbs) > 0 {
- s.bannerCache = resbs
- }
- log.Info("banner cacheproc success")
- }
- // cacheproc load cache.
- func (s *Service) loadproc() {
- for {
- time.Sleep(s.tick)
- s.load()
- }
- }
|