You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
4.3 KiB
216 lines
4.3 KiB
package app |
|
|
|
import ( |
|
"encoding/json" |
|
"io/ioutil" |
|
"net/http" |
|
"net/url" |
|
"reflect" |
|
"server/call" |
|
"server/common" |
|
"server/db" |
|
"server/modules/web/values" |
|
"server/util" |
|
"strconv" |
|
"strings" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/gin-gonic/gin/binding" |
|
"github.com/liangdas/mqant/log" |
|
"gorm.io/gorm" |
|
) |
|
|
|
type Gin struct { |
|
R |
|
RetData interface{} // 定制返回内容 |
|
TmpData interface{} |
|
TmpData2 interface{} |
|
Context *gin.Context |
|
UID int |
|
Token string |
|
Lang string |
|
Referrer string |
|
// Share int |
|
Channel int |
|
UUID string |
|
WhiteIps []string |
|
Prefix string |
|
DeviceType int |
|
Resversion int |
|
} |
|
|
|
type R struct { |
|
Data interface{} `json:"data"` |
|
Msg string `json:"msg"` |
|
Code int `json:"code"` |
|
} |
|
|
|
func NewApp(c *gin.Context) *Gin { |
|
g := &Gin{Context: c, R: R{Code: values.CodeOK}} |
|
_uid, _ := c.Get("uid") |
|
if _uid != nil { |
|
g.UID = _uid.(int) |
|
} |
|
g.Token = c.GetHeader("token") |
|
g.Lang = common.CheckLang(c.GetHeader("lang")) |
|
g.Referrer = c.GetHeader("referrer") |
|
g.Resversion = util.ToInt(c.GetHeader("resversion")) |
|
channel := c.GetHeader("channel") |
|
if len(channel) > 0 { |
|
g.Channel, _ = strconv.Atoi(channel) |
|
} |
|
if channel == "" || g.Channel == 0 { |
|
// todo 先写死 |
|
g.Channel = 1000 |
|
} |
|
if g.Channel == 0 { |
|
u, _ := url.Parse(c.Request.Referer()) |
|
if u != nil && len(u.Host) > 0 { |
|
index := strings.Index(u.Host, ".") |
|
if index > 0 { |
|
g.Prefix = u.Host[:index] |
|
} |
|
channel := call.GetChannelByURL(u.Host[index+1:]) |
|
if channel != nil { |
|
g.Channel = channel.ChannelID |
|
} |
|
} |
|
} |
|
g.UUID = c.GetHeader("uuid") |
|
deviceType := c.GetHeader("platform") |
|
g.DeviceType, _ = strconv.Atoi(deviceType) |
|
return g |
|
} |
|
|
|
// Response setting gin.JSON(不加密) |
|
func (g *Gin) ResponseB() { |
|
if g.R.Code == values.CodeRetry { |
|
} else if g.R.Code == values.CodeToken { |
|
g.R.Msg = "login expired" |
|
} |
|
ret := g.RetData |
|
if ret == nil { |
|
ret = g.R |
|
} |
|
g.Context.JSON(http.StatusOK, ret) |
|
} |
|
|
|
// Response setting gin.JSON |
|
func (g *Gin) Response() { |
|
if g.R.Code == values.CodeRetry { |
|
} else if g.R.Code == values.CodeToken { |
|
g.R.Msg = "login expired" |
|
} |
|
jsonData, _ := json.Marshal(g.R) |
|
g.Context.Data(http.StatusOK, "text", util.AesEncrypt(jsonData)) |
|
} |
|
|
|
// S 解析请求(非加密) |
|
func (g *Gin) SB(one interface{}) (pass bool) { |
|
if err := g.Context.ShouldBind(one); err != nil { |
|
log.Error("err:%v", err) |
|
return |
|
} |
|
pass = true |
|
return |
|
} |
|
|
|
// S 解析请求(加密) |
|
func (g *Gin) S(one interface{}) (pass bool) { |
|
data, err := ioutil.ReadAll(g.Context.Request.Body) |
|
if err != nil { |
|
g.Code = values.CodeRetry |
|
log.Error("err:%v", err) |
|
return |
|
} |
|
if data == nil { |
|
log.Debug("is nil") |
|
} |
|
if len(data) == 0 { |
|
log.Debug("") |
|
} |
|
jsonData, err := util.AesDecrypt(data) |
|
if err != nil { |
|
g.Code = values.CodeRetry |
|
log.Error("err:%v", err) |
|
return |
|
} |
|
err = binding.JSON.BindBody(jsonData, one) |
|
// err = json.Unmarshal(jsonData, one) |
|
if err != nil { |
|
g.Code = values.CodeRetry |
|
log.Error("err:%v", err) |
|
return |
|
} |
|
pass = true |
|
return |
|
} |
|
|
|
// U 统一json解析方法 |
|
func (g *Gin) U(src []byte, tar interface{}) (pass bool) { |
|
err := json.Unmarshal(src, tar) |
|
if err != nil { |
|
log.Error("%v err:%v", reflect.TypeOf(tar), err) |
|
g.R.Code = values.CodeRetry |
|
g.R.Msg = err.Error() |
|
return |
|
} |
|
pass = true |
|
return |
|
} |
|
|
|
// 从数据库中读取活动数据(不存在时创建) |
|
func (g *Gin) MGetActivity(tar interface{}) (pass bool) { |
|
err := db.Mysql().Get(tar) |
|
if err == gorm.ErrRecordNotFound { |
|
db.Mysql().Create(tar) |
|
} else if err != nil { |
|
log.Error("err:%v", err) |
|
g.R.Code = values.CodeRetry |
|
g.R.Msg = err.Error() |
|
return |
|
} |
|
pass = true |
|
return |
|
} |
|
|
|
// 从数据库中读取数据 |
|
func (g *Gin) MGet(tar interface{}) (pass bool) { |
|
err := db.Mysql().Get(tar) |
|
if err != nil && err != gorm.ErrRecordNotFound { |
|
log.Error("err:%v", err) |
|
g.R.Code = values.CodeRetry |
|
g.R.Msg = err.Error() |
|
return |
|
} |
|
pass = true |
|
return |
|
} |
|
|
|
// MCommit 提交事务 |
|
func (g *Gin) MCommit(tx *gorm.DB) { |
|
if g.Code == values.CodeOK { |
|
if err := tx.Commit().Error; err != nil { |
|
tx.Rollback() |
|
return |
|
} |
|
} else { |
|
tx.Rollback() |
|
return |
|
} |
|
} |
|
|
|
// GetUID 可过滤的url带token时获取uid |
|
func (g *Gin) GetUID() { |
|
if g.UID > 0 { |
|
return |
|
} |
|
token := g.Context.GetHeader("token") |
|
if token == "" { |
|
return |
|
} |
|
uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(token)) |
|
if uid > 0 { |
|
g.UID = uid |
|
} |
|
}
|
|
|