164 lines
4.2 KiB
Go
164 lines
4.2 KiB
Go
package response
|
||
|
||
import (
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// response 是 API 响应的数据结构体
|
||
type response struct {
|
||
Code int `json:"code"` // 状态码
|
||
Msg string `json:"msg"` // 响应消息
|
||
Data any `json:"data"` // 响应数据
|
||
Timestamp int64 `json:"timestamp"` // 响应时间戳
|
||
}
|
||
|
||
// Api 返回结构体
|
||
// Api 是 Gin 上下文的响应包装器
|
||
type Api struct {
|
||
JSON *response // JSON 响应数据
|
||
c *gin.Context // Gin 上下文对象
|
||
}
|
||
|
||
// resFile 是文件响应的数据结构体
|
||
type resFile struct {
|
||
Code int `json:"code"` // 状态码
|
||
ContentType string `json:"content_type"` // 内容类型
|
||
Data []byte `json:"data"` // 文件数据
|
||
}
|
||
|
||
// ApiFile 是 Gin 上下文的文件响应包装器
|
||
type ApiFile struct {
|
||
JSON *resFile // 文件响应数据
|
||
c *gin.Context // Gin 上下文对象
|
||
}
|
||
|
||
// SuccessFile 创建一个包含成功响应的 ApiFile 对象
|
||
// 参数 c 是 Gin 框架的上下文对象
|
||
// 返回值是指向 ApiFile 结构体的指针
|
||
func SuccessFile(c *gin.Context) *ApiFile {
|
||
json := &resFile{
|
||
Code: 200,
|
||
}
|
||
r := &ApiFile{
|
||
JSON: json,
|
||
c: c,
|
||
}
|
||
return r
|
||
}
|
||
|
||
// SetContentType 设置文件响应的内容类型
|
||
// 参数 contentType 是要设置的 MIME 类型字符串
|
||
// 返回值是指向 ApiFile 结构体的指针,用于链式调用
|
||
func (af *ApiFile) SetContentType(contentType string) *ApiFile {
|
||
af.JSON.ContentType = contentType
|
||
return af
|
||
}
|
||
|
||
func (af *ApiFile) SetPng(data []byte) *ApiFile {
|
||
af.SetContentType("image/png")
|
||
af.SetData(data)
|
||
return af
|
||
}
|
||
|
||
func (af *ApiFile) SetJpeg(data []byte) *ApiFile {
|
||
af.SetContentType("image/jpeg")
|
||
af.SetData(data)
|
||
return af
|
||
}
|
||
|
||
func (af *ApiFile) SetGif(data []byte) *ApiFile {
|
||
af.SetContentType("image/gif")
|
||
af.SetData(data)
|
||
return af
|
||
}
|
||
|
||
func (af *ApiFile) SetPdf(data []byte) *ApiFile {
|
||
af.SetContentType("application/pdf")
|
||
af.SetData(data)
|
||
return af
|
||
}
|
||
|
||
func (af *ApiFile) SetXls(data []byte) *ApiFile {
|
||
af.SetContentType("application/vnd.ms-excel")
|
||
af.SetData(data)
|
||
return af
|
||
}
|
||
|
||
// SetData 设置文件响应的数据
|
||
// 参数 data 是要设置的字节数据
|
||
// 返回值是指向 ApiFile 结构体的指针,用于链式调用
|
||
func (af *ApiFile) SetData(data []byte) *ApiFile {
|
||
af.JSON.Data = data
|
||
return af
|
||
}
|
||
|
||
// End 将文件响应数据发送给客户端
|
||
// 使用 Gin 上下文对象的 Data 方法发送原始数据
|
||
func (af *ApiFile) End() {
|
||
af.c.Data(af.JSON.Code, af.JSON.ContentType, af.JSON.Data)
|
||
}
|
||
|
||
// Success 函数用于创建一个包含成功响应的 api 对象。
|
||
// 参数 c 是 Gin 框架的上下文对象,用于处理请求和响应。
|
||
// 返回值是一个指向 API 结构体的指针,其中包含 JSON 响应数据。
|
||
func Success(c *gin.Context) *Api {
|
||
// 创建响应结构体,包含状态码和时间戳
|
||
json := &response{
|
||
Code: 200, // 成功的状态码
|
||
Timestamp: time.Now().Unix(), // 当前时间的时间戳
|
||
}
|
||
// 创建 api 结构体实例,并将响应数据和上下文对象赋值给它
|
||
r := &Api{
|
||
JSON: json, // JSON 响应数据
|
||
c: c, // Gin 上下文对象
|
||
}
|
||
return r // 返回 api 对象的指针
|
||
}
|
||
|
||
// Error 创建一个包含错误响应的 Api 对象
|
||
// 参数 c 是 Gin 框架的上下文对象
|
||
// 返回值是指向 Api 结构体的指针
|
||
func Error(c *gin.Context) *Api {
|
||
json := &response{
|
||
Code: 200,
|
||
Timestamp: time.Now().Unix(),
|
||
}
|
||
r := &Api{
|
||
JSON: json,
|
||
c: c,
|
||
}
|
||
return r
|
||
}
|
||
|
||
// SetMsg 设置响应的消息
|
||
// 参数 msg 是要设置的消息字符串
|
||
// 返回值是指向 Api 结构体的指针,用于链式调用
|
||
func (r *Api) SetMsg(msg string) *Api {
|
||
r.JSON.Msg = msg
|
||
return r
|
||
}
|
||
|
||
// SetData 设置响应的数据
|
||
// 参数 data 是要设置的数据,类型为 any(任意类型)
|
||
// 返回值是指向 Api 结构体的指针,用于链式调用
|
||
func (r *Api) SetData(data any) *Api {
|
||
r.JSON.Data = data
|
||
return r
|
||
}
|
||
|
||
// SetCode 设置响应的状态码
|
||
// 参数 code 是要设置的状态码
|
||
// 返回值是指向 Api 结构体的指针,用于链式调用
|
||
func (r *Api) SetCode(code int) *Api {
|
||
r.JSON.Code = code
|
||
return r
|
||
}
|
||
|
||
// End 将 JSON 响应数据发送给客户端
|
||
// 使用 Gin 上下文对象的 JSON 方法发送响应
|
||
func (r *Api) End() {
|
||
r.c.JSON(r.JSON.Code, r.JSON)
|
||
}
|