package tools import ( "errors" "fmt" "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/spf13/cast" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" "log" "net/url" "runtime" "strconv" ) func CompareHashAndPassword(e string, p string) (bool, error) { err := bcrypt.CompareHashAndPassword([]byte(e), []byte(p)) if err != nil { return false, err } return true, nil } // Assert 条件断言 // 当断言条件为 假 时触发 panic // 对于当前请求不会再执行接下来的代码,并且返回指定格式的错误信息和错误码 func Assert(condition bool, msg string, code ...int) { if !condition { statusCode := 200 if len(code) > 0 { statusCode = code[0] } panic("CustomError#" + strconv.Itoa(statusCode) + "#" + msg) } } // HasError 错误断言 // 当 error 不为 nil 时触发 panic // 对于当前请求不会再执行接下来的代码,并且返回指定格式的错误信息和错误码 // 若 msg 为空,则默认为 error 中的内容 func HasError(err error, msg string, code ...int) { if err != nil { statusCode := 200 if len(code) > 0 { statusCode = code[0] } if msg == "" { msg = err.Error() } _, file, line, _ := runtime.Caller(1) log.Printf("%s:%v error: %#v", file, line, err) panic("CustomError#" + strconv.Itoa(statusCode) + "#" + msg) } } // GenerateMsgIDFromContext 生成msgID func GenerateMsgIDFromContext(c *gin.Context) string { var msgID string data, ok := c.Get("msgID") if !ok { msgID = uuid.New().String() c.Set("msgID", msgID) return msgID } msgID = cast.ToString(data) return msgID } // GetOrm 获取orm连接 func GetOrm(c *gin.Context) (*gorm.DB, error) { msgID := GenerateMsgIDFromContext(c) idb, exist := c.Get("db") if !exist { return nil, errors.New(fmt.Sprintf("msgID[%s], db connect not exist", msgID)) } switch idb.(type) { case *gorm.DB: //新增操作 return idb.(*gorm.DB), nil default: return nil, errors.New(fmt.Sprintf("msgID[%s], db connect not exist", msgID)) } } // DecodeURL 自动多次 URL 解码,直到结果不再变化 func DecodeURL(input string) (string, error) { prev := "" current := input var err error for current != prev { prev = current current, err = url.QueryUnescape(prev) if err != nil { return "", err } } return current, nil }