yjp 1 gadu atpakaļ
vecāks
revīzija
8c9ee43260

+ 2 - 2
examples/sql_mapping_tag/main.go

@@ -2,7 +2,7 @@ package main
 
 import (
 	"fmt"
-	"git.sxidc.com/go-framework/baize/tag"
+	"git.sxidc.com/go-framework/baize/tag/sql_mapping"
 	"reflect"
 	"time"
 )
@@ -32,7 +32,7 @@ type Class struct {
 }
 
 func main() {
-	err := tag.UseSqlMappingTag(&Class{}, func(fieldName string, entityFieldElemValue reflect.Value, sqlMappingTag *tag.SqlMappingTag) error {
+	err := sql_mapping.UseTag(&Class{}, func(fieldName string, entityFieldElemValue reflect.Value, sqlMappingTag *sql_mapping.Tag) error {
 		fmt.Println("Field Name:", fieldName)
 		fmt.Println("Type:", entityFieldElemValue.Type().String())
 		if entityFieldElemValue.Kind() == reflect.String {

+ 2 - 2
examples/sql_result_tag/main.go

@@ -2,7 +2,7 @@ package main
 
 import (
 	"fmt"
-	"git.sxidc.com/go-framework/baize/tag"
+	"git.sxidc.com/go-framework/baize/tag/sql_result"
 	"reflect"
 	"time"
 )
@@ -32,7 +32,7 @@ type Class struct {
 }
 
 func main() {
-	err := tag.UseSqlResultTag(&Class{}, func(fieldName string, entityFieldElemValue reflect.Value, sqlResultTag *tag.SqlResultTag) error {
+	err := sql_result.UseTag(&Class{}, func(fieldName string, entityFieldElemValue reflect.Value, sqlResultTag *sql_result.Tag) error {
 		fmt.Println("Field Name:", fieldName)
 		fmt.Println("Type:", entityFieldElemValue.Type().String())
 		if entityFieldElemValue.Kind() == reflect.String {

+ 45 - 45
tag/assign/tag.go

@@ -11,22 +11,22 @@ import (
 )
 
 const (
-	assignDefaultStringSliceSeparator = "::"
-	assignTagPartSeparator            = ";"
-	assignTagPartKeyValueSeparator    = ":"
+	defaultStringSliceSeparator = "::"
+	tagPartSeparator            = ";"
+	tagPartKeyValueSeparator    = ":"
 )
 
 const (
-	assignTagKey     = "assign"
-	assignIgnore     = "-"
-	assignToField    = "toField"
-	assignParseTime  = "parseTime"
-	assignFormatTime = "formatTime"
-	assignJoinWith   = "joinWith"
-	assignSplitWith  = "splitWith"
-	assignTrim       = "trim"
-	assignTrimPrefix = "trimPrefix"
-	assignTrimSuffix = "trimSuffix"
+	tagKey            = "assign"
+	tagPartIgnore     = "-"
+	tagPartToField    = "toField"
+	tagPartParseTime  = "parseTime"
+	tagPartFormatTime = "formatTime"
+	tagPartJoinWith   = "joinWith"
+	tagPartSplitWith  = "splitWith"
+	tagPartTrim       = "trim"
+	tagPartTrimPrefix = "trimPrefix"
+	tagPartTrimSuffix = "trimSuffix"
 )
 
 type Tag struct {
@@ -56,7 +56,7 @@ func parseTag(fromElemValue reflect.Value, toElemValue *reflect.Value, onParsedF
 
 		fromFieldElemValue := reflectutils.PointerValueElem(fromFieldValue)
 
-		tagStr := fromField.Tag.Get(assignTagKey)
+		tagStr := fromField.Tag.Get(tagKey)
 
 		// 结构类型的字段上没有添加Tag, 先尝试直接按照字段赋值
 		if strutils.IsStringEmpty(tagStr) && fromFieldElemValue.Kind() == reflect.Struct &&
@@ -113,7 +113,7 @@ func parseTag(fromElemValue reflect.Value, toElemValue *reflect.Value, onParsedF
 }
 
 func parseFieldTag(field reflect.StructField, tagStr string) (*Tag, error) {
-	if tagStr == assignIgnore {
+	if tagStr == tagPartIgnore {
 		return nil, nil
 	}
 
@@ -121,8 +121,8 @@ func parseFieldTag(field reflect.StructField, tagStr string) (*Tag, error) {
 		ToField:    field.Name,
 		ParseTime:  time.DateTime,
 		FormatTime: time.DateTime,
-		JoinWith:   assignDefaultStringSliceSeparator,
-		SplitWith:  assignDefaultStringSliceSeparator,
+		JoinWith:   defaultStringSliceSeparator,
+		SplitWith:  defaultStringSliceSeparator,
 		Trim:       "",
 		TrimPrefix: "",
 		TrimSuffix: "",
@@ -132,41 +132,41 @@ func parseFieldTag(field reflect.StructField, tagStr string) (*Tag, error) {
 		return tag, nil
 	}
 
-	assignParts := strings.Split(tagStr, assignTagPartSeparator)
-	if assignParts != nil || len(assignParts) != 0 {
-		for _, assignPart := range assignParts {
-			assignPartKeyValue := strings.SplitN(strings.TrimSpace(assignPart), assignTagPartKeyValueSeparator, 2)
-			if assignPartKeyValue != nil && len(assignPartKeyValue) == 2 && strutils.IsStringNotEmpty(assignPartKeyValue[1]) {
-				assignPartKeyValue[1] = strings.Trim(assignPartKeyValue[1], "'")
+	tagParts := strings.Split(tagStr, tagPartSeparator)
+	if tagParts != nil || len(tagParts) != 0 {
+		for _, tagPart := range tagParts {
+			tagPartKeyValue := strings.SplitN(strings.TrimSpace(tagPart), tagPartKeyValueSeparator, 2)
+			if tagPartKeyValue != nil && len(tagPartKeyValue) == 2 && strutils.IsStringNotEmpty(tagPartKeyValue[1]) {
+				tagPartKeyValue[1] = strings.Trim(tagPartKeyValue[1], "'")
 			}
 
-			switch assignPartKeyValue[0] {
-			case assignToField:
-				tag.ToField = assignPartKeyValue[1]
-			case assignParseTime:
-				tag.ParseTime = assignPartKeyValue[1]
-			case assignFormatTime:
-				tag.FormatTime = assignPartKeyValue[1]
-			case assignJoinWith:
-				if strutils.IsStringEmpty(assignPartKeyValue[1]) {
-					return nil, fserr.New(assignJoinWith + "没有赋值分隔符")
+			switch tagPartKeyValue[0] {
+			case tagPartToField:
+				tag.ToField = tagPartKeyValue[1]
+			case tagPartParseTime:
+				tag.ParseTime = tagPartKeyValue[1]
+			case tagPartFormatTime:
+				tag.FormatTime = tagPartKeyValue[1]
+			case tagPartJoinWith:
+				if strutils.IsStringEmpty(tagPartKeyValue[1]) {
+					return nil, fserr.New(tagPartJoinWith + "没有赋值分隔符")
 				}
 
-				tag.JoinWith = assignPartKeyValue[1]
-			case assignSplitWith:
-				if strutils.IsStringEmpty(assignPartKeyValue[1]) {
-					return nil, fserr.New(assignSplitWith + "没有赋值分隔符")
+				tag.JoinWith = tagPartKeyValue[1]
+			case tagPartSplitWith:
+				if strutils.IsStringEmpty(tagPartKeyValue[1]) {
+					return nil, fserr.New(tagPartSplitWith + "没有赋值分隔符")
 				}
 
-				tag.SplitWith = assignPartKeyValue[1]
-			case assignTrim:
-				tag.Trim = assignPartKeyValue[1]
-			case assignTrimPrefix:
-				tag.TrimPrefix = assignPartKeyValue[1]
-			case assignTrimSuffix:
-				tag.TrimSuffix = assignPartKeyValue[1]
+				tag.SplitWith = tagPartKeyValue[1]
+			case tagPartTrim:
+				tag.Trim = tagPartKeyValue[1]
+			case tagPartTrimPrefix:
+				tag.TrimPrefix = tagPartKeyValue[1]
+			case tagPartTrimSuffix:
+				tag.TrimSuffix = tagPartKeyValue[1]
 			default:
-				err := fserr.New(assignTagKey + "不支持的tag: " + assignPartKeyValue[0])
+				err := fserr.New(tagKey + "不支持的tag: " + tagPartKeyValue[0])
 				logger.GetInstance().Error(err)
 				continue
 			}

+ 0 - 195
tag/sql_mapping.go

@@ -1,195 +0,0 @@
-package tag
-
-import (
-	"errors"
-	"git.sxidc.com/go-tools/utils/reflectutils"
-	"git.sxidc.com/go-tools/utils/strutils"
-	"git.sxidc.com/service-supports/fserr"
-	"github.com/iancoleman/strcase"
-	"reflect"
-	"strings"
-)
-
-type OnSqlMappingParsedFieldTagFunc func(fieldName string, entityFieldElemValue reflect.Value, sqlMapping *SqlMappingTag) error
-
-func UseSqlMappingTag(e any, onParsedFieldTagFunc OnSqlMappingParsedFieldTagFunc) error {
-	if e == nil {
-		return nil
-	}
-
-	entityValue := reflect.ValueOf(e)
-
-	// 类型校验
-	if !reflectutils.IsValueStructOrStructPointer(entityValue) {
-		return fserr.New("参数不是结构或结构指针")
-	}
-
-	entityElemValue := reflectutils.PointerValueElem(entityValue)
-
-	err := parseEntitySqlMappingTag(entityElemValue, onParsedFieldTagFunc)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func parseEntitySqlMappingTag(entityElemValue reflect.Value, onParsedFieldTagFunc OnSqlMappingParsedFieldTagFunc) error {
-	for i := 0; i < entityElemValue.NumField(); i++ {
-		entityField := entityElemValue.Type().Field(i)
-		entityFieldValue := entityElemValue.Field(i)
-
-		// 无效值,不进行映射
-		if !entityFieldValue.IsValid() {
-			continue
-		}
-
-		if entityFieldValue.Kind() == reflect.Pointer && entityFieldValue.IsNil() {
-			entityFieldValue.Set(reflect.New(entityField.Type.Elem()))
-		}
-
-		entityFieldElemValue := reflectutils.PointerValueElem(entityFieldValue)
-
-		tagStr := entityField.Tag.Get(sqlMappingTagKey)
-
-		sqlMapping, err := parseSqlMappingTag(entityField, tagStr)
-		if err != nil {
-			return err
-		}
-
-		if sqlMapping == nil {
-			continue
-		}
-
-		// 结构类型的字段,解析结构内部
-		if entityFieldElemValue.Kind() == reflect.Struct &&
-			!reflectutils.IsValueTime(entityFieldElemValue) {
-			err := parseEntitySqlMappingTag(entityFieldElemValue, onParsedFieldTagFunc)
-			if err != nil {
-				return err
-			}
-
-			continue
-		}
-
-		err = onParsedFieldTagFunc(entityField.Name, entityFieldElemValue, sqlMapping)
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-const (
-	sqlMappingDefaultKeyColumnName     = "id"
-	sqlMappingDefaultJoinWith          = "::"
-	sqlMappingTagPartSeparator         = ";"
-	sqlMappingTagPartKeyValueSeparator = ":"
-)
-
-const (
-	sqlMappingTagKey      = "sqlmapping"
-	sqlMappingIgnore      = "-"
-	sqlMappingColumn      = "column"
-	sqlMappingKey         = "key"
-	sqlMappingNotUpdate   = "notUpdate"
-	sqlMappingUpdateClear = "updateClear"
-	sqlMappingAes         = "aes"
-	sqlMappingJoinWith    = "joinWith"
-	sqlMappingTrim        = "trim"
-	sqlMappingTrimPrefix  = "trimPrefix"
-	sqlMappingTrimSuffix  = "trimSuffix"
-)
-
-type SqlMappingTag struct {
-	Name           string
-	IsKey          bool
-	CanUpdate      bool
-	CanUpdateClear bool
-	AESKey         string
-	JoinWith       string
-	Trim           string
-	TrimPrefix     string
-	TrimSuffix     string
-}
-
-func parseSqlMappingTag(field reflect.StructField, tagStr string) (*SqlMappingTag, error) {
-	if tagStr == sqlMappingIgnore {
-		return nil, nil
-	}
-
-	sqlMappingTag := &SqlMappingTag{
-		Name:           strcase.ToSnake(field.Name),
-		IsKey:          false,
-		CanUpdate:      true,
-		CanUpdateClear: false,
-		AESKey:         "",
-		JoinWith:       sqlMappingDefaultJoinWith,
-		Trim:           "",
-		TrimPrefix:     "",
-		TrimSuffix:     "",
-	}
-
-	if sqlMappingTag.Name == sqlMappingDefaultKeyColumnName {
-		sqlMappingTag.IsKey = true
-		sqlMappingTag.CanUpdate = false
-	}
-
-	if strutils.IsStringEmpty(tagStr) {
-		return sqlMappingTag, nil
-	}
-
-	sqlMappingParts := strings.Split(tagStr, sqlMappingTagPartSeparator)
-	if sqlMappingParts != nil || len(sqlMappingParts) != 0 {
-		for _, sqlMappingPart := range sqlMappingParts {
-			sqlMappingPartKeyValue := strings.SplitN(strings.TrimSpace(sqlMappingPart), sqlMappingTagPartKeyValueSeparator, 2)
-			if sqlMappingPartKeyValue != nil && len(sqlMappingPartKeyValue) == 2 && strutils.IsStringNotEmpty(sqlMappingPartKeyValue[1]) {
-				sqlMappingPartKeyValue[1] = strings.Trim(sqlMappingPartKeyValue[1], "'")
-			}
-
-			switch sqlMappingPartKeyValue[0] {
-			case sqlMappingColumn:
-				if strutils.IsStringEmpty(sqlMappingPartKeyValue[1]) {
-					return nil, errors.New("column没有赋值列名")
-				}
-
-				sqlMappingTag.Name = sqlMappingPartKeyValue[1]
-			case sqlMappingKey:
-				sqlMappingTag.IsKey = true
-				sqlMappingTag.CanUpdate = false
-			case sqlMappingNotUpdate:
-				sqlMappingTag.CanUpdate = false
-				sqlMappingTag.CanUpdateClear = false
-			case sqlMappingUpdateClear:
-				if !sqlMappingTag.CanUpdate {
-					sqlMappingTag.CanUpdateClear = false
-				} else {
-					sqlMappingTag.CanUpdateClear = true
-				}
-			case sqlMappingAes:
-				if len(sqlMappingPartKeyValue[1]) != 32 {
-					return nil, errors.New("AES密钥长度应该为32个字节")
-				}
-
-				sqlMappingTag.AESKey = sqlMappingPartKeyValue[1]
-			case sqlMappingJoinWith:
-				if strutils.IsStringEmpty(sqlMappingPartKeyValue[1]) {
-					return nil, errors.New(sqlMappingJoinWith + "没有赋值分隔符")
-				}
-
-				sqlMappingTag.JoinWith = sqlMappingPartKeyValue[1]
-			case sqlMappingTrim:
-				sqlMappingTag.Trim = sqlMappingPartKeyValue[1]
-			case sqlMappingTrimPrefix:
-				sqlMappingTag.TrimPrefix = sqlMappingPartKeyValue[1]
-			case sqlMappingTrimSuffix:
-				sqlMappingTag.TrimSuffix = sqlMappingPartKeyValue[1]
-			default:
-				continue
-			}
-		}
-	}
-
-	return sqlMappingTag, nil
-}

+ 31 - 0
tag/sql_mapping/sql_mapping.go

@@ -0,0 +1,31 @@
+package sql_mapping
+
+import (
+	"git.sxidc.com/go-tools/utils/reflectutils"
+	"git.sxidc.com/service-supports/fserr"
+	"reflect"
+)
+
+type OnParsedFieldTagFunc func(fieldName string, entityFieldElemValue reflect.Value, tag *Tag) error
+
+func UseTag(e any, onParsedFieldTagFunc OnParsedFieldTagFunc) error {
+	if e == nil {
+		return nil
+	}
+
+	entityValue := reflect.ValueOf(e)
+
+	// 类型校验
+	if !reflectutils.IsValueStructOrStructPointer(entityValue) {
+		return fserr.New("参数不是结构或结构指针")
+	}
+
+	entityElemValue := reflectutils.PointerValueElem(entityValue)
+
+	err := parseTag(entityElemValue, onParsedFieldTagFunc)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

+ 170 - 0
tag/sql_mapping/tag.go

@@ -0,0 +1,170 @@
+package sql_mapping
+
+import (
+	"errors"
+	"git.sxidc.com/go-tools/utils/reflectutils"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/iancoleman/strcase"
+	"reflect"
+	"strings"
+)
+
+const (
+	defaultKeyColumnName     = "id"
+	defaultJoinWith          = "::"
+	tagPartSeparator         = ";"
+	tagPartKeyValueSeparator = ":"
+)
+
+const (
+	tagKey             = "sqlmapping"
+	tagPartIgnore      = "-"
+	tagPartColumn      = "column"
+	tagPartKey         = "key"
+	tagPartNotUpdate   = "notUpdate"
+	tagPartUpdateClear = "updateClear"
+	tagPartAes         = "aes"
+	tagPartJoinWith    = "joinWith"
+	tagPartTrim        = "trim"
+	tagPartTrimPrefix  = "trimPrefix"
+	tagPartTrimSuffix  = "trimSuffix"
+)
+
+type Tag struct {
+	Name           string
+	IsKey          bool
+	CanUpdate      bool
+	CanUpdateClear bool
+	AESKey         string
+	JoinWith       string
+	Trim           string
+	TrimPrefix     string
+	TrimSuffix     string
+}
+
+func parseTag(entityElemValue reflect.Value, onParsedFieldTagFunc OnParsedFieldTagFunc) error {
+	for i := 0; i < entityElemValue.NumField(); i++ {
+		entityField := entityElemValue.Type().Field(i)
+		entityFieldValue := entityElemValue.Field(i)
+
+		// 无效值,不进行映射
+		if !entityFieldValue.IsValid() {
+			continue
+		}
+
+		if entityFieldValue.Kind() == reflect.Pointer && entityFieldValue.IsNil() {
+			entityFieldValue.Set(reflect.New(entityField.Type.Elem()))
+		}
+
+		entityFieldElemValue := reflectutils.PointerValueElem(entityFieldValue)
+
+		tagStr := entityField.Tag.Get(tagKey)
+
+		tag, err := parseFieldTag(entityField, tagStr)
+		if err != nil {
+			return err
+		}
+
+		if tag == nil {
+			continue
+		}
+
+		// 结构类型的字段,解析结构内部
+		if entityFieldElemValue.Kind() == reflect.Struct &&
+			!reflectutils.IsValueTime(entityFieldElemValue) {
+			err := parseTag(entityFieldElemValue, onParsedFieldTagFunc)
+			if err != nil {
+				return err
+			}
+
+			continue
+		}
+
+		err = onParsedFieldTagFunc(entityField.Name, entityFieldElemValue, tag)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func parseFieldTag(field reflect.StructField, tagStr string) (*Tag, error) {
+	if tagStr == tagPartIgnore {
+		return nil, nil
+	}
+
+	tag := &Tag{
+		Name:           strcase.ToSnake(field.Name),
+		IsKey:          false,
+		CanUpdate:      true,
+		CanUpdateClear: false,
+		AESKey:         "",
+		JoinWith:       defaultJoinWith,
+		Trim:           "",
+		TrimPrefix:     "",
+		TrimSuffix:     "",
+	}
+
+	if tag.Name == defaultKeyColumnName {
+		tag.IsKey = true
+		tag.CanUpdate = false
+	}
+
+	if strutils.IsStringEmpty(tagStr) {
+		return tag, nil
+	}
+
+	tagParts := strings.Split(tagStr, tagPartSeparator)
+	if tagParts != nil || len(tagParts) != 0 {
+		for _, tagPart := range tagParts {
+			tagPartKeyValue := strings.SplitN(strings.TrimSpace(tagPart), tagPartKeyValueSeparator, 2)
+			if tagPartKeyValue != nil && len(tagPartKeyValue) == 2 && strutils.IsStringNotEmpty(tagPartKeyValue[1]) {
+				tagPartKeyValue[1] = strings.Trim(tagPartKeyValue[1], "'")
+			}
+
+			switch tagPartKeyValue[0] {
+			case tagPartColumn:
+				if strutils.IsStringEmpty(tagPartKeyValue[1]) {
+					return nil, errors.New("column没有赋值列名")
+				}
+
+				tag.Name = tagPartKeyValue[1]
+			case tagPartKey:
+				tag.IsKey = true
+				tag.CanUpdate = false
+			case tagPartNotUpdate:
+				tag.CanUpdate = false
+				tag.CanUpdateClear = false
+			case tagPartUpdateClear:
+				if !tag.CanUpdate {
+					tag.CanUpdateClear = false
+				} else {
+					tag.CanUpdateClear = true
+				}
+			case tagPartAes:
+				if len(tagPartKeyValue[1]) != 32 {
+					return nil, errors.New("AES密钥长度应该为32个字节")
+				}
+
+				tag.AESKey = tagPartKeyValue[1]
+			case tagPartJoinWith:
+				if strutils.IsStringEmpty(tagPartKeyValue[1]) {
+					return nil, errors.New(tagPartJoinWith + "没有赋值分隔符")
+				}
+
+				tag.JoinWith = tagPartKeyValue[1]
+			case tagPartTrim:
+				tag.Trim = tagPartKeyValue[1]
+			case tagPartTrimPrefix:
+				tag.TrimPrefix = tagPartKeyValue[1]
+			case tagPartTrimSuffix:
+				tag.TrimSuffix = tagPartKeyValue[1]
+			default:
+				continue
+			}
+		}
+	}
+
+	return tag, nil
+}

+ 0 - 154
tag/sql_result.go

@@ -1,154 +0,0 @@
-package tag
-
-import (
-	"errors"
-	"git.sxidc.com/go-tools/utils/reflectutils"
-	"git.sxidc.com/go-tools/utils/strutils"
-	"git.sxidc.com/service-supports/fserr"
-	"github.com/iancoleman/strcase"
-	"reflect"
-	"strings"
-)
-
-type OnSqlResultParsedFieldTagFunc func(fieldName string, entityFieldElemValue reflect.Value, sqlResult *SqlResultTag) error
-
-func UseSqlResultTag(e any, onParsedFieldTagFunc OnSqlResultParsedFieldTagFunc) error {
-	if e == nil {
-		return nil
-	}
-
-	entityValue := reflect.ValueOf(e)
-
-	// 类型校验
-	if !reflectutils.IsValueStructPointer(entityValue) {
-		return fserr.New("参数不是结构指针")
-	}
-
-	entityElemValue := reflectutils.PointerValueElem(entityValue)
-
-	err := parseEntitySqlResultTag(entityElemValue, onParsedFieldTagFunc)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func parseEntitySqlResultTag(entityElemValue reflect.Value, onParsedFieldTagFunc OnSqlResultParsedFieldTagFunc) error {
-	for i := 0; i < entityElemValue.NumField(); i++ {
-		entityField := entityElemValue.Type().Field(i)
-		entityFieldValue := entityElemValue.Field(i)
-
-		// 无效值,不进行映射
-		if !entityFieldValue.IsValid() {
-			continue
-		}
-
-		if entityFieldValue.Kind() == reflect.Pointer && entityFieldValue.IsNil() {
-			entityFieldValue.Set(reflect.New(entityField.Type.Elem()))
-		}
-
-		entityFieldElemValue := reflectutils.PointerValueElem(entityFieldValue)
-
-		tagStr := entityField.Tag.Get(sqlResultTagKey)
-
-		tag, err := parseSqlResultTag(entityField, tagStr)
-		if err != nil {
-			return err
-		}
-
-		if tag == nil {
-			continue
-		}
-
-		// 结构类型的字段,解析结构内部
-		if entityFieldElemValue.Kind() == reflect.Struct &&
-			!reflectutils.IsValueTime(entityFieldElemValue) {
-			err := parseEntitySqlResultTag(entityFieldElemValue, onParsedFieldTagFunc)
-			if err != nil {
-				return err
-			}
-
-			continue
-		}
-
-		err = onParsedFieldTagFunc(entityField.Name, entityFieldElemValue, tag)
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-const (
-	sqlResultDefaultSplitWith         = "::"
-	sqlResultTagPartSeparator         = ";"
-	sqlResultTagPartKeyValueSeparator = ":"
-)
-
-const (
-	sqlResultTagKey    = "sqlresult"
-	sqlResultIgnore    = "-"
-	sqlResultColumn    = "column"
-	sqlResultParseTime = "parseTime"
-	sqlResultAes       = "aes"
-	sqlResultSplitWith = "splitWith"
-)
-
-type SqlResultTag struct {
-	Name      string
-	ParseTime string
-	AESKey    string
-	SplitWith string
-}
-
-func parseSqlResultTag(field reflect.StructField, tagStr string) (*SqlResultTag, error) {
-	if tagStr == sqlResultIgnore {
-		return nil, nil
-	}
-
-	sqlResultTag := &SqlResultTag{
-		Name:      strcase.ToSnake(field.Name),
-		ParseTime: "",
-		AESKey:    "",
-		SplitWith: sqlResultDefaultSplitWith,
-	}
-
-	if strutils.IsStringEmpty(tagStr) {
-		return sqlResultTag, nil
-	}
-
-	sqlResultParts := strings.Split(tagStr, sqlResultTagPartSeparator)
-	if sqlResultParts != nil || len(sqlResultParts) != 0 {
-		for _, sqlResultPart := range sqlResultParts {
-			sqlPartKeyValue := strings.SplitN(strings.TrimSpace(sqlResultPart), sqlResultTagPartKeyValueSeparator, 2)
-			if sqlPartKeyValue != nil && len(sqlPartKeyValue) == 2 && strutils.IsStringNotEmpty(sqlPartKeyValue[1]) {
-				sqlPartKeyValue[1] = strings.Trim(sqlPartKeyValue[1], "'")
-			}
-
-			switch sqlPartKeyValue[0] {
-			case sqlResultColumn:
-				sqlResultTag.Name = sqlPartKeyValue[1]
-			case sqlResultParseTime:
-				sqlResultTag.ParseTime = sqlPartKeyValue[1]
-			case sqlResultAes:
-				if len(sqlPartKeyValue[1]) != 32 {
-					return nil, errors.New("AES密钥长度应该为32个字节")
-				}
-
-				sqlResultTag.AESKey = sqlPartKeyValue[1]
-			case sqlResultSplitWith:
-				if strutils.IsStringEmpty(sqlPartKeyValue[1]) {
-					return nil, errors.New(sqlResultDefaultSplitWith + "没有赋值分隔符")
-				}
-
-				sqlResultTag.SplitWith = sqlPartKeyValue[1]
-			default:
-				continue
-			}
-		}
-	}
-
-	return sqlResultTag, nil
-}

+ 31 - 0
tag/sql_result/sql_result.go

@@ -0,0 +1,31 @@
+package sql_result
+
+import (
+	"git.sxidc.com/go-tools/utils/reflectutils"
+	"git.sxidc.com/service-supports/fserr"
+	"reflect"
+)
+
+type OnParsedFieldTagFunc func(fieldName string, entityFieldElemValue reflect.Value, tag *Tag) error
+
+func UseTag(e any, onParsedFieldTagFunc OnParsedFieldTagFunc) error {
+	if e == nil {
+		return nil
+	}
+
+	entityValue := reflect.ValueOf(e)
+
+	// 类型校验
+	if !reflectutils.IsValueStructPointer(entityValue) {
+		return fserr.New("参数不是结构指针")
+	}
+
+	entityElemValue := reflectutils.PointerValueElem(entityValue)
+
+	err := parseTag(entityElemValue, onParsedFieldTagFunc)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

+ 141 - 0
tag/sql_result/tag.go

@@ -0,0 +1,141 @@
+package sql_result
+
+import (
+	"errors"
+	"git.sxidc.com/go-tools/utils/reflectutils"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/iancoleman/strcase"
+	"reflect"
+	"strings"
+)
+
+const (
+	defaultSplitWith         = "::"
+	tagPartSeparator         = ";"
+	tagPartKeyValueSeparator = ":"
+)
+
+const (
+	tagKey            = "sqlresult"
+	tagPartIgnore     = "-"
+	tagPartColumn     = "column"
+	tagPartParseTime  = "parseTime"
+	tagPartAes        = "aes"
+	tagPartSplitWith  = "splitWith"
+	tagPartTrim       = "trim"
+	tagPartTrimPrefix = "trimPrefix"
+	tagPartTrimSuffix = "trimSuffix"
+)
+
+type Tag struct {
+	Name       string
+	ParseTime  string
+	AESKey     string
+	SplitWith  string
+	Trim       string
+	TrimPrefix string
+	TrimSuffix string
+}
+
+func parseTag(entityElemValue reflect.Value, onParsedFieldTagFunc OnParsedFieldTagFunc) error {
+	for i := 0; i < entityElemValue.NumField(); i++ {
+		entityField := entityElemValue.Type().Field(i)
+		entityFieldValue := entityElemValue.Field(i)
+
+		// 无效值,不进行映射
+		if !entityFieldValue.IsValid() {
+			continue
+		}
+
+		if entityFieldValue.Kind() == reflect.Pointer && entityFieldValue.IsNil() {
+			entityFieldValue.Set(reflect.New(entityField.Type.Elem()))
+		}
+
+		entityFieldElemValue := reflectutils.PointerValueElem(entityFieldValue)
+
+		tagStr := entityField.Tag.Get(tagKey)
+
+		tag, err := parseFieldTag(entityField, tagStr)
+		if err != nil {
+			return err
+		}
+
+		if tag == nil {
+			continue
+		}
+
+		// 结构类型的字段,解析结构内部
+		if entityFieldElemValue.Kind() == reflect.Struct &&
+			!reflectutils.IsValueTime(entityFieldElemValue) {
+			err := parseTag(entityFieldElemValue, onParsedFieldTagFunc)
+			if err != nil {
+				return err
+			}
+
+			continue
+		}
+
+		err = onParsedFieldTagFunc(entityField.Name, entityFieldElemValue, tag)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func parseFieldTag(field reflect.StructField, tagStr string) (*Tag, error) {
+	if tagStr == tagPartIgnore {
+		return nil, nil
+	}
+
+	tag := &Tag{
+		Name:      strcase.ToSnake(field.Name),
+		ParseTime: "",
+		AESKey:    "",
+		SplitWith: defaultSplitWith,
+	}
+
+	if strutils.IsStringEmpty(tagStr) {
+		return tag, nil
+	}
+
+	tagParts := strings.Split(tagStr, tagPartSeparator)
+	if tagParts != nil || len(tagParts) != 0 {
+		for _, tagPart := range tagParts {
+			tagPartKeyValue := strings.SplitN(strings.TrimSpace(tagPart), tagPartKeyValueSeparator, 2)
+			if tagPartKeyValue != nil && len(tagPartKeyValue) == 2 && strutils.IsStringNotEmpty(tagPartKeyValue[1]) {
+				tagPartKeyValue[1] = strings.Trim(tagPartKeyValue[1], "'")
+			}
+
+			switch tagPartKeyValue[0] {
+			case tagPartColumn:
+				tag.Name = tagPartKeyValue[1]
+			case tagPartParseTime:
+				tag.ParseTime = tagPartKeyValue[1]
+			case tagPartAes:
+				if len(tagPartKeyValue[1]) != 32 {
+					return nil, errors.New("AES密钥长度应该为32个字节")
+				}
+
+				tag.AESKey = tagPartKeyValue[1]
+			case tagPartSplitWith:
+				if strutils.IsStringEmpty(tagPartKeyValue[1]) {
+					return nil, errors.New(defaultSplitWith + "没有赋值分隔符")
+				}
+
+				tag.SplitWith = tagPartKeyValue[1]
+			case tagPartTrim:
+				tag.Trim = tagPartKeyValue[1]
+			case tagPartTrimPrefix:
+				tag.TrimPrefix = tagPartKeyValue[1]
+			case tagPartTrimSuffix:
+				tag.TrimSuffix = tagPartKeyValue[1]
+			default:
+				continue
+			}
+		}
+	}
+
+	return tag, nil
+}