108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
package request
|
||
|
||
import (
|
||
"encoding/json"
|
||
"energy-management-system/utils/exception"
|
||
"errors"
|
||
"fmt"
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/gin-gonic/gin/binding"
|
||
"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"
|
||
"os"
|
||
"reflect"
|
||
"regexp"
|
||
"strconv"
|
||
"strings"
|
||
)
|
||
|
||
// Trans 定义一个全局翻译器T
|
||
var trans ut.Translator
|
||
var validate *validator.Validate
|
||
var ok bool
|
||
|
||
// InitTrans 初始化翻译器
|
||
func InitTrans(locale ...string) {
|
||
if len(locale) == 0 {
|
||
locale = []string{"zh"}
|
||
}
|
||
// 修改gin框架中的Validator引擎属性,实现自定制
|
||
if validate, ok = binding.Validator.Engine().(*validator.Validate); ok {
|
||
|
||
// zi
|
||
//validate.SetTagName("ss")
|
||
|
||
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
||
if name == "-" || name == "_" {
|
||
return ""
|
||
}
|
||
return name
|
||
})
|
||
|
||
// 第一个参数是备用(fallback)的语言环境
|
||
uni := ut.New(en.New(), zh.New())
|
||
trans, _ = uni.FindTranslator(locale[0])
|
||
// 注册翻译器
|
||
err := zhTranslations.RegisterDefaultTranslations(validate, trans)
|
||
|
||
// 注册自定义验证
|
||
validate.RegisterValidation("mobile", func(fl validator.FieldLevel) bool {
|
||
regRuler := "^1[3456789]{1}\\d{9}$"
|
||
reg := regexp.MustCompile(regRuler)
|
||
return reg.MatchString(fl.Field().String())
|
||
})
|
||
|
||
// 注册自定义验证的翻译
|
||
validate.RegisterTranslation("mobile", trans, func(ut ut.Translator) error {
|
||
return ut.Add("mobile", "手机号错误!", true)
|
||
}, func(ut ut.Translator, fe validator.FieldError) string {
|
||
t, _ := ut.T("mobile", fe.Field())
|
||
return t
|
||
})
|
||
|
||
if err != nil {
|
||
fmt.Printf("[-]自定义gin验证器失败: %s \n", err)
|
||
os.Exit(0)
|
||
}
|
||
}
|
||
}
|
||
|
||
func BindJson(c *gin.Context, f interface{}) {
|
||
dealWithError(c.ShouldBindJSON(f), "JSON")
|
||
}
|
||
func BindJsonWith(c *gin.Context, f interface{}) {
|
||
dealWithError(c.ShouldBindBodyWith(f, binding.JSON), "JSON")
|
||
}
|
||
func BindParam(c *gin.Context, f interface{}) {
|
||
dealWithError(c.ShouldBindQuery(f), "FORM")
|
||
}
|
||
|
||
func dealWithError(err error, t string) {
|
||
if err != nil {
|
||
var validationErrors validator.ValidationErrors
|
||
var unmarshalTypeError *json.UnmarshalTypeError
|
||
var numError *strconv.NumError
|
||
switch {
|
||
case errors.As(err, &validationErrors):
|
||
exception.PanicMsg(removeTopStruct(err.(validator.ValidationErrors).Translate(trans)))
|
||
case errors.As(err, &unmarshalTypeError):
|
||
exception.PanicCodeMsg(exception.PARAMETER_ERROR, err.(*json.UnmarshalTypeError).Field+": 类型错误")
|
||
case errors.As(err, &numError):
|
||
exception.PanicCodeMsg(exception.PARAMETER_ERROR, err.(*strconv.NumError).Num+": 类型错误")
|
||
default:
|
||
exception.PanicCodeMsg(exception.PARAMETER_ERROR, fmt.Sprintf("请将参数放于%s中传递: ", t)+err.Error())
|
||
}
|
||
}
|
||
}
|
||
|
||
func removeTopStruct(fields map[string]string) (re []string) {
|
||
for _, err := range fields {
|
||
re = append(re, err)
|
||
}
|
||
return
|
||
}
|