69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
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
|
|
}
|