Files
bj_power/bj_power_mes/common/httpx/validator.go
T

59 lines
1.6 KiB
Go
Raw Normal View History

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())
}