Explorar el Código

1、优化在线用户 2、增加登录滑动验证

zuohuaijun hace 3 años
padre
commit
5a3c628c09

+ 94 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -993,6 +993,56 @@
             菜单子项
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.SysOnlineUser">
+            <summary>
+            系统在线用户表
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.ConnectionId">
+            <summary>
+            连接Id
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.UserId">
+            <summary>
+            用户Id
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.Account">
+            <summary>
+            账号
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.Name">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.LastTime">
+            <summary>
+            最后连接时间
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.LastLoginIp">
+            <summary>
+            最后登录IP
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.LastLoginBrowser">
+            <summary>
+            最后登录浏览器
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.LastLoginOs">
+            <summary>
+            最后登录所用系统
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysOnlineUser.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.SysOrg">
             <summary>
             系统机构表
@@ -5130,6 +5180,50 @@
             <param name="type">消息类型</param>
             <returns></returns>
         </member>
+        <member name="T:Admin.NET.Core.Service.SendMessageService">
+            <summary>
+            消息发送服务
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToAllUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum)">
+            <summary>
+            发送消息给所有人
+            </summary>
+            <param name="title">发送标题</param>
+            <param name="message">发送内容</param>
+            <param name="type">消息类型</param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToOtherUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
+            <summary>
+            发送消息给除了发送人的其他人
+            </summary>
+            <param name="title">发送标题</param>
+            <param name="message">发送内容</param>
+            <param name="userId">发送人</param>
+            <param name="type">消息类型</param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToUser(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Int64)">
+            <summary>
+            发送消息给某个人
+            </summary>
+            <param name="title">发送标题</param>
+            <param name="message">发送内容</param>
+            <param name="userId">接收人</param>
+            <param name="type">消息类型</param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SendMessageService.SendMessageToUsers(System.String,System.String,Admin.NET.Core.MessageTypeEnum,System.Collections.Generic.List{System.Int64})">
+            <summary>
+            发送消息给某些人
+            </summary>
+            <param name="title">发送标题</param>
+            <param name="message">发送内容</param>
+            <param name="userId">接收人列表</param>
+            <param name="type">消息类型</param>
+            <returns></returns>
+        </member>
         <member name="P:Admin.NET.Core.Service.OrgInput.Pid">
             <summary>
             父Id

+ 67 - 0
Admin.NET/Admin.NET.Core/Entity/SysOnlineUser.cs

@@ -0,0 +1,67 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 系统在线用户表
+/// </summary>
+[SugarTable("sys_online_user", "系统在线用户表")]
+public class SysOnlineUser : EntityBaseId
+{
+    /// <summary>
+    /// 连接Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "连接Id")]
+    public string ConnectionId { get; set; }
+
+    /// <summary>
+    /// 用户Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "用户Id")]
+    public long UserId { get; set; }
+
+    /// <summary>
+    /// 账号
+    /// </summary>
+    [SugarColumn(ColumnDescription = "账号", Length = 20)]
+    [Required, MaxLength(20)]
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 姓名
+    /// </summary>
+    [SugarColumn(ColumnDescription = "姓名", Length = 20)]
+    [MaxLength(20)]
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 最后连接时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "最后连接时间")]
+    public DateTimeOffset LastTime { get; set; }
+
+    /// <summary>
+    /// 最后登录IP
+    /// </summary>
+    [SugarColumn(ColumnDescription = "最后登录IP", Length = 50)]
+    [MaxLength(50)]
+    public string LastLoginIp { get; set; }
+
+    /// <summary>
+    /// 最后登录浏览器
+    /// </summary>
+    [SugarColumn(ColumnDescription = "最后登录浏览器", Length = 20)]
+    [MaxLength(20)]
+    public string LastLoginBrowser { get; set; }
+
+    /// <summary>
+    /// 最后登录所用系统
+    /// </summary>
+    [SugarColumn(ColumnDescription = "最后登录系统", Length = 20)]
+    [MaxLength(20)]
+    public string LastLoginOs { get; set; }
+
+    /// <summary>
+    /// 租户Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "租户Id")]
+    public long TenantId { get; set; }
+}

+ 31 - 32
Admin.NET/Admin.NET.Core/Hub/ChatHub.cs

@@ -10,7 +10,7 @@ public class ChatHub : Hub<IChatClient>
     private readonly ISysCacheService _cache;
     private readonly ISendMessageService _sendMessageService;
 
