Bladeren bron

多点登陆 在线用户缓存

Signed-off-by: IMaster <logole@live.cn>
IMaster 1 jaar geleden
bovenliggende
commit
cdc6dedc87
1 gewijzigde bestanden met toevoegingen van 24 en 4 verwijderingen
  1. 24 4
      Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs

+ 24 - 4
Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs

@@ -1,4 +1,4 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
 //
 // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
 //
@@ -21,16 +21,19 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
     private readonly SysMessageService _sysMessageService;
     private readonly IHubContext<OnlineUserHub, IOnlineUserHub> _onlineUserHubContext;
     private readonly SysCacheService _sysCacheService;
+    private readonly SysConfigService _sysConfigService;
 
     public OnlineUserHub(SqlSugarRepository<SysOnlineUser> sysOnlineUerRep,
         SysMessageService sysMessageService,
         IHubContext<OnlineUserHub, IOnlineUserHub> onlineUserHubContext,
-        SysCacheService sysCacheService)
+        SysCacheService sysCacheService,
+        SysConfigService sysConfigService)
     {
         _sysOnlineUerRep = sysOnlineUerRep;
         _sysMessageService = sysMessageService;
         _onlineUserHubContext = onlineUserHubContext;
         _sysCacheService = sysCacheService;
+        _sysConfigService = sysConfigService;
     }
 
     /// <summary>
@@ -59,7 +62,14 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
             TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : Convert.ToInt64(tenantId),
         };
         await _sysOnlineUerRep.InsertAsync(user);
-        _sysCacheService.Set(CacheConst.KeyUserOnline + user.UserId, user);
+
+        // 是否开启单用户登录
+        if (await _sysConfigService.GetConfigValue<bool>(CommonConst.SysSingleLogin)) {
+            _sysCacheService.Set(CacheConst.KeyUserOnline + user.UserId, user);
+        } else {
+            var device = (client.UA.Family + client.UA.Major + client.OS.Family + client.OS.Major).Trim();
+            _sysCacheService.Set(CacheConst.KeyUserOnline + user.UserId + device, user);
+        }
 
         // 以租户Id进行分组
         var groupName = $"{GROUP_ONLINE}{user.TenantId}";
@@ -83,12 +93,22 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
     public override async Task OnDisconnectedAsync(Exception exception)
     {
         if (string.IsNullOrEmpty(Context.ConnectionId)) return;
+        
+        var httpContext = Context.GetHttpContext();
+        var client = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]);
 
         var user = await _sysOnlineUerRep.AsQueryable().Filter("", true).FirstAsync(u => u.ConnectionId == Context.ConnectionId);
         if (user == null) return;
 
         await _sysOnlineUerRep.DeleteAsync(u => u.Id == user.Id);
-        _sysCacheService.Remove(CacheConst.KeyUserOnline + user.UserId);
+
+        // 是否开启单用户登录
+        if (await _sysConfigService.GetConfigValue<bool>(CommonConst.SysSingleLogin)) {
+            _sysCacheService.Remove(CacheConst.KeyUserOnline + user.UserId);
+        } else {
+            var device = (client.UA.Family + client.UA.Major + client.OS.Family + client.OS.Major).Trim();
+            _sysCacheService.Remove(CacheConst.KeyUserOnline + user.UserId + device);
+        }
 
         // 通知当前组用户变动
         var userList = await _sysOnlineUerRep.AsQueryable().Filter("", true)