package response
import (
"net/http"
"reflect"
"github.com/gin-gonic/gin"
)
//统一响应集
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data"`
}
// PageResult 分页结果返回
//type PageResult struct {
// Total int64 `json:"total"`
// List interface{} `json:"list"`
//}
// Success 请求成功返回
func Success(message string, data any, c *gin.Context) {
c.JSON(http.StatusOK, Response{200, message, data})
}
// Failed 请求失败返回
func Failed(message string, c *gin.Context) {
c.JSON(http.StatusOK, Response{400, message, 0})
}
// SuccessPage 请求成功返回分页结果
//func SuccessPage(message string, data interface{}, rows int64, c *gin.Context) {
// page := &PageResult{Total: rows, List: data}
// c.JSON(http.StatusOK, Response{200, message, page})
//}
// 分页结果集结构体
type PageResult struct {
Total int64 `json:"total"` // 总记录数
List interface{} `json:"list"` // 当前页数据列表
}
func SuccessPage(message string, data []interface{}, page int64, size int64, c *gin.Context) {
var total int64
if page <= 0 && size < 0 {
page = 1
size = int64(getSliceLength(data))
}
if page == 0 {
page = 1
}
var pageTotal int64
if getSliceLength(data) != 0 {
if int64(getSliceLength(data))%size == 0 {
pageTotal = int64(getSliceLength(data)) / size
} else {
pageTotal = int64(getSliceLength(data))/size + 1
}
} else {
pageTotal = 0
}
if page > pageTotal {
page = 1
size = int64(getSliceLength(data))
}
if isArray(data) {
// 判断是否为数组
total = int64(getArrayLength(data))
} else if isSlice(data) {
// 判断是否为切片
total = int64(getSliceLength(data))
}
start := (page - 1) * size
end := page * size
if end > total {
end = total
}
// 获取当前页数据列表
currentPageData := data[start:end]
// 创建分页结果集
pageResult := PageResult{
Total: total,
List: currentPageData,
}
//c.JSON(http.StatusOK, pageResult)
c.JSON(http.StatusOK, Response{200, message, pageResult})
//c.JSON(http.StatusOK, Response{200, message, page})
}
func isArray(v interface{}) bool {
t := reflect.TypeOf(v)
return t.Kind() == reflect.Array
}
func isSlice(v interface{}) bool {
t := reflect.TypeOf(v)
return t.Kind() == reflect.Slice
}
func getArrayLength(arr interface{}) int {
v := reflect.ValueOf(arr)
return v.Len()
}
func getSliceLength(slice interface{}) int {
v := reflect.ValueOf(slice)
return v.Len()
}