Compare commits

..

No commits in common. "9fcab57b4b631680b767b3ca23d228bbc37823c2" and "e7ea6956ef1cc0bc10cf040f7817202291d29399" have entirely different histories.

13 changed files with 159 additions and 198 deletions

View File

@ -119,11 +119,6 @@ namespace WGShare.API.Controllers
if (!string.IsNullOrWhiteSpace(connectId)) if (!string.IsNullOrWhiteSpace(connectId))
{ {
_logger.LogInformation($"账号已在其他地方登录强制下线account:{user.Account} connectId:{connectId}"); _logger.LogInformation($"账号已在其他地方登录强制下线account:{user.Account} connectId:{connectId}");
var roomNum = RedisHelper.Instance.Get(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(user.Id));
if (!string.IsNullOrWhiteSpace(roomNum))
{
await _hubContext.Clients.Group(roomNum).UserLeave(user.Id);
}
await _hubContext.Clients.Client(connectId).ForceLogout("账号已在其他地方登录,您被迫下线!"); await _hubContext.Clients.Client(connectId).ForceLogout("账号已在其他地方登录,您被迫下线!");
} }

View File

@ -89,7 +89,7 @@ namespace WGShare.API.Controllers.Backend
} }
return await _sqlSugar.Updateable(entity) return await _sqlSugar.Updateable(entity)
.UpdateColumns(x => new { x.UserName, x.Account, x.RoleId, x.TenantId }).ExecuteCommandAsync() > 0; .IgnoreColumns(x => new { x.Pwd, x.ScreenShareId }).ExecuteCommandAsync() > 0;
} }
[HttpPut("pwd")] [HttpPut("pwd")]
@ -180,7 +180,7 @@ namespace WGShare.API.Controllers.Backend
memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.Seek(0, SeekOrigin.Begin);
var fileName = $@"excel/{Regex.Replace(file.FileName, @"\.(xlsx|xls)$", "", RegexOptions.IgnoreCase)}_验证不通过_{DateTime.UtcNow.Ticks}.xlsx"; var fileName = $@"excel/{Regex.Replace(file.FileName, @"\.(xlsx|xls)$", "", RegexOptions.IgnoreCase)}_验证不通过_{DateTime.UtcNow.Ticks}.xlsx";
_ossHelper.UploadWithExpireTime(fileName, memoryStream, 10); _ossHelper.UploadWithExpireTime(fileName, memoryStream, 1);
var fileUrl = _ossHelper.GetAccessFileUrl(fileName, 1); var fileUrl = _ossHelper.GetAccessFileUrl(fileName, 1);
return Ok((isSuccess: false, url: fileUrl)); return Ok((isSuccess: false, url: fileUrl));

View File

@ -1,7 +1,6 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using SqlSugar.Extensions; using SqlSugar.Extensions;
using System.Security.Claims;
using WGShare.API.Helpers; using WGShare.API.Helpers;
using WGShare.Domain.Constant; using WGShare.Domain.Constant;
using WGShare.Domain.FriendlyException; using WGShare.Domain.FriendlyException;
@ -16,7 +15,7 @@ namespace WGShare.API.Controllers.Basic
{ {
get get
{ {
var uid = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value; var uid = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "uid").Value;
if (string.IsNullOrWhiteSpace(uid)) if (string.IsNullOrWhiteSpace(uid))
{ {
throw Oops.Oh("用户信息有误,请重新登录"); throw Oops.Oh("用户信息有误,请重新登录");
@ -91,20 +90,16 @@ namespace WGShare.API.Controllers.Basic
} }
} }
private string connectionId;
public string ConnectionId public string ConnectionId
{ {
get get
{ {
if (!string.IsNullOrWhiteSpace(connectionId)) var connectid = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), UId);
return connectionId; if (string.IsNullOrWhiteSpace(connectid))
connectionId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), UId);
if (string.IsNullOrWhiteSpace(connectionId))
{ {
throw Oops.Oh("用户信息有误,请重新登录"); throw Oops.Oh("用户信息有误,请重新登录");
} }
return connectionId; return connectid;
} }
} }

