2021-04-16 15:10:07 +08:00
|
|
|
|
package ginx
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2022-01-28 11:30:11 +08:00
|
|
|
|
"io"
|
2022-06-02 17:41:11 +08:00
|
|
|
|
"mayfly-go/pkg/biz"
|
|
|
|
|
|
"mayfly-go/pkg/global"
|
|
|
|
|
|
"mayfly-go/pkg/model"
|
2023-07-21 17:07:04 +08:00
|
|
|
|
"mayfly-go/pkg/utils/structx"
|
2021-04-16 15:10:07 +08:00
|
|
|
|
"net/http"
|
2023-03-16 16:40:57 +08:00
|
|
|
|
"runtime/debug"
|
2021-04-16 15:10:07 +08:00
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 绑定并校验请求结构体参数
|
2023-07-08 20:05:55 +08:00
|
|
|
|
func BindJsonAndValid[T any](g *gin.Context, data T) T {
|
2021-07-28 18:03:19 +08:00
|
|
|
|
if err := g.ShouldBindJSON(data); err != nil {
|
2021-05-08 18:00:33 +08:00
|
|
|
|
panic(biz.NewBizErr(err.Error()))
|
2023-07-08 20:05:55 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
return data
|
2021-05-08 18:00:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-08 20:05:55 +08:00
|
|
|
|
// 绑定请求体中的json至form结构体,并拷贝至另一结构体
|
|
|
|
|
|
func BindJsonAndCopyTo[T any](g *gin.Context, form any, toStruct T) T {
|
|
|
|
|
|
BindJsonAndValid(g, form)
|
2023-07-21 17:07:04 +08:00
|
|
|
|
structx.Copy(toStruct, form)
|
2023-07-08 20:05:55 +08:00
|
|
|
|
return toStruct
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 绑定查询字符串到指定结构体
|
|
|
|
|
|
func BindQuery[T any](g *gin.Context, data T) T {
|
|
|
|
|
|
if err := g.BindQuery(data); err != nil {
|
|
|
|
|
|
panic(biz.NewBizErr(err.Error()))
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return data
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 绑定查询字符串到指定结构体,并将分页信息也返回
|
|
|
|
|
|
func BindQueryAndPage[T any](g *gin.Context, data T) (T, *model.PageParam) {
|
|
|
|
|
|
if err := g.BindQuery(data); err != nil {
|
2021-04-16 15:10:07 +08:00
|
|
|
|
panic(biz.NewBizErr(err.Error()))
|
2023-07-08 20:05:55 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
return data, GetPageParam(g)
|
2021-04-16 15:10:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取分页参数
|
|
|
|
|
|
func GetPageParam(g *gin.Context) *model.PageParam {
|
|
|
|
|
|
return &model.PageParam{PageNum: QueryInt(g, "pageNum", 1), PageSize: QueryInt(g, "pageSize", 10)}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-16 00:50:36 +08:00
|
|
|
|
// 获取查询参数,不存在则返回默认值
|
|
|
|
|
|
func Query(g *gin.Context, qm string, defaultStr string) string {
|
|
|
|
|
|
qv := g.Query(qm)
|
|
|
|
|
|
if qv == "" {
|
|
|
|
|
|
return defaultStr
|
|
|
|
|
|
}
|
|
|
|
|
|
return qv
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-04-16 15:10:07 +08:00
|
|
|
|
// 获取查询参数中指定参数值,并转为int
|
|
|
|
|
|
func QueryInt(g *gin.Context, qm string, defaultInt int) int {
|
|
|
|
|
|
qv := g.Query(qm)
|
|
|
|
|
|
if qv == "" {
|
|
|
|
|
|
return defaultInt
|
|
|
|
|
|
}
|
|
|
|
|
|
qvi, err := strconv.Atoi(qv)
|
2021-05-08 18:00:33 +08:00
|
|
|
|
biz.ErrIsNil(err, "query param not int")
|
2021-04-16 15:10:07 +08:00
|
|
|
|
return qvi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
// 获取路径参数
|
|
|
|
|
|
func PathParamInt(g *gin.Context, pm string) int {
|
2023-07-01 14:34:42 +08:00
|
|
|
|
value, err := strconv.Atoi(g.Param(pm))
|
|
|
|
|
|
biz.ErrIsNilAppendErr(err, "string类型转换int异常: %s")
|
2021-06-07 17:22:07 +08:00
|
|
|
|
return value
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-01 14:34:42 +08:00
|
|
|
|
// 获取路径参数
|
|
|
|
|
|
func PathParam(g *gin.Context, pm string) string {
|
|
|
|
|
|
return g.Param(pm)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-05-08 18:00:33 +08:00
|
|
|
|
// 文件下载
|
2022-01-28 11:30:11 +08:00
|
|
|
|
func Download(g *gin.Context, reader io.Reader, filename string) {
|
2021-05-08 18:00:33 +08:00
|
|
|
|
g.Header("Content-Type", "application/octet-stream")
|
|
|
|
|
|
g.Header("Content-Disposition", "attachment; filename="+filename)
|
2022-01-28 11:30:11 +08:00
|
|
|
|
io.Copy(g.Writer, reader)
|
2021-05-08 18:00:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-04-16 15:10:07 +08:00
|
|
|
|
// 返回统一成功结果
|
2023-06-01 12:31:32 +08:00
|
|
|
|
func SuccessRes(g *gin.Context, data any) {
|
2021-04-16 15:10:07 +08:00
|
|
|
|
g.JSON(http.StatusOK, model.Success(data))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回失败结果集
|
2023-06-01 12:31:32 +08:00
|
|
|
|
func ErrorRes(g *gin.Context, err any) {
|
2021-04-16 15:10:07 +08:00
|
|
|
|
switch t := err.(type) {
|
2022-07-18 20:36:31 +08:00
|
|
|
|
case biz.BizError:
|
2021-07-28 18:03:19 +08:00
|
|
|
|
g.JSON(http.StatusOK, model.Error(t))
|
2021-04-16 15:10:07 +08:00
|
|
|
|
case error:
|
|
|
|
|
|
g.JSON(http.StatusOK, model.ServerError())
|
2023-03-16 16:40:57 +08:00
|
|
|
|
global.Log.Errorf("%s\n%s", t.Error(), string(debug.Stack()))
|
2021-04-16 15:10:07 +08:00
|
|
|
|
case string:
|
|
|
|
|
|
g.JSON(http.StatusOK, model.ServerError())
|
2023-03-16 16:40:57 +08:00
|
|
|
|
global.Log.Errorf("%s\n%s", t, string(debug.Stack()))
|
2021-04-16 15:10:07 +08:00
|
|
|
|
default:
|
2021-06-07 17:22:07 +08:00
|
|
|
|
global.Log.Error(t)
|
2021-04-16 15:10:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|