validator.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package validator
  2. import (
  3. "reflect"
  4. "strings"
  5. "sync"
  6. "github.com/gin-gonic/gin/binding"
  7. "github.com/go-playground/validator/v10"
  8. )
  9. var (
  10. once sync.Once
  11. validate *validator.Validate
  12. )
  13. // Get 获取验证器实例
  14. func Get() *validator.Validate {
  15. once.Do(func() {
  16. validate = validator.New()
  17. // 使用 JSON tag 作为字段名
  18. validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
  19. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  20. if name == "-" {
  21. return ""
  22. }
  23. return name
  24. })
  25. // 注册自定义验证器
  26. registerCustomValidators(validate)
  27. })
  28. return validate
  29. }
  30. // Init 初始化验证器并绑定到 Gin
  31. func Init() {
  32. if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
  33. // 使用 JSON tag 作为字段名
  34. v.RegisterTagNameFunc(func(fld reflect.StructField) string {
  35. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
  36. if name == "-" {
  37. return ""
  38. }
  39. return name
  40. })
  41. // 注册自定义验证器
  42. registerCustomValidators(v)
  43. }
  44. }
  45. // registerCustomValidators 注册自定义验证器
  46. func registerCustomValidators(v *validator.Validate) {
  47. // 可以在这里注册自定义验证规则
  48. // 例如: v.RegisterValidation("custom_rule", customRuleFunc)
  49. }
  50. // Validate 验证结构体
  51. func Validate(s interface{}) error {
  52. return Get().Struct(s)
  53. }
  54. // ValidationErrors 格式化验证错误
  55. func ValidationErrors(err error) map[string]string {
  56. errors := make(map[string]string)
  57. if validationErrors, ok := err.(validator.ValidationErrors); ok {
  58. for _, e := range validationErrors {
  59. field := e.Field()
  60. switch e.Tag() {
  61. case "required":
  62. errors[field] = field + " is required"
  63. case "email":
  64. errors[field] = field + " must be a valid email"
  65. case "min":
  66. errors[field] = field + " must be at least " + e.Param()
  67. case "max":
  68. errors[field] = field + " must be at most " + e.Param()
  69. case "oneof":
  70. errors[field] = field + " must be one of: " + e.Param()
  71. default:
  72. errors[field] = field + " is invalid"
  73. }
  74. }
  75. }
  76. return errors
  77. }