response.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package utils
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. // APIResponse 统一API响应格式
  7. type APIResponse struct {
  8. Code int `json:"code"`
  9. Message string `json:"message"`
  10. Data interface{} `json:"data,omitempty"`
  11. Meta *MetaInfo `json:"meta,omitempty"`
  12. }
  13. // MetaInfo 分页信息
  14. type MetaInfo struct {
  15. Page int `json:"page"`
  16. PageSize int `json:"page_size"`
  17. Total int `json:"total"`
  18. TotalPage int `json:"total_page"`
  19. }
  20. // SuccessResponse 成功响应
  21. func SuccessResponse(c *gin.Context, statusCode int, message string, data interface{}) {
  22. response := APIResponse{
  23. Code: statusCode,
  24. Message: message,
  25. Data: data,
  26. }
  27. c.JSON(statusCode, response)
  28. }
  29. // ErrorResponse 错误响应
  30. func ErrorResponse(c *gin.Context, statusCode int, message string, details string) {
  31. response := APIResponse{
  32. Code: statusCode,
  33. Message: message,
  34. Data: map[string]interface{}{"details": details},
  35. }
  36. c.JSON(statusCode, response)
  37. }
  38. // PaginatedResponse 分页响应
  39. func PaginatedResponse(c *gin.Context, statusCode int, message string, data interface{}, page, pageSize, total int) {
  40. totalPage := (total + pageSize - 1) / pageSize
  41. response := APIResponse{
  42. Code: statusCode,
  43. Message: message,
  44. Data: data,
  45. Meta: &MetaInfo{
  46. Page: page,
  47. PageSize: pageSize,
  48. Total: total,
  49. TotalPage: totalPage,
  50. },
  51. }
  52. c.JSON(statusCode, response)
  53. }
  54. // GetPaginationParams 获取分页参数
  55. func GetPaginationParams(c *gin.Context) (page, pageSize int) {
  56. page = 1
  57. pageSize = 10
  58. // 获取页码
  59. if p := c.Query("page"); p != "" {
  60. if parsedPage, err := parseInt(p); err == nil && parsedPage > 0 {
  61. page = parsedPage
  62. }
  63. }
  64. // 获取每页数量
  65. if ps := c.Query("page_size"); ps != "" {
  66. if parsedPageSize, err := parseInt(ps); err == nil && parsedPageSize > 0 && parsedPageSize <= 100 {
  67. pageSize = parsedPageSize
  68. }
  69. }
  70. return page, pageSize
  71. }
  72. // GetIDParam 获取ID参数
  73. func GetIDParam(c *gin.Context) (uint, error) {
  74. idStr := c.Param("id")
  75. id, err := parseUint(idStr)
  76. if err != nil {
  77. return 0, err
  78. }
  79. return id, nil
  80. }
  81. // parseInt 解析整数
  82. func parseInt(s string) (int, error) {
  83. var result int
  84. _, err := fmt.Sscanf(s, "%d", &result)
  85. return result, err
  86. }
  87. // parseUint 解析无符号整数
  88. func parseUint(s string) (uint, error) {
  89. var result uint
  90. _, err := fmt.Sscanf(s, "%d", &result)
  91. return result, err
  92. }