View File

@ -57,7 +57,6 @@ namespace WGShare.API.Controllers.Frontend
var list = await _sqlSugar.Queryable<Room>() var list = await _sqlSugar.Queryable<Room>()
.Where(x => x.TenantId == TenantId && x.IsDelete == false) .Where(x => x.TenantId == TenantId && x.IsDelete == false)
.OrderBy(x => x.Id, OrderByType.Desc)
.ToPageListAsync(dto.PageIndex, dto.PageSize, total); .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
var result = list.Adapt<List<RoomOutputDTO>>(); var result = list.Adapt<List<RoomOutputDTO>>();

View File

@ -69,18 +69,18 @@ namespace WGShare.API.Controllers.Frontend
throw Oops.Oh("用户已不在房间内!"); throw Oops.Oh("用户已不在房间内!");
} }
//var entities = new RoomManager var entities = new RoomManager
//{ {
// RoomId = inputDTO.RoomId, RoomId = inputDTO.RoomId,
// UserId = inputDTO.UserId UserId = inputDTO.UserId
//}; };
user.IsRoomManager = true; user.IsRoomManager = true;
//await _sqlSugar.Storageable(entities) await _sqlSugar.Storageable(entities)
// .SplitInsert(x => !x.Any()) .SplitInsert(x => !x.Any())
// .ToStorage().AsInsertable.ExecuteCommandAsync(); .ToStorage().AsInsertable.ExecuteCommandAsync();
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user); RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user);
@ -101,9 +101,9 @@ namespace WGShare.API.Controllers.Frontend
throw Oops.Oh("用户已不在房间内!"); throw Oops.Oh("用户已不在房间内!");
} }
//await _sqlSugar.Deleteable<RoomManager>() await _sqlSugar.Deleteable<RoomManager>()
// .Where(x => x.RoomId == inputDTO.RoomId && x.UserId == inputDTO.UserId) .Where(x => x.RoomId == inputDTO.RoomId && x.UserId == inputDTO.UserId)
// .ExecuteCommandAsync(); .ExecuteCommandAsync();
user.IsRoomManager = false; user.IsRoomManager = false;
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user); RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user);
@ -161,22 +161,6 @@ namespace WGShare.API.Controllers.Frontend
#endregion #endregion
} }
/// <summary>
/// 查询房间中的单个用户信息
/// </summary>
/// <returns></returns>
[HttpGet("user/{uid}")]
public async Task<ChannelUserInfo> GetUser([FromQuery] string roomNum, [FromRoute] string uid)
{
var channelUser = RedisHelper.Instance.HGet<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid);
if (channelUser == null)
{
throw Oops.Oh("用户不在房间内!");
}
return channelUser;
}
/// <summary> /// <summary>
/// 检验房间是否存在 /// 检验房间是否存在
/// </summary> /// </summary>
@ -230,13 +214,10 @@ namespace WGShare.API.Controllers.Frontend
{ {
var room = await _sqlSugar.Queryable<Room>().FirstAsync(x => x.Id == roomId); var room = await _sqlSugar.Queryable<Room>().FirstAsync(x => x.Id == roomId);
//var connectIds = RedisHelper.Instance.HMGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), inviteeUids); var connectIds = RedisHelper.Instance.HMGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), inviteeUids);
//connectIds.RemoveWhere(x => string.IsNullOrWhiteSpace(x)); connectIds.RemoveWhere(x => string.IsNullOrWhiteSpace(x));
//await _hubContext.Clients.Clients(connectIds).Invitation(room.RoomNum, room.RoomName, UserName); await _hubContext.Clients.Clients(connectIds).Invitation(room.RoomNum, room.RoomName, UserName);
await _hubContext.Clients.Users(inviteeUids).Invitation(room.RoomNum, room.RoomName, UserName);
} }
/// <summary> /// <summary>
@ -246,7 +227,11 @@ namespace WGShare.API.Controllers.Frontend
[HttpGet("kickout")] [HttpGet("kickout")]
public async Task KickOut([FromQuery] string roomNum, [FromQuery] string kickUid) public async Task KickOut([FromQuery] string roomNum, [FromQuery] string kickUid)
{ {
await _hubContext.Clients.User(kickUid).ForceExitRoom(roomNum); var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), kickUid);
if (!string.IsNullOrWhiteSpace(connectId))
{
await _hubContext.Clients.Client(connectId).ForceExitRoom(roomNum);
}
} }
/// <summary> /// <summary>
@ -272,9 +257,10 @@ namespace WGShare.API.Controllers.Frontend
}); });
RedisHelper.Instance.HMSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), allUsers); RedisHelper.Instance.HMSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), allUsers);
// 通知其他人 // 通知其他人
await _hubContext.Clients.Group(roomNum).OperAllMicr(enableMicr, UId); await _hubContext.Clients.Group(roomNum).OperAllMicr(enableMicr);
} }
/// <summary> /// <summary>
/// 单用户开闭麦 /// 单用户开闭麦
/// </summary> /// </summary>
@ -315,20 +301,20 @@ namespace WGShare.API.Controllers.Frontend
userInfo.EnableCamera = enableCamera; userInfo.EnableCamera = enableCamera;
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo); RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo);
// 通知所有人该用户摄像头状态 // 通知所有人该用户麦克风状态
await _hubContext.Clients.Group(roomNum).OperCamera(userInfo); await _hubContext.Clients.Group(roomNum).OperCamera(userInfo);
} }
///// <summary> /// <summary>
///// 同步视图 /// 同步视图
///// </summary> /// </summary>
///// <param name="type"></param> /// <param name="type"></param>
///// <returns></returns> /// <returns></returns>
//[HttpGet("sync-view")] [HttpGet("sync-view")]
//public async Task ChangeView([FromQuery] string roomNum, [FromQuery] string type) public async Task ChangeView([FromQuery] string roomNum, [FromQuery] string type)
//{ {
// await _hubContext.Clients.Groups(roomNum).RefreshView(type); await _hubContext.Clients.Groups(roomNum).RefreshView(type);
//} }
/// <summary> /// <summary>
/// 全员观看 /// 全员观看
@ -337,6 +323,13 @@ namespace WGShare.API.Controllers.Frontend
[HttpGet("show-user")] [HttpGet("show-user")]
public async Task<string> GetShowUser([FromQuery] string roomNum) public async Task<string> GetShowUser([FromQuery] string roomNum)
{ {
// 获取全部用户
var channelUsers = RedisHelper.Instance.HGetAll<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
if (channelUsers.IsNullOrEmpty())
{
throw Oops.Oh("无效会议号!");
}
// 获取全员观看用户 // 获取全员观看用户
var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum); var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum);
if (!string.IsNullOrWhiteSpace(showUserId)) if (!string.IsNullOrWhiteSpace(showUserId))
@ -344,14 +337,7 @@ namespace WGShare.API.Controllers.Frontend
return showUserId; return showUserId;
} }
// 获取全部用户 return channelUsers.FirstOrDefault().Value.UID;
var uids = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
if (uids.IsNullOrEmpty())
{
throw Oops.Oh("无效会议号!");
}
return uids.FirstOrDefault();
} }
/// <summary> /// <summary>
@ -364,13 +350,11 @@ namespace WGShare.API.Controllers.Frontend
// 设置房间全员观看用户 // 设置房间全员观看用户
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, uid); RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, uid);
//var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), UId); var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), UId);
//if (!string.IsNullOrWhiteSpace(connectId)) if (!string.IsNullOrWhiteSpace(connectId))
//{ {
// await _hubContext.Clients.GroupExcept(roomNum, connectId).ShowUser(); await _hubContext.Clients.GroupExcept(roomNum, connectId).ShowUser();
//} }
await _hubContext.Clients.Group(roomNum).ShowUser();
} }
/// <summary> /// <summary>
@ -383,10 +367,10 @@ namespace WGShare.API.Controllers.Frontend
[HttpGet("join")] [HttpGet("join")]
public async Task JoinChannel([FromQuery] string roomNum, [FromQuery] bool enableMicr = false, [FromQuery] bool enableCamera = false) public async Task JoinChannel([FromQuery] string roomNum, [FromQuery] bool enableMicr = false, [FromQuery] bool enableCamera = false)
{ {
//var isRoomManager = await _sqlSugar.Queryable<RoomManager>() var isRoomManager = await _sqlSugar.Queryable<RoomManager>()
// .InnerJoin<Room>((rm, r) => r.Id == rm.RoomId) .InnerJoin<Room>((rm, r) => r.Id == rm.RoomId)
// .Where((rm, r) => r.RoomNum == roomNum && rm.UserId == UId) .Where((rm, r) => r.RoomNum == roomNum && rm.UserId == UId)
// .AnyAsync(); .AnyAsync();
var userInfo = new ChannelUserInfo var userInfo = new ChannelUserInfo
{ {
@ -399,20 +383,17 @@ namespace WGShare.API.Controllers.Frontend
ScreenShareId = ScreenShareId, ScreenShareId = ScreenShareId,
RoleId = RoleId, RoleId = RoleId,
RoleName = ((RoleEnums)RoleId.ToInt32()).GetDescription(), RoleName = ((RoleEnums)RoleId.ToInt32()).GetDescription(),
IsRoomManager = false IsRoomManager = isRoomManager
}; };
using (var pipe = RedisHelper.Instance.StartPipe()) using (var pipe = RedisHelper.Instance.StartPipe())
{ {
// 进房第一人,则设置全员看ta
var script = $@"local exists = redis.call('HLEN', KEYS[1]) var script = $@"local exists = redis.call('HLEN', KEYS[1])
if exists == 0 then redis.call('HSET', KEYS[2], ARGV[1], ARGV[2]) end if exists == 0 then redis.call('HSET', KEYS[2], ARGV[1], ARGV[2]) end
return exists"; return exists";
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId)], roomNum, UId); pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId)], roomNum, UId);
// 记录频道得用户信息 pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId, userInfo.ToJsonString());
pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId, userInfo); pipe.HSet(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(UId), roomNum, 1);
// 记录用户已参与频道
pipe.Set(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(UId), roomNum);
pipe.EndPipe(); pipe.EndPipe();
} }
await _hubContext.Groups.AddToGroupAsync(ConnectionId, roomNum); await _hubContext.Groups.AddToGroupAsync(ConnectionId, roomNum);
@ -420,7 +401,7 @@ namespace WGShare.API.Controllers.Frontend
} }
/// <summary> /// <summary>
/// 单用户离开频道 /// 离开频道
/// </summary> /// </summary>
/// <param name="roomNum"></param> /// <param name="roomNum"></param>
/// <returns></returns> /// <returns></returns>
@ -429,17 +410,14 @@ namespace WGShare.API.Controllers.Frontend
{ {
using (var pipe = RedisHelper.Instance.StartPipe()) using (var pipe = RedisHelper.Instance.StartPipe())
{ {
// 判断如果有全员看ta则删除
var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1]) var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
if value == ARGV[2] or value == ARGV[3] then if value == ARGV[2] or value == ARGV[3] then
return redis.call('HDEL', KEYS[1], ARGV[1]) return redis.call('HDEL', KEYS[1], ARGV[1])
else return -1 end"; else return -1 end";
// 执行 eval 命令 // 执行 eval 命令
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId)], roomNum, UId, ScreenShareId); pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId)], roomNum, UId, ScreenShareId);
// 删除频道中得该用户
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId); pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId);
// 删除用户已参与频道 pipe.HDel(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(UId), roomNum);
pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(UId));
pipe.EndPipe(); pipe.EndPipe();
} }
@ -447,33 +425,6 @@ namespace WGShare.API.Controllers.Frontend
await _hubContext.Groups.RemoveFromGroupAsync(ConnectionId, roomNum); await _hubContext.Groups.RemoveFromGroupAsync(ConnectionId, roomNum);
} }
/// <summary>
/// 全部离开频道
/// </summary>
/// <param name="roomNum"></param>
/// <returns></returns>
[HttpGet("leave-all")]
public async Task AllLevelChannel([FromQuery] string roomNum)
{
var uids = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)).ToList();
using (var pipe = RedisHelper.Instance.StartPipe())
{
// 删除大家都看ta
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum);
// 删除频道里得用户
pipe.Del(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
if (!uids.IsNullOrEmpty())
{
var keys = uids.ConvertAll(uid => RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
pipe.Del(keys.ToArray());
}
pipe.EndPipe();
}
await _hubContext.Clients.Group(roomNum).AllLeave();
}
#region #region
/// <summary> /// <summary>
/// 分享上传文件 /// 分享上传文件

View File

@ -101,7 +101,7 @@ namespace WGShare.API.Controllers.Frontend
} }
return await _sqlSugar.Updateable(entity) return await _sqlSugar.Updateable(entity)
.UpdateColumns(x => new { x.Account, x.UserName, x.RoleId }).ExecuteCommandAsync() > 0; .IgnoreColumns(x => new { x.Pwd, x.TenantId, x.ScreenShareId }).ExecuteCommandAsync() > 0;
} }
/// <summary> /// <summary>

View File

@ -33,7 +33,7 @@ namespace WGShare.API.Controllers
/// 角色列表下拉框 /// 角色列表下拉框
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpGet("role-dp-list"), AllowAnonymous] [HttpGet("role-dp-list")]
public async Task<List<Role>> GetDropDownList() public async Task<List<Role>> GetDropDownList()
{ {
return await _sqlSugar.Queryable<Role>().Where(x => x.IsDelete == false).ToListAsync(); return await _sqlSugar.Queryable<Role>().Where(x => x.IsDelete == false).ToListAsync();

View File

@ -22,7 +22,7 @@ namespace WGShare.API.Helpers
claims.AddRange(new List<Claim> claims.AddRange(new List<Claim>
{ {
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.NameIdentifier, uid), new Claim("uid", uid),
}); });
// 2. 从 appsettings.json 中读取SecretKey // 2. 从 appsettings.json 中读取SecretKey

View File

@ -27,7 +27,7 @@ namespace WGShare.API.Hubs
Task Invitation(string roomNum, string roomName, string InviterName); Task Invitation(string roomNum, string roomName, string InviterName);
/// <summary> /// <summary>
/// 单用户踢出房间 /// 强制退出房间
/// </summary> /// </summary>
/// <param name="roomNum">会议号</param> /// <param name="roomNum">会议号</param>
/// <returns></returns> /// <returns></returns>
@ -70,19 +70,12 @@ namespace WGShare.API.Hubs
/// <returns></returns> /// <returns></returns>
Task UserLeave(string uid); Task UserLeave(string uid);
/// <summary>
/// 所有用户退出频道
/// </summary>
/// <returns></returns>
Task AllLeave();
/// <summary> /// <summary>
/// 所有用户开闭麦 /// 所有用户开闭麦
/// </summary> /// </summary>
/// <param name="enableMicr"></param> /// <param name="enableMicr"></param>
/// <param name="operUid">操作人UID</param>
/// <returns></returns> /// <returns></returns>
Task OperAllMicr(bool enableMicr,string operUid); Task OperAllMicr(bool enableMicr);
/// <summary> /// <summary>
/// 用户关闭开启麦克风 /// 用户关闭开启麦克风
@ -106,7 +99,7 @@ namespace WGShare.API.Hubs
Task ManagerRefresh(ChannelUserInfo user); Task ManagerRefresh(ChannelUserInfo user);
/// <summary> /// <summary>
/// 强制 /// 强制退
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
Task ForceLogout(string msg); Task ForceLogout(string msg);

View File

@ -3,8 +3,6 @@ using Masuit.Tools.Maths;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using SqlSugar; using SqlSugar;
using System;
using System.Security.Claims;
using System.Text; using System.Text;
using WGShare.API.Helpers; using WGShare.API.Helpers;
using WGShare.Domain.Constant; using WGShare.Domain.Constant;
@ -26,11 +24,14 @@ namespace WGShare.API.Hubs
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 == ClaimTypes.NameIdentifier)?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value;
Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account{account} uid:{uid} connectId:{Context.ConnectionId}"); Console.WriteLine($"{DateTime.Now}连接成功 当前租户:" + tenant);
Console.WriteLine($"{DateTime.Now} 连接成功 account" + account);
Console.WriteLine($"{DateTime.Now} 连接成功 uid" + uid);
Console.WriteLine($"{DateTime.Now}连接成功 connectId" + Context.ConnectionId);
await ClearUserChannel(uid, tenant, account, ssid); await ClearUserChannel(uid, tenant, account, ssid);
// 存储在线信息 // 存储在线信息
@ -40,12 +41,14 @@ namespace WGShare.API.Hubs
public async override Task OnDisconnectedAsync(Exception? exception) public async override Task OnDisconnectedAsync(Exception? exception)
{ {
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 == ClaimTypes.NameIdentifier)?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value;
Console.WriteLine($"{DateTime.Now}断开连接 当前租户:" + tenant);
Console.WriteLine($"{DateTime.Now}断开连接 当前租户:{tenant} account{account} uid:{uid} connectId:{Context.ConnectionId} exception:{exception?.Message} "); Console.WriteLine($"{DateTime.Now}断开连接 account" + account);
Console.WriteLine($"{DateTime.Now}断开连接 uid" + uid);
Console.WriteLine($"{DateTime.Now}断开连接 connectId" + Context.ConnectionId);
if (Context.ConnectionId == RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid)) if (Context.ConnectionId == RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid))
{ {
@ -61,22 +64,24 @@ namespace WGShare.API.Hubs
{ {
Console.WriteLine($"{DateTime.Now} 执行删除开始"); Console.WriteLine($"{DateTime.Now} 执行删除开始");
// 获取用户参加得频道 // 获取用户参加得频道
var roomNum = RedisHelper.Instance.Get(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())
{ {
Console.WriteLine($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNum)}"); Console.WriteLine($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNums)}");
if (!string.IsNullOrEmpty(roomNum)) if (!roomNums.IsNullOrEmpty())
{ {
// 所有房间移除该用户 // 所有房间移除该用户
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); roomNums.ForEach(roomNum =>
{
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
// 判断是否全员看他,是则移除 var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
if value == ARGV[2] or value == ARGV[3] then if value == ARGV[2] or value == ARGV[3] then
return redis.call('HDEL', KEYS[1], ARGV[1]) return redis.call('HDEL', KEYS[1], ARGV[1])
else return -1 end"; else return -1 end";
// 执行 eval 命令 // 执行 eval 命令
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid); pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid);
});
} }
// 删除用户在线状态 // 删除用户在线状态
@ -101,7 +106,7 @@ namespace WGShare.API.Hubs
public async Task JoinChannel(string roomNum, bool enableMicr = true, bool enableCamera = true) public async Task JoinChannel(string roomNum, bool enableMicr = true, bool enableCamera = true)
{ {
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 == ClaimTypes.NameIdentifier)?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value;
var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value;
@ -111,6 +116,29 @@ namespace WGShare.API.Hubs
Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum);
Console.WriteLine($"{DateTime.Now}加入频道 account" + account); Console.WriteLine($"{DateTime.Now}加入频道 account" + account);
Console.WriteLine($"{DateTime.Now}加入频道 tenant" + tenant); Console.WriteLine($"{DateTime.Now}加入频道 tenant" + tenant);
//using (var pipe = RedisHelper.Instance.StartPipe())
//{
// var userInfo = new ChannelUserInfo(uid, Context.ConnectionId, enableMicr, enableCamera, account, ssid);
// pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo.ToJsonString());
// //pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, 1);
// pipe.HSet(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum, 1);
// pipe.EndPipe();
//}
//await Groups.AddToGroupAsync(Context.ConnectionId, roomNum);
//await Clients.GroupExcept(roomNum, Context.ConnectionId).UserJoined(new Domain.DTOs.User.UserOutputDTO
//{
// Id = uid,
// UserName = uname,
// Account = account,
// RoleId = roleId,
// RoleName = ((RoleEnums)roleId.ToInt32()).GetDescription(),
// EnableCamera = enableCamera,
// EnableMicr = enableMicr,
// ScreenShareId = ssid,
// IsOnline = true,
//});
} }
/// <summary> /// <summary>
@ -121,7 +149,7 @@ namespace WGShare.API.Hubs
public async Task LevelChannel(string roomNum) public async Task LevelChannel(string roomNum)
{ {
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 == ClaimTypes.NameIdentifier)?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value;
var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value;
@ -131,6 +159,22 @@ namespace WGShare.API.Hubs
Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum); Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum);
Console.WriteLine($" {DateTime.Now}离开频道 account" + account); Console.WriteLine($" {DateTime.Now}离开频道 account" + account);
Console.WriteLine($" {DateTime.Now}离开频道 tenant" + tenant); Console.WriteLine($" {DateTime.Now}离开频道 tenant" + tenant);
//using (var pipe = RedisHelper.Instance.StartPipe())
//{
// var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
// if value == ARGV[2] or value == ARGV[3] then
// return redis.call('HDEL', KEYS[1], ARGV[1])
// else return -1 end";
// // 执行 eval 命令
// pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid);
// pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
// pipe.HDel(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum);
// pipe.EndPipe();
//}
//await Clients.GroupExcept(roomNum, Context.ConnectionId).UserLeave(uid);
//await Groups.RemoveFromGroupAsync(Context.ConnectionId, roomNum);
} }
/// <summary> /// <summary>
@ -142,14 +186,13 @@ namespace WGShare.API.Hubs
public async Task SenMessage(string rooNum, string msg) public async Task SenMessage(string rooNum, string msg)
{ {
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 == ClaimTypes.NameIdentifier)?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
Console.WriteLine($" {DateTime.Now}发送消息 uname" + uname); Console.WriteLine($" {DateTime.Now}发送消息 uname" + uname);
Console.WriteLine($" {DateTime.Now}发送消息 roomNum" + rooNum); Console.WriteLine($" {DateTime.Now}发送消息 roomNum" + rooNum);
Console.WriteLine($" {DateTime.Now}发送消息 msg" + msg); Console.WriteLine($" {DateTime.Now}发送消息 msg" + msg);
await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, uname, msg); await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg);
//await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg);
} }
/// <summary> /// <summary>

View File

@ -1,6 +1,5 @@
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using System.Security.Claims;
using WGShare.API.Helpers; using WGShare.API.Helpers;
using WGShare.API.Hubs; using WGShare.API.Hubs;
using WGShare.Domain.Constant; using WGShare.Domain.Constant;
@ -14,10 +13,9 @@ namespace WGShare.API.ServiceConfigs
public void OnAuthorization(AuthorizationFilterContext context) public void OnAuthorization(AuthorizationFilterContext context)
{ {
if (context.HttpContext.User.Identity.IsAuthenticated if (context.HttpContext.User.Identity.IsAuthenticated
&& !context.HttpContext.GetEndpoint().Metadata.Any(x => x is Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute) && !context.HttpContext.GetEndpoint().Metadata.Any(x => x is Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute))
&& context.HttpContext.Request.Path.StartsWithSegments("/be/"))
{ {
var uid = context.HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; var uid = context.HttpContext.User.Claims.FirstOrDefault(x => x.Type == "uid")?.Value;
if (string.IsNullOrWhiteSpace(uid)) if (string.IsNullOrWhiteSpace(uid))
{ {
context.Result = new Microsoft.AspNetCore.Mvc.UnauthorizedObjectResult(new { message = "身份认证有误,请重新登录!" }); context.Result = new Microsoft.AspNetCore.Mvc.UnauthorizedObjectResult(new { message = "身份认证有误,请重新登录!" });

View File

@ -115,12 +115,6 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.GetUser(System.String,System.String)">
<summary>
查询房间中所有用户信息
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.ExistsRoom(System.String)"> <member name="M:WGShare.API.Controllers.Frontend.RoomController.ExistsRoom(System.String)">
<summary> <summary>
检验房间是否存在 检验房间是否存在
@ -169,6 +163,13 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.ChangeView(System.String,System.String)">
<summary>
同步视图
</summary>
<param name="type"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.GetShowUser(System.String)"> <member name="M:WGShare.API.Controllers.Frontend.RoomController.GetShowUser(System.String)">
<summary> <summary>
全员观看 全员观看
@ -192,14 +193,7 @@
</member> </member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.LevelChannel(System.String)"> <member name="M:WGShare.API.Controllers.Frontend.RoomController.LevelChannel(System.String)">
<summary> <summary>
单用户离开频道 离开频道
</summary>
<param name="roomNum"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.AllLevelChannel(System.String)">
<summary>
全部离开频道
</summary> </summary>
<param name="roomNum"></param> <param name="roomNum"></param>
<returns></returns> <returns></returns>
@ -381,7 +375,7 @@
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.ForceExitRoom(System.String)"> <member name="M:WGShare.API.Hubs.IMessageClient.ForceExitRoom(System.String)">
<summary> <summary>
单用户踢出房间 强制退出房间
</summary> </summary>
<param name="roomNum">会议号</param> <param name="roomNum">会议号</param>
<returns></returns> <returns></returns>
@ -423,18 +417,11 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.AllLeave"> <member name="M:WGShare.API.Hubs.IMessageClient.OperAllMicr(System.Boolean)">
<summary>
所有用户退出频道
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.IMessageClient.OperAllMicr(System.Boolean,System.String)">
<summary> <summary>
所有用户开闭麦 所有用户开闭麦
</summary> </summary>
<param name="enableMicr"></param> <param name="enableMicr"></param>
<param name="operUid">操作人UID</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.OperMicr(WGShare.Domain.Entities.ChannelUserInfo)"> <member name="M:WGShare.API.Hubs.IMessageClient.OperMicr(WGShare.Domain.Entities.ChannelUserInfo)">
@ -460,7 +447,7 @@
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.ForceLogout(System.String)"> <member name="M:WGShare.API.Hubs.IMessageClient.ForceLogout(System.String)">
<summary> <summary>
强制 强制退
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>

View File

@ -5,22 +5,22 @@
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
}, },
"Console": { "Console": {
"LogLevel": { //"LogLevel": {
"Default": "Information", // "Default": "Information",
"Microsoft": "Warning", // "Microsoft": "Warning",
//},
"FormatterName": "CustomTimePrefixingFormatter",
"FormatterOptions": {
"CustomPrefix": "|-<[",
"CustomSuffix": "]>-|",
"SingleLine": true,
"IncludeScopes": true,
"TimestampFormat": "HH:mm:ss.ffff ",
"UseUtcTimestamp": true,
"JsonWriterOptions": {
"Indented": true
}
} }
//"FormatterName": "CustomTimePrefixingFormatter",
//"FormatterOptions": {
// "CustomPrefix": "|-<[",
// "CustomSuffix": "]>-|",
// "SingleLine": true,
// "IncludeScopes": true,
// "TimestampFormat": "HH:mm:ss.ffff ",
// "UseUtcTimestamp": true,
// "JsonWriterOptions": {
// "Indented": true
// }
//}
} }
}, },
"ConnectionStrings": { "ConnectionStrings": {