gplus.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package gplus
  2. import (
  3. "context"
  4. "github.com/gogf/gf/frame/g"
  5. "github.com/gogf/gf/net/ghttp"
  6. iContext "gxt-file-server/app/context"
  7. "gxt-file-server/app/errors"
  8. "gxt-file-server/app/schema"
  9. "gxt-file-server/pkg/logger"
  10. "gxt-file-server/pkg/utils"
  11. "net/http"
  12. "strings"
  13. )
  14. // 定义上下文中的键
  15. const (
  16. prefix = "gao-xin-tong"
  17. // UserIDKey 存储上下文中的键(用户ID)
  18. UserIDKey = prefix + "/user-id"
  19. // UserTypeKey 存储上下文中的键(用户类型)
  20. UserTypeKey = prefix + "/user-type"
  21. // TraceIDKey 存储上下文中的键(跟踪ID)
  22. TraceIDKey = prefix + "/trace-id"
  23. // ResBodyKey 存储上下文中的键(响应Body数据)
  24. ResBodyKey = prefix + "/res-body"
  25. )
  26. // ParseJson 解析请求参数Json
  27. func ParseJson(r *ghttp.Request, out interface{}) error {
  28. if err := r.Parse(out); err != nil {
  29. m := "解析请求参数发生错误"
  30. if g.Cfg().GetString("common.run_mode") == "debug" {
  31. m += "[" + err.Error() + "]"
  32. }
  33. return errors.Wrap400Response(err, m)
  34. }
  35. return nil
  36. }
  37. // GetPageIndex 获取当前页
  38. func GetPageIndex(r *ghttp.Request) int {
  39. defaultVal := 1
  40. if v := r.GetQueryInt("current"); v > 0 {
  41. return v
  42. }
  43. return defaultVal
  44. }
  45. // GetPageSize 获取分页的页大小(最大50)
  46. func GetPageSize(r *ghttp.Request) int {
  47. defaultVal := 10
  48. if v := r.GetQueryInt("pageSize"); v > 0 {
  49. if v > 50 {
  50. v = 50
  51. }
  52. return v
  53. }
  54. return defaultVal
  55. }
  56. // ResPage 分页响应
  57. func ResPage(r *ghttp.Request, v interface{}, pr *schema.PaginationResult) {
  58. result := schema.HTTPList{
  59. List: v,
  60. Pagination: &schema.HTTPPagination{
  61. Current: GetPageIndex(r),
  62. PageSize: GetPageSize(r),
  63. },
  64. }
  65. if pr != nil {
  66. result.Pagination.Total = pr.Total
  67. }
  68. ResSuccess(r, result)
  69. }
  70. // ResSuccess 响应成功
  71. func ResSuccess(c *ghttp.Request, v interface{}) {
  72. ResJSON(c, http.StatusOK, v)
  73. }
  74. // ResOK 响应OK
  75. func ResOK(c *ghttp.Request) {
  76. ResSuccess(c, schema.HTTPStatus{Status: "OK"})
  77. }
  78. // ResList 响应列表数据
  79. func ResList(c *ghttp.Request, v interface{}) {
  80. ResSuccess(c, schema.HTTPList{List: v})
  81. }
  82. // ResJSON 响应JSON结果
  83. func ResJSON(r *ghttp.Request, code int, v interface{}) {
  84. errors.JsonExit(r, code, v)
  85. }
  86. // ResError 响应错误
  87. func ResError(r *ghttp.Request, err error, status ...int) {
  88. var res *errors.ResponseError
  89. if err != nil {
  90. if e, ok := err.(*errors.ResponseError); ok {
  91. res = e
  92. } else {
  93. res = errors.UnWrapResponse(errors.Wrap500Response(err))
  94. }
  95. } else {
  96. res = errors.UnWrapResponse(errors.ErrInternalServer)
  97. }
  98. if len(status) > 0 {
  99. res.StatusCode = status[0]
  100. }
  101. if err := res.ERR; err != nil {
  102. if res.StatusCode >= 500 {
  103. logger.Errorf(NewContext(r), "%s", err)
  104. }
  105. }
  106. eitem := schema.HTTPErrorItem{
  107. Code: res.Code,
  108. Message: res.Message,
  109. TraceId: GetTraceID(r),
  110. }
  111. ResJSON(r, res.StatusCode, schema.HTTPError{Error: eitem})
  112. }
  113. // SetUserId 上下文中设置用户Id
  114. func SetUserId(r *ghttp.Request, userId string) {
  115. r.SetCtxVar(UserIDKey, userId)
  116. }
  117. // GetUserId 获取上下文中的用户Id
  118. func GetUserId(r *ghttp.Request) string {
  119. return r.GetCtxVar(UserIDKey).String()
  120. }
  121. // GetToken 获取token
  122. func GetToken(r *ghttp.Request) string {
  123. var token string
  124. auth := r.GetHeader("Authorization")
  125. prefix := "Bearer "
  126. if auth != "" && strings.HasPrefix(auth, prefix) {
  127. token = auth[len(prefix):]
  128. }
  129. return token
  130. }
  131. // NewContext 封装上下文入口
  132. func NewContext(r *ghttp.Request) context.Context {
  133. parent := context.Background()
  134. traceId := GetTraceID(r)
  135. if traceId == "" {
  136. traceId = utils.NewTraceID()
  137. }
  138. parent = iContext.NewTraceID(parent, traceId)
  139. parent = logger.NewTraceIDContext(parent, traceId)
  140. if v := GetUserID(r); v != "" {
  141. parent = iContext.NewUserID(parent, v)
  142. parent = logger.NewUserIDContext(parent, v)
  143. }
  144. return parent
  145. }
  146. // GetTraceID 获取追踪ID
  147. func GetTraceID(c *ghttp.Request) string {
  148. return c.GetCtxVar(TraceIDKey).String()
  149. }
  150. // GetUserID 获取用户ID
  151. func GetUserID(c *ghttp.Request) string {
  152. return c.GetCtxVar(UserIDKey).String()
  153. }
  154. // GetUserType 获取用户类型
  155. func GetUserType(c *ghttp.Request) string {
  156. return c.GetCtxVar(UserTypeKey).String()
  157. }