package e import ( "applet/app/lib/aes" "applet/app/lib/aes/md" "applet/app/utils" "encoding/json" "net/http" "github.com/gin-gonic/gin" "applet/app/utils/logx" ) // GetMsg get error information based on Code // 因为这里code是自己控制的, 因此没考虑报错信息 func GetMsg(code int) (int, string) { if msg, ok := MsgFlags[code]; ok { return code / 1000, msg } if http.StatusText(code) == "" { code = 200 } return code, MsgFlags[ERR_BAD_REQUEST] } // 成功输出, fields 是额外字段, 与code, msg同级 func OutSuc(c *gin.Context, data interface{}, fields map[string]interface{}) { res := gin.H{ "code": 1, "msg": "ok", "data": data, } if fields != nil { for k, v := range fields { res[k] = v } } if c.GetBool("is_check_sign") { jsonData, _ := json.Marshal(res) str := aes.AesEncryptByECB(md.AesKey, string(jsonData)) c.Writer.WriteString(str) } c.AbortWithStatusJSON(200, res) } func OutSucPure(c *gin.Context, data interface{}, fields map[string]interface{}) { res := gin.H{ "code": 1, "msg": "ok", "data": data, } if fields != nil { for k, v := range fields { res[k] = v } } c.Abort() c.PureJSON(200, res) } // 错误输出 func OutErr(c *gin.Context, code int, err ...interface{}) { statusCode, msg := GetMsg(code) if len(err) > 0 && err[0] != nil { e := err[0] switch v := e.(type) { case E: statusCode = v.Code / 1000 msg = v.Error() logx.Error(v.msg + ": " + v.st) // 记录堆栈信息 case error: logx.Error(v) break case string: msg = v case int: if _, ok := MsgFlags[v]; ok { msg = MsgFlags[v] } } } if c.GetBool("is_check_sign") { jsonData, _ := json.Marshal(gin.H{ "code": code, "msg": msg, "data": []struct{}{}, }) str := aes.AesEncryptByECB(md.AesKey, string(jsonData)) if code > 100000 { code = int(utils.FloatFormat(float64(code/1000), 0)) } c.Status(500) c.Writer.WriteString(str) } c.AbortWithStatusJSON(statusCode, gin.H{ "code": code, "msg": msg, "data": []struct{}{}, }) } // 重定向 func OutRedirect(c *gin.Context, code int, loc string) { if code < 301 || code > 308 { code = 303 } c.Redirect(code, loc) c.Abort() }