/
response.go
134 lines (114 loc) · 3.99 KB
/
response.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package xt
import (
"encoding/base64"
"encoding/json"
"github.com/gin-gonic/gin"
"log"
"net/http"
"os"
)
// Response
// @description: 接口返回值
type Response interface {
Result(code int, data any, msg, err string) // 手动组装返回结果
Ok() // 返回无数据的成功
OkWithMessage(message string) // 返回自定义成功的消息
OkWithData(data any) // 自定义内容的成功返回
OkDetailed(data any, message string) // 自定义消息和内容的成功返回
Fail() // 返回默认失败
FailWithMessage(message string) // 返回默认状态码自定义消息的失败
FailWithError(msg string, err error) // 返回自定义消息和内容的失败
FailWithErrorAndCode(msg string, err error, code int) // 返回自定义消息和内容以及错误代码的失败
FailWithMessageAndCode(message string, code int) // 返回自定义消息和状态码的失败
}
// 返回数据包装
type responseData struct {
Code int `json:"code"`
Data any `json:"data"`
Msg string `json:"message"`
ErrMsg string `json:"errMsg,omitempty"`
}
type resp struct {
ctx *gin.Context
}
// 定义状态码
const (
ERROR = http.StatusInternalServerError
SUCCESS = http.StatusOK
)
// R 工厂函数
func R(ctx *MultiTenantContext) Response {
x := ctx.Context
x.Header("Tenant-Id", ctx.TenantInfo.Id) // 租户Id
x.Header("Tenant-Name", base64.StdEncoding.EncodeToString([]byte(ctx.TenantInfo.Name))) // 租户名称
x.Header("Tenant-Short-Name", base64.StdEncoding.EncodeToString([]byte(ctx.TenantInfo.ShortName))) // 租户简称
x.Header("Tenant-Logo", base64.StdEncoding.EncodeToString([]byte(ctx.TenantInfo.Logo))) // 租户logo
x.Header("Tenant-Type-Code", ctx.TenantInfo.TypeCode) // 租户类型代码
return &resp{ctx: x}
}
// SetHeader
// @description: 设置响应头
// @receiver r
// @param k
// @param v
func (r *resp) SetHeader(k, v string) *resp {
r.ctx.Header(k, v)
return r
}
// Result 手动组装返回结果
func (r resp) Result(code int, data any, msg, err string) {
respData := responseData{
Code: code,
Data: data,
Msg: msg,
ErrMsg: err,
}
go func() {
// 异步处理一下要不要打印返回数据
if os.Getenv("SHOW_RESP_DATA") == "true" {
bs, er := json.Marshal(respData)
if er != nil {
log.Printf("返回数据序列化失败: %s", er.Error())
} else {
log.Printf("返回数据: %s", string(bs))
}
}
}()
r.ctx.JSON(code, respData)
}
// Ok 返回无数据的成功
func (r resp) Ok() {
r.Result(SUCCESS, nil, "操作成功", "")
}
// OkWithMessage 返回自定义成功的消息
func (r resp) OkWithMessage(message string) {
r.Result(SUCCESS, nil, message, "")
}
// OkWithData 自定义内容的成功返回
func (r resp) OkWithData(data any) {
r.Result(SUCCESS, data, "操作成功", "")
}
// OkDetailed 自定义消息和内容的成功返回
func (r resp) OkDetailed(data any, message string) {
r.Result(SUCCESS, data, message, "")
}
// Fail 返回默认失败
func (r resp) Fail() {
r.Result(ERROR, nil, "操作失败", "")
}
// FailWithMessage 返回默认状态码自定义消息的失败
func (r resp) FailWithMessage(message string) {
r.Result(ERROR, nil, message, "")
}
// FailWithError 返回自定义消息和内容的失败
func (r resp) FailWithError(msg string, err error) {
r.Result(ERROR, nil, msg, err.Error())
}
// FailWithErrorAndCode 返回自定义消息和内容以及错误代码的失败
func (r resp) FailWithErrorAndCode(msg string, err error, code int) {
r.Result(code, nil, msg, err.Error())
}
// FailWithMessageAndCode 返回自定义消息和状态码的失败
func (r resp) FailWithMessageAndCode(message string, code int) {
r.Result(code, nil, message, "")
}