pcm-openi/apis/base_api.go

116 lines
2.5 KiB
Go

package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zht "github.com/go-playground/validator/v10/translations/zh"
"net/http"
"strconv"
"strings"
)
type errorCode int
const (
Success errorCode = 200
Failed errorCode = 500
ParamError errorCode = 400
NotFound errorCode = 404
UnAuthorized errorCode = 401
)
var codeMsg = map[errorCode]string{
Success: "正常",
Failed: "系统异常",
ParamError: "参数错误",
NotFound: "记录不存在",
UnAuthorized: "未授权",
}
type Api struct {
Page int
PageSize int
}
type Pagination struct {
List interface{} `json:"list"`
Page int `json:"page"`
PageSize int `json:"page_size"`
TotalCount int64 `json:"total_count"`
}
var BaseApi = &Api{}
var trans ut.Translator
// 注册validator中文翻译
func init() {
uni := ut.New(en.New(), zh.New())
trans, _ = uni.GetTranslator("zh")
validate := binding.Validator.Engine().(*validator.Validate)
_ = zht.RegisterDefaultTranslations(validate, trans)
}
func translate(err error) string {
errors, ok := err.(validator.ValidationErrors)
if !ok {
return err.Error()
}
result := make([]string, 0)
for _, err := range errors {
errMsg := err.Translate(trans)
if errMsg == "" {
continue
}
result = append(result, errMsg)
}
return strings.Join(result, ",")
}
func (r *Api) ParsePage(ctx *gin.Context) {
page, err := strconv.Atoi(ctx.Query("page"))
if err != nil || page <= 0 {
page = 1
}
pageSize, err := strconv.Atoi(ctx.Query("page_size"))
if err != nil || pageSize <= 0 {
pageSize = 10
}
if pageSize > 1000 {
pageSize = 1000
}
r.Page = page
r.PageSize = pageSize
}
func (*Api) Index(ctx *gin.Context) {
ctx.String(http.StatusOK, "Gen Web")
}
func (*Api) Success(ctx *gin.Context, msg string, data interface{}) {
ctx.JSON(http.StatusOK, gin.H{
"code": Success,
"msg": msg,
"data": data,
"trace_id": ctx.GetString("trace_id"),
})
}
func (*Api) Failed(ctx *gin.Context, code errorCode, msg string) {
errMsg := codeMsg[code] + ": " + msg
ctx.AbortWithStatusJSON(http.StatusOK, gin.H{
"code": code,
"msg": errMsg,
"data": nil,
"trace_id": ctx.GetString("trace_id"),
})
if code != Success {
ctx.Set("error_code", int(code))
ctx.Set("error_msg", msg)
}
}