response.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package response
  2. import (
  3. "encoding/json"
  4. "git.sxidc.com/go-framework/baize/framework/core/api"
  5. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/logger"
  6. "github.com/pkg/errors"
  7. )
  8. // SendResponseFunc 发送响应函数
  9. type SendResponseFunc[O any] func(c *api.Context, statusCode int, data O, err error)
  10. // NoResponse 零值占位响应函数
  11. func NoResponse(_ *api.Context, _ int, _ any, _ error) {
  12. return
  13. }
  14. // SendMsgResponse 发送MsgResponse的响应函数
  15. // 参数:
  16. // - c: 上下文
  17. // - statusCode: HTTP状态码
  18. // - data: 无效
  19. // - err: 错误
  20. // 返回值: 无
  21. func SendMsgResponse(c *api.Context, statusCode int, _ any, err error) {
  22. msgResp := formMsgResponse(err)
  23. c.JSON(statusCode, msgResp)
  24. }
  25. // IDResponse 响应ID的响应结构
  26. type IDResponse struct {
  27. MsgResponse
  28. ID string `json:"id"`
  29. }
  30. // SendIDResponse 发送ID响应的函数
  31. // 参数:
  32. // - c: 上下文
  33. // - statusCode: HTTP状态码
  34. // - id: 发送的id
  35. // - err: 错误
  36. // 返回值: 无
  37. func SendIDResponse(c *api.Context, statusCode int, id string, err error) {
  38. msgResp := formMsgResponse(err)
  39. c.JSON(statusCode, IDResponse{
  40. MsgResponse: msgResp,
  41. ID: id,
  42. })
  43. }
  44. // InfoResponse 响应Info的响应结构
  45. type InfoResponse[T any] struct {
  46. MsgResponse
  47. Info T `json:"info"`
  48. }
  49. // SendInfoResponse 发送Info响应的函数
  50. // 参数:
  51. // - c: 上下文
  52. // - statusCode: HTTP状态码
  53. // - info: 发送的Info
  54. // - err: 错误
  55. // 返回值: 无
  56. func SendInfoResponse[T any](c *api.Context, statusCode int, info T, err error) {
  57. msgResp := formMsgResponse(err)
  58. c.JSON(statusCode, InfoResponse[T]{
  59. MsgResponse: msgResp,
  60. Info: info,
  61. })
  62. }
  63. // InfosResponse 响应Infos的响应结构
  64. type InfosResponse[T any] struct {
  65. MsgResponse
  66. InfosData[T]
  67. }
  68. // InfosData Infos响应的数据结构
  69. // 类型参数:
  70. // - T: Info结构类型
  71. type InfosData[T any] struct {
  72. Infos []T `json:"infos"`
  73. TotalCount int64 `json:"totalCount"`
  74. PageNo int `json:"pageNo"`
  75. }
  76. // SendInfosResponse 发送Infos响应的函数
  77. // 参数:
  78. // - c: 上下文
  79. // - statusCode: HTTP状态码
  80. // - data: InfosData[T]结构,T是包含的Info类型
  81. // - err: 错误
  82. // 返回值: 无
  83. func SendInfosResponse[T any](c *api.Context, statusCode int, data InfosData[T], err error) {
  84. msgResp := formMsgResponse(err)
  85. c.JSON(statusCode, InfosResponse[T]{
  86. MsgResponse: msgResp,
  87. InfosData: data,
  88. })
  89. }
  90. // StructToMap 将结构转换为map的函数(用于作为map响应函数的发送数据)
  91. // 参数:
  92. // - originStruct: 原始结构
  93. // 返回值:
  94. // - 转换为的map
  95. func StructToMap(originStruct any) map[string]any {
  96. jsonBytes, err := json.Marshal(originStruct)
  97. if err != nil {
  98. panic(err)
  99. }
  100. retMap := make(map[string]any)
  101. err = json.Unmarshal(jsonBytes, &retMap)
  102. if err != nil {
  103. panic(err)
  104. }
  105. return retMap
  106. }
  107. // SendMapResponse 发送map响应的函数(实际响应的是Json)
  108. // 参数:
  109. // - c: 上下文
  110. // - statusCode: HTTP状态码
  111. // - data: map响应数据
  112. // - err: 错误
  113. // 返回值: 无
  114. func SendMapResponse(c *api.Context, statusCode int, data map[string]any, err error) {
  115. msgRespMap := formMapMsgResponse(err)
  116. for key, value := range data {
  117. msgRespMap[key] = value
  118. }
  119. c.JSON(statusCode, msgRespMap)
  120. }
  121. // SendString 发送字符串响应的函数
  122. // 参数:
  123. // - c: 上下文
  124. // - statusCode: HTTP状态码
  125. // - data: 字符串响应数据
  126. // - err: 错误
  127. // 返回值: 无
  128. func SendString(c *api.Context, statusCode int, data string, err error) {
  129. if err != nil {
  130. c.String(statusCode, err.Error())
  131. return
  132. }
  133. c.String(statusCode, data)
  134. }
  135. // WriteBytes 发送字节响应的函数
  136. // 参数:
  137. // - c: 上下文
  138. // - statusCode: HTTP状态码
  139. // - data: 字节响应数据
  140. // - err: 错误
  141. // 返回值: 无
  142. func WriteBytes(c *api.Context, statusCode int, bytes []byte, err error) {
  143. if err != nil {
  144. c.AbortWithStatus(statusCode)
  145. return
  146. }
  147. _, err = c.Writer.Write(bytes)
  148. if err != nil {
  149. logger.GetInstance().Error(errors.New(err.Error()))
  150. c.AbortWithStatus(statusCode)
  151. return
  152. }
  153. c.Writer.Flush()
  154. }
  155. // WXOrderResponse 微信订单响应结构
  156. type WXOrderResponse struct {
  157. ReturnCode string `xml:"return_code"`
  158. ReturnMsg string `xml:"return_msg"`
  159. }
  160. // SendWXOrderResponse 微信订单响应函数
  161. // 参数:
  162. // - c: 上下文
  163. // - statusCode: HTTP状态码
  164. // - data: 无效
  165. // - err: 错误
  166. // 返回值: 无
  167. func SendWXOrderResponse(c *api.Context, statusCode int, _ any, err error) {
  168. if err != nil {
  169. c.XML(statusCode, &WXOrderResponse{
  170. ReturnCode: "FAIL",
  171. ReturnMsg: err.Error(),
  172. })
  173. return
  174. }
  175. c.XML(statusCode, &WXOrderResponse{
  176. ReturnCode: "SUCCESS",
  177. })
  178. }
  179. // MsgResponse 响应头
  180. type MsgResponse struct {
  181. Success bool `json:"success"`
  182. ErrCode int `json:"errCode"`
  183. Msg string `json:"msg"`
  184. }
  185. func formMsgResponse(err error) MsgResponse {
  186. if err != nil {
  187. logger.GetInstance().Error(err)
  188. return MsgResponse{
  189. Success: false,
  190. ErrCode: 1,
  191. Msg: err.Error(),
  192. }
  193. }
  194. return MsgResponse{
  195. Success: true,
  196. ErrCode: 0,
  197. Msg: "操作成功",
  198. }
  199. }
  200. func formMapMsgResponse(err error) map[string]any {
  201. resp := make(map[string]any)
  202. if err != nil {
  203. logger.GetInstance().Error(err)
  204. resp["success"] = false
  205. resp["errCode"] = 1
  206. resp["msg"] = err.Error()
  207. return resp
  208. }
  209. resp["success"] = true
  210. resp["errCode"] = 0
  211. resp["msg"] = "操作成功"
  212. return resp
  213. }