Files
mayfly-go/base/controller.go
2021-01-08 15:37:32 +08:00

166 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package base
import (
"encoding/json"
"fmt"
"mayfly-go/base/ctx"
"mayfly-go/base/model"
"mayfly-go/base/token"
"github.com/beego/beego/v2/core/logs"
"github.com/beego/beego/v2/core/validation"
"github.com/beego/beego/v2/server/web"
)
type Controller struct {
web.Controller
}
// 获取数据函数
type getDataFunc func(loginAccount *ctx.LoginAccount) interface{}
// 操作函数,无返回数据
type operationFunc func(loginAccount *ctx.LoginAccount)
// 将请求体的json赋值给指定的结构体
func (c *Controller) UnmarshalBody(data interface{}) {
err := json.Unmarshal(c.Ctx.Input.RequestBody, data)
model.BizErrIsNil(err, "request body解析错误")
}
// 校验表单数据
func (c *Controller) validForm(form interface{}) {
valid := validation.Validation{}
b, err := valid.Valid(form)
if err != nil {
panic(err)
}
if !b {
e := valid.Errors[0]
panic(model.NewBizErr(e.Field + " " + e.Message))
}
}
// 将请求体的json赋值给指定的结构体并校验表单数据
func (c *Controller) UnmarshalBodyAndValid(data interface{}) {
c.UnmarshalBody(data)
c.validForm(data)
}
// 返回数据
// @param checkToken 是否校验token
// @param getData 获取数据的回调函数
func (c *Controller) ReturnData(checkToken bool, getData getDataFunc) {
defer func() {
if err := recover(); err != nil {
c.parseErr(err)
}
}()
var loginAccount *ctx.LoginAccount
if checkToken {
loginAccount = c.CheckToken()
}
c.Success(getData(loginAccount))
}
// 返回数据
// @param checkToken 是否校验token
// @param getData 获取数据的回调函数
func (c *Controller) ReturnDataWithPermisison(permission ctx.Permission, getData getDataFunc) {
defer func() {
if err := recover(); err != nil {
c.parseErr(err)
}
}()
var logMsg string
var loginAccount *ctx.LoginAccount
if permission.CheckToken {
loginAccount = c.CheckToken()
logMsg = fmt.Sprintf("[uid=%d, uname=%s]\n", loginAccount.Id, loginAccount.Username)
}
c.Success(getData(loginAccount))
logs.Info(logMsg)
}
// 无返回数据的操作,如新增修改等无需返回数据的操作
// @param checkToken 是否校验token
func (c *Controller) Operation(checkToken bool, operation operationFunc) {
defer func() {
if err := recover(); err != nil {
c.parseErr(err)
}
}()
var loginAccount *ctx.LoginAccount
if checkToken {
loginAccount = c.CheckToken()
}
operation(loginAccount)
c.SuccessNoData()
}
// 校验token并返回登录者账号信息
func (c *Controller) CheckToken() *ctx.LoginAccount {
tokenStr := c.Ctx.Input.Header("Authorization")
loginAccount, err := token.ParseToken(tokenStr)
if err != nil || loginAccount == nil {
panic(model.NewBizErrCode(model.TokenErrorCode, model.TokenErrorMsg))
}
return loginAccount
}
// 获取分页参数
func (c *Controller) GetPageParam() *model.PageParam {
pn, err := c.GetInt("pageNum", 1)
model.BizErrIsNil(err, "pageNum参数错误")
ps, serr := c.GetInt("pageSize", 10)
model.BizErrIsNil(serr, "pageSize参数错误")
return &model.PageParam{PageNum: pn, PageSize: ps}
}
// 统一返回Result json对象
func (c *Controller) Result(result *model.Result) {
c.Data["json"] = result
c.ServeJSON()
}
// 返回成功结果
func (c *Controller) Success(data interface{}) {
c.Result(model.Success(data))
}
// 返回成功结果
func (c *Controller) SuccessNoData() {
c.Result(model.SuccessNoData())
}
// 返回业务错误
func (c *Controller) BizError(bizError model.BizError) {
c.Result(model.Error(bizError.Code(), bizError.Error()))
}
// 返回服务器错误结果
func (c *Controller) ServerError() {
c.Result(model.ServerError())
}
// 解析error并对不同error返回不同result
func (c *Controller) parseErr(err interface{}) {
switch t := err.(type) {
case model.BizError:
c.BizError(t)
break
case error:
c.ServerError()
logs.Error(t)
panic(err)
//break
case string:
c.ServerError()
logs.Error(t)
panic(err)
//break
default:
logs.Error(t)
}
}