160 lines
4.1 KiB
Go
160 lines
4.1 KiB
Go
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)
|
||
}
|