2020-09-01 10:34:11 +08:00
|
|
|
|
package base
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"encoding/json"
|
2021-03-24 17:18:39 +08:00
|
|
|
|
"mayfly-go/base/biz"
|
2021-01-08 15:37:32 +08:00
|
|
|
|
"mayfly-go/base/ctx"
|
2021-03-24 17:18:39 +08:00
|
|
|
|
"mayfly-go/base/mlog"
|
2021-01-08 15:37:32 +08:00
|
|
|
|
"mayfly-go/base/model"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/beego/beego/v2/core/validation"
|
|
|
|
|
|
"github.com/beego/beego/v2/server/web"
|
2020-09-01 10:34:11 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type Controller struct {
|
2021-01-08 15:37:32 +08:00
|
|
|
|
web.Controller
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取数据函数
|
2021-01-08 15:37:32 +08:00
|
|
|
|
type getDataFunc func(loginAccount *ctx.LoginAccount) interface{}
|
2020-09-01 10:34:11 +08:00
|
|
|
|
|
|
|
|
|
|
// 操作函数,无返回数据
|
2021-01-08 15:37:32 +08:00
|
|
|
|
type operationFunc func(loginAccount *ctx.LoginAccount)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
|
|
|
|
|
|
// 将请求体的json赋值给指定的结构体
|
|
|
|
|
|
func (c *Controller) UnmarshalBody(data interface{}) {
|
|
|
|
|
|
err := json.Unmarshal(c.Ctx.Input.RequestBody, data)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
biz.BizErrIsNil(err, "request body解析错误")
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 校验表单数据
|
|
|
|
|
|
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]
|
2021-03-24 17:18:39 +08:00
|
|
|
|
panic(biz.NewBizErr(e.Field + " " + e.Message))
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将请求体的json赋值给指定的结构体,并校验表单数据
|
|
|
|
|
|
func (c *Controller) UnmarshalBodyAndValid(data interface{}) {
|
|
|
|
|
|
c.UnmarshalBody(data)
|
|
|
|
|
|
c.validForm(data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回数据
|
2021-03-24 17:18:39 +08:00
|
|
|
|
// @param reqCtx 请求上下文
|
2020-09-01 10:34:11 +08:00
|
|
|
|
// @param getData 获取数据的回调函数
|
2021-03-24 17:18:39 +08:00
|
|
|
|
func (c *Controller) ReturnData(reqCtx *ctx.ReqCtx, getData getDataFunc) {
|
2020-09-01 10:34:11 +08:00
|
|
|
|
defer func() {
|
|
|
|
|
|
if err := recover(); err != nil {
|
2021-03-24 17:18:39 +08:00
|
|
|
|
ctx.ApplyAfterHandler(reqCtx, err.(error))
|
2020-09-01 10:34:11 +08:00
|
|
|
|
c.parseErr(err)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
// 应用所有请求后置处理器
|
|
|
|
|
|
ctx.ApplyAfterHandler(reqCtx, nil)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
}()
|
2021-03-24 17:18:39 +08:00
|
|
|
|
reqCtx.Req = c.Ctx.Request
|
|
|
|
|
|
// 调用请求前所有处理器
|
|
|
|
|
|
err := ctx.ApplyBeforeHandler(reqCtx)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(err)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-03-24 17:18:39 +08:00
|
|
|
|
resp := getData(reqCtx.LoginAccount)
|
|
|
|
|
|
c.Success(resp)
|
|
|
|
|
|
reqCtx.RespObj = resp
|
2021-01-08 15:37:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-09-01 10:34:11 +08:00
|
|
|
|
// 无返回数据的操作,如新增修改等无需返回数据的操作
|
2021-03-24 17:18:39 +08:00
|
|
|
|
// @param reqCtx 请求上下文
|
|
|
|
|
|
func (c *Controller) Operation(reqCtx *ctx.ReqCtx, operation operationFunc) {
|
2020-09-01 10:34:11 +08:00
|
|
|
|
defer func() {
|
|
|
|
|
|
if err := recover(); err != nil {
|
2021-03-24 17:18:39 +08:00
|
|
|
|
ctx.ApplyAfterHandler(reqCtx, err.(error))
|
2020-09-01 10:34:11 +08:00
|
|
|
|
c.parseErr(err)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
ctx.ApplyAfterHandler(reqCtx, nil)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
}()
|
2021-03-24 17:18:39 +08:00
|
|
|
|
reqCtx.Req = c.Ctx.Request
|
|
|
|
|
|
// 调用请求前所有处理器
|
|
|
|
|
|
err := ctx.ApplyBeforeHandler(reqCtx)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(err)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
2021-03-24 17:18:39 +08:00
|
|
|
|
|
|
|
|
|
|
operation(reqCtx.LoginAccount)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
c.SuccessNoData()
|
|
|
|
|
|
|
2021-03-24 17:18:39 +08:00
|
|
|
|
// 不记录返回结果
|
|
|
|
|
|
reqCtx.RespObj = 0
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取分页参数
|
2021-01-08 15:37:32 +08:00
|
|
|
|
func (c *Controller) GetPageParam() *model.PageParam {
|
2020-09-01 10:34:11 +08:00
|
|
|
|
pn, err := c.GetInt("pageNum", 1)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
biz.BizErrIsNil(err, "pageNum参数错误")
|
2020-09-01 10:34:11 +08:00
|
|
|
|
ps, serr := c.GetInt("pageSize", 10)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
biz.BizErrIsNil(serr, "pageSize参数错误")
|
2021-01-08 15:37:32 +08:00
|
|
|
|
return &model.PageParam{PageNum: pn, PageSize: ps}
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 统一返回Result json对象
|
2021-01-08 15:37:32 +08:00
|
|
|
|
func (c *Controller) Result(result *model.Result) {
|
2020-09-01 10:34:11 +08:00
|
|
|
|
c.Data["json"] = result
|
|
|
|
|
|
c.ServeJSON()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回成功结果
|
|
|
|
|
|
func (c *Controller) Success(data interface{}) {
|
2021-01-08 15:37:32 +08:00
|
|
|
|
c.Result(model.Success(data))
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回成功结果
|
|
|
|
|
|
func (c *Controller) SuccessNoData() {
|
2021-01-08 15:37:32 +08:00
|
|
|
|
c.Result(model.SuccessNoData())
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回业务错误
|
2021-03-24 17:18:39 +08:00
|
|
|
|
func (c *Controller) BizError(bizError *biz.BizError) {
|
2021-01-08 15:37:32 +08:00
|
|
|
|
c.Result(model.Error(bizError.Code(), bizError.Error()))
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回服务器错误结果
|
|
|
|
|
|
func (c *Controller) ServerError() {
|
2021-01-08 15:37:32 +08:00
|
|
|
|
c.Result(model.ServerError())
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 解析error,并对不同error返回不同result
|
|
|
|
|
|
func (c *Controller) parseErr(err interface{}) {
|
|
|
|
|
|
switch t := err.(type) {
|
2021-03-24 17:18:39 +08:00
|
|
|
|
case *biz.BizError:
|
2020-09-01 10:34:11 +08:00
|
|
|
|
c.BizError(t)
|
|
|
|
|
|
break
|
|
|
|
|
|
case error:
|
|
|
|
|
|
c.ServerError()
|
2021-03-24 17:18:39 +08:00
|
|
|
|
mlog.Log.Error(t)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
|
//break
|
|
|
|
|
|
case string:
|
|
|
|
|
|
c.ServerError()
|
2021-03-24 17:18:39 +08:00
|
|
|
|
mlog.Log.Error(t)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
|
//break
|
|
|
|
|
|
default:
|
2021-03-24 17:18:39 +08:00
|
|
|
|
mlog.Log.Error(t)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|