mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	refactor: 后端validator校验错误转译
This commit is contained in:
		
							
								
								
									
										41
									
								
								server/pkg/validatorx/pattern.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								server/pkg/validatorx/pattern.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
package validatorx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"mayfly-go/pkg/global"
 | 
			
		||||
	"regexp"
 | 
			
		||||
 | 
			
		||||
	"github.com/go-playground/validator/v10"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const CustomPatternTagName = "pattern"
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	regexpMap     map[string]*regexp.Regexp
 | 
			
		||||
	patternErrMsg map[string]string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 注册自定义正则表达式校验规则
 | 
			
		||||
func RegisterCustomPatterns() {
 | 
			
		||||
	// 账号用户名校验
 | 
			
		||||
	RegisterPattern("account_username", "^[a-zA-Z0-9_]{5,20}$", "只允许输入5-20位大小写字母、数字、下划线")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 注册自定义正则表达式
 | 
			
		||||
func RegisterPattern(patternName string, regexpStr string, errMsg string) {
 | 
			
		||||
	if regexpMap == nil {
 | 
			
		||||
		regexpMap = make(map[string]*regexp.Regexp, 0)
 | 
			
		||||
		patternErrMsg = make(map[string]string)
 | 
			
		||||
	}
 | 
			
		||||
	regexpMap[patternName] = regexp.MustCompile(regexpStr)
 | 
			
		||||
	patternErrMsg[patternName] = errMsg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func patternValidFunc(f validator.FieldLevel) bool {
 | 
			
		||||
	reg := regexpMap[f.Param()]
 | 
			
		||||
	if reg == nil {
 | 
			
		||||
		global.Log.Warnf("%s的正则校验规则不存在!", f.Param())
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return reg.MatchString(f.Field().String())
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										92
									
								
								server/pkg/validatorx/validatorx.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								server/pkg/validatorx/validatorx.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
package validatorx
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"mayfly-go/pkg/utils/structx"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin/binding"
 | 
			
		||||
	"github.com/go-playground/locales/zh"
 | 
			
		||||
	ut "github.com/go-playground/universal-translator"
 | 
			
		||||
	"github.com/go-playground/validator/v10"
 | 
			
		||||
	zh_trans "github.com/go-playground/validator/v10/translations/zh"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	trans ut.Translator
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Init() {
 | 
			
		||||
	// 获取gin的校验器
 | 
			
		||||
	validate, ok := binding.Validator.Engine().(*validator.Validate)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 修改返回字段key的格式
 | 
			
		||||
	validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
 | 
			
		||||
		// 如果存在校验错误提示消息,则使用字段名,后续需要通过该字段名获取相应错误消息
 | 
			
		||||
		if _, ok := fld.Tag.Lookup("valid_msg"); ok {
 | 
			
		||||
			return fld.Name
 | 
			
		||||
		}
 | 
			
		||||
		name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
 | 
			
		||||
		if name == "-" {
 | 
			
		||||
			return ""
 | 
			
		||||
		}
 | 
			
		||||
		return name
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// 注册翻译器
 | 
			
		||||
	zh := zh.New()
 | 
			
		||||
	uni := ut.New(zh, zh)
 | 
			
		||||
 | 
			
		||||
	trans, _ = uni.GetTranslator("zh")
 | 
			
		||||
 | 
			
		||||
	// 注册翻译器
 | 
			
		||||
	zh_trans.RegisterDefaultTranslations(validate, trans)
 | 
			
		||||
 | 
			
		||||
	// 注册自定义校验器
 | 
			
		||||
	validate.RegisterValidation(CustomPatternTagName, patternValidFunc)
 | 
			
		||||
 | 
			
		||||
	// 注册自定义正则校验规则
 | 
			
		||||
	RegisterCustomPatterns()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Translate 翻译错误信息
 | 
			
		||||
func Translate(data any, err error) map[string][]string {
 | 
			
		||||
	var result = make(map[string][]string)
 | 
			
		||||
 | 
			
		||||
	errors := err.(validator.ValidationErrors)
 | 
			
		||||
 | 
			
		||||
	for _, err := range errors {
 | 
			
		||||
		fieldName := err.Field()
 | 
			
		||||
 | 
			
		||||
		// 判断该字段是否设置了自定义的错误描述信息,存在则使用自定义错误信息进行提示
 | 
			
		||||
		if field, ok := structx.IndirectType(reflect.TypeOf(data)).FieldByName(fieldName); ok {
 | 
			
		||||
			if errMsg, ok := field.Tag.Lookup("valid_msg"); ok {
 | 
			
		||||
				result[fieldName] = append(result[fieldName], errMsg)
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 如果是自定义正则校验规则,则使用自定义的错误描述信息
 | 
			
		||||
		if err.Tag() == CustomPatternTagName {
 | 
			
		||||
			result[fieldName] = append(result[fieldName], fieldName+patternErrMsg[err.Param()])
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		result[fieldName] = append(result[fieldName], err.Translate(trans))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Translate 翻译错误信息为字符串
 | 
			
		||||
func Translate2Str(data any, err error) string {
 | 
			
		||||
	res := Translate(data, err)
 | 
			
		||||
	errMsgs := make([]string, 0)
 | 
			
		||||
	for _, v := range res {
 | 
			
		||||
		errMsgs = append(errMsgs, v...)
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(errMsgs, ", ")
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user