This commit is contained in:
2024-08-26 17:20:13 +08:00
commit 51090658a2
39 changed files with 2231 additions and 0 deletions

107
request/request.go Normal file
View File

@@ -0,0 +1,107 @@
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
}