yjp 1 жил өмнө
parent
commit
11d363d521

+ 3 - 3
convenient/entity_crud/service.go

@@ -269,7 +269,7 @@ func GetByID[O any](tableName string, callbacks *GetByIDCallbacks[O]) binding.Se
 			return outputZero, errors.New("需要传递领域对象应该为实体")
 		}
 
-		err := e.CheckFieldID()
+		err := entity.CheckFieldID(e)
 		if err != nil {
 			return callbackOnGetByIDErrorReturn(callbacks, e, err, i)
 		}
@@ -379,7 +379,7 @@ func DeleteTx(tableName string, callbacks *DeleteCallbacks) binding.ServiceFunc[
 			return nil, errors.New("需要传递领域对象应该为实体")
 		}
 
-		err := e.CheckFieldID()
+		err := entity.CheckFieldID(e)
 		if err != nil {
 			return nil, callbackOnDeleteErrorReturn(callbacks, e, make(map[string]any), err, i)
 		}
@@ -429,7 +429,7 @@ func UpdateTx(tableName string, callbacks *UpdateCallbacks) binding.ServiceFunc[
 			return nil, errors.New("需要传递领域对象应该为实体")
 		}
 
-		err := e.CheckFieldID()
+		err := entity.CheckFieldID(e)
 		if err != nil {
 			return nil, callbackOnUpdateErrorReturn(callbacks, e, make(map[string]any), err, i)
 		}

+ 2 - 2
convenient/relation/many2many/service.go

@@ -31,7 +31,7 @@ func Update(middleTableName string,
 		}
 
 		// 字段校验
-		err := fromEntity.CheckFieldID()
+		err := entity.CheckFieldID(fromEntity)
 		if err != nil {
 			return nil, err
 		}
