每次使用gin时返回json都需要handler里面用context.JSON()返回,异常的麻烦。
这里封装一下工具方法直接调用ctx.Ok(data)这样的方式返回
type Context struct {
*gin.Context
}
// UnAuthorization 未授权
func (c Context) UnAuthorization() {
d := Body{
Code: code.RUnAuthorization,
Data: nil,
Msg: "未授权",
}
c.JSON(http.StatusOK, d)
}
// Ok 成功
func (c Context) Ok(data any, msg any) {
d := Body{
Code: code.ROk,
Data: data,
Msg: "操作成功",
}
if mg, ok := msg.(string); ok {
d.Msg = mg
}
c.JSON(http.StatusOK, d)
}
// Fail 操作失败
func (c Context) Fail(msg any) {
d := Body{
Code: code.RFail,
Data: nil,
Msg: "操作失败",
}
if mg, ok := msg.(string); ok {
d.Msg = mg
}
c.JSON(http.StatusOK, d)
}
// ParamFail 参数错误
func (c Context) ParamFail(msg any) {
d := Body{
Code: code.RParamError,
Data: nil,
Msg: "参数错误",
}
if mg, ok := msg.(string); ok {
d.Msg = mg
}
c.JSON(http.StatusOK, d)
}
func (c Context) Error(msg any) {
d := Body{
Code: code.RError,
Data: nil,
Msg: "系统错误",
}
if mg, ok := msg.(string); ok {
d.Msg = mg
}
c.JSON(http.StatusOK, d)
}
// ExtractPager 提取分页
func (c Context) ExtractPager() (page int, size int) {
page, err := strconv.Atoi(c.Query("page"))
if err != nil {
page = 1
}
size, err = strconv.Atoi(c.Query("size"))
if err != nil {
size = 10
}
return page, size
}
type HandlerFunc func(*Context)
func Handler(fn HandlerFunc) gin.HandlerFunc {
return func(c *gin.Context) {
ctx := new(Context)
ctx.Context = c
fn(ctx)
}
}
func page() HandlerFunc {
return func(ctx *Context) {
page, size := ctx.ExtractPager()
ctx.Ok(gin.H{
"size": size,
"page": page,
}, nil)
}
}
r := gin.Default()
r.GET("/",Handler(page()))
$$end, have fun.