service_context.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package svc
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strconv"
  8. "time"
  9. "git.i2edu.net/i2/go-zero/core/stores/sqlx"
  10. "git.i2edu.net/i2/go-zero/rest/token"
  11. "git.i2edu.net/i2/go-zero/zrpc"
  12. "git.i2edu.net/i2/i2-bill-api/internal/config"
  13. "git.i2edu.net/i2/i2-bill-api/model"
  14. "git.i2edu.net/i2/i2-bill-erp/transformclient"
  15. "github.com/dgrijalva/jwt-go"
  16. _ "github.com/go-sql-driver/mysql"
  17. "github.com/xormplus/xorm"
  18. )
  19. type ServiceContext struct {
  20. Config config.Config
  21. SqlConn sqlx.SqlConn
  22. RdCli Cache
  23. Wechat *Wechat
  24. Transformer transformclient.Transform
  25. UserModel model.UserModel
  26. I2billAcquirerStudentModel model.I2billAcquirerStudentModel
  27. DB *xorm.Engine
  28. }
  29. // GetUserId defined TODO
  30. func (sc *ServiceContext) GetClaims(r *http.Request) (int64, string, error) {
  31. parser := token.NewTokenParser(token.WithResetDuration(time.Minute))
  32. tok, err := parser.ParseToken(r, sc.Config.JwtAuth.AccessSecret, "")
  33. if err != nil {
  34. return 0, "", err
  35. }
  36. userId, sessionKey := int64(0), ""
  37. m := tok.Claims.(jwt.MapClaims)
  38. switch nbf := m["userId"].(type) {
  39. case string:
  40. i, err := strconv.ParseInt(nbf, 10, 64)
  41. if err != nil {
  42. return 0, "", err
  43. }
  44. userId = i
  45. case json.Number:
  46. v, err := nbf.Int64()
  47. if err != nil {
  48. return 0, "", err
  49. }
  50. userId = v
  51. }
  52. switch nbf := m["sessionKey"].(type) {
  53. case string:
  54. sessionKey = nbf
  55. case json.Number:
  56. v, err := nbf.Int64()
  57. if err != nil {
  58. return 0, "", err
  59. }
  60. sessionKey = fmt.Sprintf("%v", v)
  61. }
  62. return userId, sessionKey, err
  63. }
  64. func (sc *ServiceContext) GetUserIdByJwt(ctx context.Context) int64 {
  65. UserIdStr := ctx.Value("userId").(json.Number)
  66. number, _ := strconv.ParseInt(UserIdStr.String(), 10, 64)
  67. return number
  68. }
  69. func NewServiceContext(c config.Config) *ServiceContext {
  70. db, err := xorm.NewEngine("mysql", c.DataSource)
  71. if err != nil {
  72. panic(err)
  73. }
  74. db.RegisterSqlMap(xorm.Xml("sqlconfig", ".xml"))
  75. db.RegisterSqlTemplate(xorm.Pongo2("sqlconfig", ".stpl"))
  76. db.RegisterSqlTemplate(xorm.Jet("sqlconfig", ".jet"))
  77. db.RegisterSqlTemplate(xorm.Default("sqlconfig", ".tpl"))
  78. db.ShowSQL(true)
  79. svc := &ServiceContext{
  80. Config: c,
  81. SqlConn: sqlx.NewMysql(c.DataSource),
  82. Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
  83. DB: db,
  84. }
  85. svc.UserModel = model.NewUserModel(svc.SqlConn, c.Cache)
  86. svc.I2billAcquirerStudentModel = model.NewI2billAcquirerStudentModel(svc.SqlConn)
  87. svc.RdCli = svc.UserModel.CacheStorage()
  88. svc.Wechat = &Wechat{
  89. RdCli: svc.RdCli,
  90. c: c,
  91. }
  92. return svc
  93. }