Files
mayfly-go/base/controller.go
2021-03-24 17:18:39 +08:00

154 lines
3.4 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"
"mayfly-go/base/biz"
"mayfly-go/base/ctx"
"mayfly-go/base/mlog"
"mayfly-go/base/model"
"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)
biz.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(biz.NewBizErr(e.Field + " " + e.Message))
}
}
// 将请求体的json赋值给指定的结构体并校验表单数据
func (c *Controller) UnmarshalBodyAndValid(data interface{}) {
c.UnmarshalBody(data)
c.validForm(data)
}
// 返回数据
// @param reqCtx 请求上下文
// @param getData 获取数据的回调函数
func (c *Controller) ReturnData(reqCtx *ctx.ReqCtx, getData getDataFunc) {
defer func() {
if err := recover(); err != nil {
ctx.ApplyAfterHandler(reqCtx, err.(error))
c.parseErr(err)
} else {
// 应用所有请求后置处理器
ctx.ApplyAfterHandler(reqCtx, nil)
}
}()
reqCtx.Req = c.Ctx.Request
// 调用请求前所有处理器
err := ctx.ApplyBeforeHandler(reqCtx)
if err != nil {
panic(err)
}
resp := getData(reqCtx.LoginAccount)
c.Success(resp)
reqCtx.RespObj = resp
}
// 无返回数据的操作,如新增修改等无需返回数据的操作
// @param reqCtx 请求上下文
func (c *Controller) Operation(reqCtx *ctx.ReqCtx, operation operationFunc) {
defer func() {
if err := recover(); err != nil {
ctx.ApplyAfterHandler(reqCtx, err.(error))
c.parseErr(err)
} else {
ctx.ApplyAfterHandler(reqCtx, nil)
}
}()
reqCtx.Req = c.Ctx.Request
// 调用请求前所有处理器
err := ctx.ApplyBeforeHandler(reqCtx)
if err != nil {
panic(err)
}
operation(reqCtx.LoginAccount)
c.SuccessNoData()
// 不记录返回结果
reqCtx.RespObj = 0
}
// 获取分页参数
func (c *Controller) GetPageParam() *model.PageParam {
pn, err := c.GetInt("pageNum", 1)
biz.BizErrIsNil(err, "pageNum参数错误")
ps, serr := c.GetInt("pageSize", 10)
biz.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 *biz.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 *biz.BizError:
c.BizError(t)
break
case error:
c.ServerError()
mlog.Log.Error(t)
panic(err)
//break
case string:
c.ServerError()
mlog.Log.Error(t)
panic(err)
//break
default:
mlog.Log.Error(t)
}
}