封装了一个 go-gin 的 BaseController

185 阅读1分钟

 web项目中规范的写法会使用controller层作为控制器,通常有大量json返回的需求,工作中对success、fail、abort分别进行了封装,以下是具体代码,可以根据实际需求进行修改。

package controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
	jsonIter "github.com/json-iterator/go"
)

type response struct {
	Code int         `json:"code"`
	Data interface{} `json:"data"`
	Msg  string      `json:"msg"`
}

func SuccessJson(c *gin.Context, data interface{}) {
	JsonResponse(c, "操作成功", 200, data)
}
func JsonResponse(c *gin.Context, msg string, code int, data interface{}) {
	responseData := response{
		Code: code,
		Data: data,
		Msg:  msg,
	}
	value, err := jsonIter.Marshal(responseData)
	if err != nil {
		return
	}
	c.Writer.Header().Set("Content-Type", "application/json")
	_, err = c.Writer.WriteString(string(value))
	if err != nil {
		fmt.Printf("写入JSON响应失败:%v:::%s\n", err, err.Error())
		_ = c.Error(err)
	}
	c.Abort()
}
func FailJson(c *gin.Context, msg string) {
	if msg == "" {
		msg = "操作失败"
	}
	JsonResponse(c, msg, 503, nil)
}

type BaseController struct {
}

// SuccessJson  成功响应
func (r *BaseController) SuccessJson(c *gin.Context, data interface{}) {
	SuccessJson(c, data)
}

// Abort  中断响应
func (r *BaseController) Abort(c *gin.Context, code int) {
	c.AbortWithStatus(code)
}

// FailJson  失败响应
func (r *BaseController) FailJson(c *gin.Context, msg string) {
	FailJson(c, msg)
}

使用示例

type InfoController struct {
	BaseController //这里继承
}

func NewInfoController() *InfoController {
	return &InfoController{}
}


func (r *InfoController) GetSkin(c *gin.Context) {

	installedInfo, err := pkgInstances.NewInstalledJsonS()
	if err != nil {
		return
	}
	r.SuccessJson(c, installedInfo.SkinItems)
}