package globals import ( "errors" "fmt" "log/slog" "strings" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zhtrans "github.com/go-playground/validator/v10/translations/zh" "github.com/gofiber/fiber/v2" ) var Validator *ValidatorClient type ValidatorClient struct { validator *validator.Validate translator ut.Translator } func (v *ValidatorClient) ParseBody(c *fiber.Ctx, data any) error { if err := c.BodyParser(data); err != nil { return err } return validate(data) } func (v *ValidatorClient) ParseQuery(c *fiber.Ctx, data any) error { if err := c.QueryParser(data); err != nil { return err } return validate(data) } func validate(data any) error { if errs := Validator.validator.Struct(data); errs != nil { var sb = strings.Builder{} var typeErrs validator.ValidationErrors errors.As(errs, &typeErrs) for i, err := range typeErrs { sb.WriteString(err.Translate(Validator.translator)) if i < len(typeErrs)-1 { sb.WriteString("\n") } } slog.Debug("请求参数验证失败", "msg", sb.String()) return fiber.NewError(fiber.StatusBadRequest, sb.String()) } return nil } func initValidator() error { var validate = validator.New(validator.WithRequiredStructEnabled()) var translator = ut.New(zh.New()).GetFallback() err := zhtrans.RegisterDefaultTranslations(validate, translator) if err != nil { return fmt.Errorf("初始化验证器失败: %w", err) } Validator = &ValidatorClient{ validator: validate, translator: translator, } return nil }