增加定时任务 处理异常

This commit is contained in:
2024-08-30 11:55:19 +08:00
parent aa3f9e8711
commit bfb284c4cc
30 changed files with 945 additions and 336 deletions

View File

@@ -2,104 +2,136 @@ package request
import (
"encoding/json"
req_validator "energy-management-system/request/validator"
"energy-management-system/utils/code"
"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
//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 {
//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)
// }
// }
//}
// zi
//validate.SetTagName("ss")
//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(code.PARAMETER_ERROR, err.(*json.UnmarshalTypeError).Field+": 类型错误")
// case errors.As(err, &numError):
// exception.PanicCodeMsg(code.PARAMETER_ERROR, err.(*strconv.NumError).Num+": 类型错误")
// default:
// exception.PanicCodeMsg(code.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
//}
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 any) {
err := c.ShouldBindJSON(f)
//if gin.IsDebugging() {
// c.Set("_req", f)
//doc.SetReq(c, f)
//}
DealValidError(err, "JSON")
}
func BindJsonWith(c *gin.Context, f any) {
DealValidError(c.ShouldBindBodyWith(f, binding.JSON), "JSON")
}
func BindParam(c *gin.Context, f any) {
err := c.ShouldBindQuery(f)
//doc.SetReq(c, f)
DealValidError(err, "FORM")
}
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) {
func DealValidError(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+": 类型错误")
switch err.(type) {
case validator.ValidationErrors:
exception.PM(RemoveTopStruct(err.(validator.ValidationErrors).Translate(req_validator.Trans)))
case *json.UnmarshalTypeError:
exception.PMC(err.(*json.UnmarshalTypeError).Field+": 类型错误", code.PARAMETER_ERROR)
case *strconv.NumError:
exception.PMC(err.(*strconv.NumError).Num+": 类型错误", code.PARAMETER_ERROR)
default:
exception.PanicCodeMsg(exception.PARAMETER_ERROR, fmt.Sprintf("请将参数放于%s中传递: ", t)+err.Error())
exception.PMC(fmt.Sprintf("请将参数放于%s中传递: ", t)+err.Error(), code.PARAMETER_ERROR)
}
}
}
func removeTopStruct(fields map[string]string) (re []string) {
func RemoveTopStruct(fields map[string]string) (re []string) {
for _, err := range fields {
re = append(re, err)
}