From 184493f71bb878dba6409864af7c753d7123d8c2 Mon Sep 17 00:00:00 2001 From: youngq Date: Thu, 25 Jul 2024 17:38:51 +0800 Subject: [PATCH] 1 --- WGShare.API/Controllers/AuthController.cs | 8 +-- .../Controllers/Frontend/HomeController.cs | 15 ++-- WGShare.API/Hubs/SessionManageHub.cs | 71 +++++++++++++------ WGShare.API/Program.cs | 1 - .../SqlsugarServiceExtensions.cs | 10 +-- WGShare.API/appsettings.Development.json | 18 +++++ WGShare.Domain/Constant/RedisKeyConstant.cs | 1 + WGShare.Domain/DTOs/Room/RoomOutputDTO.cs | 2 +- 8 files changed, 85 insertions(+), 41 deletions(-) diff --git a/WGShare.API/Controllers/AuthController.cs b/WGShare.API/Controllers/AuthController.cs index 0516ad6..e8aab5a 100644 --- a/WGShare.API/Controllers/AuthController.cs +++ b/WGShare.API/Controllers/AuthController.cs @@ -82,7 +82,7 @@ namespace WGShare.API.Controllers btnAutn.Add(new Claim("uname", user.UserName)); var refreshToken = Guid.NewGuid().ToString(); - RedisHelper.Instance.Set(refreshToken, user, TimeSpan.FromDays(30).TotalSeconds.ToInt32()); + RedisHelper.Instance.Set($@"refresh:{refreshToken}", user, TimeSpan.FromDays(30).TotalSeconds.ToInt32()); return Ok(new { @@ -106,7 +106,7 @@ namespace WGShare.API.Controllers [HttpPost("refresh"), AllowAnonymous] public async Task Refresh([FromQuery] string refreshToken) { - var user = RedisHelper.Instance.Get(refreshToken); + var user = RedisHelper.Instance.Get($@"refresh:{refreshToken}"); if (user == null || string.IsNullOrWhiteSpace(user.Id)) { throw Oops.Oh("登录已失效,请重新登录"); @@ -121,8 +121,8 @@ namespace WGShare.API.Controllers var refreshTokenNew = Guid.NewGuid().ToString(); - RedisHelper.Instance.Del(refreshToken); - RedisHelper.Instance.Set(refreshTokenNew, user, TimeSpan.FromDays(30).TotalSeconds.ToInt32()); + RedisHelper.Instance.Del($@"refresh:{refreshToken}"); + RedisHelper.Instance.Set($@"refresh:{refreshTokenNew}", user, TimeSpan.FromDays(30).TotalSeconds.ToInt32()); return Ok(new { diff --git a/WGShare.API/Controllers/Frontend/HomeController.cs b/WGShare.API/Controllers/Frontend/HomeController.cs index aa16b8b..9f707ee 100644 --- a/WGShare.API/Controllers/Frontend/HomeController.cs +++ b/WGShare.API/Controllers/Frontend/HomeController.cs @@ -63,12 +63,13 @@ namespace WGShare.API.Controllers.Frontend if (!result.IsNullOrEmpty()) { // 从Redis获取缓存在线人数 拼装数据 - var userCounts = RedisHelper.Instance.HMGet(RedisKeyConstant.SessionManage.GetChannelUserCountKey(TenantId), - result.Select(x => x.RoomNum).ToArray()); - for (int i = 0; i < userCounts.Length; i++) - { - result[i].OnlineUserCount = userCounts[i]; - } + result.ForEach(x => x.OnlineUserCount = RedisHelper.Instance.HLen(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, x.RoomNum))); + //var userCounts = RedisHelper.Instance.HMGet(RedisKeyConstant.SessionManage.GetChannelUserCountKey(TenantId), + // result.Select(x => x.RoomNum).ToArray()); + //for (int i = 0; i < userCounts.Length; i++) + //{ + // result[i].OnlineUserCount = userCounts[i]; + //} } return PagedResult.Create(result, total.Value); @@ -103,7 +104,7 @@ namespace WGShare.API.Controllers.Frontend /// 获取 rtm token /// /// - [HttpGet("tk/rtm"),Obsolete] + [HttpGet("tk/rtm"), Obsolete] public async Task GetRTMToken() { uint privilegeExpiredTs = (uint)_configuration["tokenExpireTimeInSecond"].ToInt32() + (uint)Utils.getTimestamp(); diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index c6b8bfd..677ac18 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -1,6 +1,8 @@ using Masuit.Tools; +using Masuit.Tools.Maths; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; +using SqlSugar; using System.Text; using WGShare.API.Helpers; using WGShare.Domain.Constant; @@ -11,16 +13,22 @@ namespace WGShare.API.Hubs [Authorize] public class SessionManageHub : Hub { + private readonly ILogger _logger; + + public SessionManageHub(ILogger logger) + { + this._logger = logger; + } public async override Task OnConnectedAsync() { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + Console.WriteLine($"{DateTime.Now}连接成功 当前租户:" + tenant); + Console.WriteLine($"{DateTime.Now} 连接成功 uid:" + uid); + Console.WriteLine($"{DateTime.Now}连接成功 connectId:" + Context.ConnectionId); - await Console.Out.WriteLineAsync("连接成功 当前租户:" + tenant); - await Console.Out.WriteLineAsync("连接成功 uid:" + uid); - await Console.Out.WriteLineAsync("连接成功 connectId:" + Context.ConnectionId); - + await ClearUserChannel(uid, tenant); // 存储在线信息 RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid, Context.ConnectionId); } @@ -30,32 +38,49 @@ namespace WGShare.API.Hubs var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; - await Console.Out.WriteLineAsync("断开连接 当前租户:" + tenant); - await Console.Out.WriteLineAsync("断开连接 uid:" + uid); - await Console.Out.WriteLineAsync("断开连接 connectId:" + Context.ConnectionId); + Console.WriteLine($"{DateTime.Now}断开连接 当前租户:" + tenant); + Console.WriteLine($"{DateTime.Now}断开连接 uid:" + uid); + Console.WriteLine($"{DateTime.Now}断开连接 connectId:" + Context.ConnectionId); - // 获取用户参加得频道 + if (Context.ConnectionId == RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid)) + { + Console.WriteLine($"{DateTime.Now}断开连接 True"); + // 断开后未重连则清退频道 + await ClearUserChannel(uid, tenant); + + } + + } + + private async Task ClearUserChannel(string uid, string tenant) + { + Console.WriteLine($"{DateTime.Now} 执行删除"); var roomNums = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); using (var pipe = RedisHelper.Instance.StartPipe()) { - // 移除在线信息 - pipe.HDel(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid); + // 获取用户参加得频道 + //var roomNums = pipe.HKeys(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); if (!roomNums.IsNullOrEmpty()) { - await Console.Out.WriteLineAsync($@"uid:{uid} 退出以下频道:{string.Join(',', roomNums)}"); + Console.WriteLine($@"{DateTime.Now}uid:{uid} 退出以下频道:{string.Join(',', roomNums)}"); // 所有房间移除该用户 roomNums.ForEach(roomNum => { pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); - pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, -1); + //pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, -1); }); } + + // 删除用户在线状态 + pipe.HDel(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid); + // 删除用户已加入频道信息 pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); pipe.EndPipe(); } + Console.WriteLine($"{DateTime.Now} 执行删除 完成"); } /// @@ -71,15 +96,15 @@ namespace WGShare.API.Hubs var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; - await Console.Out.WriteLineAsync("加入频道 会议号:" + roomNum); - await Console.Out.WriteLineAsync("加入频道 uid:" + uid); - await Console.Out.WriteLineAsync("加入频道 tenant:" + tenant); + Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); + Console.WriteLine($"{DateTime.Now}加入频道 uid:" + uid); + Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant); using (var pipe = RedisHelper.Instance.StartPipe()) { var userInfo = new ChannelUserInfo(uid, Context.ConnectionId, enableMicr, enableCamera); pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo.ToJsonString()); - pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, 1); + //pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, 1); pipe.HSet(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum, 1); pipe.EndPipe(); } @@ -98,15 +123,15 @@ namespace WGShare.API.Hubs var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; - await Console.Out.WriteLineAsync("离开频道 会议号:" + roomNum); - await Console.Out.WriteLineAsync("离开频道 uid:" + uid); - await Console.Out.WriteLineAsync("离开频道 tenant:" + tenant); + Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum); + Console.WriteLine($" {DateTime.Now}离开频道 uid:" + uid); + Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant); using (var pipe = RedisHelper.Instance.StartPipe()) { pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); pipe.HDel(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum); - pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, -1); + //pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, -1); pipe.EndPipe(); } @@ -124,9 +149,9 @@ namespace WGShare.API.Hubs var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; - await Console.Out.WriteLineAsync("发送消息 uname:" + uname); - await Console.Out.WriteLineAsync("发送消息 roomNum:" + rooNum); - await Console.Out.WriteLineAsync("发送消息 msg:" + msg); + Console.WriteLine($" {DateTime.Now}发送消息 uname:" + uname); + Console.WriteLine($" {DateTime.Now}发送消息 roomNum:" + rooNum); + Console.WriteLine($" {DateTime.Now}发送消息 msg:" + msg); await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); } diff --git a/WGShare.API/Program.cs b/WGShare.API/Program.cs index 2632b97..dc28d8a 100644 --- a/WGShare.API/Program.cs +++ b/WGShare.API/Program.cs @@ -21,7 +21,6 @@ namespace WGShare.API { public static void Main(string[] args) { - var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; diff --git a/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs b/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs index c0ccaaf..971fd3a 100644 --- a/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs +++ b/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs @@ -43,17 +43,17 @@ namespace WGShare.API.ServiceConfigs db.Aop.OnLogExecuting = (sql, pars) => { // 打印 Sql 语句 - Console.WriteLine($@"{DateTime.Now.ToShortTimeString()}{new string('=', 10)}BEGIN{new string('=', 5)} DB-IP:{ipMatch.Value} {new string('=', 5)} DB-Name:{dbNamne} {new string('=', 15)}"); - Console.WriteLine($"执行Sql:{Environment.NewLine}{sql}"); - Console.WriteLine($"参数:{db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))}"); + //Console.WriteLine($@"{DateTime.Now.ToShortTimeString()}{new string('=', 10)}BEGIN{new string('=', 5)} DB-IP:{ipMatch.Value} {new string('=', 5)} DB-Name:{dbNamne} {new string('=', 15)}"); + //Console.WriteLine($"执行Sql:{Environment.NewLine}{sql}"); + //Console.WriteLine($"参数:{db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))}"); }; //SQL执行完成 db.Aop.OnLogExecuted = (sql, pars) => { //执行完了可以输出SQL执行时间 - Console.WriteLine("Sql用时:" + db.Ado.SqlExecutionTime.ToString()); - Console.WriteLine($@"{DateTime.Now.ToShortTimeString()}{new string('=', 10)}END{new string('=', 7)} DB-IP:{ipMatch.Value} {new string('=', 5)} DB-Name:{dbNamne} {new string('=', 15)}"); + //Console.WriteLine("Sql用时:" + db.Ado.SqlExecutionTime.ToString()); + //Console.WriteLine($@"{DateTime.Now.ToShortTimeString()}{new string('=', 10)}END{new string('=', 7)} DB-IP:{ipMatch.Value} {new string('=', 5)} DB-Name:{dbNamne} {new string('=', 15)}"); }; } }); diff --git a/WGShare.API/appsettings.Development.json b/WGShare.API/appsettings.Development.json index 23a1824..afb98eb 100644 --- a/WGShare.API/appsettings.Development.json +++ b/WGShare.API/appsettings.Development.json @@ -3,6 +3,24 @@ "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" + }, + "Console": { + //"LogLevel": { + // "Default": "Information", + // "Microsoft": "Warning", + //}, + "FormatterName": "CustomTimePrefixingFormatter", + "FormatterOptions": { + "CustomPrefix": "|-<[", + "CustomSuffix": "]>-|", + "SingleLine": true, + "IncludeScopes": true, + "TimestampFormat": "HH:mm:ss.ffff ", + "UseUtcTimestamp": true, + "JsonWriterOptions": { + "Indented": true + } + } } }, "ConnectionStrings": { diff --git a/WGShare.Domain/Constant/RedisKeyConstant.cs b/WGShare.Domain/Constant/RedisKeyConstant.cs index 4a39640..4597744 100644 --- a/WGShare.Domain/Constant/RedisKeyConstant.cs +++ b/WGShare.Domain/Constant/RedisKeyConstant.cs @@ -41,6 +41,7 @@ namespace WGShare.Domain.Constant /// /// /// + [Obsolete("废弃")] public static string GetChannelUserCountKey(string tenantId) => $@"te_{tenantId}:ChannelUserCount"; } } diff --git a/WGShare.Domain/DTOs/Room/RoomOutputDTO.cs b/WGShare.Domain/DTOs/Room/RoomOutputDTO.cs index bc49fcc..e86fb47 100644 --- a/WGShare.Domain/DTOs/Room/RoomOutputDTO.cs +++ b/WGShare.Domain/DTOs/Room/RoomOutputDTO.cs @@ -23,6 +23,6 @@ namespace WGShare.Domain.DTOs.Room /// /// 在线人数 /// - public int OnlineUserCount { get; set; } + public long OnlineUserCount { get; set; } } }