online.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package monitor_service
  2. import (
  3. "gfast/app/model/admin/user_online"
  4. "gfast/boot"
  5. "gfast/library/utils"
  6. "github.com/goflyfox/gtoken/gtoken"
  7. "github.com/gogf/gf/encoding/gjson"
  8. "github.com/gogf/gf/errors/gerror"
  9. "github.com/gogf/gf/frame/g"
  10. "github.com/gogf/gf/os/gcache"
  11. "github.com/gogf/gf/util/gconv"
  12. )
  13. //获取在线用户列表
  14. func GetOnlineListPage(req *user_online.ReqListSearch) (total, page int, list []*user_online.Entity, err error) {
  15. model := user_online.Model
  16. if req != nil {
  17. if req.Ip != "" {
  18. model = model.Where("ip like ?", "%"+req.Ip+"%")
  19. }
  20. if req.Username != "" {
  21. model = model.Where("username like ?", "%"+req.Username+"%")
  22. }
  23. }
  24. total, err = model.Count()
  25. if err != nil {
  26. g.Log().Error(err)
  27. err = gerror.New("获取总行数失败")
  28. return
  29. }
  30. if req.PageNum == 0 {
  31. req.PageNum = 1
  32. }
  33. page = req.PageNum
  34. if req.PageSize == 0 {
  35. req.PageSize = utils.AdminPageNum
  36. }
  37. list, err = model.FieldsEx("token").Page(page, req.PageSize).Order("create_time DESC").All()
  38. if err != nil {
  39. g.Log().Error(err)
  40. err = gerror.New("获取数据失败")
  41. return
  42. }
  43. return
  44. }
  45. //通过token获取登录用户数据
  46. func GetOnlineInfo(token string) g.Map {
  47. uuid, userKey := GetUuidUserKeyByToken(token)
  48. cacheKey := boot.AdminGfToken.CacheKey + userKey
  49. switch boot.AdminGfToken.CacheMode {
  50. case gtoken.CacheModeCache:
  51. userCacheValue := gcache.Get(cacheKey)
  52. if userCacheValue == nil {
  53. return nil
  54. }
  55. return gconv.Map(userCacheValue)
  56. case gtoken.CacheModeRedis:
  57. var userCache g.Map
  58. userCacheJson, err := g.Redis().Do("GET", cacheKey)
  59. if err != nil {
  60. g.Log().Error("[GToken]cache get error", err)
  61. return nil
  62. }
  63. if userCacheJson == nil {
  64. return nil
  65. }
  66. err = gjson.DecodeTo(userCacheJson, &userCache)
  67. if err != nil {
  68. g.Log().Error("[GToken]cache get json error", err)
  69. return nil
  70. }
  71. if uuid != userCache["uuid"] {
  72. return nil
  73. }
  74. return userCache
  75. }
  76. return nil
  77. }
  78. //通过token获取uuid和userKey
  79. func GetUuidUserKeyByToken(token string) (uuid, userKey string) {
  80. decryptToken := boot.AdminGfToken.DecryptToken(token)
  81. if !decryptToken.Success() {
  82. return
  83. }
  84. userKey = decryptToken.GetString("userKey")
  85. uuid = decryptToken.GetString("uuid")
  86. return
  87. }
  88. //强制退出操作
  89. func ForceLogout(ids []int) error {
  90. for _, id := range ids {
  91. entity, err := user_online.Model.FindOne("id", id)
  92. if err != nil {
  93. g.Log().Error(err)
  94. return gerror.New("获取在线用户信息失败")
  95. }
  96. if entity == nil {
  97. continue
  98. }
  99. entity.Delete()
  100. _, userKey := GetUuidUserKeyByToken(entity.Token)
  101. if userKey == "" {
  102. continue
  103. }
  104. userKey = boot.AdminGfToken.CacheKey + userKey
  105. _, err = g.Redis().Do("DEL", userKey)
  106. if err != nil {
  107. return err
  108. }
  109. }
  110. return nil
  111. }