Files
energy-management-system/request/request.go
2024-08-26 17:20:13 +08:00

108 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}