package sys import ( "SciencesServer/app/api/admin/model" "SciencesServer/app/basic/controller" model2 "SciencesServer/app/common/model" "SciencesServer/app/session" "SciencesServer/config" "SciencesServer/utils" "errors" "strings" ) type Banner struct { *session.Admin } type BannerHandle func(session *session.Admin) *Banner type ( // BannerInfo 轮播图信息 BannerInfo struct { ID string `json:"id"` TenantID string `json:"tenant_id"` *model2.SysBanner Area string `json:"area"` Images string `json:"images"` } // BannerLocalInfo 轮播图位置信息 BannerLocalInfo struct { Title string `json:"title"` Children []*BannerLocalInfo `json:"children"` } // BannerMarkLocalInfo 轮播图临时位置信息 BannerMarkLocalInfo struct { Title string `json:"title"` Children []string `json:"children"` } // BannerParams 轮播图参数信息 BannerParams struct { ID, TenantID uint64 Title, Local, Size, Images, Remark string IsMultiple int } ) const ( defaultFirstLevelKey string = "+home" ) // tree 树状 func (c *Banner) tree(src map[string][]string, key string) []*BannerLocalInfo { out := make([]*BannerLocalInfo, 0) data, has := src[key] if !has { return nil } for _, v := range data { out = append(out, &BannerLocalInfo{ Title: v, Children: c.tree(src, v), }) } return out } // merge 合并 func (c *Banner) merge(obj, parentObj string, out map[string][]string) { if _, has := out[parentObj]; !has { out[parentObj] = []string{obj} return } if !utils.InArray(obj, out[parentObj]) { out[parentObj] = append(out[parentObj], obj) } } // filter 筛选 func (c *Banner) filter(src []string, sep string) map[string][]string { // 解决方案>中小型企业 // 解决方案>政府区域 out := make(map[string][]string, 0) for _, v := range src { objs := strings.Split(v, sep) for i := 0; i < len(objs); i++ { parent := defaultFirstLevelKey if i > 0 { parent = objs[i-1] } c.merge(objs[i], parent, out) } } return out } // Instance 列表信息 func (c *Banner) Instance(tenantID uint64, title, local string, page, pageSize int) (*controller.ReturnPages, error) { mSysBanner := model.NewSysBanner() where := make([]*model2.ModelWhere, 0) if c.TenantID > 0 { where = append(where, model2.NewWhere("b.tenant_id", c.TenantID)) } if tenantID > 0 { where = append(where, model2.NewWhere("b.tenant_id", tenantID)) } if title != "" { where = append(where, model2.NewWhereLike("b.title", title)) } if local != "" { where = append(where, model2.NewWhereLike("b.local", local)) } var count int64 out, err := mSysBanner.Banner(page, pageSize, &count, where...) if err != nil { return nil, err } list := make([]*BannerInfo, 0) for _, v := range out { list = append(list, &BannerInfo{ ID: v.GetEncodeID(), TenantID: v.GetEncodeTenantID(), SysBanner: v.SysBanner, Area: v.FormatBasic(), Images: v.Images.AnalysisSlice(config.SettingInfo.Domain), }) } return &controller.ReturnPages{Data: list, Count: count}, nil } // Form 数据操作 func (c *Banner) Form(params *BannerParams) error { mSysBanner := model.NewSysBanner() if params.ID > 0 { mSysBanner.ID = params.ID isExist, err := model2.FirstField(mSysBanner.SysBanner, []string{"id", "tenant_id", "created_at"}) if err != nil { return err } else if !isExist { return errors.New("操作错误,轮播图信息不存在或已被删除") } if c.TenantID > 0 && c.TenantID != mSysBanner.TenantID { return errors.New("操作错误,无权限操作") } } mSysBanner.Title = params.Title mSysBanner.Local = params.Local mSysBanner.Images.Images = params.Images mSysBanner.Size = params.Size mSysBanner.IsMultiple = params.IsMultiple mSysBanner.Remark = params.Remark if mSysBanner.ID > 0 { if c.TenantID <= 0 { mSysBanner.TenantID = params.TenantID } return model2.Updates(mSysBanner.SysBanner, mSysBanner.SysBanner) } mSysBanner.TenantID = params.TenantID if c.TenantID > 0 { mSysBanner.TenantID = c.TenantID } return model2.Create(mSysBanner.SysBanner) } // Local 位置信息 func (c *Banner) Local(tenantID uint64) ([]*BannerLocalInfo, error) { mSysBanner := model.NewSysBanner() out := make([]string, 0) where := make([]*model2.ModelWhere, 0) if tenantID > 0 { where = append(where, model2.NewWhere("tenant_id", tenantID)) } if err := model2.Pluck(mSysBanner.SysBanner, "local", &out, where...); err != nil { return nil, err } return c.tree(c.filter(out, ">"), defaultFirstLevelKey), nil } // Delete 删除操作 func (c *Banner) Delete(id uint64) error { mSysBanner := model.NewSysBanner() mSysBanner.ID = id isExist, err := model2.FirstField(mSysBanner.SysBanner, []string{"id", "tenant_id"}) if err != nil { return err } else if !isExist { return errors.New("操作错误,轮播图信息不存在或已被删除") } else if c.TenantID > 0 && mSysBanner.TenantID != c.TenantID { return errors.New("操作错误,无权限操作") } return model2.Delete(mSysBanner.SysBanner) } func NewBanner() BannerHandle { return func(session *session.Admin) *Banner { return &Banner{session} } }