From 206932038e19af3a755c0ca6946eab710f6ee72b Mon Sep 17 00:00:00 2001 From: Yavolte Date: Wed, 25 Jun 2025 11:10:20 +0800 Subject: [PATCH] add tier value support --- rest.go | 43 +++++++++++++++++++++++++++++++++++++++++++ types/types.go | 8 ++++++++ utils.go | 13 +++++++++++++ 3 files changed, 64 insertions(+) diff --git a/rest.go b/rest.go index 2c356b5..9ad6022 100644 --- a/rest.go +++ b/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 ( diff --git a/types/types.go b/types/types.go index 5f35d24..dc280d9 100644 --- a/types/types.go +++ b/types/types.go @@ -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"` diff --git a/utils.go b/utils.go index 262be11..1712df6 100644 --- a/utils.go +++ b/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 +}