base_controller.go 3.5 KB
package controllers

import (
	"encoding/json"
	"errors"
	"fmt"
	"io/ioutil"
	"strconv"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/logs"
	"github.com/prometheus/common/log"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/lib"
	"gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/port/beego/protocol"
)

type BaseController struct {
	beego.Controller
}

func (controller BaseController) BindJsonData(v interface{}) error {
	bodyData := controller.Ctx.Input.GetData("requestBody")
	bodyByte, ok := bodyData.([]byte)
	if !ok {
		return errors.New("requestBody is not []byte")
	}
	return json.Unmarshal(bodyByte, v)
}

func (controller BaseController) ResponseError(err error) {
	controller.Data["json"] = protocol.ResponseData{
		Code: "-1",
		Msg:  err.Error(),
		Data: struct{}{},
	}
	controller.ServeJSON()
	logs.Error(err)
}

func (controller BaseController) ResponseData(data interface{}) {
	if data == nil {
		data = struct{}{}
	}
	controller.Data["json"] = protocol.ResponseData{
		Code: "0",
		Msg:  "ok",
		Data: data,
	}
	controller.ServeJSON()
}

//Finish 重写 beego.Controller 的Finish 方法
func (controller *BaseController) Finish() {
	strByte, _ := json.Marshal(controller.Data["json"])
	length := len(strByte)
	if length > 1500 {
		logs.Info("<====Send to client:  RspBodyData: %s......", string(strByte[:1500]))
	} else {
		logs.Info("<====Send to client:  RspBodyData: %s......", string(strByte))
	}
}

////Prepare 重写 beego.Controller 的Prepare方法
func (controller *BaseController) Prepare() {
	log.Info("====>Recv Request:%s Method:%s", controller.Ctx.Input.URI(), controller.Ctx.Input.Method())
	if controller.Ctx.Input.IsPost() || controller.Ctx.Input.IsPut() {
		bodyByte, _ := ioutil.ReadAll(controller.Ctx.Request.Body)
		controller.Ctx.Input.SetData("requestBody", bodyByte)
		controller.Ctx.Request.Body.Close()
		if len(bodyByte) > 1000 {
			log.Info("====>Recv data from client: BodyData:\n %s ...", string(bodyByte[0:1000]))
		} else {
			log.Info("====>Recv data from client: BodyData: \n %s", string(bodyByte))
		}
	}
	return
}

func (controller *BaseController) GetHeaderToken() string {
	return controller.Ctx.Input.Header("Authorization")
}

func (controller *BaseController) GetUserId() int {
	idV := controller.Ctx.Input.GetData("admin_user_id")
	uid, _ := strconv.Atoi(fmt.Sprint(idV))
	return uid
}

func (controller *BaseController) setUserId(id int) {
	controller.Ctx.Input.SetData("admin_user_id", id)
}

func (controller *BaseController) ValidJWTToken() bool {
	headerToken := controller.GetHeaderToken()
	mytoken := lib.NewMyToken(0)
	err := mytoken.ValidJWTToken(headerToken)
	if err != nil {
		if mytoken.IsJwtErrorExpired(err) {
			//token超时
			controller.Data["json"] = protocol.ResponseData{
				Code: "2",
				Msg:  "token过期,请重新登录",
				Data: struct{}{},
			}
			controller.ServeJSON()
		} else {
			controller.Data["json"] = protocol.ResponseData{
				Code: "-1",
				Msg:  "token校验失败",
				Data: struct{}{},
			}
			controller.ServeJSON()
		}
		return false
	}
	controller.setUserId(mytoken.UID)
	return true
}

func (controller *BaseController) ValidAdminPermission(code string, excludeURL ...string) bool {
	//排除掉的请求
	reqUrl := controller.Ctx.Input.URL()
	for i := range excludeURL {
		if reqUrl == excludeURL[i] {
			return true
		}
	}
	//权限校验
	//
	var err error
	if err != nil {
		controller.Data["json"] = protocol.ResponseData{
			Code: "-1",
			Msg:  "没有操作权限",
			Data: struct{}{},
		}
		controller.ServeJSON()
	}
	return true
}