[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