Compare commits

...

4 Commits

Author SHA1 Message Date
Yavolte 3b130c9d14 fix tier 2025-06-26 18:30:17 +08:00
Yavolte 8409716217 add types 2025-06-26 14:07:30 +08:00
Yavolte 368a9e868c fix tier loop 2025-06-25 11:15:08 +08:00
Yavolte 206932038e add tier value support 2025-06-25 11:10:20 +08:00
3 changed files with 83 additions and 0 deletions

43
rest.go
View File

@ -687,6 +687,49 @@ func ModelTypes[T any](ctx context.Context, db *gorm.DB, model any, domainName,
return values, nil
}
// ModelTiers 查询指定模型的层级数据
func ModelTiers[T comparable](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 (

View File

@ -124,6 +124,15 @@ type (
Value T `json:"value"`
}
//TierValue 层级数据
TierValue[T comparable] struct {
Label string `json:"label"`
Value T `json:"value"`
Parent T `json:"-"`
Used bool `json:"-"`
Children []*TierValue[T] `json:"children"`
}
// NestedValue 层级数据
NestedValue[T any] struct {
Label string `json:"label"`
@ -240,3 +249,17 @@ type (
Status string `json:"status"`
}
)
func (t *TierValue[T]) HasChild(value T) bool {
for _, child := range t.Children {
if child.Value == value {
return true
}
if len(child.Children) > 0 {
if child.HasChild(value) {
return true
}
}
}
return false
}

View File

@ -4,6 +4,8 @@ import (
"reflect"
"slices"
"strings"
"git.nobla.cn/golang/rest/types"
)
func hasToken(hack string, need string) bool {
@ -43,3 +45,18 @@ func isEmpty(val any) bool {
return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface())
}
}
func recursiveTier[T comparable](parent T, values []*types.TierValue[T]) []*types.TierValue[T] {
items := make([]*types.TierValue[T], 0, len(values)/2)
for idx, row := range values {
if row.Used {
continue
}
if row.Parent == parent {
values[idx].Used = true
row.Children = recursiveTier(row.Value, values)
items = append(items, row)
}
}
return items
}