rescode.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package common
  2. import (
  3. "log/slog"
  4. )
  5. import (
  6. "github.com/gin-gonic/gin"
  7. "github.com/nicksnyder/go-i18n/v2/i18n"
  8. "github.com/spf13/cast"
  9. )
  10. const OKCode = "0x000000"
  11. const InvalidTokenCode = "0x010101"
  12. const InvalidRoleCode = "0x010102"
  13. type ResDesc string
  14. var (
  15. // 全局
  16. Success ResDesc = "ErrCode_Success"
  17. InvalidTokenError ResDesc = "ErrCode_InvalidTokenError"
  18. InvalidRoleError ResDesc = "ErrCode_InvalidRoleError"
  19. InvalidParamError ResDesc = "ErrCode_InvalidParamError"
  20. NotExistsError ResDesc = "ErrCode_NotExistsError"
  21. NotSupportError ResDesc = "ErrCode_NotSupportError"
  22. NoAuthError ResDesc = "ErrCode_NoAuthError"
  23. ExistsError ResDesc = "ErrCode_ExistsError"
  24. NotAvailableError ResDesc = "ErrCode_NotAvailableError"
  25. UnknownError ResDesc = "ErrCode_UnknownError"
  26. InvalidLanguageError ResDesc = "ErrCode_InvalidLanguageError"
  27. InvalidSourceError ResDesc = "ErrCode_InvalidSourceError"
  28. InvalidProductError ResDesc = "ErrCode_InvalidProductError"
  29. // 业务 错误
  30. InvalidIdError ResDesc = "Error_InvalidIdError"
  31. FieldTypeError ResDesc = "Error_FieldTypeError"
  32. )
  33. var (
  34. OK = &ResStatus{Code: "0x000000", Description: Success, Solution: ""}
  35. InvalidToken = &ResStatus{Code: "0x000101", Description: InvalidTokenError, Solution: ""}
  36. InvalidRole = &ResStatus{Code: "0x000102", Description: InvalidRoleError, Solution: ""}
  37. InvalidParam = &ResStatus{Code: "0x000103", Description: InvalidParamError, Solution: ""}
  38. NotExists = &ResStatus{Code: "0x000104", Description: NotExistsError, Solution: ""}
  39. NotSupport = &ResStatus{Code: "0x000105", Description: NotSupportError, Solution: ""}
  40. NoAuth = &ResStatus{Code: "0x000106", Description: NoAuthError, Solution: ""}
  41. Exists = &ResStatus{Code: "0x000107", Description: ExistsError, Solution: ""}
  42. NotAvailable = &ResStatus{Code: "0x000108", Description: NotAvailableError, Solution: ""}
  43. InvalidLanguage = &ResStatus{Code: "0x000111", Description: InvalidLanguageError, Solution: ""}
  44. InvalidSource = &ResStatus{Code: "0x000112", Description: InvalidSourceError, Solution: ""}
  45. InvalidProduct = &ResStatus{Code: "0x000113", Description: InvalidProductError, Solution: ""}
  46. InvalidUsernameOrPasswd = &ResStatus{Code: "0x010101", Description: "ErrCode_InvalidUsernameOrPasswdError", Solution: ""}
  47. Unknown = &ResStatus{Code: "0x999999", Description: UnknownError, Solution: ""}
  48. )
  49. func helper(code string, msg ResDesc) *ResStatus {
  50. return &ResStatus{
  51. Code: code,
  52. Description: msg,
  53. Solution: "",
  54. }
  55. }
  56. type ResStatus struct {
  57. Code string `json:"code"`
  58. Description ResDesc `json:"description"`
  59. Params map[string]interface{} `json:"-"`
  60. Solution string `json:"solution"`
  61. }
  62. func (p *ResStatus) Error() string {
  63. return string(p.Description)
  64. }
  65. func (p *ResStatus) Desc(msg ResDesc) *ResStatus {
  66. return &ResStatus{p.Code, msg, nil, p.Solution}
  67. }
  68. func convertParamsToMap(params ...interface{}) map[string]interface{} {
  69. result := make(map[string]interface{})
  70. for i := 0; i < len(params); i += 2 {
  71. var value interface{}
  72. if i+1 < len(params) {
  73. value = params[i+1]
  74. } else {
  75. value = nil
  76. }
  77. result[cast.ToString(params[i])] = value
  78. }
  79. return result
  80. }
  81. func (p *ResStatus) SetParam(params ...interface{}) *ResStatus {
  82. return &ResStatus{p.Code, p.Description, convertParamsToMap(params...), p.Solution}
  83. }
  84. func (p *ResStatus) Translator(localizer *i18n.Localizer) *ResStatus {
  85. t, err := localizer.Localize(&i18n.LocalizeConfig{
  86. MessageID: string(p.Description),
  87. TemplateData: p.Params,
  88. })
  89. if err != nil {
  90. slog.Error("translator fail\n", "desc", p.Description, "err", err)
  91. t = string(p.Description)
  92. }
  93. return &ResStatus{p.Code, ResDesc(t), p.Params, p.Solution}
  94. }
  95. func (p *ResStatus) H(data ...interface{}) gin.H {
  96. if len(data) > 0 {
  97. return gin.H{
  98. "code": p.Code,
  99. "description": p.Description,
  100. "solution": p.Solution,
  101. "data": data[0],
  102. }
  103. }
  104. return gin.H{
  105. "code": p.Code,
  106. "description": p.Description,
  107. "solution": p.Solution,
  108. "data": gin.H{},
  109. }
  110. }