Compare commits
14 Commits
feautre-修复
...
master
| Author | SHA1 | Date |
|---|---|---|
|
|
c65e6673e0 | |
|
|
d66fec6b66 | |
|
|
7c31c67f9d | |
|
|
c33c06176b | |
|
|
505dd42294 | |
|
|
7a75025880 | |
|
|
484ab104ab | |
|
|
806d585717 | |
|
|
ebfd8b9fb7 | |
|
|
40bf8cc5ba | |
|
|
6106f06f8a | |
|
|
9a7c0c61d0 | |
|
|
ac22e5097c | |
|
|
e29665cd90 |
|
|
@ -24,13 +24,23 @@
|
|||
"LinuxServerList": [
|
||||
{
|
||||
"UserName": "marking",
|
||||
"Pwd": "0610DBF49053E6779393A74BE1ED4FD2",
|
||||
"Pwd": "CE09921E2AD09E56095579DF1F7C614B",
|
||||
"Host": "47.109.67.254:10022",
|
||||
"NickName": "marking001",
|
||||
"IIsFireUrl": null,
|
||||
"DockerFireUrl": "",
|
||||
"WindowsServiceFireUrl": null,
|
||||
"LinuxServiceFireUrl": null
|
||||
},
|
||||
{
|
||||
"UserName": "marking",
|
||||
"Pwd": "CE09921E2AD09E56095579DF1F7C614B",
|
||||
"Host": "47.109.193.53:10022",
|
||||
"NickName": "meeting",
|
||||
"IIsFireUrl": null,
|
||||
"DockerFireUrl": "",
|
||||
"WindowsServiceFireUrl": null,
|
||||
"LinuxServiceFireUrl": null
|
||||
}
|
||||
],
|
||||
"IgnoreList": [],
|
||||
|
|
@ -115,11 +125,11 @@
|
|||
"DockerConfig": {
|
||||
"Prot": "5192:5192",
|
||||
"AspNetCoreEnv": "",
|
||||
"LastEnvName": "29dev",
|
||||
"LastEnvName": "marking001",
|
||||
"RemoveDaysFromPublished": "10",
|
||||
"WorkDir": "",
|
||||
"Volume": "",
|
||||
"Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Development -e TZ=Asia/Shanghai",
|
||||
"Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Production -e TZ=Asia/Shanghai",
|
||||
"EnvPairList": [
|
||||
{
|
||||
"EnvName": "29dev",
|
||||
|
|
|
|||
|
|
@ -51,6 +51,27 @@ namespace WGShare.API.Controllers
|
|||
return await _sqlSugar.Queryable<User>().AnyAsync(x => x.IsDelete == false && x.Account == account && x.IsAnonymous == false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查用户是否在线
|
||||
/// </summary>
|
||||
/// <param name="account"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("check-online"), AllowAnonymous]
|
||||
public async Task<bool> CheckUserOnline([FromQuery] string account)
|
||||
{
|
||||
var user = await _sqlSugar.Queryable<User>().FirstAsync(x => x.IsDelete == false && x.Account == account && x.IsAnonymous == false);
|
||||
if (user == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(user.TenantId), user.Id);
|
||||
if (!string.IsNullOrWhiteSpace(connectId))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 正常账号登录
|
||||
/// </summary>
|
||||
|
|
@ -108,7 +129,7 @@ namespace WGShare.API.Controllers
|
|||
pipe.Del(RedisKeyConstant.Data.GetRefreshTokenKey(tokens.RefreshToken));
|
||||
}
|
||||
// 设置新的刷新token
|
||||
pipe.Set(RedisKeyConstant.Data.GetRefreshTokenKey(refreshToken), user, TimeSpan.FromDays(7).TotalSeconds.ToInt32());
|
||||
pipe.Set(RedisKeyConstant.Data.GetRefreshTokenKey(refreshToken), user, TimeSpan.FromDays(360).TotalSeconds.ToInt32());
|
||||
// 记录accessToken
|
||||
pipe.Set(RedisKeyConstant.Data.GetAccessTokenKey(user.Id), new AccessAndRefreshToken
|
||||
{
|
||||
|
|
@ -177,7 +198,7 @@ namespace WGShare.API.Controllers
|
|||
using (var pipe = RedisHelper.Instance.StartPipe())
|
||||
{
|
||||
pipe.Del(RedisKeyConstant.Data.GetRefreshTokenKey(refreshToken));
|
||||
pipe.Set(RedisKeyConstant.Data.GetRefreshTokenKey(refreshTokenNew), user, TimeSpan.FromDays(7).TotalSeconds.ToInt32());
|
||||
pipe.Set(RedisKeyConstant.Data.GetRefreshTokenKey(refreshTokenNew), user, TimeSpan.FromDays(360).TotalSeconds.ToInt32());
|
||||
pipe.Set(RedisKeyConstant.Data.GetAccessTokenKey(user.Id), new AccessAndRefreshToken
|
||||
{
|
||||
AccessToken = accessToken,
|
||||
|
|
|
|||
|
|
@ -165,9 +165,18 @@ namespace WGShare.API.Controllers.Frontend
|
|||
return;
|
||||
}
|
||||
|
||||
if(existsChannel.TryAdd(eventBody.payload.channelName, 0))
|
||||
if (existsChannel.TryAdd(eventBody.payload.channelName, 0))
|
||||
{
|
||||
ExceptionNotice.JoinAsync(eventBody);
|
||||
var roomInfo = await _sqlSugarClient.Queryable<Room>()
|
||||
.LeftJoin<Tenant>((r, t) => r.TenantId == t.Id)
|
||||
.Where((r, t) => r.RoomNum == eventBody.payload.channelName)
|
||||
.Select((r, t) => new Room
|
||||
{
|
||||
Id = r.Id.SelectAll(),
|
||||
TenantName = t.TenantName
|
||||
})
|
||||
.FirstAsync();
|
||||
ExceptionNotice.JoinAsync(eventBody, roomInfo);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,12 +8,14 @@ using MiniExcelLibs;
|
|||
using MiniExcelLibs.Attributes;
|
||||
using MiniExcelLibs.OpenXml;
|
||||
using SqlSugar;
|
||||
using SqlSugar.Extensions;
|
||||
using System.IO;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text.RegularExpressions;
|
||||
using WGShare.API.Controllers.Basic;
|
||||
using WGShare.API.Helpers;
|
||||
using WGShare.Domain.Constant;
|
||||
using WGShare.Domain.DTOs.Home;
|
||||
using WGShare.Domain.DTOs.MiniProgram;
|
||||
using WGShare.Domain.DTOs.Room;
|
||||
using WGShare.Domain.Entities;
|
||||
|
|
@ -354,5 +356,32 @@ namespace WGShare.API.Controllers.Frontend
|
|||
_logger.LogError("返回 ContentType 未命中");
|
||||
throw Oops.Oh("二维码生成失败");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 反馈打分
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("feedback")]
|
||||
public async Task FeedbackScoring([FromBody] FeedBackRequset requset)
|
||||
{
|
||||
var entity = requset.Adapt<FeedbackIssue>();
|
||||
entity.UID = UId.ToInt64();
|
||||
entity.Types = string.Join(",", requset.Types);
|
||||
|
||||
await _sqlSugar.Insertable(entity).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 记录用户当前用户版本
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("ver-log")]
|
||||
public async Task RecordVersionLog([FromBody] UserVersionLogDto userVersionLog)
|
||||
{
|
||||
var uvl = userVersionLog.Adapt<UserVersionLog>();
|
||||
uvl.UserId = UId.ToInt64();
|
||||
await _sqlSugar.Insertable(uvl).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,10 +63,11 @@ namespace WGShare.API.Controllers.Frontend
|
|||
[HttpPost("manager")]
|
||||
public async Task SetRoomManager([FromBody] RoomManagerInputDTO inputDTO)
|
||||
{
|
||||
inputDTO.SettingUserId = UId;
|
||||
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum));
|
||||
if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 32)
|
||||
if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 20)
|
||||
{
|
||||
throw Oops.Oh("房间已达到32个发言人限制。请移除一位发言人");
|
||||
throw Oops.Oh("当前房间已达最大发言人数!");
|
||||
}
|
||||
var user = users.FirstOrDefault(x => x.UID == inputDTO.UserId);
|
||||
if (user == null)
|
||||
|
|
@ -74,11 +75,13 @@ namespace WGShare.API.Controllers.Frontend
|
|||
throw Oops.Oh("用户已不在房间内!");
|
||||
}
|
||||
|
||||
user.IsRoomManager = true;
|
||||
await _hubContext.Clients.User(inputDTO.UserId).SetSpeaker(inputDTO);
|
||||
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user);
|
||||
//user.IsRoomManager = true;
|
||||
|
||||
await _hubContext.Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, UId);
|
||||
//RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user);
|
||||
|
||||
//await _hubContext.Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, UId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -104,17 +107,27 @@ namespace WGShare.API.Controllers.Frontend
|
|||
var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), inputDTO.RoomNum);
|
||||
if (showUserId == inputDTO.UserId || showUserId == user.ScreenShareId)
|
||||
{
|
||||
|
||||
//var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum));
|
||||
//var showUser = users.FirstOrDefault(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString());
|
||||
//if (showUser != null)
|
||||
//{
|
||||
|
||||
// 取消显示用户,设置显示当前操作的管理员
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), inputDTO.RoomNum, UId);
|
||||
await _hubContext.Clients.Group(inputDTO.RoomNum).ShowUser(UId, UserName, string.Empty, string.Empty);
|
||||
//}
|
||||
|
||||
if (UId == inputDTO.UserId)
|
||||
{
|
||||
// 表示自己取消自己的发言权限
|
||||
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum));
|
||||
var showUser = users.FirstOrDefault(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString());
|
||||
if (showUser != null)
|
||||
{
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), inputDTO.RoomNum, showUser.UID);
|
||||
await _hubContext.Clients.Group(inputDTO.RoomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), inputDTO.RoomNum, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 取消显示用户,设置显示当前操作的管理员
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), inputDTO.RoomNum, UId);
|
||||
await _hubContext.Clients.Group(inputDTO.RoomNum).ShowUser(UId, UserName, string.Empty, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
await _hubContext.Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, UId);
|
||||
|
|
@ -220,7 +233,7 @@ namespace WGShare.API.Controllers.Frontend
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -329,7 +342,7 @@ namespace WGShare.API.Controllers.Frontend
|
|||
userInfo.EnableMicr = enableMicr;
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo);
|
||||
|
||||
_logger.LogInformation($@"开闭麦克分,推送一次,roomNum:{roomNum},enableMicr:{enableMicr},uid:{uid}");
|
||||
//_logger.LogInformation($@"开闭麦克分,推送一次,roomNum:{roomNum},enableMicr:{enableMicr},uid:{uid}");
|
||||
// 通知所有人该用户麦克风状态
|
||||
await _hubContext.Clients.Group(roomNum).OperMicr(userInfo, UId);
|
||||
}
|
||||
|
|
@ -370,13 +383,25 @@ namespace WGShare.API.Controllers.Frontend
|
|||
}
|
||||
|
||||
// 获取全部用户
|
||||
var uids = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
|
||||
if (uids.IsNullOrEmpty())
|
||||
var userInfos = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
|
||||
if (userInfos.IsNullOrEmpty())
|
||||
{
|
||||
throw Oops.Oh("无效会议号!");
|
||||
}
|
||||
|
||||
return uids.FirstOrDefault();
|
||||
var managers = userInfos.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString());
|
||||
if (managers.IsNullOrEmpty())
|
||||
{
|
||||
return userInfos.FirstOrDefault().UID;
|
||||
}
|
||||
|
||||
var user = managers.FirstOrDefault(x => x.EnableCamera = true);
|
||||
if (user == null)
|
||||
{
|
||||
return managers.FirstOrDefault().UID;
|
||||
}
|
||||
|
||||
return user.UID;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -386,6 +411,13 @@ namespace WGShare.API.Controllers.Frontend
|
|||
[HttpPost("show-user")]
|
||||
public async Task SetShowUser([FromQuery] string roomNum, [FromQuery] string uid, [FromQuery] string uname)
|
||||
{
|
||||
|
||||
if (RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum) == uid)
|
||||
{
|
||||
// 如果已经是全员观看他了, 直接通知其他房间用户
|
||||
await _hubContext.Clients.Group(roomNum).ShowUser(uid, uname, UId, UserName);
|
||||
return;
|
||||
}
|
||||
// 设置房间全员观看用户
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, uid);
|
||||
|
||||
|
|
@ -596,10 +628,78 @@ namespace WGShare.API.Controllers.Frontend
|
|||
|
||||
if (connectionIds.Any())
|
||||
{
|
||||
await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, UserName);
|
||||
var userInfo = RedisHelper.Instance.HGet<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId);
|
||||
var userName = UserName;
|
||||
if (userInfo != null)
|
||||
{
|
||||
userName = userInfo.UserName;
|
||||
}
|
||||
await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, userName);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取共享屏幕
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("shared-screen")]
|
||||
public async Task<string> GetSharedScreen([FromQuery] string roomNum)
|
||||
{
|
||||
var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum);
|
||||
if (!string.IsNullOrWhiteSpace(showUserId) && showUserId.Length == 9)
|
||||
{
|
||||
// 全员观看userid =9 表示共享屏幕
|
||||
return showUserId;
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置共享屏幕
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("shared-screen")]
|
||||
public async Task SharedScreen([FromQuery] string roomNum)
|
||||
{
|
||||
//var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum);
|
||||
//if (showUserId.Length == 9)
|
||||
//{
|
||||
// var user = await _sqlSugar.Queryable<User>().FirstAsync(x => x.ScreenShareId == showUserId);
|
||||
// if (user != null)
|
||||
// {
|
||||
// //
|
||||
// await _hubContext.Clients.User(user.Id).ExitSharedScreen();
|
||||
// }
|
||||
//}
|
||||
|
||||
var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), UId);
|
||||
// 通知其他所有共享屏幕用户退出
|
||||
await _hubContext.Clients.GroupExcept(roomNum, connectId).ExitSharedScreen();
|
||||
|
||||
// 设置新的共享屏幕
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, ScreenShareId);
|
||||
// 通知全员观看新的共享屏幕
|
||||
await _hubContext.Clients.Group(roomNum).ShowUser(UId, UserName, string.Empty, string.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 共享人取消共享屏幕
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("stop-shared-screen")]
|
||||
public async Task StopedSharedScreen([FromQuery] string roomNum)
|
||||
{
|
||||
if (RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum) != ScreenShareId)
|
||||
{
|
||||
// 不是共享屏幕的人,不做处理
|
||||
return;
|
||||
}
|
||||
|
||||
// 设置新的共享屏幕
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, UId);
|
||||
|
||||
await _hubContext.Clients.Group(roomNum).StopedSharedScreen(ScreenShareId);
|
||||
}
|
||||
|
||||
#region 文件分享
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
using WGShare.Domain.DTOs.User;
|
||||
using SignalRSwaggerGen.Attributes;
|
||||
using WGShare.Domain.DTOs.Room;
|
||||
using WGShare.Domain.DTOs.User;
|
||||
using WGShare.Domain.Entities;
|
||||
|
||||
namespace WGShare.API.Hubs
|
||||
|
|
@ -6,6 +8,7 @@ namespace WGShare.API.Hubs
|
|||
/// <summary>
|
||||
/// 客户端消息
|
||||
/// </summary>
|
||||
[SignalRHub]
|
||||
public interface IMessageClient
|
||||
{
|
||||
/// <summary>
|
||||
|
|
@ -44,7 +47,7 @@ namespace WGShare.API.Hubs
|
|||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
Task Operation(int type);
|
||||
Task Operation(string contentString);
|
||||
|
||||
/// <summary>
|
||||
/// 更新视图
|
||||
|
|
@ -58,6 +61,12 @@ namespace WGShare.API.Hubs
|
|||
/// <returns></returns>
|
||||
Task ShowUser(string uid, string uname, string operUid, string operUserName);
|
||||
|
||||
/// <summary>
|
||||
/// 共享人取消共享屏幕
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task StopedSharedScreen(string ScreenShareId);
|
||||
|
||||
/// <summary>
|
||||
/// 用户加入频道回调
|
||||
/// </summary>
|
||||
|
|
@ -152,5 +161,29 @@ namespace WGShare.API.Hubs
|
|||
/// <param name="NickName"></param>
|
||||
/// <returns></returns>
|
||||
Task ModifyNickName(long UId, string NickName);
|
||||
|
||||
/// <summary>
|
||||
/// 退出共享屏幕
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task ExitSharedScreen();
|
||||
|
||||
/// <summary>
|
||||
/// 加入频道回调
|
||||
/// </summary>
|
||||
Task JoinChannelCallback(bool isSuccess);
|
||||
|
||||
/// <summary>
|
||||
/// 发送设置发言人指令
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task SetSpeaker(RoomManagerInputDTO inputDTO);
|
||||
|
||||
/// <summary>
|
||||
/// 客户端接收到消息
|
||||
/// </summary>
|
||||
/// <param name="contentString"></param>
|
||||
/// <returns></returns>
|
||||
Task ReceivedOperation(string contentString);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,17 +2,22 @@
|
|||
using Masuit.Tools.DateTimeExt;
|
||||
using Masuit.Tools.Maths;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using SqlSugar;
|
||||
using SqlSugar.Extensions;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Claims;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using WGShare.API.Helpers;
|
||||
using WGShare.Domain.Constant;
|
||||
using WGShare.Domain.DTOs.Room;
|
||||
using WGShare.Domain.Entities;
|
||||
using WGShare.Domain.Enums;
|
||||
using WGShare.Domain.FriendlyException;
|
||||
using ZstdSharp.Unsafe;
|
||||
|
||||
namespace WGShare.API.Hubs
|
||||
|
|
@ -41,11 +46,11 @@ namespace WGShare.API.Hubs
|
|||
Context.Items.Add("account", account);
|
||||
Context.Items.Add("ssid", ssid);
|
||||
Context.Items.Add("uname", uname);
|
||||
Context.Items.Add("roleid", roleId);
|
||||
Context.Items.Add("roleid", roleId);
|
||||
|
||||
Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId}");
|
||||
_logger.LogInformation($"{DateTime.Now}连接成功 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId}");
|
||||
|
||||
await ClearUserChannel(uid, tenant, account, ssid, false);
|
||||
//await ClearUserChannel(uid, tenant, account, ssid, false);
|
||||
// 存储在线信息
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid, Context.ConnectionId);
|
||||
}
|
||||
|
|
@ -58,11 +63,11 @@ namespace WGShare.API.Hubs
|
|||
var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value;
|
||||
|
||||
|
||||
Console.WriteLine($"{DateTime.Now}断开连接 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId} exception:{exception?.Message} ");
|
||||
_logger.LogInformation($"{DateTime.Now}断开连接 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId} exception:{exception?.Message} ");
|
||||
|
||||
if (Context.ConnectionId == RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid))
|
||||
{
|
||||
Console.WriteLine($"{DateTime.Now}断开连接 未重连,开始删除用户频道信息");
|
||||
_logger.LogInformation($"{DateTime.Now}断开连接 未重连,开始删除用户频道信息");
|
||||
// 断开后未重连则清退频道
|
||||
await ClearUserChannel(uid, tenant, account, ssid, true);
|
||||
|
||||
|
|
@ -72,17 +77,14 @@ namespace WGShare.API.Hubs
|
|||
|
||||
private async Task ClearUserChannel(string uid, string tenant, string account, string ssid, bool isclose)
|
||||
{
|
||||
Console.WriteLine($"{DateTime.Now} 执行删除开始");
|
||||
_logger.LogInformation($"{DateTime.Now} 执行删除开始");
|
||||
// 获取用户参加得频道
|
||||
var roomNum = RedisHelper.Instance.Get(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
|
||||
using (var pipe = RedisHelper.Instance.StartPipe())
|
||||
{
|
||||
Console.WriteLine($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNum)}");
|
||||
_logger.LogInformation($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNum)}");
|
||||
if (!string.IsNullOrEmpty(roomNum))
|
||||
{
|
||||
// 所有房间移除该用户
|
||||
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
|
||||
|
||||
// 判断是否全员看他,是则移除
|
||||
var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
|
||||
if value == ARGV[2] or value == ARGV[3] then
|
||||
|
|
@ -90,6 +92,9 @@ namespace WGShare.API.Hubs
|
|||
else return -1 end";
|
||||
// 执行 eval 命令
|
||||
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid);
|
||||
|
||||
// 房间移除该用户
|
||||
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
|
||||
}
|
||||
|
||||
// 删除用户在线状态
|
||||
|
|
@ -98,14 +103,31 @@ namespace WGShare.API.Hubs
|
|||
// 删除用户已加入频道信息
|
||||
pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
|
||||
|
||||
pipe.EndPipe();
|
||||
var result = pipe.EndPipe();
|
||||
|
||||
if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1)
|
||||
{
|
||||
// 如果离开的是全员看ta,则重新设置管理员为全员看ta
|
||||
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum));
|
||||
var showUsers = users.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()).ToList();
|
||||
if (!showUsers.IsNullOrEmpty())
|
||||
{
|
||||
var showUser = showUsers.FirstOrDefault(x => x.EnableCamera == true);
|
||||
if (showUser == null)
|
||||
{
|
||||
showUser = showUsers.FirstOrDefault();
|
||||
}
|
||||
// 通知全员看ta
|
||||
await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(roomNum))
|
||||
// 通知房间其他用户,该用户退出
|
||||
await Clients.Group(roomNum).UserLeave(uid);
|
||||
|
||||
Console.WriteLine($"{DateTime.Now} 执行删除完成");
|
||||
_logger.LogInformation($"{DateTime.Now} 执行删除完成");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -115,7 +137,7 @@ namespace WGShare.API.Hubs
|
|||
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
|
||||
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
|
||||
[HubMethodName("joinChannel")]
|
||||
public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = false,bool isRoomManager = false)
|
||||
public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = false, bool isRoomManager = false)
|
||||
{
|
||||
var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value;
|
||||
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value;
|
||||
|
|
@ -123,32 +145,32 @@ namespace WGShare.API.Hubs
|
|||
var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value;
|
||||
var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value;
|
||||
var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value;
|
||||
|
||||
|
||||
Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum);
|
||||
Console.WriteLine($"{DateTime.Now}加入频道 account:" + account);
|
||||
Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant);
|
||||
|
||||
var userInfo = new ChannelUserInfo
|
||||
{
|
||||
UID = uid,
|
||||
UserName = uname,
|
||||
EnableCamera = enableCamera,
|
||||
EnableMicr = enableMicr,
|
||||
ConnectId = Context.ConnectionId,
|
||||
Account = account,
|
||||
ScreenShareId = ssid,
|
||||
RoleId = roleId,
|
||||
RoleName = ((RoleEnums)roleId.ToInt32()).GetDescription(),
|
||||
IsRoomManager = isRoomManager
|
||||
};
|
||||
using (var pipe = RedisHelper.Instance.StartPipe())
|
||||
try
|
||||
{
|
||||
_logger.LogInformation($"{DateTime.Now}加入频道 会议号:" + roomNum);
|
||||
_logger.LogInformation($"{DateTime.Now}加入频道 account:" + account);
|
||||
_logger.LogInformation($"{DateTime.Now}加入频道 tenant:" + tenant);
|
||||
|
||||
if (((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager)
|
||||
var userInfo = new ChannelUserInfo
|
||||
{
|
||||
// 管理员进房,如果没有全员看ta,则设置
|
||||
var script = @"local hashKey = KEYS[1]
|
||||
UID = uid,
|
||||
UserName = uname,
|
||||
EnableCamera = enableCamera,
|
||||
EnableMicr = enableMicr,
|
||||
ConnectId = Context.ConnectionId,
|
||||
Account = account,
|
||||
ScreenShareId = ssid,
|
||||
RoleId = roleId,
|
||||
RoleName = ((RoleEnums)roleId.ToInt32()).GetDescription(),
|
||||
IsRoomManager = isRoomManager
|
||||
};
|
||||
using (var pipe = RedisHelper.Instance.StartPipe())
|
||||
{
|
||||
|
||||
if (((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager)
|
||||
{
|
||||
// 管理员进房,如果没有全员看ta,则设置
|
||||
var script = @"local hashKey = KEYS[1]
|
||||
local field = ARGV[1]
|
||||
local value = ARGV[2]
|
||||
|
||||
|
|
@ -158,25 +180,34 @@ namespace WGShare.API.Hubs
|
|||
else
|
||||
return 0
|
||||
end";
|
||||
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid);
|
||||
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid);
|
||||
|
||||
}
|
||||
|
||||
// 记录频道得用户信息
|
||||
pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo);
|
||||
// 记录用户已参与频道
|
||||
pipe.Set(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum);
|
||||
var results = pipe.EndPipe();
|
||||
|
||||
// 判断,如果有全员看ta,则通知
|
||||
if ((((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager) && !results.IsNullOrEmpty() && results[0].ObjToInt() == 1)
|
||||
await Clients.Group(roomNum).ShowUser(uid, uname, string.Empty, string.Empty);
|
||||
}
|
||||
await Groups.AddToGroupAsync(Context.ConnectionId, roomNum);
|
||||
await Clients.GroupExcept(roomNum, Context.ConnectionId).UserJoined(userInfo);
|
||||
|
||||
// 记录频道得用户信息
|
||||
pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo);
|
||||
// 记录用户已参与频道
|
||||
pipe.Set(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum);
|
||||
var results = pipe.EndPipe();
|
||||
await Clients.Caller.JoinChannelCallback(true);
|
||||
|
||||
// 判断,如果有全员看ta,则通知
|
||||
if ((((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager) && !results.IsNullOrEmpty() && results[0].ObjToInt() == 1)
|
||||
await Clients.Group(roomNum).ShowUser(uid, uname, string.Empty, string.Empty);
|
||||
}
|
||||
await Groups.AddToGroupAsync(Context.ConnectionId, roomNum);
|
||||
await Clients.GroupExcept(roomNum, Context.ConnectionId).UserJoined(userInfo);
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
await Clients.Caller.JoinChannelCallback(false);
|
||||
_logger.LogError(ex, $@"加入频道异常,tenant:{tenant},uid:{uid},ssid:{ssid},uname:{uname} {Environment.NewLine}{ex.Message}");
|
||||
await ExceptionNotice.SendAsync(ex, $@"加入频道异常,tenant:{tenant},uid:{uid},ssid:{ssid},uname:{uname} ");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 离开频道
|
||||
/// </summary>
|
||||
|
|
@ -192,9 +223,9 @@ namespace WGShare.API.Hubs
|
|||
var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value;
|
||||
|
||||
|
||||
Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum);
|
||||
Console.WriteLine($" {DateTime.Now}离开频道 account:" + account);
|
||||
Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant);
|
||||
_logger.LogInformation($" {DateTime.Now}离开频道 会议号:" + roomNum);
|
||||
_logger.LogInformation($" {DateTime.Now}离开频道 account:" + account);
|
||||
_logger.LogInformation($" {DateTime.Now}离开频道 tenant:" + tenant);
|
||||
|
||||
using (var pipe = RedisHelper.Instance.StartPipe())
|
||||
{
|
||||
|
|
@ -212,10 +243,16 @@ namespace WGShare.API.Hubs
|
|||
var result = pipe.EndPipe();
|
||||
if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1)
|
||||
{
|
||||
// 如果离开的是全员看ta,则重新设置管理员为全员看ta
|
||||
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum));
|
||||
var showUser = users.FirstOrDefault(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString());
|
||||
if (showUser != null)
|
||||
var showUsers = users.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()).ToList();
|
||||
if (!showUsers.IsNullOrEmpty())
|
||||
{
|
||||
var showUser = showUsers.FirstOrDefault(x => x.EnableCamera == true);
|
||||
if (showUser == null)
|
||||
{
|
||||
showUser = showUsers.FirstOrDefault();
|
||||
}
|
||||
// 通知全员看ta
|
||||
await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty);
|
||||
}
|
||||
|
|
@ -237,12 +274,18 @@ namespace WGShare.API.Hubs
|
|||
{
|
||||
var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value;
|
||||
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value;
|
||||
var tenant = Context.Items["tenant"].ToString();
|
||||
|
||||
_logger.LogInformation($" {DateTime.Now} 发送消息 uname:{uname} roomNum:{rooNum} msg:{msg}");
|
||||
|
||||
Console.WriteLine($" {DateTime.Now}发送消息 uname:" + uname);
|
||||
Console.WriteLine($" {DateTime.Now}发送消息 roomNum:" + rooNum);
|
||||
Console.WriteLine($" {DateTime.Now}发送消息 msg:" + msg);
|
||||
var userInfo = RedisHelper.Instance.HGet<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, rooNum), uid);
|
||||
var userName = uname;
|
||||
if (userInfo != null)
|
||||
{
|
||||
userName = userInfo.UserName;
|
||||
}
|
||||
|
||||
await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, uname, msg, DateTime.Now.GetTotalMilliseconds()); //await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg);
|
||||
await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, userName, msg, DateTime.Now.GetTotalMilliseconds()); //await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -250,9 +293,21 @@ namespace WGShare.API.Hubs
|
|||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HubMethodName("sendOper")]
|
||||
public async Task SendOperation(string roomNum, int type)
|
||||
public async Task SendOperation(string roomNum, string contentString)
|
||||
{
|
||||
await Clients.Group(roomNum).Operation(type);
|
||||
await Clients.Group(roomNum).Operation(contentString);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送客户端指令到指定用户
|
||||
/// </summary>
|
||||
/// <param name="uid"></param>
|
||||
/// <param name="contentString"></param>
|
||||
/// <returns></returns>
|
||||
[HubMethodName("sendOper2User")]
|
||||
public async Task SendOperationToUser(string uid, string contentString)
|
||||
{
|
||||
await Clients.User(uid).ReceivedOperation(contentString);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -290,5 +345,32 @@ namespace WGShare.API.Hubs
|
|||
{
|
||||
await Clients.User(uid).SaveDriver(driversJsonString);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发言人设置成功回调
|
||||
/// </summary>
|
||||
/// <param name="inputDTO"></param>
|
||||
/// <returns></returns>
|
||||
[HubMethodName("setSpeakerCallback")]
|
||||
public async Task SetSpeakerCallback(RoomManagerInputDTO inputDTO)
|
||||
{
|
||||
var tenantId = Context.Items["tenant"].ToString();
|
||||
|
||||
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenantId, inputDTO.RoomNum));
|
||||
//if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 20)
|
||||
//{
|
||||
// throw Oops.Oh("房间已达到20个发言人限制。请移除一位发言人");
|
||||
//}
|
||||
var user = users.FirstOrDefault(x => x.UID == inputDTO.UserId);
|
||||
if (user == null)
|
||||
{
|
||||
throw Oops.Oh("用户已不在房间内!");
|
||||
}
|
||||
user.IsRoomManager = true;
|
||||
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenantId, inputDTO.RoomNum), inputDTO.UserId, user);
|
||||
|
||||
await Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, inputDTO.SettingUserId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ namespace WGShare.API
|
|||
});
|
||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwagger();
|
||||
builder.Services.AddSwagger();
|
||||
builder.Services.AddSignalR();
|
||||
builder.Services.AddHttpClient();
|
||||
builder.Services.ConfigureHangfire();
|
||||
|
|
@ -99,7 +99,6 @@ namespace WGShare.API
|
|||
options.SwaggerEndpoint($"/swagger/frontend/swagger.json", "ǰ¶Ë");
|
||||
options.SwaggerEndpoint($"/swagger/backend/swagger.json", "ºó¶Ë");
|
||||
options.SwaggerEndpoint($"/swagger/public/swagger.json", "¹«¹²½Ó¿Ú");
|
||||
|
||||
});
|
||||
app.UseCustomCors();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ namespace WGShare.API.ServiceConfigs
|
|||
{
|
||||
services.AddSwaggerGen(w =>
|
||||
{
|
||||
w.AddSignalRSwaggerGen();
|
||||
w.SwaggerDoc("frontend", new OpenApiInfo { Title = "前端", Version = "frontend" });
|
||||
w.SwaggerDoc("backend", new OpenApiInfo { Title = "后端", Version = "backend" });
|
||||
w.SwaggerDoc("public", new OpenApiInfo { Title = "公共接口", Version = "public" });
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.14" />
|
||||
<PackageReference Include="Hangfire.Core" Version="1.8.14" />
|
||||
<PackageReference Include="Hangfire.MemoryStorage" Version="1.8.1.1" />
|
||||
<PackageReference Include="SignalRSwaggerGen" Version="4.7.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,13 @@
|
|||
<param name="account"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.AuthController.CheckUserOnline(System.String)">
|
||||
<summary>
|
||||
检查用户是否在线
|
||||
</summary>
|
||||
<param name="account"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.AuthController.Login(WGShare.Domain.DTOs.Login.UserLoginDTO)">
|
||||
<summary>
|
||||
正常账号登录
|
||||
|
|
@ -156,6 +163,18 @@
|
|||
<param name="roomNum"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.Frontend.HomeController.FeedbackScoring(WGShare.Domain.DTOs.Home.FeedBackRequset)">
|
||||
<summary>
|
||||
反馈打分
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.Frontend.HomeController.RecordVersionLog(WGShare.Domain.DTOs.Home.UserVersionLogDto)">
|
||||
<summary>
|
||||
记录用户当前用户版本
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:WGShare.API.Controllers.Frontend.RoomController">
|
||||
<summary>
|
||||
会议室接口
|
||||
|
|
@ -280,6 +299,24 @@
|
|||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.Frontend.RoomController.GetSharedScreen(System.String)">
|
||||
<summary>
|
||||
获取共享屏幕
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.Frontend.RoomController.SharedScreen(System.String)">
|
||||
<summary>
|
||||
设置共享屏幕
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.Frontend.RoomController.StopedSharedScreen(System.String)">
|
||||
<summary>
|
||||
共享人取消共享屏幕
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Controllers.Frontend.RoomController.AddFile(WGShare.Domain.DTOs.File.ShareFileInputDTO)">
|
||||
<summary>
|
||||
分享上传文件
|
||||
|
|
@ -582,7 +619,7 @@
|
|||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.Operation(System.Int32)">
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.Operation(System.String)">
|
||||
<summary>
|
||||
客户端操作
|
||||
</summary>
|
||||
|
|
@ -601,6 +638,12 @@
|
|||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.StopedSharedScreen(System.String)">
|
||||
<summary>
|
||||
共享人取消共享屏幕
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.UserJoined(WGShare.Domain.Entities.ChannelUserInfo)">
|
||||
<summary>
|
||||
用户加入频道回调
|
||||
|
|
@ -696,6 +739,30 @@
|
|||
<param name="NickName"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.ExitSharedScreen">
|
||||
<summary>
|
||||
退出共享屏幕
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.JoinChannelCallback(System.Boolean)">
|
||||
<summary>
|
||||
加入频道回调
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.SetSpeaker(WGShare.Domain.DTOs.Room.RoomManagerInputDTO)">
|
||||
<summary>
|
||||
发送设置发言人指令
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.IMessageClient.ReceivedOperation(System.String)">
|
||||
<summary>
|
||||
客户端接收到消息
|
||||
</summary>
|
||||
<param name="contentString"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.SessionManageHub.JoinChannel(System.String,System.Boolean,System.Boolean,System.Boolean)">
|
||||
<summary>
|
||||
加入频道
|
||||
|
|
@ -717,12 +784,20 @@
|
|||
<param name="rooNum"></param>
|
||||
<param name="msg"></param>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.SessionManageHub.SendOperation(System.String,System.Int32)">
|
||||
<member name="M:WGShare.API.Hubs.SessionManageHub.SendOperation(System.String,System.String)">
|
||||
<summary>
|
||||
发送客户端指令
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.SessionManageHub.SendOperationToUser(System.String,System.String)">
|
||||
<summary>
|
||||
发送客户端指令到指定用户
|
||||
</summary>
|
||||
<param name="uid"></param>
|
||||
<param name="contentString"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.SessionManageHub.GetDriversList(System.String)">
|
||||
<summary>
|
||||
获取设备列表
|
||||
|
|
@ -745,6 +820,13 @@
|
|||
<param name="driversJsonString"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Hubs.SessionManageHub.SetSpeakerCallback(WGShare.Domain.DTOs.Room.RoomManagerInputDTO)">
|
||||
<summary>
|
||||
发言人设置成功回调
|
||||
</summary>
|
||||
<param name="inputDTO"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:WGShare.API.Program.ResetRedisKey">
|
||||
<summary>
|
||||
程序启动前,删除redis中得数据
|
||||
|
|
|
|||
|
|
@ -36,12 +36,12 @@
|
|||
"Issuer": "WGshareApi",
|
||||
"Audience": "WGshareClient",
|
||||
// 过期 秒
|
||||
"Expires": 86400
|
||||
"Expires": 600000
|
||||
},
|
||||
"Agora": {
|
||||
"appId": "4a4f7be64fa1404ebda74784fe9ac381",
|
||||
"appSecret": "255e05d96c794251b282a0de84242355",
|
||||
"tokenExpireTimeInSecond": 7200,
|
||||
"tokenExpireTimeInSecond": 86400,
|
||||
"apiPrefix": "https://api.sd-rtn.com/",
|
||||
"clientId": "80cdc24f7dfa4497a37d98da95a3c4a4",
|
||||
"clientSecret": "8323581d4d464114b1f324b26cc62e09",
|
||||
|
|
|
|||
|
|
@ -13,20 +13,20 @@
|
|||
"SecretKey": "apDbztyqjSNuvWnezhbdUxduhDidZbF897t2uTJs53RMdY9Cai7eexavBhka3HN6mcTe9oohjFg6bNffRRkcfMqnVKNBnmyPzkRgNopHGJAL7KMwkeZdZ7BaWnT57jCi11",
|
||||
"Issuer": "WGshareApi",
|
||||
"Audience": "WGshareClient",
|
||||
// 过期 秒
|
||||
"Expires": 86400
|
||||
// 过期 秒 360 天
|
||||
"Expires": 31104000
|
||||
},
|
||||
"ConnectionStrings": {
|
||||
"metting": "Database=metting;Server=rds-proxy-internal.rwlb.cn-chengdu.rds.aliyuncs.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;",
|
||||
"usercenter": "Database=usercenter;Server=rds-proxy-internal.rwlb.cn-chengdu.rds.aliyuncs.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;"
|
||||
"metting": "Database=metting;Server=rds-external.23544.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;",
|
||||
"usercenter": "Database=usercenter;Server=rds-external.23544.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;"
|
||||
},
|
||||
"Redis": {
|
||||
"master": "172.29.33.83:16379,password=poiuyt)(*&^%,defaultDatabase=6,prefix=wgshare:"
|
||||
"master": "redis-internal.23544.com:16379,password=poiuyt)(*&^%,defaultDatabase=6,prefix=wgshare:"
|
||||
},
|
||||
"Agora": {
|
||||
"appId": "dcfc466a6ecb4a1f972630065dfb1e75",
|
||||
"appSecret": "fc77000e329b4be7a0e26fa789e20d00",
|
||||
"tokenExpireTimeInSecond": 7200,
|
||||
"tokenExpireTimeInSecond": 72000,
|
||||
"apiPrefix": "https://api.sd-rtn.com/",
|
||||
"clientId": "80cdc24f7dfa4497a37d98da95a3c4a4",
|
||||
"clientSecret": "8323581d4d464114b1f324b26cc62e09",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using WGShare.Domain.Enums;
|
||||
|
||||
namespace WGShare.Domain.DTOs.Home
|
||||
{
|
||||
public class FeedBackRequset
|
||||
{
|
||||
/// <summary>
|
||||
/// 分值
|
||||
/// </summary>
|
||||
public double Score { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 反馈内容
|
||||
/// </summary>
|
||||
public string OtherContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 反馈类型
|
||||
/// </summary>
|
||||
public List<int> Types { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
using SqlSugar;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Yitter.IdGenerator;
|
||||
|
||||
namespace WGShare.Domain.DTOs.Home
|
||||
{
|
||||
public class UserVersionLogDto
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 使用版本
|
||||
///</summary>
|
||||
public string Version { get; set; }
|
||||
/// <summary>
|
||||
/// 平台类型 1:PC 2:微信小程序
|
||||
///</summary>
|
||||
public int PlatformType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 房间号
|
||||
///</summary>
|
||||
public string RoomNum { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -12,5 +12,9 @@ namespace WGShare.Domain.DTOs.Room
|
|||
public string RoomId { get; set; }
|
||||
public string RoomNum { get; set; }
|
||||
public string UserId { get; set; }
|
||||
/// <summary>
|
||||
/// 设置人Id
|
||||
/// </summary>
|
||||
public string SettingUserId { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SqlSugar;
|
||||
using WGShare.Domain.Enums;
|
||||
using Yitter.IdGenerator;
|
||||
namespace WGShare.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 反馈问题表
|
||||
///</summary>
|
||||
[SugarTable("feedback_issue")]
|
||||
public class FeedbackIssue
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
|
||||
public string Id { get; set; } = YitIdHelper.NextId().ToString();
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// 默认值: CURRENT_TIMESTAMP
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "create_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户id
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "uid")]
|
||||
public long UID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分值
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "score")]
|
||||
public double Score { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 反馈其他
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "other_content")]
|
||||
public string OtherContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 反馈其他
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "types")]
|
||||
public string Types { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -68,5 +68,12 @@ namespace WGShare.Domain.Entities
|
|||
///</summary>
|
||||
[SugarColumn(ColumnName = "allow_anonymous")]
|
||||
public bool AllowAnonymous { get; set; } = true;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 租户名称
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string TenantName { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
using SqlSugar;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Principal;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Yitter.IdGenerator;
|
||||
|
||||
namespace WGShare.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户版本记录表
|
||||
/// </summary>
|
||||
[SugarTable("user_version_log")]
|
||||
public class UserVersionLog
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
|
||||
public string Id { get; set; } = YitIdHelper.NextId().ToString();
|
||||
/// <summary>
|
||||
/// 用户Id
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "user_id")]
|
||||
public long UserId { get; set; }
|
||||
/// <summary>
|
||||
/// 使用版本
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "version")]
|
||||
public string Version { get; set; }
|
||||
/// <summary>
|
||||
/// 平台类型
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "platform_type")]
|
||||
public int PlatformType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 房间号
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "room_num")]
|
||||
public string RoomNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 进房时间
|
||||
///</summary>
|
||||
[SugarColumn(ColumnName = "join_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]
|
||||
public DateTime JoinTime { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace WGShare.Domain.Enums
|
||||
{
|
||||
/// <summary>
|
||||
/// 反馈问题枚举
|
||||
/// </summary>
|
||||
public enum FeedbackIssueEnums
|
||||
{
|
||||
/// <summary>
|
||||
/// 其他
|
||||
/// </summary>
|
||||
Other = 1,
|
||||
/// <summary>
|
||||
/// 软件卡顿
|
||||
/// </summary>
|
||||
SoftwareLag = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 设计不合理
|
||||
/// </summary>
|
||||
UnreasonableDesign = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 功能太少
|
||||
/// </summary>
|
||||
TooLittleFeatures = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 通话不流畅
|
||||
/// </summary>
|
||||
CallIsNotSmooth = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 视频卡顿
|
||||
/// </summary>
|
||||
VideoLag = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 操作麻烦
|
||||
/// </summary>
|
||||
OperationTrouble
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
using System.Net.Http.Json;
|
||||
using WGShare.Domain.DTOs.AgoraCallback;
|
||||
using WGShare.Domain.Entities;
|
||||
|
||||
namespace WGShare.Domain.FriendlyException
|
||||
{
|
||||
|
|
@ -41,7 +42,7 @@ namespace WGShare.Domain.FriendlyException
|
|||
|
||||
}
|
||||
|
||||
public static async Task JoinAsync(EventBody eventBody)
|
||||
public static async Task JoinAsync(EventBody eventBody, Room roomInfo)
|
||||
{
|
||||
// 获取当前的日期
|
||||
DateTime today = DateTime.Today;
|
||||
|
|
@ -69,7 +70,7 @@ namespace WGShare.Domain.FriendlyException
|
|||
markdown = new
|
||||
{
|
||||
title = "有人入会通知",
|
||||
text = $"有人进入会议室了,会议号:{eventBody.payload.channelName},点击查看:https://analytics-lab.agora.io/analytics/call/search?projectId=0tOpVUrmf&fromTs={startTimestamp}&toTs={endTimestamp}"
|
||||
text = $"有人进入会议室了,学校:{roomInfo.TenantName},会议室名称:{roomInfo.RoomName},会议号:{eventBody.payload.channelName}. \r\n 点击查看:https://analytics-lab.agora.io/analytics/call/search?projectId=0tOpVUrmf&fromTs={startTimestamp}&toTs={endTimestamp}"
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue