add generic type

This commit is contained in:
Yavolte 2025-06-18 14:47:19 +08:00
parent 01a671dff8
commit 1432ae2640
2 changed files with 26 additions and 15 deletions

27
rest.go
View File

@ -652,28 +652,39 @@ func VisibleSchemas(ctx context.Context, db *gorm.DB, domain, moduleName, tableN
} }
// ModelTypes 查询指定模型的类型 // ModelTypes 查询指定模型的类型
func ModelTypes(ctx context.Context, db *gorm.DB, model any, domainName, labelColumn, valueColumn string) (values []*types.TypeValue) { func ModelTypes[T any](ctx context.Context, db *gorm.DB, model any, domainName, labelColumn, valueColumn string) (values []*types.TypeValue[T], err error) {
tx := db.WithContext(ctx) tx := db.WithContext(ctx)
result := make([]map[string]any, 0, 10) result := make([]map[string]any, 0, 10)
if domainName == "" { if domainName == "" {
tx.Model(model).Select(labelColumn, valueColumn).Scan(&result) err = tx.Model(model).Select(labelColumn, valueColumn).Scan(&result).Error
} else { } else {
tx.Model(model).Select(labelColumn, valueColumn).Where("domain=?", domainName).Scan(&result) err = tx.Model(model).Select(labelColumn, valueColumn).Where("domain=?", domainName).Scan(&result).Error
} }
values = make([]*types.TypeValue, 0, len(result)) if err != nil {
return
}
values = make([]*types.TypeValue[T], 0, len(result))
for _, pairs := range result { for _, pairs := range result {
feed := &types.TypeValue{} feed := &types.TypeValue[T]{}
for k, v := range pairs { for k, v := range pairs {
if k == labelColumn { if k == labelColumn {
feed.Label = v if s, ok := v.(string); ok {
feed.Label = s
} else {
feed.Label = fmt.Sprint(s)
}
continue
} }
if k == valueColumn { if k == valueColumn {
feed.Value = v if p, ok := v.(T); ok {
feed.Value = p
}
continue
} }
} }
values = append(values, feed) values = append(values, feed)
} }
return values return values, nil
} }
// GetFieldValue 获取模型某个字段的值 // GetFieldValue 获取模型某个字段的值

View File

@ -119,16 +119,16 @@ type (
} }
// TypeValue 键值对数据 // TypeValue 键值对数据
TypeValue struct { TypeValue[T any] struct {
Label any `json:"label"` Label string `json:"label"`
Value any `json:"value"` Value T `json:"value"`
} }
// NestedValue 层级数据 // NestedValue 层级数据
NestedValue struct { NestedValue[T any] struct {
Label any `json:"label"` Label string `json:"label"`
Value any `json:"value"` Value T `json:"value"`
Children []*NestedValue `json:"children,omitempty"` Children []*NestedValue[T] `json:"children,omitempty"`
} }
//ValueLookupFunc 查找域的函数 //ValueLookupFunc 查找域的函数