123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- package operate
- import (
- "encoding/json"
- "sort"
- "strconv"
- "go-common/app/interface/main/app-card/model"
- "go-common/library/log"
- xtime "go-common/library/time"
- )
- type Menu struct {
- TabID int64 `json:"tab_id,omitempty"`
- Name string `json:"name,omitempty"`
- Img string `json:"img,omitempty"`
- Icon string `json:"icon,omitempty"`
- Color string `json:"color,omitempty"`
- ID int64 `json:"id,omitempty"`
- Plat int `json:"-"`
- CType int `json:"-"`
- CValue string `json:"-"`
- PlatVersion json.RawMessage `json:"-"`
- STime xtime.Time `json:"-"`
- ETime xtime.Time `json:"-"`
- Status int `json:"-"`
- Badge string `json:"-"`
- Versions map[int8][]*Version `json:"-"`
- }
- type Version struct {
- PlatStr string `json:"plat,omitempty"`
- BuildStr string `json:"build,omitempty"`
- Condition string `json:"conditions,omitempty"`
- Plat int8 `json:"-"`
- Build int `json:"-"`
- }
- func (m *Menu) Change() {
- m.Icon = m.Badge
- var vs []*Version
- if err := json.Unmarshal(m.PlatVersion, &vs); err != nil {
- log.Error("json.Unmarshal(%s) error(%v)", m.PlatVersion, err)
- return
- }
- vm := make(map[int8][]*Version, len(vs))
- for _, v := range vs {
- if v.PlatStr == "" || v.BuildStr == "" {
- continue
- }
- if plat, err := strconv.ParseInt(v.PlatStr, 10, 8); err != nil {
- log.Error("strconv.ParseInt(%s,10,8) error(%v)", v.PlatStr, err)
- continue
- } else {
- v.Plat = int8(plat)
- }
- if build, err := strconv.Atoi(v.BuildStr); err != nil {
- log.Error("strconv.Atoi(%s) error(%v)", v.BuildStr, err)
- continue
- } else {
- v.Build = build
- }
- vm[v.Plat] = append(vm[v.Plat], v)
- }
- m.Versions = vm
- if m.CType == 1 {
- var err error
- if m.ID, err = strconv.ParseInt(m.CValue, 10, 64); err != nil {
- log.Error("strconv.ParseInt(%s) error(%v)", m.CValue, err)
- return
- }
- }
- }
- type Active struct {
- ID int64 `json:"id,omitempty"`
- ParentID int64 `json:"parent_id,omitempty"`
- Name string `json:"name,omitempty"`
- Background string `json:"background,omitempty"`
- Type string `json:"type,omitempty"`
- Content json.RawMessage `json:"content,omitempty"`
- // Extra
- Pid int64 `json:"pid,omitempty"`
- Title string `json:"title,omitempty"`
- Subtitle string `json:"subtitle,omitempty"`
- Desc string `json:"desc,omitempty"`
- Param string `json:"param,omitempty"`
- Goto model.Gt `json:"goto,omitempty"`
- Cover string `json:"cover,omitempty"`
- Limit int `json:"limit,omitempty"`
- Items []*Active `json:"items,omitempty"`
- }
- type Actives []*Active
- func (is Actives) Len() int { return len(is) }
- func (is Actives) Less(i, j int) bool { return is[i].ID < is[j].ID }
- func (is Actives) Swap(i, j int) { is[i], is[j] = is[j], is[i] }
- type CardItem struct {
- Title string `json:"title,omitempty"`
- Cover string `json:"cover,omitempty"`
- LinkType string `json:"link_type,omitempty"`
- LinkValue string `json:"link_value,omitempty"`
- Weight int `json:"weight,omitempty"`
- }
- type CardItems []*CardItem
- func (is CardItems) Len() int { return len(is) }
- func (is CardItems) Less(i, j int) bool { return is[i].Weight < is[j].Weight }
- func (is CardItems) Swap(i, j int) { is[i], is[j] = is[j], is[i] }
- func (a *Active) Change() {
- switch a.Type {
- case "archive":
- a.Type = "player"
- case "live":
- a.Type = "player_live"
- case "basic":
- a.Type = "content_rcmd"
- case "shortcut":
- a.Type = "entrance"
- case "common":
- a.Type = "background"
- case "tag":
- a.Type = "tag_rcmd"
- }
- switch a.Type {
- // 基本类型
- case "player_live", "converge", "special", "article_s", "player":
- var id int64
- if err := json.Unmarshal(a.Content, &id); err != nil {
- log.Error("%+v", err)
- return
- }
- if id > 0 {
- a.Pid = id
- }
- // 新增类型
- case "content_rcmd":
- var basic struct {
- Type string `json:"type,omitempty"`
- Title string `json:"title,omitempty"`
- Subtitle string `json:"subtitle,omitempty"`
- Sublink string `json:"sublink,omitempty"`
- Content []*struct {
- LinkType string `json:"link_type,omitempty"`
- LinkValue string `json:"link_value,omitempty"`
- } `json:"content,omitempty"`
- }
- if err := json.Unmarshal(a.Content, &basic); err != nil {
- log.Error("%+v", err)
- return
- }
- ris := make([]*Active, 0, len(basic.Content))
- for _, c := range basic.Content {
- typ, _ := strconv.Atoi(c.LinkType)
- id, _ := strconv.ParseInt(c.LinkValue, 10, 64)
- ri := &Active{Goto: model.OperateType[typ], Pid: id}
- if ri.Goto != "" {
- ris = append(ris, ri)
- }
- }
- if len(ris) != 0 {
- a.Items = ris
- a.Title = basic.Title
- a.Subtitle = basic.Subtitle
- a.Param = basic.Sublink
- }
- case "entrance", "banner":
- var card struct {
- Type string `json:"type,omitempty"`
- CardItem []*CardItem `json:"card_item,omitempty"`
- }
- if err := json.Unmarshal(a.Content, &card); err != nil {
- log.Error("%+v", err)
- return
- }
- ris := make([]*Active, 0, len(card.CardItem))
- sort.Sort(CardItems(card.CardItem))
- for _, item := range card.CardItem {
- typ, _ := strconv.Atoi(item.LinkType)
- id, _ := strconv.ParseInt(item.LinkValue, 10, 64)
- ri := &Active{Goto: model.OperateType[typ], Pid: id, Param: item.LinkValue, Title: item.Title, Cover: item.Cover}
- if ri.Goto != "" {
- ris = append(ris, ri)
- }
- }
- if len(ris) != 0 {
- a.Items = ris
- }
- case "tag_rcmd":
- var tag struct {
- AidStr string `json:"aid,omitempty"`
- Type string `json:"type,omitempty"`
- NumberStr string `json:"number,omitempty"`
- Tid int64 `json:"-"`
- Number int `json:"-"`
- }
- if err := json.Unmarshal(a.Content, &tag); err != nil {
- log.Error("%+v", err)
- return
- }
- tag.Tid, _ = strconv.ParseInt(tag.AidStr, 10, 64)
- tag.Number, _ = strconv.Atoi(tag.NumberStr)
- if tag.Tid != 0 {
- a.Pid = tag.Tid
- a.Limit = tag.Number
- }
- case "background":
- a.Title = a.Name
- a.Cover = a.Background
- case "news":
- var news struct {
- Title string `json:"title,omitempty"`
- Body string `json:"body,omitempty"`
- Link string `json:"link,omitempty"`
- }
- if err := json.Unmarshal(a.Content, &news); err != nil {
- log.Error("%+v", err)
- return
- }
- if news.Body != "" {
- a.Title = news.Title
- a.Desc = news.Body
- a.Param = news.Link
- }
- }
- }
|