add tier value support
This commit is contained in:
parent
5c09f1eefc
commit
206932038e
43
rest.go
43
rest.go
|
@ -687,6 +687,49 @@ func ModelTypes[T any](ctx context.Context, db *gorm.DB, model any, domainName,
|
|||
return values, nil
|
||||
}
|
||||
|
||||
// ModelTiers 查询指定模型的层级数据
|
||||
func ModelTiers[T any](ctx context.Context, db *gorm.DB, model any, domainName, parentColumn, labelColumn, valueColumn string) (values []*types.TierValue[T], err error) {
|
||||
tx := db.WithContext(ctx)
|
||||
result := make([]map[string]any, 0, 10)
|
||||
if domainName == "" {
|
||||
err = tx.Model(model).Select(parentColumn, labelColumn, valueColumn).Scan(&result).Error
|
||||
} else {
|
||||
err = tx.Model(model).Select(parentColumn, labelColumn, valueColumn).Where("domain=?", domainName).Scan(&result).Error
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
values = make([]*types.TierValue[T], 0, len(result))
|
||||
for _, pairs := range result {
|
||||
feed := &types.TierValue[T]{}
|
||||
for k, v := range pairs {
|
||||
if k == labelColumn {
|
||||
if s, ok := v.(string); ok {
|
||||
feed.Label = s
|
||||
} else {
|
||||
feed.Label = fmt.Sprint(s)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if k == valueColumn {
|
||||
if p, ok := v.(T); ok {
|
||||
feed.Value = p
|
||||
}
|
||||
continue
|
||||
}
|
||||
if k == parentColumn {
|
||||
if p, ok := v.(T); ok {
|
||||
feed.Parent = p
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
values = append(values, feed)
|
||||
}
|
||||
var none T
|
||||
return recursiveTier(none, values), nil
|
||||
}
|
||||
|
||||
// GetFieldValue 获取模型某个字段的值
|
||||
func GetFieldValue(stmt *gorm.Statement, refValue reflect.Value, column string) any {
|
||||
var (
|
||||
|
|
|
@ -124,6 +124,14 @@ type (
|
|||
Value T `json:"value"`
|
||||
}
|
||||
|
||||
//TierValue 层级数据
|
||||
TierValue[T any] struct {
|
||||
Label string `json:"label"`
|
||||
Value T `json:"value"`
|
||||
Parent T `json:"-"`
|
||||
Children []*TierValue[T] `json:"children"`
|
||||
}
|
||||
|
||||
// NestedValue 层级数据
|
||||
NestedValue[T any] struct {
|
||||
Label string `json:"label"`
|
||||
|
|
13
utils.go
13
utils.go
|
@ -4,6 +4,8 @@ import (
|
|||
"reflect"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"git.nobla.cn/golang/rest/types"
|
||||
)
|
||||
|
||||
func hasToken(hack string, need string) bool {
|
||||
|
@ -43,3 +45,14 @@ func isEmpty(val any) bool {
|
|||
return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface())
|
||||
}
|
||||
}
|
||||
|
||||
func recursiveTier[T any](parent T, values []*types.TierValue[T]) []*types.TierValue[T] {
|
||||
items := make([]*types.TierValue[T], 0, len(values)/2)
|
||||
for _, row := range values {
|
||||
if reflect.DeepEqual(row.Parent, parent) {
|
||||
row.Children = recursiveTier(row.Value, values)
|
||||
items = append(items, row)
|
||||
}
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue