This commit is contained in:
youngq 2024-07-25 17:38:51 +08:00
parent b2e9814a90
commit 184493f71b
8 changed files with 85 additions and 41 deletions

View File

@ -82,7 +82,7 @@ namespace WGShare.API.Controllers
btnAutn.Add(new Claim("uname", user.UserName)); btnAutn.Add(new Claim("uname", user.UserName));
var refreshToken = Guid.NewGuid().ToString(); 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 return Ok(new
{ {
@ -106,7 +106,7 @@ namespace WGShare.API.Controllers
[HttpPost("refresh"), AllowAnonymous] [HttpPost("refresh"), AllowAnonymous]
public async Task<IActionResult> Refresh([FromQuery] string refreshToken) public async Task<IActionResult> Refresh([FromQuery] string refreshToken)
{ {
var user = RedisHelper.Instance.Get<User>(refreshToken); var user = RedisHelper.Instance.Get<User>($@"refresh:{refreshToken}");
if (user == null || string.IsNullOrWhiteSpace(user.Id)) if (user == null || string.IsNullOrWhiteSpace(user.Id))
{ {
throw Oops.Oh("登录已失效,请重新登录"); throw Oops.Oh("登录已失效,请重新登录");
@ -121,8 +121,8 @@ namespace WGShare.API.Controllers
var refreshTokenNew = Guid.NewGuid().ToString(); var refreshTokenNew = Guid.NewGuid().ToString();
RedisHelper.Instance.Del(refreshToken); RedisHelper.Instance.Del($@"refresh:{refreshToken}");
RedisHelper.Instance.Set(refreshTokenNew, user, TimeSpan.FromDays(30).TotalSeconds.ToInt32()); RedisHelper.Instance.Set($@"refresh:{refreshTokenNew}", user, TimeSpan.FromDays(30).TotalSeconds.ToInt32());
return Ok(new return Ok(new
{ {

View File

@ -63,12 +63,13 @@ namespace WGShare.API.Controllers.Frontend
if (!result.IsNullOrEmpty()) if (!result.IsNullOrEmpty())
{ {
// 从Redis获取缓存在线人数 拼装数据 // 从Redis获取缓存在线人数 拼装数据
var userCounts = RedisHelper.Instance.HMGet<int>(RedisKeyConstant.SessionManage.GetChannelUserCountKey(TenantId), result.ForEach(x => x.OnlineUserCount = RedisHelper.Instance.HLen(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, x.RoomNum)));
result.Select(x => x.RoomNum).ToArray()); //var userCounts = RedisHelper.Instance.HMGet<int>(RedisKeyConstant.SessionManage.GetChannelUserCountKey(TenantId),
for (int i = 0; i < userCounts.Length; i++) // result.Select(x => x.RoomNum).ToArray());
{ //for (int i = 0; i < userCounts.Length; i++)
result[i].OnlineUserCount = userCounts[i]; //{
} // result[i].OnlineUserCount = userCounts[i];
//}
} }
return PagedResult<RoomOutputDTO>.Create(result, total.Value); return PagedResult<RoomOutputDTO>.Create(result, total.Value);
@ -103,7 +104,7 @@ namespace WGShare.API.Controllers.Frontend
/// 获取 rtm token /// 获取 rtm token
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpGet("tk/rtm"),Obsolete] [HttpGet("tk/rtm"), Obsolete]
public async Task<string> GetRTMToken() public async Task<string> GetRTMToken()
{ {
uint privilegeExpiredTs = (uint)_configuration["tokenExpireTimeInSecond"].ToInt32() + (uint)Utils.getTimestamp(); uint privilegeExpiredTs = (uint)_configuration["tokenExpireTimeInSecond"].ToInt32() + (uint)Utils.getTimestamp();

View File

@ -1,6 +1,8 @@
using Masuit.Tools; using Masuit.Tools;
using Masuit.Tools.Maths;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using SqlSugar;
using System.Text; using System.Text;
using WGShare.API.Helpers; using WGShare.API.Helpers;
using WGShare.Domain.Constant; using WGShare.Domain.Constant;
@ -11,16 +13,22 @@ namespace WGShare.API.Hubs
[Authorize] [Authorize]
public class SessionManageHub : Hub<IMessageClient> public class SessionManageHub : Hub<IMessageClient>
{ {
private readonly ILogger<SessionManageHub> _logger;
public SessionManageHub(ILogger<SessionManageHub> logger)
{
this._logger = logger;
}
public async override Task OnConnectedAsync() public async override Task OnConnectedAsync()
{ {
var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value;
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.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 ClearUserChannel(uid, tenant);
await Console.Out.WriteLineAsync("连接成功 uid" + uid);
await Console.Out.WriteLineAsync("连接成功 connectId" + Context.ConnectionId);
// 存储在线信息 // 存储在线信息
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid, Context.ConnectionId); 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 tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value;
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
await Console.Out.WriteLineAsync("断开连接 当前租户:" + tenant); Console.WriteLine($"{DateTime.Now}断开连接 当前租户:" + tenant);
await Console.Out.WriteLineAsync("断开连接 uid" + uid); Console.WriteLine($"{DateTime.Now}断开连接 uid" + uid);
await Console.Out.WriteLineAsync("断开连接 connectId" + Context.ConnectionId); 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)); var roomNums = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
using (var pipe = RedisHelper.Instance.StartPipe()) using (var pipe = RedisHelper.Instance.StartPipe())
{ {
// 移除在线信息 // 获取用户参加得频道
pipe.HDel(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid); //var roomNums = pipe.HKeys(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
if (!roomNums.IsNullOrEmpty()) if (!roomNums.IsNullOrEmpty())
{ {
await Console.Out.WriteLineAsync($@"uid:{uid} 退出以下频道:{string.Join(',', roomNums)}"); Console.WriteLine($@"{DateTime.Now}uid:{uid} 退出以下频道:{string.Join(',', roomNums)}");
// 所有房间移除该用户 // 所有房间移除该用户
roomNums.ForEach(roomNum => roomNums.ForEach(roomNum =>
{ {
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); 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.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
pipe.EndPipe(); pipe.EndPipe();
} }
Console.WriteLine($"{DateTime.Now} 执行删除 完成");
} }
/// <summary> /// <summary>
@ -71,15 +96,15 @@ namespace WGShare.API.Hubs
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
await Console.Out.WriteLineAsync("加入频道 会议号:" + roomNum); Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum);
await Console.Out.WriteLineAsync("加入频道 uid" + uid); Console.WriteLine($"{DateTime.Now}加入频道 uid" + uid);
await Console.Out.WriteLineAsync("加入频道 tenant" + tenant); Console.WriteLine($"{DateTime.Now}加入频道 tenant" + tenant);
using (var pipe = RedisHelper.Instance.StartPipe()) using (var pipe = RedisHelper.Instance.StartPipe())
{ {
var userInfo = new ChannelUserInfo(uid, Context.ConnectionId, enableMicr, enableCamera); var userInfo = new ChannelUserInfo(uid, Context.ConnectionId, enableMicr, enableCamera);
pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo.ToJsonString()); 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.HSet(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum, 1);
pipe.EndPipe(); pipe.EndPipe();
} }
@ -98,15 +123,15 @@ namespace WGShare.API.Hubs
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
await Console.Out.WriteLineAsync("离开频道 会议号:" + roomNum); Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum);
await Console.Out.WriteLineAsync("离开频道 uid" + uid); Console.WriteLine($" {DateTime.Now}离开频道 uid" + uid);
await Console.Out.WriteLineAsync("离开频道 tenant" + tenant); Console.WriteLine($" {DateTime.Now}离开频道 tenant" + tenant);
using (var pipe = RedisHelper.Instance.StartPipe()) using (var pipe = RedisHelper.Instance.StartPipe())
{ {
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
pipe.HDel(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum); 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(); pipe.EndPipe();
} }
@ -124,9 +149,9 @@ namespace WGShare.API.Hubs
var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value;
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
await Console.Out.WriteLineAsync("发送消息 uname" + uname); Console.WriteLine($" {DateTime.Now}发送消息 uname" + uname);
await Console.Out.WriteLineAsync("发送消息 roomNum" + rooNum); Console.WriteLine($" {DateTime.Now}发送消息 roomNum" + rooNum);
await Console.Out.WriteLineAsync("发送消息 msg" + msg); Console.WriteLine($" {DateTime.Now}发送消息 msg" + msg);
await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg);
} }

View File

@ -21,7 +21,6 @@ namespace WGShare.API
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration; var configuration = builder.Configuration;

View File

@ -43,17 +43,17 @@ namespace WGShare.API.ServiceConfigs
db.Aop.OnLogExecuting = (sql, pars) => db.Aop.OnLogExecuting = (sql, pars) =>
{ {
// 打印 Sql 语句 // 打印 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($@"{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($"执行Sql:{Environment.NewLine}{sql}");
Console.WriteLine($"参数:{db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))}"); //Console.WriteLine($"参数:{db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))}");
}; };
//SQL执行完成 //SQL执行完成
db.Aop.OnLogExecuted = (sql, pars) => db.Aop.OnLogExecuted = (sql, pars) =>
{ {
//执行完了可以输出SQL执行时间 //执行完了可以输出SQL执行时间
Console.WriteLine("Sql用时:" + db.Ado.SqlExecutionTime.ToString()); //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($@"{DateTime.Now.ToShortTimeString()}{new string('=', 10)}END{new string('=', 7)} DB-IP{ipMatch.Value} {new string('=', 5)} DB-Name:{dbNamne} {new string('=', 15)}");
}; };
} }
}); });

View File

@ -3,6 +3,24 @@
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Information",
"Microsoft.AspNetCore": "Warning" "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": { "ConnectionStrings": {

View File

@ -41,6 +41,7 @@ namespace WGShare.Domain.Constant
/// </summary> /// </summary>
/// <param name="tenantId"></param> /// <param name="tenantId"></param>
/// <returns></returns> /// <returns></returns>
[Obsolete("废弃")]
public static string GetChannelUserCountKey(string tenantId) => $@"te_{tenantId}:ChannelUserCount"; public static string GetChannelUserCountKey(string tenantId) => $@"te_{tenantId}:ChannelUserCount";
} }
} }

View File

@ -23,6 +23,6 @@ namespace WGShare.Domain.DTOs.Room
/// <summary> /// <summary>
/// 在线人数 /// 在线人数
/// </summary> /// </summary>
public int OnlineUserCount { get; set; } public long OnlineUserCount { get; set; }
} }
} }