This commit is contained in:
youngq 2024-08-22 17:19:35 +08:00
parent 0d51178455
commit b6aab652a8
7 changed files with 58 additions and 66 deletions

View File

@ -194,53 +194,7 @@ namespace WGShare.API.Controllers
});
}
/// <summary>
/// 匿名登录,直接进入会议室
/// </summary>
/// <returns></returns>
[HttpPost("anon-login"), Obsolete]
public async Task<IActionResult> Login([FromBody] AnonymousLoginDTO loginDTO)
{
var room = await _sqlSugar.Queryable<Room>().FirstAsync(x => x.Id == loginDTO.RoomId);
if (room == null)
{
throw Oops.Oh("会议号无效");
}
var anonRoleId = "2";
// 匿名登录使用普通用户身份
var perms = await _sqlSugar.Queryable<Permission>()
.InnerJoin<RolePrem>((m, rm) => m.Id == rm.PermId)
.Where((m, rm) => rm.RoleId == anonRoleId)
.Distinct()
.ToListAsync();
var tenant = await _sqlSugar.Queryable<Tenant>().FirstAsync(x => x.Id == room.TenantId);
if (tenant == null || tenant.IsDelete == true)
{
throw Oops.Oh("该区域账号已停用,请联系管理员");
}
var btnAutn = new List<Claim>();
btnAutn.Add(new Claim("perm", perms.Sum(x => x.PermValue).ToString()));
btnAutn.Add(new Claim("roleid", anonRoleId));
btnAutn.Add(new Claim("tenant", room.TenantId));
btnAutn.Add(new Claim("mac", loginDTO.Mac));
btnAutn.Add(new Claim("machine", loginDTO.MachineName));
btnAutn.Add(new Claim("nickName", loginDTO.NickName));
return Ok(new
{
perms = perms.Sum(x => x.PermValue),
token = _jwtHelper.CreateToken("0", btnAutn),
roleId = anonRoleId,
userName = loginDTO.NickName,
tenantName = tenant.TenantName
});
}
/// <summary>
/// 登出(暂未处理任何业务逻辑)
/// </summary>

View File

@ -4,6 +4,8 @@ using SqlSugar.Extensions;
using System.Security.Claims;
using WGShare.API.Helpers;
using WGShare.Domain.Constant;
using WGShare.Domain.Entities;
using WGShare.Domain.Enums;
using WGShare.Domain.FriendlyException;
namespace WGShare.API.Controllers.Basic
@ -52,16 +54,17 @@ namespace WGShare.API.Controllers.Basic
}
public string RoleId
public RoleEnums RoleId
{
get
{
var roleId = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "roleid").Value;
if (string.IsNullOrWhiteSpace(roleId))
if (string.IsNullOrWhiteSpace(roleId) || !int.TryParse(roleId, out int role) || role == 0)
{
throw Oops.Oh("用户信息有误,请重新登录");
}
return roleId;
return (RoleEnums)role;
}
}

View File

@ -397,8 +397,8 @@ namespace WGShare.API.Controllers.Frontend
ConnectId = ConnectionId,
Account = Account,
ScreenShareId = ScreenShareId,
RoleId = RoleId,
RoleName = ((RoleEnums)RoleId.ToInt32()).GetDescription(),
RoleId = ((int)RoleId).ToString(),
RoleName = RoleId.GetDescription(),
IsRoomManager = false
};
using (var pipe = RedisHelper.Instance.StartPipe())
@ -486,7 +486,7 @@ namespace WGShare.API.Controllers.Frontend
var polledUserIds = RedisHelper.Instance.SMembers(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum));
// 排除已轮询的用户
var userInfos = channelUserInfos.Where(x => !polledUserIds.Contains(x.UID)).Take(count).ToList();
var userInfos = channelUserInfos.Where(x => !polledUserIds.Contains(x.UID) && x.RoleId != ((int)RoleEnums.Admin).ToString()).Take(count).ToList();
if (userInfos.Count < count)
{
// 数量不足,则从全部用户中取足
@ -496,8 +496,11 @@ namespace WGShare.API.Controllers.Frontend
RedisHelper.Instance.Del(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum));
}
RedisHelper.Instance.SAdd(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum), userInfos.Select(x => x.UID).ToArray());
return userInfos;
var watchUids = userInfos.Select(x => x.UID).ToArray();
RedisHelper.Instance.SAdd(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum), watchUids);
_hubContext.Clients.Group(roomNum).Watch(watchUids);
return userInfos;
}
/// <summary>
@ -505,9 +508,19 @@ namespace WGShare.API.Controllers.Frontend
/// </summary>
/// <returns></returns>
[HttpGet("apply-speak")]
public async Task ApplyToSpeak([FromQuery] string roomNum)
public async Task ApplySpeak([FromQuery] string roomNum)
{
var channelUsers = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
if (channelUsers.IsNullOrEmpty())
{
return;
}
var connectionIds = channelUsers.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString()).Select(x => x.ConnectId);
if (connectionIds.Any())
{
await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, UserName);
}
}

