package controllers import ( "fwh-toolbox-server/dto" "time" "github.com/gofiber/fiber/v2" "github.com/google/uuid" ) const traceIdHeader string = "X-Trace-Id" type Response[T any] struct { Code int `json:"code"` Message string `json:"message"` Data T `json:"data"` TraceID string `json:"traceId"` Timestamp int64 `json:"timestamp"` } type ResponsePage[T any] struct { Code int `json:"code"` Message string `json:"message"` Data []T `json:"data"` PageSize uint `json:"pageSize"` PageNum uint `json:"pageNum"` Total uint `json:"total"` TraceID string `json:"traceId"` Timestamp int64 `json:"timestamp"` } type ResponseNoData struct { Code int `json:"code"` Message string `json:"message"` TraceID string `json:"traceId"` Timestamp int64 `json:"timestamp"` } // 成功返回 200 func Success[T any](c *fiber.Ctx, data T, msg ...string) error { message := "success" if len(msg) > 0 { message = msg[0] } traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusOK).JSON(Response[T]{ Code: 0, Message: message, Data: data, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) } // 成功返回 200 func SuccessPage[T any](c *fiber.Ctx, data *dto.ResPage[T], msg ...string) error { message := "success" if len(msg) > 0 { message = msg[0] } traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusOK).JSON(ResponsePage[T]{ Code: 0, Message: message, Data: data.Data, PageSize: data.PageSize, PageNum: data.PageNum, Total: data.Total, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) } // 失败返回 400 func Fail(c *fiber.Ctx, msg string) error { traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusBadRequest).JSON(ResponseNoData{ Code: 1, Message: msg, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) } // 401 未认证 func Unauthorized(c *fiber.Ctx, msg ...string) error { message := "unauthorized" if len(msg) > 0 { message = msg[0] } traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusUnauthorized).JSON(ResponseNoData{ Code: 401, Message: message, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) } // 403 禁止访问 func Forbidden(c *fiber.Ctx, msg ...string) error { message := "forbidden" if len(msg) > 0 { message = msg[0] } traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusForbidden).JSON(ResponseNoData{ Code: 403, Message: message, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) } // 404 或无数据 func NotFound(c *fiber.Ctx, msg ...string) error { message := "not found" if len(msg) > 0 { message = msg[0] } traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusNotFound).JSON(ResponseNoData{ Code: 1, Message: message, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) } // 空响应(204 No Content) func NoContent(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusNoContent) } // 服务器错误 500 func Error(c *fiber.Ctx, msg string) error { traceId := c.Get(traceIdHeader) // 从请求头取 if traceId == "" { traceId = uuid.New().String() // 没有就生成 // 设置到响应头,让前端也能拿到 c.Set(traceIdHeader, traceId) } return c.Status(fiber.StatusInternalServerError).JSON(ResponseNoData{ Code: 500, Message: msg, TraceID: traceId, Timestamp: time.Now().UnixMilli(), }) }