-    public ChatHub(ISysCacheService cache, 
+    public ChatHub(ISysCacheService cache,
         ISendMessageService sendMessageService)
     {
         _cache = cache;
@@ -23,31 +23,31 @@ public class ChatHub : Hub<IChatClient>
     /// <returns></returns>
     public override async Task OnConnectedAsync()
     {
-        //var token = Context.GetHttpContext().Request.Query["access_token"];
-        //var claims = JWTEncryption.ReadJwtToken(token)?.Claims;
+        var token = Context.GetHttpContext().Request.Query["access_token"];
+        var claims = JWTEncryption.ReadJwtToken(token)?.Claims;
 
-        //var client = Parser.GetDefault().Parse(Context.GetHttpContext().Request.Headers["User-Agent"]);
-        //var loginBrowser = client.UA.Family + client.UA.Major;
-        //var loginOs = client.OS.Family + client.OS.Major;
+        var client = Parser.GetDefault().Parse(Context.GetHttpContext().Request.Headers["User-Agent"]);
+        var loginBrowser = client.UA.Family + client.UA.Major;
+        var loginOs = client.OS.Family + client.OS.Major;
 
-        //var userId = claims.FirstOrDefault(e => e.Type == ClaimConst.CLAINM_USERID)?.Value;
-        //var account = claims.FirstOrDefault(e => e.Type == ClaimConst.CLAINM_ACCOUNT)?.Value;
-        //var name = claims.FirstOrDefault(e => e.Type == ClaimConst.CLAINM_NAME)?.Value;
-        //var tenantId = claims.FirstOrDefault(e => e.Type == ClaimConst.TENANT_ID)?.Value;
-        //var onlineUsers = await _cache.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER) ?? new List<OnlineUser>();
-        //onlineUsers.Add(new OnlineUser
-        //{
-        //    ConnectionId = Context.ConnectionId,
-        //    UserId = long.Parse(userId),
-        //    LastTime = DateTime.Now,
-        //    LastLoginIp = App.HttpContext.GetRequestIPv4(),
-        //    LastLoginBrowser = loginBrowser,
-        //    LastLoginOs = loginOs,
-        //    Account = account,
-        //    Name = name,
-        //    TenantId = Convert.ToInt64(tenantId),
-        //});
-        //await _cache.SetAsync(CommonConst.CACHE_KEY_ONLINE_USER, onlineUsers);
+        var userId = claims.FirstOrDefault(e => e.Type == ClaimConst.UserId)?.Value;
+        var account = claims.FirstOrDefault(e => e.Type == ClaimConst.UserName)?.Value;
+        var name = claims.FirstOrDefault(e => e.Type == ClaimConst.RealName)?.Value;
+        var tenantId = claims.FirstOrDefault(e => e.Type == ClaimConst.TenantId)?.Value;
+        var onlineUsers = await _cache.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser) ?? new List<SysOnlineUser>();
+        onlineUsers.Add(new SysOnlineUser
+        {
+            ConnectionId = Context.ConnectionId,
+            UserId = long.Parse(userId),
+            LastTime = DateTime.Now,
+            LastLoginIp = App.HttpContext.GetRemoteIpAddressToIPv4(),
+            LastLoginBrowser = loginBrowser,
+            LastLoginOs = loginOs,
+            Account = account,
+            Name = name,
+            TenantId = Convert.ToInt64(tenantId),
+        });
+        await _cache.SetAsync(CacheConst.KeyOnlineUser, onlineUsers);
     }
 
     /// <summary>
@@ -57,14 +57,14 @@ public class ChatHub : Hub<IChatClient>
     /// <returns></returns>
     public override async Task OnDisconnectedAsync(Exception exception)
     {
-        //if (!string.IsNullOrEmpty(Context.ConnectionId))
-        //{
-        //    var onlineUsers = await _cache.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER);
-        //    if (onlineUsers == null) return;
+        if (!string.IsNullOrEmpty(Context.ConnectionId))
+        {
+            var onlineUsers = await _cache.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
+            if (onlineUsers == null) return;
 
-        //    onlineUsers.RemoveAll(u => u.ConnectionId == Context.ConnectionId);
-        //    await _cache.SetAsync(CommonConst.CACHE_KEY_ONLINE_USER, onlineUsers);
-        //}
+            onlineUsers.RemoveAll(u => u.ConnectionId == Context.ConnectionId);
+            await _cache.SetAsync(CacheConst.KeyOnlineUser, onlineUsers);
+        }
     }
 
     /// <summary>
@@ -94,7 +94,6 @@ public class ChatHub : Hub<IChatClient>
     /// <returns></returns>
     public async Task ClientsSendMessagetoOther(MessageInput _message)
     {
-        // _message.userId为发送人ID
         await _sendMessageService.SendMessageToOtherUser(_message.Title, _message.Message, _message.MessageType, _message.UserId);
     }
 

+ 88 - 89
Admin.NET/Admin.NET.Core/Service/Message/SendMessageService.cs

@@ -1,99 +1,98 @@
-//using Microsoft.AspNetCore.SignalR;
+using Microsoft.AspNetCore.SignalR;
 
-//namespace Admin.NET.Core.Service;
+namespace Admin.NET.Core.Service;
 
-///// <summary>
-///// 消息发送服务
-///// </summary>
-//[ApiDescriptionSettings(Name = "Message", Order = 100)]
-//[Route("api")]
-//public class SendMessageService : ISendMessageService, IDynamicApiController, ITransient
-//{
-//    private readonly ISysCacheService _sysCacheService;
-//    private readonly IHubContext<ChatHub, IChatClient> _chatHubContext;
+/// <summary>
+/// 消息发送服务
+/// </summary>
+[ApiDescriptionSettings(Name = "消息发送", Order = 101)]
+public class SendMessageService : ISendMessageService, IDynamicApiController, ITransient
+{
+    private readonly ISysCacheService _sysCacheService;
+    private readonly IHubContext<ChatHub, IChatClient> _chatHubContext;
 
-//    public SendMessageService(ISysCacheService sysCacheService,
-//        IHubContext<ChatHub, IChatClient> chatHubContext)
-//    {
-//        _sysCacheService = sysCacheService;
-//        _chatHubContext = chatHubContext;
-//    }
+    public SendMessageService(ISysCacheService sysCacheService,
+        IHubContext<ChatHub, IChatClient> chatHubContext)
+    {
+        _sysCacheService = sysCacheService;
+        _chatHubContext = chatHubContext;
+    }
 
-//    /// <summary>
-//    /// 发送消息给所有人
-//    /// </summary>
-//    /// <param name="title">发送标题</param>
-//    /// <param name="message">发送内容</param>
-//    /// <param name="type">消息类型</param>
-//    /// <returns></returns>
-//    [HttpGet("sysMessage/allUser")]
-//    public async Task SendMessageToAllUser(string title, string message, MessageTypeEnum type)
-//    {
-//        await _chatHubContext.Clients.All.ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
-//    }
+    /// <summary>
+    /// 发送消息给所有人
+    /// </summary>
+    /// <param name="title">发送标题</param>
+    /// <param name="message">发送内容</param>
+    /// <param name="type">消息类型</param>
+    /// <returns></returns>
+    [HttpGet("sysMessage/allUser")]
+    public async Task SendMessageToAllUser(string title, string message, MessageTypeEnum type)
+    {
+        await _chatHubContext.Clients.All.ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
+    }
 
-//    /// <summary>
-//    /// 发送消息给除了发送人的其他人
-//    /// </summary>
-//    /// <param name="title">发送标题</param>
-//    /// <param name="message">发送内容</param>
-//    /// <param name="userId">发送人</param>
-//    /// <param name="type">消息类型</param>
-//    /// <returns></returns>
-//    [HttpGet("sysMessage/otherUser")]
-//    public async Task SendMessageToOtherUser(string title, string message, MessageTypeEnum type, long userId)
-//    {
-//        var onlineuserlist = await _sysCacheService.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER);
+    /// <summary>
+    /// 发送消息给除了发送人的其他人
+    /// </summary>
+    /// <param name="title">发送标题</param>
+    /// <param name="message">发送内容</param>
+    /// <param name="userId">发送人</param>
+    /// <param name="type">消息类型</param>
+    /// <returns></returns>
+    [HttpGet("sysMessage/otherUser")]
+    public async Task SendMessageToOtherUser(string title, string message, MessageTypeEnum type, long userId)
+    {
+        var onlineuserlist = await _sysCacheService.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
 
-//        var user = onlineuserlist.Where(x => x.UserId == userId).ToList();
-//        if (user != null)
-//        {
-//            await _chatHubContext.Clients.AllExcept(user[0].ConnectionId).ReceiveMessage(new { title = title, message = message, messagetype = type });
-//        }
-//    }
+        var user = onlineuserlist.Where(x => x.UserId == userId).ToList();
+        if (user != null)
+        {
+            await _chatHubContext.Clients.AllExcept(user[0].ConnectionId).ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
+        }
+    }
 
-//    /// <summary>
-//    /// 发送消息给某个人
-//    /// </summary>
-//    /// <param name="title">发送标题</param>
-//    /// <param name="message">发送内容</param>
-//    /// <param name="userId">接收人</param>
-//    /// <param name="type">消息类型</param>
-//    /// <returns></returns>
-//    [HttpGet("sysMessage/user")]
-//    public async Task SendMessageToUser(string title, string message, MessageTypeEnum type, long userId)
-//    {
-//        var onlineuserlist = await _sysCacheService.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER);
+    /// <summary>
+    /// 发送消息给某个人
+    /// </summary>
+    /// <param name="title">发送标题</param>
+    /// <param name="message">发送内容</param>
+    /// <param name="userId">接收人</param>
+    /// <param name="type">消息类型</param>
+    /// <returns></returns>
+    [HttpGet("sysMessage/user")]
+    public async Task SendMessageToUser(string title, string message, MessageTypeEnum type, long userId)
+    {
+        var onlineuserlist = await _sysCacheService.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
 
-//        var user = onlineuserlist.Where(x => x.UserId == userId).ToList();
-//        if (user != null)
-//        {
-//            foreach (var item in user)
-//            {
-//                await _chatHubContext.Clients.Client(item.ConnectionId).ReceiveMessage(new { title = title, message = message, messagetype = type });
-//            }
-//        }
-//    }
+        var user = onlineuserlist.Where(x => x.UserId == userId).ToList();
+        if (user != null)
+        {
+            foreach (var item in user)
+            {
+                await _chatHubContext.Clients.Client(item.ConnectionId).ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
+            }
+        }
+    }
 
-//    /// <summary>
-//    /// 发送消息给某些人
-//    /// </summary>
-//    /// <param name="title">发送标题</param>
-//    /// <param name="message">发送内容</param>
-//    /// <param name="userId">接收人列表</param>
-//    /// <param name="type">消息类型</param>
-//    /// <returns></returns>
-//    [HttpGet("sysMessage/users")]
-//    public async Task SendMessageToUsers(string title, string message, MessageTypeEnum type, List<long> userId)
-//    {
-//        var onlineuserlist = await _sysCacheService.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER);
+    /// <summary>
+    /// 发送消息给某些人
+    /// </summary>
+    /// <param name="title">发送标题</param>
+    /// <param name="message">发送内容</param>
+    /// <param name="userId">接收人列表</param>
+    /// <param name="type">消息类型</param>
+    /// <returns></returns>
+    [HttpGet("sysMessage/users")]
+    public async Task SendMessageToUsers(string title, string message, MessageTypeEnum type, List<long> userId)
+    {
+        var onlineuserlist = await _sysCacheService.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
 
-//        var userlist = new List<string>();
-//        foreach (var item in onlineuserlist)
-//        {
-//            if (userId.Contains(item.UserId))
-//                userlist.Add(item.ConnectionId);
-//        }
-//        await _chatHubContext.Clients.Clients(userlist).ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
-//    }
-//}
+        var userlist = new List<string>();
+        foreach (var item in onlineuserlist)
+        {
+            if (userId.Contains(item.UserId))
+                userlist.Add(item.ConnectionId);
+        }
+        await _chatHubContext.Clients.Clients(userlist).ReceiveMessage(new { Title = title, Message = message, Messagetype = type });
+    }
+}

+ 2 - 1
doc/Vben2前端框架修改记录.txt

@@ -68,7 +68,8 @@ Vben2/src/router/guard/permissionGuard.ts
 Vben2/src/store/modules/user.ts	
 18、增加常量下拉框帮助类
 Vben2/src/utils/helper/constSelectorHelper.ts	
-19、
+19、增加登录滑动验证
+Vben2/src/views/sys/login/LoginForm.vue