146 lines
3.7 KiB
Go
146 lines
3.7 KiB
Go
package response
|
||
|
||
import (
|
||
"time"
|
||
"github.com/gogf/gf/v2/net/ghttp"
|
||
)
|
||
|
||
// Response 统一响应结构
|
||
type Response struct {
|
||
Code int `json:"code"`
|
||
Message string `json:"message"`
|
||
Data interface{} `json:"data"`
|
||
Timestamp int64 `json:"timestamp"`
|
||
}
|
||
|
||
// 状态码定义 - 与API文档保持一致
|
||
const (
|
||
CodeSuccess = 200 // 请求成功
|
||
CodeError = 400 // 通用错误/请求参数错误
|
||
CodeInvalidParam = 400 // 参数错误
|
||
CodeUnauthorized = 401 // 未授权
|
||
CodeForbidden = 403 // 权限不足
|
||
CodeNotFound = 404 // 资源不存在
|
||
CodeServerError = 500 // 服务器内部错误
|
||
CodeInternalError = 500 // 内部错误(别名)
|
||
CodeTokenExpired = 401 // Token过期
|
||
CodeTokenInvalid = 401 // Token无效
|
||
)
|
||
|
||
// 状态码对应消息
|
||
var codeMsg = map[int]string{
|
||
CodeSuccess: "success",
|
||
CodeError: "请求参数错误",
|
||
CodeUnauthorized: "未授权",
|
||
CodeForbidden: "权限不足",
|
||
CodeNotFound: "资源不存在",
|
||
CodeServerError: "服务器内部错误",
|
||
}
|
||
|
||
// Success 成功响应 - 始终返回HTTP 200
|
||
func Success(r *ghttp.Request, data interface{}) {
|
||
r.Response.Status = 200 // 强制设置HTTP状态码为200
|
||
r.Response.WriteJson(Response{
|
||
Code: 200,
|
||
Message: "success",
|
||
Data: data,
|
||
Timestamp: time.Now().Unix(),
|
||
})
|
||
}
|
||
|
||
// Error 错误响应 - 始终返回HTTP 200,错误信息在code和message中
|
||
func Error(r *ghttp.Request, code int, msg ...string) {
|
||
message := codeMsg[code]
|
||
if len(msg) > 0 && msg[0] != "" {
|
||
message = msg[0]
|
||
}
|
||
|
||
r.Response.Status = 200 // 强制设置HTTP状态码为200
|
||
r.Response.WriteJson(Response{
|
||
Code: code,
|
||
Message: message,
|
||
Data: nil,
|
||
Timestamp: time.Now().Unix(),
|
||
})
|
||
}
|
||
|
||
// Json 自定义响应 - 始终返回HTTP 200
|
||
func Json(r *ghttp.Request, code int, msg string, data interface{}) {
|
||
r.Response.Status = 200 // 强制设置HTTP状态码为200
|
||
r.Response.WriteJson(Response{
|
||
Code: code,
|
||
Message: msg,
|
||
Data: data,
|
||
Timestamp: time.Now().Unix(),
|
||
})
|
||
}
|
||
|
||
// GetTimestamp 将time.Time转换为时间戳
|
||
func GetTimestamp(t time.Time) int64 {
|
||
return t.Unix()
|
||
}
|
||
|
||
// FormatTimestamp 将时间戳转换为时间戳(保持原样)
|
||
func FormatTimestamp(timestamp int) int64 {
|
||
if timestamp == 0 {
|
||
return 0
|
||
}
|
||
return int64(timestamp)
|
||
}
|
||
|
||
// FormatTimestampToDate 将时间戳转换为日期字符串
|
||
func FormatTimestampToDate(timestamp int) string {
|
||
if timestamp == 0 {
|
||
return ""
|
||
}
|
||
return time.Unix(int64(timestamp), 0).Format("2006-01-02")
|
||
}
|
||
|
||
// FormatUserResponse 格式化用户响应数据,将时间戳转换为格式化时间
|
||
func FormatUserResponse(user interface{}) map[string]interface{} {
|
||
result := make(map[string]interface{})
|
||
|
||
switch u := user.(type) {
|
||
case map[string]interface{}:
|
||
for k, v := range u {
|
||
switch k {
|
||
case "created_at", "updated_at", "last_login_time", "vip_expire_time":
|
||
if timestamp, ok := v.(int); ok {
|
||
result[k] = FormatTimestamp(timestamp)
|
||
} else {
|
||
result[k] = v
|
||
}
|
||
default:
|
||
result[k] = v
|
||
}
|
||
}
|
||
default:
|
||
// 如果不是map类型,直接返回原数据
|
||
return map[string]interface{}{"data": user}
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// SuccessWithFormattedTime 成功响应并格式化时间字段
|
||
func SuccessWithFormattedTime(r *ghttp.Request, data interface{}) {
|
||
var formattedData interface{}
|
||
|
||
switch d := data.(type) {
|
||
case []interface{}:
|
||
// 处理数组数据
|
||
var formattedArray []interface{}
|
||
for _, item := range d {
|
||
formattedArray = append(formattedArray, FormatUserResponse(item))
|
||
}
|
||
formattedData = formattedArray
|
||
case map[string]interface{}:
|
||
// 处理单个对象
|
||
formattedData = FormatUserResponse(d)
|
||
default:
|
||
// 其他类型直接返回
|
||
formattedData = data
|
||
}
|
||
|
||
Success(r, formattedData)
|
||
} |