@@ -60,7 +60,7 @@ func Update(middleTableName string,
 
 		if toIDs != nil && len(toIDs) != 0 {
 			for _, toID := range toIDs {
-				err := entity.CheckID(fromDomainCNName, fromRelationFieldName, toID)
+				err := entity.CheckIDTypeValue(fromDomainCNName, fromRelationFieldName, toID)
 				if err != nil {
 					return nil, err
 				}

+ 3 - 3
convenient/relation/one2many/service.go

@@ -34,7 +34,7 @@ func UpdateLeft(leftTableName string, leftDomainCNName string, leftRelationField
 		}
 
 		// 字段校验
-		err := leftEntity.CheckFieldID()
+		err := entity.CheckFieldID(leftEntity)
 		if err != nil {
 			return nil, err
 		}
@@ -63,7 +63,7 @@ func UpdateLeft(leftTableName string, leftDomainCNName string, leftRelationField
 
 		if rightIDs != nil && len(rightIDs) != 0 {
 			for _, rightID := range rightIDs {
-				err := entity.CheckID(leftDomainCNName, leftRelationFieldName, rightID)
+				err := entity.CheckIDTypeValue(leftDomainCNName, leftRelationFieldName, rightID)
 				if err != nil {
 					return nil, err
 				}
@@ -196,7 +196,7 @@ func UpdateRight(rightTableName string, rightRelationFieldName string, rightRela
 		}
 
 		// 字段校验
-		err := rightEntity.CheckFieldID()
+		err := entity.CheckFieldID(rightEntity)
 		if err != nil {
 			return nil, err
 		}

+ 1 - 1
convenient/relation/one2one/service.go

@@ -33,7 +33,7 @@ func Update(fromTableName string, fromRelationFieldName string, fromRelationColu
 		}
 
 		// 字段校验
-		err := fromEntity.CheckFieldID()
+		err := entity.CheckFieldID(fromEntity)
 		if err != nil {
 			return nil, err
 		}

+ 2 - 2
convenient/relation/remote/service.go

@@ -31,7 +31,7 @@ func Update(middleTableName string,
 		}
 
 		// 字段校验
-		err := fromEntity.CheckFieldID()
+		err := entity.CheckFieldID(fromEntity)
 		if err != nil {
 			return nil, err
 		}
@@ -62,7 +62,7 @@ func Update(middleTableName string,
 
 		if toIDs != nil && len(toIDs) != 0 {
 			for _, toID := range toIDs {
-				err := entity.CheckID(fromDomainCNName, fromRelationFieldName, toID)
+				err := entity.CheckIDTypeValue(fromDomainCNName, fromRelationFieldName, toID)
 				if err != nil {
 					return nil, err
 				}

+ 1 - 7
framework/binding/bind_item.go

@@ -139,14 +139,8 @@ func (item *BindItem[O]) bind(binder *Binder, middlewares ...api.Handler) {
 			}
 
 			// 执行业务函数
-			statusCode := http.StatusOK
-
 			outputModel, err := item.ServiceFunc(c, params, domainObjects, binder.i)
-			if err != nil {
-				statusCode = fserr.ParseCode(err).HttpCode
-			}
-
-			item.SendResponseFunc(c, statusCode, outputModel, err)
+			item.SendResponseFunc(c, http.StatusOK, outputModel, err)
 			return
 		},
 	}

+ 1 - 1
framework/core/api/api.go

@@ -73,7 +73,7 @@ func NewWithEngine(server *http.Server, engine *gin.Engine, opts ...Option) *Api
 
 func (api *Api) Start() error {
 	err := api.server.ListenAndServe()
-	if err != nil && !fserr.Is(err, http.ErrServerClosed) {
+	if err != nil && !errors.Is(err, http.ErrServerClosed) {
 		return errors.New(err.Error())
 	}
 

+ 4 - 3
framework/core/api/response/response.go

@@ -4,8 +4,10 @@ import (
 	"encoding/json"
 	"git.sxidc.com/go-framework/baize/framework/core/api"
 	"git.sxidc.com/go-framework/baize/framework/core/infrastructure/logger"
+	"git.sxidc.com/service-supports/fserr"
 	"git.sxidc.com/service-supports/websocket"
 	"github.com/pkg/errors"
+	"net/http"
 )
 
 type SendResponseFunc[O any] func(c *api.Context, statusCode int, data O, err error)
@@ -91,12 +93,11 @@ type MsgResponse struct {
 func formMsgResponse(err error) MsgResponse {
 	if err != nil {
 		logger.GetInstance().Error(err)
-		serviceErr := fserr.ParseCode(err)
 
 		return MsgResponse{
 			Success: false,
-			ErrCode: serviceErr.BusinessCode,
-			Msg:     serviceErr.Msg,
+			ErrCode: http.StatusOK,
+			Msg:     err.Error(),
 		}
 	}
 

+ 4 - 10
framework/core/domain/entity/base.go

@@ -1,9 +1,11 @@
 package entity
 
-import "git.sxidc.com/go-tools/utils/strutils"
+import (
+	"git.sxidc.com/go-tools/utils/strutils"
+)
 
 type Base struct {
-	ID string `sqlmapping:"column:id;key;" sqlresult:"column:id;"`
+	ID string `sqlmapping:"column:id;key;" sqlresult:"column:id;" check:"required,len32"`
 }
 
 func (e *Base) DBSchema() string {
@@ -18,11 +20,3 @@ func (e *Base) GenerateID() error {
 func (e *Base) GetID() string {
 	return e.ID
 }
-
-func (e *Base) CheckFieldID(domainCNName string) error {
-	return CheckID(domainCNName, "ID", e.ID)
-}
-
-func (e *Base) IDColumnName() string {
-	return ColumnID
-}

+ 0 - 1
framework/core/domain/entity/entity.go

@@ -8,7 +8,6 @@ type Entity interface {
 	domain.Object
 	GenerateID() error
 	GetID() string
-	CheckFieldID() error
 	ForCreate() error
 	ForDelete() error
 	ForUpdate() error

+ 58 - 13
framework/core/domain/entity/field.go

@@ -1,9 +1,21 @@
 package entity
 
 import (
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"github.com/pkg/errors"
 	"time"
 )
 
+const (
+	FieldID               = "ID"
+	FieldTenantID         = "TenantID"
+	FieldCreateUserID     = "CreateUserID"
+	FieldLastUpdateUserID = "LastUpdateUserID"
+	FieldCreatedTime      = "CreatedTime"
+	FieldLastUpdatedTime  = "LastUpdatedTime"
+)
+
 const (
 	ColumnID               = "id"
 	ColumnTenantID         = "tenant_id"
@@ -14,27 +26,60 @@ const (
 )
 
 type TenantIDField struct {
-	TenantID string `sqlmapping:"column:tenant_id;" sqlresult:"column:tenant_id;"`
+	TenantID string `sqlmapping:"column:tenant_id;" sqlresult:"column:tenant_id;" check:"required,len32"`
 }
 
-func (field *TenantIDField) CheckFieldTenantID(domainCNName string) error {
-	return CheckID(domainCNName, "租户ID", field.TenantID)
+type UserIDFields struct {
+	CreateUserID     string `sqlmapping:"column:create_user_id;" sqlresult:"column:create_user_id;" check:"required,len32"`
+	LastUpdateUserID string `sqlmapping:"column:last_update_user_id;" sqlresult:"column:last_update_user_id;" check:"required,len32"`
 }
 
-type UserIDFields struct {
-	CreateUserID     string `sqlmapping:"column:create_user_id;" sqlresult:"column:create_user_id;"`
-	LastUpdateUserID string `sqlmapping:"column:last_update_user_id;" sqlresult:"column:last_update_user_id;"`
+type TimeFields struct {
+	CreatedTime     time.Time `sqlmapping:"column:created_time;" sqlresult:"column:created_time;"`
+	LastUpdatedTime time.Time `sqlmapping:"column:last_updated_time;" sqlresult:"column:last_updated_time;"`
 }
 
-func (field *UserIDFields) CheckFieldCreateUserID(domainCNName string) error {
-	return CheckID(domainCNName, "创建用户ID", field.CreateUserID)
+func CheckFieldID(entity Entity) error {
+	return checkIDTypeField(entity, FieldID, "ID")
 }
 
-func (field *UserIDFields) CheckFieldLastUpdateUserID(domainCNName string) error {
-	return CheckID(domainCNName, "更新用户ID", field.LastUpdateUserID)
+func CheckFieldTenantID(entity Entity) error {
+	return checkIDTypeField(entity, FieldTenantID, "租户ID")
 }
 
-type TimeFields struct {
-	CreatedTime     time.Time `sqlmapping:"column:created_time;" sqlresult:"column:created_time;"`
-	LastUpdatedTime time.Time `sqlmapping:"column:last_updated_time;" sqlresult:"column:last_updated_time;"`
+func CheckFieldCreateUserID(entity Entity) error {
+	return checkIDTypeField(entity, FieldCreateUserID, "创建用户ID")
+}
+
+func CheckFieldLastUpdateUserID(entity Entity) error {
+	return checkIDTypeField(entity, FieldLastUpdateUserID, "最近更新用户ID")
+}
+
+func checkIDTypeField(entity Entity, fieldName string, fieldCNName string) error {
+	checkResult := check.Struct(entity, map[string]string{
+		fieldName: entity.DomainCNName() + fieldCNName,
+	})
+
+	err := checkResult.CheckFields(fieldName)
+	if err != nil {
+		return errors.New(entity.DomainCNName() + ": " + err.Error())
+	}
+
+	return nil
+}
+
+const (
+	idLen = 32
+)
+
+func CheckIDTypeValue(domainCNName string, fieldCNName string, id string) error {
+	if strutils.IsStringEmpty(id) {
+		return errors.New(domainCNName + fieldCNName + "为空")
+	}
+
+	if len(id) != idLen {
+		return errors.New(domainCNName + fieldCNName + "长度不正确")
+	}
+
+	return nil
 }

+ 0 - 22
framework/core/domain/entity/utils.go

@@ -1,22 +0,0 @@
-package entity
-
-import (
-	"git.sxidc.com/go-tools/utils/strutils"
-	"github.com/pkg/errors"
-)
-
-const (
-	fieldIDLen = 32
-)
-
-func CheckID(domainCNName string, fieldCNName string, id string) error {
-	if strutils.IsStringEmpty(id) {
-		return errors.New(domainCNName + fieldCNName + "为空")
-	}
-
-	if len(id) != fieldIDLen {
-		return errors.New(domainCNName + fieldCNName + "长度不正确")
-	}
-
-	return nil
-}

+ 55 - 32
framework/core/domain/object.go

@@ -1,6 +1,7 @@
 package domain
 
 import (
+	"git.sxidc.com/go-framework/baize/framework/core/tag/check"
 	"git.sxidc.com/go-tools/utils/reflectutils"
 	"git.sxidc.com/go-tools/utils/strutils"
 	"git.sxidc.com/go-tools/utils/template"
@@ -19,6 +20,24 @@ func HasField(object Object, fieldName string) bool {
 	return hasField(object, fieldName)
 }
 
+func CheckField(result check.Result, domainCNName string, fieldName string) error {
+	err := result.CheckFields(fieldName)
+	if err != nil {
+		return errors.New(domainCNName + ": " + err.Error())
+	}
+
+	return nil
+}
+
+func CheckFields(result check.Result, domainCNName string, fieldNames []string) error {
+	err := result.CheckFields(fieldNames...)
+	if err != nil {
+		return errors.New(domainCNName + ":\n" + err.Error())
+	}
+
+	return nil
+}
+
 func SetField[T any](object Object, fieldName string, value T) error {
 	if object == nil {
 		return errors.New("领域对象为nil")
@@ -77,6 +96,42 @@ func ToConcrete[T Object](object Object) (T, error) {
 	return concrete, nil
 }
 
+func TableName(schema string, object Object) string {
+	if strutils.IsStringNotEmpty(object.DBSchema()) {
+		schema = object.DBSchema()
+	}
+
+	if strutils.IsStringEmpty(schema) {
+		return template.Plural(strcase.ToSnake(template.Id(object.DomainCamelName())))
+	} else {
+		return schema + "." + template.Plural(strcase.ToSnake(template.Id(object.DomainCamelName())))
+	}
+}
+
+func RelationTableName(schema string, left Object, right Object) string {
+	if strutils.IsStringEmpty(schema) {
+		return strcase.ToSnake(template.Id(left.DomainCamelName())) + "_and_" + strcase.ToSnake(template.Id(right.DomainCamelName()))
+	} else {
+		return schema + "." + strcase.ToSnake(template.Id(left.DomainCamelName())) + "_and_" + strcase.ToSnake(template.Id(right.DomainCamelName()))
+	}
+}
+
+func ColumnName(fieldName string) string {
+	return strcase.ToSnake(template.Id(fieldName))
+}
+
+func RelationColumnName(object Object) string {
+	return strcase.ToSnake(template.Id(object.DomainCamelName())) + "_id"
+}
+
+func RelativeDomainPath(object Object) string {
+	return "/" + strcase.ToLowerCamel(template.Id(object.DomainCamelName()))
+}
+
+func SnakeDomainName(object Object) string {
+	return strcase.ToSnake(template.Id(object.DomainCamelName()))
+}
+
 func hasField(object Object, fieldName string) bool {
 	if object == nil {
 		return false
@@ -110,35 +165,3 @@ func getFieldValue(object Object, fieldName string) (*reflect.Value, error) {
 
 	return &fieldValue, nil
 }
-
-func TableName(schema string, object Object) string {
-	if strutils.IsStringNotEmpty(object.DBSchema()) {
-		schema = object.DBSchema()
-	}
-
-	if strutils.IsStringEmpty(schema) {
-		return template.Plural(strcase.ToSnake(template.Id(object.DomainCamelName())))
-	} else {
-		return schema + "." + template.Plural(strcase.ToSnake(template.Id(object.DomainCamelName())))
-	}
-}
-
-func RelationTableName(schema string, left Object, right Object) string {
-	if strutils.IsStringEmpty(schema) {
-		return strcase.ToSnake(template.Id(left.DomainCamelName())) + "_and_" + strcase.ToSnake(template.Id(right.DomainCamelName()))
-	} else {
-		return schema + "." + strcase.ToSnake(template.Id(left.DomainCamelName())) + "_and_" + strcase.ToSnake(template.Id(right.DomainCamelName()))
-	}
-}
-
-func RelationColumnName(object Object) string {
-	return strcase.ToSnake(template.Id(object.DomainCamelName())) + "_id"
-}
-
-func RelativeDomainPath(object Object) string {
-	return "/" + strcase.ToLowerCamel(template.Id(object.DomainCamelName()))
-}
-
-func SnakeDomainName(object Object) string {
-	return strcase.ToSnake(template.Id(object.DomainCamelName()))
-}

+ 31 - 8
framework/core/tag/validate/validate.go → framework/core/tag/check/validate.go

@@ -1,4 +1,4 @@
-package validate
+package check
 
 import (
 	"github.com/go-playground/locales/zh"
@@ -13,6 +13,8 @@ var validate = validator.New(validator.WithRequiredStructEnabled())
 var translator ut.Translator
 
 func init() {
+	validate.SetTagName("check")
+
 	zhLocale := zh.New()
 	zhTranslator := ut.New(zhLocale)
 	trans, _ := zhTranslator.GetTranslator("zh")
@@ -25,13 +27,22 @@ func init() {
 	translator = trans
 }
 
-func Struct(obj any) Result {
-	return Result{err: validate.Struct(obj)}
+func Struct(obj any, fieldNameMap map[string]string) Result {
+	return newResult(validate.Struct(obj), nil, fieldNameMap)
 }
 
 type Result struct {
 	err            error
 	translatedErrs map[string]string
+	fieldNameMap   map[string]string
+}
+
+func newResult(err error, translatedErrs map[string]string, fieldNameMap map[string]string) Result {
+	return Result{
+		err:            err,
+		translatedErrs: translatedErrs,
+		fieldNameMap:   fieldNameMap,
+	}
 }
 
 func (result Result) IsError() bool {
@@ -67,6 +78,13 @@ func (result Result) checkFields(fieldNames ...string) error {
 		for errStructFieldName, translatedErr := range translatedResult.translatedErrs {
 			errFieldName := strings.SplitAfterN(errStructFieldName, ".", 2)[1]
 			if fieldName == errFieldName {
+				if translatedResult.fieldNameMap != nil {
+					fieldCNName, ok := translatedResult.fieldNameMap[fieldName]
+					if ok {
+						translatedErr = strings.ReplaceAll(translatedErr, fieldName, fieldCNName)
+					}
+				}
+
 				errMsg.WriteString(translatedErr + "\n")
 			}
 		}
@@ -88,7 +106,15 @@ func (result Result) checkStruct() error {
 
 	errMsg := strings.Builder{}
 
-	for _, translatedErr := range translatedResult.translatedErrs {
+	for errStructFieldName, translatedErr := range translatedResult.translatedErrs {
+		if translatedResult.fieldNameMap != nil {
+			errFieldName := strings.SplitAfterN(errStructFieldName, ".", 2)[1]
+			fieldCNName, ok := translatedResult.fieldNameMap[errFieldName]
+			if ok {
+				translatedErr = strings.ReplaceAll(translatedErr, errFieldName, fieldCNName)
+			}
+		}
+
 		errMsg.WriteString(translatedErr + "\n")
 	}
 
@@ -109,8 +135,5 @@ func (result Result) translation() Result {
 		return result
 	}
 
-	return Result{
-		err:            result.err,
-		translatedErrs: validationErrors.Translate(translator),
-	}
+	return newResult(result.err, validationErrors.Translate(translator), result.fieldNameMap)
 }

+ 2 - 3
framework/gateway/builder_params.go

@@ -43,11 +43,10 @@ func newBuilderParams() *builderParams {
 
 			resp := make(map[string]any)
 			logger.GetInstance().Error(err)
-			serviceErr := fserr.ParseCode(err)
 
 			resp["success"] = false
-			resp["errCode"] = serviceErr.BusinessCode
-			resp["msg"] = serviceErr.Msg
+			resp["errCode"] = http.StatusOK
+			resp["msg"] = err.Error()
 
 			c.JSON(http.StatusOK, resp)
 		},

+ 4 - 2
go.mod

@@ -3,8 +3,8 @@ module git.sxidc.com/go-framework/baize
 go 1.22.3
 
 require (
-	git.sxidc.com/go-tools/utils v1.5.14
-	git.sxidc.com/service-supports/fslog v0.5.9
+	git.sxidc.com/go-tools/utils v1.5.15
+	git.sxidc.com/service-supports/fserr v0.3.5
 	git.sxidc.com/service-supports/websocket v1.3.1
 	github.com/gin-gonic/gin v1.10.0
 	github.com/go-playground/locales v0.14.1
@@ -24,6 +24,7 @@ require (
 )
 
 require (
+	git.sxidc.com/service-supports/fslog v0.5.9 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver/v3 v3.2.0 // indirect
 	github.com/Masterminds/sprig/v3 v3.2.3 // indirect
@@ -55,6 +56,7 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/olahol/melody v1.2.1 // indirect
 	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+	github.com/puzpuzpuz/xsync v1.5.2 // indirect
 	github.com/rogpeppe/go-internal v1.12.0 // indirect
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/shopspring/decimal v1.2.0 // indirect

+ 3 - 2
go.sum

@@ -1,5 +1,5 @@
-git.sxidc.com/go-tools/utils v1.5.14 h1:HVYw1wx4BBrh9acQJQ+B4Qb2ejKjFVGslcCnAmSVOsg=
-git.sxidc.com/go-tools/utils v1.5.14/go.mod h1:fkobAXFpOMTvkZ82TQXWcpsayePcyk/MS5TN6GTlRDg=
+git.sxidc.com/go-tools/utils v1.5.15 h1:7xs/EM8XZyKycrSSHcPZ6wvyYs+v8uWQ7ZmPP/fHyFI=
+git.sxidc.com/service-supports/fserr v0.3.5 h1:1SDC60r3FIDd2iRq/oHRLK4OMa1gf67h9B7kierKTUE=
 git.sxidc.com/service-supports/fslog v0.5.9 h1:q2XIK2o/fk/qmByy4x5kKLC+k7kolT5LrXHcWRSffXQ=
 git.sxidc.com/service-supports/fslog v0.5.9/go.mod h1:/m03ATmmOle75qtEgvEw8a1+Dcg6iHp08M1bGFXJTBU=
 git.sxidc.com/service-supports/websocket v1.3.1 h1:1mRfUwvpg0QA2JVKVMK8YJ/B33HFpDhY9srqroIuNGc=
@@ -103,6 +103,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/puzpuzpuz/xsync v1.5.2 h1:yRAP4wqSOZG+/4pxJ08fPTwrfL0IzE/LKQ/cw509qGY=
 github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=