response.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package controllers
  2. import (
  3. "fwh-toolbox-server/dto"
  4. "time"
  5. "github.com/gofiber/fiber/v2"
  6. "github.com/google/uuid"
  7. )
  8. const traceIdHeader string = "X-Trace-Id"
  9. type Response[T any] struct {
  10. Code int `json:"code"`
  11. Message string `json:"message"`
  12. Data T `json:"data"`
  13. TraceID string `json:"traceId"`
  14. Timestamp int64 `json:"timestamp"`
  15. }
  16. type ResponsePage[T any] struct {
  17. Code int `json:"code"`
  18. Message string `json:"message"`
  19. Data []T `json:"data"`
  20. PageSize uint `json:"pageSize"`
  21. PageNum uint `json:"pageNum"`
  22. Total uint `json:"total"`
  23. TraceID string `json:"traceId"`
  24. Timestamp int64 `json:"timestamp"`
  25. }
  26. type ResponseNoData struct {
  27. Code int `json:"code"`
  28. Message string `json:"message"`
  29. TraceID string `json:"traceId"`
  30. Timestamp int64 `json:"timestamp"`
  31. }
  32. // 成功返回 200
  33. func Success[T any](c *fiber.Ctx, data T, msg ...string) error {
  34. message := "success"
  35. if len(msg) > 0 {
  36. message = msg[0]
  37. }
  38. traceId := c.Get(traceIdHeader) // 从请求头取
  39. if traceId == "" {
  40. traceId = uuid.New().String() // 没有就生成
  41. // 设置到响应头,让前端也能拿到
  42. c.Set(traceIdHeader, traceId)
  43. }
  44. return c.Status(fiber.StatusOK).JSON(Response[T]{
  45. Code: 0,
  46. Message: message,
  47. Data: data,
  48. TraceID: traceId,
  49. Timestamp: time.Now().UnixMilli(),
  50. })
  51. }
  52. // 成功返回 200
  53. func SuccessPage[T any](c *fiber.Ctx, data *dto.ResPage[T], msg ...string) error {
  54. message := "success"
  55. if len(msg) > 0 {
  56. message = msg[0]
  57. }
  58. traceId := c.Get(traceIdHeader) // 从请求头取
  59. if traceId == "" {
  60. traceId = uuid.New().String() // 没有就生成
  61. // 设置到响应头,让前端也能拿到
  62. c.Set(traceIdHeader, traceId)
  63. }
  64. return c.Status(fiber.StatusOK).JSON(ResponsePage[T]{
  65. Code: 0,
  66. Message: message,
  67. Data: data.Data,
  68. PageSize: data.PageSize,
  69. PageNum: data.PageNum,
  70. Total: data.Total,
  71. TraceID: traceId,
  72. Timestamp: time.Now().UnixMilli(),
  73. })
  74. }
  75. // 失败返回 400
  76. func Fail(c *fiber.Ctx, msg string) error {
  77. traceId := c.Get(traceIdHeader) // 从请求头取
  78. if traceId == "" {
  79. traceId = uuid.New().String() // 没有就生成
  80. // 设置到响应头,让前端也能拿到
  81. c.Set(traceIdHeader, traceId)
  82. }
  83. return c.Status(fiber.StatusBadRequest).JSON(ResponseNoData{
  84. Code: 1,
  85. Message: msg,
  86. TraceID: traceId,
  87. Timestamp: time.Now().UnixMilli(),
  88. })
  89. }
  90. // 401 未认证
  91. func Unauthorized(c *fiber.Ctx, msg ...string) error {
  92. message := "unauthorized"
  93. if len(msg) > 0 {
  94. message = msg[0]
  95. }
  96. traceId := c.Get(traceIdHeader) // 从请求头取
  97. if traceId == "" {
  98. traceId = uuid.New().String() // 没有就生成
  99. // 设置到响应头,让前端也能拿到
  100. c.Set(traceIdHeader, traceId)
  101. }
  102. return c.Status(fiber.StatusUnauthorized).JSON(ResponseNoData{
  103. Code: 401,
  104. Message: message,
  105. TraceID: traceId,
  106. Timestamp: time.Now().UnixMilli(),
  107. })
  108. }
  109. // 403 禁止访问
  110. func Forbidden(c *fiber.Ctx, msg ...string) error {
  111. message := "forbidden"
  112. if len(msg) > 0 {
  113. message = msg[0]
  114. }
  115. traceId := c.Get(traceIdHeader) // 从请求头取
  116. if traceId == "" {
  117. traceId = uuid.New().String() // 没有就生成
  118. // 设置到响应头,让前端也能拿到
  119. c.Set(traceIdHeader, traceId)
  120. }
  121. return c.Status(fiber.StatusForbidden).JSON(ResponseNoData{
  122. Code: 403,
  123. Message: message,
  124. TraceID: traceId,
  125. Timestamp: time.Now().UnixMilli(),
  126. })
  127. }
  128. // 404 或无数据
  129. func NotFound(c *fiber.Ctx, msg ...string) error {
  130. message := "not found"
  131. if len(msg) > 0 {
  132. message = msg[0]
  133. }
  134. traceId := c.Get(traceIdHeader) // 从请求头取
  135. if traceId == "" {
  136. traceId = uuid.New().String() // 没有就生成
  137. // 设置到响应头,让前端也能拿到
  138. c.Set(traceIdHeader, traceId)
  139. }
  140. return c.Status(fiber.StatusNotFound).JSON(ResponseNoData{
  141. Code: 1,
  142. Message: message,
  143. TraceID: traceId,
  144. Timestamp: time.Now().UnixMilli(),
  145. })
  146. }
  147. // 空响应(204 No Content)
  148. func NoContent(c *fiber.Ctx) error {
  149. return c.SendStatus(fiber.StatusNoContent)
  150. }
  151. // 服务器错误 500
  152. func Error(c *fiber.Ctx, msg string) error {
  153. traceId := c.Get(traceIdHeader) // 从请求头取
  154. if traceId == "" {
  155. traceId = uuid.New().String() // 没有就生成
  156. // 设置到响应头,让前端也能拿到
  157. c.Set(traceIdHeader, traceId)
  158. }
  159. return c.Status(fiber.StatusInternalServerError).JSON(ResponseNoData{
  160. Code: 500,
  161. Message: msg,
  162. TraceID: traceId,
  163. Timestamp: time.Now().UnixMilli(),
  164. })
  165. }