View File

@ -110,5 +110,19 @@ namespace WGShare.API.Hubs
/// </summary>
/// <returns></returns>
Task ForceLogout(string msg);
/// <summary>
/// 用户申请发言
/// </summary>
/// <param name="uid"></param>
/// <param name="uname"></param>
/// <returns></returns>
Task ApplyToSpeak(string uid, string uname);
/// <summary>
/// 接受监控用户
/// </summary>
/// <param name="watchUids"></param>
void Watch(string[] watchUids);
}
}

View File

@ -12,6 +12,7 @@ using WGShare.API.Helpers;
using WGShare.Domain.Constant;
using WGShare.Domain.Entities;
using WGShare.Domain.Enums;
using ZstdSharp.Unsafe;
namespace WGShare.API.Hubs
{
@ -34,7 +35,7 @@ namespace WGShare.API.Hubs
Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account{account} uid:{uid} connectId:{Context.ConnectionId}");
await ClearUserChannel(uid, tenant, account, ssid);
await ClearUserChannel(uid, tenant, account, ssid, false);
// 存储在线信息
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid, Context.ConnectionId);
}
@ -53,13 +54,13 @@ namespace WGShare.API.Hubs
{
Console.WriteLine($"{DateTime.Now}断开连接 未重连,开始删除用户频道信息");
// 断开后未重连则清退频道
await ClearUserChannel(uid, tenant, account, ssid);
await ClearUserChannel(uid, tenant, account, ssid, true);
}
}
private async Task ClearUserChannel(string uid, string tenant, string account, string ssid)
private async Task ClearUserChannel(string uid, string tenant, string account, string ssid, bool isclose)
{
Console.WriteLine($"{DateTime.Now} 执行删除开始");
// 获取用户参加得频道
@ -90,6 +91,10 @@ namespace WGShare.API.Hubs
pipe.EndPipe();
}
if (!string.IsNullOrEmpty(roomNum))
// 通知房间其他用户,该用户退出
await Clients.Group(roomNum).UserLeave(uid);
Console.WriteLine($"{DateTime.Now} 执行删除完成");
}

View File

@ -24,12 +24,6 @@
<param name="refreshToken"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.AuthController.Login(WGShare.Domain.DTOs.Login.AnonymousLoginDTO)">
<summary>
匿名登录,直接进入会议室
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.AuthController.Logout">
<summary>
登出(暂未处理任何业务逻辑)
@ -210,7 +204,7 @@
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.ApplyToSpeak(System.String)">
<member name="M:WGShare.API.Controllers.Frontend.RoomController.ApplySpeak(System.String)">
<summary>
申请发言
</summary>
@ -476,6 +470,14 @@
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.IMessageClient.ApplyToSpeak(System.String,System.String)">
<summary>
用户申请发言
</summary>
<param name="uid"></param>
<param name="uname"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.SessionManageHub.JoinChannel(System.String,System.Boolean,System.Boolean)">
<summary>
加入频道

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WGShare.Domain.Enums;
namespace WGShare.Domain.Entities
{