package controllers import ( "encoding/json" "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/model" wxConst "git.rosy.net.cn/jx-print/model/app_model" "git.rosy.net.cn/jx-print/putils" "git.rosy.net.cn/jx-print/services/print_server" "github.com/dchest/captcha" "github.com/gin-gonic/gin" "net/http" "strings" "time" ) func init() { globals.SugarLogger.Debugf("test init ...") } func CheckToken(c *gin.Context) (tokenInfo *model.TokenInfo) { var ( cookie *http.Cookie err error tokenMap map[string]interface{} user *model.User ) tokenInfo = &model.TokenInfo{} //验证token //v2下的接口需要验证,v1不需要 if !strings.Contains(c.Request.URL.String(), "v1") || !strings.Contains(c.Request.URL.String(), "app_no") { if cookie, err = c.Request.Cookie("token"); err != nil { c.JSON(http.StatusOK, &model.CallBack{ Desc: err.Error(), Code: model.ErrCodeNormal, }) return nil } else { tokenInfo.Token = cookie.Value } globals.SugarLogger.Debugf("checkToken token: %v", tokenInfo.Token) if tokenMap = putils.GetKey(tokenInfo.Token).(map[string]interface{}); tokenMap == nil { err = fmt.Errorf("token过期或无效,请重新登录!") c.JSON(http.StatusOK, &model.CallBack{ Desc: err.Error(), Code: model.ErrCodeToken, }) return nil } data, _ := json.Marshal(tokenMap) if err = json.Unmarshal(data, &user); err == nil && user != nil { tokenInfo.User = user } else { err = fmt.Errorf("token错误,请重新登录!") c.JSON(http.StatusOK, &model.CallBack{ Desc: err.Error(), Code: model.ErrCodeToken, }) return nil } globals.SugarLogger.Debugf("checkToken user: %v", putils.Format4Output(user, true)) } return tokenInfo } func CallFunc(c *gin.Context, worker func() (retVal interface{}, errCode string, err error)) bool { var ( err error callBack = &model.CallBack{ Code: model.ErrCodeNormal, } result interface{} ) if result, _, err = worker(); err == nil { if result != nil { if data, err := json.Marshal(&result); err == nil { callBack.Code = model.ErrCodeSuccess callBack.Data = string(data) c.JSON(http.StatusOK, callBack) globals.SugarLogger.Debugf("End API :%s success", c.Request.URL) return true } else { err = fmt.Errorf("data error!") callBack.Desc = err.Error() c.JSON(http.StatusOK, callBack) return false } } else { callBack.Code = model.ErrCodeSuccess c.JSON(http.StatusOK, callBack) globals.SugarLogger.Debugf("End API :%s success", c.Request.URL) return true } } else { callBack.Desc = err.Error() c.JSON(http.StatusOK, callBack) globals.SugarLogger.Debugf("End API :%s error:%v", c.Request.URL, err) } return false } func CaptchaVerify(c *gin.Context, code string) bool { verifyCode := putils.GetKey(c.ClientIP() + model.SessionKey) if verifyCode == nil { return true } if captchaId := verifyCode.(string); captchaId != "" { putils.DelKey(c.ClientIP() + model.SessionKey) return captcha.VerifyString(captchaId, code) } return false } func BuildErrJson(c *gin.Context, err error) { c.JSON(http.StatusOK, &model.CallBack{ Code: model.ErrCodeNormal, Desc: err.Error(), }) globals.SugarLogger.Debugf("End API :%s error:%v:", c.Request.URL, err) } func GetConfig(c *gin.Context) { var ( err error param = &struct { Type string `json:"type" form:"type" binding:"required"` Key string `json:"key" form:"key" binding:"required"` }{} ) if err = c.ShouldBind(¶m); err != nil { BuildErrJson(c, err) return } if !CallFunc(c, func() (retVal interface{}, errCode string, err error) { retVal, err = print_server.GetConfig(c, param.Type, param.Key) return retVal, "", err }) { return } } func SetToken(user *model.User) (token string, err error) { token = createToken(user) err = putils.SetKey(token, user, putils.DefTokenDuration) return token, err } func createToken(user *model.User) (token string) { return strings.Join([]string{ wxConst.TokenHeader, wxConst.TokenVer, user.UserID, time.Now().Format("20060102-150405"), utils.GetUUID(), user.Name, }, wxConst.TokenTypeSep) }