[feat] 新增 OperationAccess 支持
This commit is contained in:
		
							parent
							
								
									47a74d113e
								
							
						
					
					
						commit
						553f327ae1
					
				
							
								
								
									
										99
									
								
								support/list.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								support/list.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
			
		||||
package support
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
	"git.fsdpf.net/go/contracts"
 | 
			
		||||
	"github.com/spf13/cast"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type OperationAccess struct {
 | 
			
		||||
	typ  reflect.Kind // 只能为 reflect.Int 和 reflect.String
 | 
			
		||||
	data map[string][]any
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this OperationAccess) Get(k string) []any {
 | 
			
		||||
	items, ok := this.data[k]
 | 
			
		||||
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return items
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *OperationAccess) Set(k string, v []any) error {
 | 
			
		||||
	this.data[k] = []any{}
 | 
			
		||||
	return this.Push(k, v...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *OperationAccess) Push(k string, input ...any) error {
 | 
			
		||||
	if _, ok := this.data[k]; !ok {
 | 
			
		||||
		this.Set(k, []any{})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < len(input); i++ {
 | 
			
		||||
		if v, err := this.Convert(input[i]); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		} else {
 | 
			
		||||
			this.data[k] = append(this.data[k], v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this OperationAccess) Convert(v any) (any, error) {
 | 
			
		||||
	if this.typ == reflect.Int {
 | 
			
		||||
		return cast.ToIntE(v)
 | 
			
		||||
	}
 | 
			
		||||
	return cast.ToStringE(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this OperationAccess) Exist(k string, v any) bool {
 | 
			
		||||
	items, ok := this.data[k]
 | 
			
		||||
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flag, err := this.Convert(v)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < len(items); i++ {
 | 
			
		||||
		if items[i] == flag {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this OperationAccess) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	temp := [][2]any{}
 | 
			
		||||
 | 
			
		||||
	for k, v := range this.data {
 | 
			
		||||
		temp = append(temp, [2]any{k, v})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return json.Marshal(temp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewOperationAccess(m contracts.Model) OperationAccess {
 | 
			
		||||
	// 主键类型
 | 
			
		||||
	tPkType := reflect.String
 | 
			
		||||
 | 
			
		||||
	if tPk, ok := GetStructField(m.GetQueryFieldsStruct(), m.GetPrimaryKey()); ok {
 | 
			
		||||
		switch tPk.Type.Kind() {
 | 
			
		||||
		case reflect.Int, reflect.Int32, reflect.Int64,
 | 
			
		||||
			reflect.Uint, reflect.Uint32, reflect.Uint64:
 | 
			
		||||
			tPkType = reflect.Int
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return OperationAccess{typ: tPkType, data: map[string][]any{}}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user