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)
|
|||
|
|
}
|