package entity import ( "admin/apps/user/model/dto" "admin/lib/xlog" "fmt" "gorm.io/gorm" "reflect" "strconv" "strings" "time" ) func poToCommonDtoNo(po any) dto.CommonDtoValues { obj := make(dto.CommonDtoValues) to := reflect.TypeOf(po).Elem() vo := reflect.ValueOf(po).Elem() for i := 0; i < vo.NumField(); i++ { ft := to.Field(i) fo := vo.Field(i) if ft.Tag.Get("server_use") == "true" { continue } if ft.Name == "UserPass" { obj[ft.Name] = "***" // 密码不下发了 } else { obj[ft.Name] = fo.Interface() } if ft.Type.Name() == "Time" && ft.Type.PkgPath() == "time" { obj[ft.Name] = fo.Interface().(time.Time).Format("2006/01/02 15:04:05") } } return obj } func getFieldTypeDtoDescInfo(poValue reflect.Value, fieldType reflect.StructField) *dto.CommonDtoFieldDesc { name := fieldType.Tag.Get("name") if name == "" { name = fieldType.Name } f1 := &dto.CommonDtoFieldDesc{ Name: name, Key: fieldType.Name, Type: fieldType.Type.Name(), HelpText: fieldType.Tag.Get("desc"), Readonly: fieldType.Tag.Get("readonly") == "true", Required: fieldType.Tag.Get("required") == "true", Choices: make([]*dto.CommonDtoFieldChoice, 0), MultiChoice: fieldType.Tag.Get("multi_choice") == "true", Uneditable: fieldType.Tag.Get("uneditable") == "true", } if f1.Key == "CreatedAt" { f1.Name = "创建时间" } if tagType := fieldType.Tag.Get("type"); tagType != "" { f1.Type = tagType } cf := fieldType.Tag.Get("choices") if cf != "" { method := poValue.MethodByName(cf) if !method.IsValid() { xlog.Warnf("po %v choices %v function not found in model", poValue.Type().Name(), cf) } else { rets := method.Call([]reflect.Value{}) f1.Choices = rets[0].Interface().([]*dto.CommonDtoFieldChoice) } } return f1 } func parseStr2FieldValue(field reflect.StructField, rawValue any) (realSetValue reflect.Value) { setValue := fmt.Sprintf("%v", rawValue) var parsedValue any switch field.Type.Kind() { case reflect.Int: v, _ := strconv.Atoi(setValue) parsedValue = int(v) case reflect.Int32: v, _ := strconv.Atoi(setValue) parsedValue = int32(v) case reflect.Int8: v, _ := strconv.Atoi(setValue) parsedValue = int8(v) case reflect.Int16: v, _ := strconv.Atoi(setValue) parsedValue = int16(v) case reflect.Int64: v, _ := strconv.Atoi(setValue) parsedValue = int64(v) case reflect.Uint: v, _ := strconv.Atoi(setValue) parsedValue = uint(v) case reflect.Uint8: v, _ := strconv.Atoi(setValue) parsedValue = uint(v) case reflect.Uint16: v, _ := strconv.Atoi(setValue) parsedValue = uint16(v) case reflect.Uint32: v, _ := strconv.Atoi(setValue) parsedValue = uint32(v) case reflect.Uint64: v, _ := strconv.Atoi(setValue) parsedValue = uint64(v) case reflect.Bool: parsedValue = setValue == "true" case reflect.String: parsedValue = setValue case reflect.Float32: v, _ := strconv.ParseFloat(setValue, 10) parsedValue = float32(v) case reflect.Float64: v, _ := strconv.ParseFloat(setValue, 10) parsedValue = float64(v) case reflect.Struct: typeName := field.Type.Name() if typeName == "Time" { xlog.Debugf("time content:%v", setValue) t, _ := time.ParseInLocation("2006/01/02 15:04:05", setValue, time.Local) return reflect.ValueOf(t) } if typeName == "DeletedAt" { return reflect.ValueOf(gorm.DeletedAt{}) } fallthrough case reflect.Slice: typeName := field.Type.String() if typeName == "[]string" { list := make([]string, 0) if rawValueStr, ok := rawValue.(string); ok { elems := strings.Split(rawValueStr, ",") list = append(list, elems...) // 空的字符串 } else { if rawValueList, ok := rawValue.([]string); ok { for _, v := range rawValueList { list = append(list, v) } } else { for _, v := range rawValue.([]interface{}) { list = append(list, v.(string)) } } } parsedValue = list } //else if typeName == "[]*model.MailAttachItem" { // items := make([]*model.MailAttachItem, 0) // if rawValueList, ok := rawValue.([]*model.MailAttachItem); ok { // for _, item := range rawValueList { // items = append(items, item) // } // } else { // for _, itemI := range rawValue.([]interface{}) { // item := &model.MailAttachItem{} // for k, vI := range itemI.(map[string]any) { // v := vI.(float64) // if k == "id" { // item.ID = int32(v) // } else if k == "num" { // item.Num = int64(v) // } else if k == "item_type" { // item.ItemType = int(v) // } // } // items = append(items, item) // } // } // // parsedValue = items //} default: panic(fmt.Errorf("暂时不支持的前后端交互字段类型:%v, 类型名:%v", field.Type.Kind(), field.Type.Name())) } return reflect.ValueOf(parsedValue) }