123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package academy
- import (
- "reflect"
- "go-common/app/service/main/archive/api"
- "go-common/library/time"
- )
- //Occupation for occupation.
- type Occupation struct {
- ID int64 `json:"id"`
- Rank int64 `json:"rank"`
- Name string `json:"name"`
- Desc string `json:"desc"`
- MainStep string `json:"main_step"`
- MainSoftWare string `json:"main_software"`
- Logo string `json:"logo"`
- }
- //Skill for Skill.
- type Skill struct {
- ID int64 `json:"id"`
- OID int64 `json:"oid"`
- Name string `json:"name"`
- Desc string `json:"desc"`
- }
- //SkillArc for Skill.
- type SkillArc struct {
- ID int64 `json:"id"`
- AID int64 `json:"aid"`
- Type int `json:"type"`
- PID int64 `json:"pid"`
- SkID int64 `json:"skid"`
- SID int64 `json:"sid"`
- }
- //ArcMeta for skill arc meta.
- type ArcMeta struct {
- AID int64 `json:"aid"`
- MID int64 `json:"mid"`
- Cover string `json:"cover"`
- Title string `json:"title"`
- Type string `json:"type"`
- Duration int64 `json:"duration,omitempty"`
- PlayTime time.Time `json:"play_time"` //历史课程上次学习时间
- Watch int8 `json:"watch"` //标记是否观看过
- ArcStat *api.Stat `json:"arc_stat,omitempty"`
- Skill *SkillArc `json:"-"`
- Business int8 `json:"business"`
- Tags map[string][]*Tag `json:"tags,omitempty"`
- }
- //ArcList for archive list.
- type ArcList struct {
- Items []*ArcMeta `json:"items"`
- Page *ArchivePage `json:"page"`
- }
- //NewbCourseList for NewbCourse list.
- type NewbCourseList struct {
- Items []*ArcMeta `json:"items"`
- Title string `json:"title"`
- TID int64 `json:"tid"`
- }
- //Play for academy play list.
- type Play struct {
- MID int64 `json:"mid"`
- AID int64 `json:"aid"`
- Business int8 `json:"business"`
- Watch int8 `json:"watch"`
- CTime time.Time `json:"ctime"`
- MTime time.Time `json:"mtime"`
- }
- //SearchKeywords for academy h5 search keywords.
- type SearchKeywords struct {
- ID int64 `json:"id"`
- Rank int64 `json:"rank"`
- ParentID int64 `json:"parent_id"`
- State int8 `json:"state"`
- Name string `json:"name"`
- Comment string `json:"comment"`
- CTime string `json:"-"`
- MTime string `json:"-"`
- Count int `json:"count,omitempty"`
- Children []*SearchKeywords `json:"children,omitempty"`
- }
- //Trees for generate tree data set
- // data - db result set
- // idFieldStr - primary key in table map to struct
- // pidFieldStr - top parent id in table map to struct
- // chFieldStr - struct child nodes
- func Trees(data interface{}, idFieldStr, pidFieldStr, chFieldStr string) (res []interface{}) {
- if reflect.TypeOf(data).Kind() != reflect.Slice {
- return
- }
- sli := reflect.ValueOf(data)
- top := make(map[int64]interface{})
- res = make([]interface{}, 0, sli.Len())
- for i := 0; i < sli.Len(); i++ {
- v := sli.Index(i).Interface()
- if reflect.TypeOf(v).Kind() != reflect.Ptr {
- continue
- }
- if reflect.ValueOf(v).IsNil() {
- continue
- }
- getValue := reflect.ValueOf(v).Elem()
- getType := reflect.TypeOf(v).Elem()
- pid := getValue.FieldByName(pidFieldStr).Interface().(int64)
- if _, ok := getType.FieldByName(pidFieldStr); ok && pid == 0 {
- id := getValue.FieldByName(idFieldStr).Interface().(int64)
- top[id] = v
- res = append(res, v)
- }
- }
- for i := 0; i < sli.Len(); i++ {
- v := sli.Index(i).Interface()
- if reflect.TypeOf(v).Kind() != reflect.Ptr {
- continue
- }
- if reflect.ValueOf(v).IsNil() {
- continue
- }
- pid := reflect.ValueOf(v).Elem().FieldByName(pidFieldStr).Interface().(int64)
- if pid == 0 {
- continue
- }
- if p, ok := top[pid]; ok {
- ch := reflect.ValueOf(p).Elem().FieldByName(chFieldStr)
- ch.Set(reflect.Append(ch, reflect.ValueOf(v)))
- }
- }
- return
- }
|