package xhttp import ( "log/slog" "net/http" "reflect" "regexp" "github.com/go-playground/locales/en" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zhTranslations "github.com/go-playground/validator/v10/translations/zh" ) var mobileMatcher = regexp.MustCompile(`^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$`) var translator ut.Translator type Validator struct { v *validator.Validate } func NewValidator() *Validator { validate := validator.New() uni := ut.New(en.New(), zh.New(), en.New()) translator, _ = uni.GetTranslator("zh") if err := zhTranslations.RegisterDefaultTranslations(validate, translator); err != nil { slog.Error("验证器: 注册默认翻译失败", "error", err) } validate.RegisterTagNameFunc(func(fld reflect.StructField) string { return fld.Tag.Get("comment") }) if err := validate.RegisterValidation("mobile", validateMobile); err != nil { slog.Error("验证器: 注册mobile校验失败", "error", err) } if err := validate.RegisterTranslation("mobile", translator, func(ut ut.Translator) error { return ut.Add("mobile", "{0}必须是一个有效的手机号", true) }, func(ut ut.Translator, fe validator.FieldError) string { t, _ := ut.T("mobile", fe.Field()) return t }); err != nil { slog.Error("验证器: 注册mobile翻译失败", "error", err) } return &Validator{ v: validate, } } func (v *Validator) Validate(r *http.Request, data any) error { return v.v.Struct(data) } func validateMobile(fl validator.FieldLevel) bool { return mobileMatcher.MatchString(fl.Field().String()) }