diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 5f4f8ca..470baaa 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -120,7 +120,7 @@ namespace WGShare.API.Controllers.Frontend result.ForEach(x => { - x.IsManager = managerIds.Contains(x.Id); + x.IsManager = (x.RoleId == "1" || managerIds.Contains(x.Id)); var info = channelUsers.FirstOrDefault(q => q.UID == x.Id); if (info != null) { @@ -257,10 +257,16 @@ namespace WGShare.API.Controllers.Frontend { return; } - allUsers.ForEach(x => x.Value.EnableMicr = enableMicr); + allUsers.ForEach(x => + { + if (x.Key != uid) + { + x.Value.EnableMicr = enableMicr; + } + }); RedisHelper.Instance.HMSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), allUsers); - await _hubContext.Clients.Group(roomNum).OperMicr(enableMicr); + await _hubContext.Clients.GroupExcept(roomNum, allUsers[uid].ConnectId).OperMicr(enableMicr); await _hubContext.Clients.Group(roomNum).RefreshUserList(); return; } @@ -294,11 +300,19 @@ namespace WGShare.API.Controllers.Frontend { return; } - allUsers.ForEach(x => x.Value.EnableCamera = enableCamera); + allUsers.ForEach(x => + { + if (x.Key != uid) + { + x.Value.EnableCamera = enableCamera; + } + }); + + //allUsers.ForEach(x => x.Value.EnableCamera = enableCamera); RedisHelper.Instance.HMSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), allUsers); // 全员开关闭摄像头 - await _hubContext.Clients.Group(roomNum).OperCamera(enableCamera); + await _hubContext.Clients.GroupExcept(roomNum, allUsers[uid].ConnectId).OperCamera(enableCamera); await _hubContext.Clients.Group(roomNum).RefreshUserList(); return; } @@ -317,7 +331,16 @@ namespace WGShare.API.Controllers.Frontend await _hubContext.Clients.Group(roomNum).RefreshUserList(); } - + /// + /// 同步视图 + /// + /// + /// + [HttpGet("sync-view")] + public async Task ChangeView([FromQuery] string roomNum, [FromQuery] string type) + { + await _hubContext.Clients.Groups(roomNum).RefreshView(type); + } #region 文件分享 /// diff --git a/WGShare.API/Controllers/Frontend/UserController.cs b/WGShare.API/Controllers/Frontend/UserController.cs index 7e35e56..1c41231 100644 --- a/WGShare.API/Controllers/Frontend/UserController.cs +++ b/WGShare.API/Controllers/Frontend/UserController.cs @@ -2,6 +2,8 @@ using Microsoft.AspNetCore.Mvc; using SqlSugar; using WGShare.API.Controllers.Basic; +using WGShare.API.Helpers; +using WGShare.Domain.Constant; using WGShare.Domain.DTOs.User; using WGShare.Domain.Entities; using WGShare.Domain.FriendlyException; @@ -29,14 +31,19 @@ namespace WGShare.API.Controllers.Frontend /// 翻页信息 /// [HttpGet("list")] - public async Task> GetUserList([FromQuery] string? searchKeywod, [FromQuery] PagedBaseDto pagedBaseDto) + public async Task> GetUserList([FromQuery] string? searchKeywod, [FromQuery] bool? isOnline, [FromQuery] PagedBaseDto pagedBaseDto) { RefAsync total = 0; + // 获取在线用户id + var onlineUid = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId)); + var list = await _sqlSugar.Queryable() .InnerJoin((u, r) => u.RoleId == r.Id) .Where((u, r) => u.IsDelete == false && u.TenantId == TenantId) .WhereIF(!string.IsNullOrWhiteSpace(searchKeywod), (u, r) => u.UserName.Contains(searchKeywod) || u.Account.Contains(searchKeywod)) + .WhereIF(isOnline.HasValue && isOnline.Value == true, (u, r) => onlineUid.Contains(u.Id)) + .WhereIF(isOnline.HasValue && isOnline.Value == false, (u, r) => !onlineUid.Contains(u.Id)) .Select((u, r) => new UserOutputDTO { Id = u.Id, @@ -47,6 +54,9 @@ namespace WGShare.API.Controllers.Frontend }) .ToPageListAsync(pagedBaseDto.PageIndex, pagedBaseDto.PageSize, total); + + list.ForEach(x => x.IsOnline = onlineUid.Contains(x.Id)); + return PagedResult.Create(list, total.Value); } diff --git a/WGShare.API/Hubs/IMessageClient.cs b/WGShare.API/Hubs/IMessageClient.cs index 395980d..7d6911b 100644 --- a/WGShare.API/Hubs/IMessageClient.cs +++ b/WGShare.API/Hubs/IMessageClient.cs @@ -50,11 +50,17 @@ /// Task RefreshUserList(); - ///// - ///// 客户端操作 - ///// - ///// - ///// - //Task Operation(int type); + /// + /// 客户端操作 + /// + /// + /// + Task Operation(int type); + + /// + /// 更新视图 + /// + /// + Task RefreshView(string type); } } diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index e7d2762..c6b8bfd 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -131,15 +131,15 @@ namespace WGShare.API.Hubs await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); } - ///// - ///// 发送客户端指令 - ///// - ///// - //[HubMethodName("sendOper")] - //public async Task SendOperation(string roomNum, int type) - //{ - // await Clients.Group(roomNum).Operation(type); - //} - + /// + /// 发送客户端指令 + /// + /// + [HubMethodName("sendOper")] + public async Task SendOperation(string roomNum, int type) + { + await Clients.Group(roomNum).Operation(type); + } + } } diff --git a/WGShare.API/Program.cs b/WGShare.API/Program.cs index 4cf627f..2632b97 100644 --- a/WGShare.API/Program.cs +++ b/WGShare.API/Program.cs @@ -2,11 +2,13 @@ using Hangfire; using Hangfire.MemoryStorage; using Masuit.Tools; using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.FileSystemGlobbing.Internal; using Microsoft.OpenApi.Models; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using SqlSugar; +using System.Linq; using WGShare.API.BackgroudServices; using WGShare.API.Helpers; using WGShare.API.Hubs; @@ -19,7 +21,9 @@ namespace WGShare.API { public static void Main(string[] args) { + var builder = WebApplication.CreateBuilder(args); + var configuration = builder.Configuration; // Add services to the container. @@ -30,6 +34,8 @@ namespace WGShare.API Deserialize = (x, t) => JsonConvert.DeserializeObject(x, t), //DeserializeRaw = (x, t) => JsonConvert.DeserializeObject(x, t), }); + ResetRedisKey(); + builder.Services.AddControllers(options => { // ȫ쳣ڴ д try catch @@ -78,6 +84,7 @@ namespace WGShare.API var app = builder.Build(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { @@ -103,5 +110,33 @@ namespace WGShare.API app.Run(); } + + /// + /// ǰɾredisе + /// + private static void ResetRedisKey() + { + Console.WriteLine($@"ʼǰִRedisʼ..."); + + var keys = new List(); + long nextCursor = 0; + do + { + var scanResult = RedisHelper.Instance.Scan(nextCursor, "wgshare:*", 1000, ""); + nextCursor = scanResult.cursor; + var items = scanResult.items; + keys.AddRange(items); + } + while (nextCursor != 0); + + var keysArr = keys.ConvertAll(x => x.Replace("wgshare:", "")).Distinct().ToArray(); + if (!keysArr.IsNullOrEmpty()) + { + Console.WriteLine($@"ɾֵ{Environment.NewLine}{string.Join(Environment.NewLine, keysArr)}"); + RedisHelper.Instance.Del(keysArr); + } + + Console.WriteLine("ִ,ʼRedis"); + } } } diff --git a/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs b/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs index ef6cae4..c0ccaaf 100644 --- a/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs +++ b/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs @@ -43,7 +43,7 @@ namespace WGShare.API.ServiceConfigs db.Aop.OnLogExecuting = (sql, pars) => { // 打印 Sql 语句 - Console.WriteLine($@"{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($"参数:{db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))}"); }; @@ -53,7 +53,7 @@ namespace WGShare.API.ServiceConfigs { //执行完了可以输出SQL执行时间 Console.WriteLine("Sql用时:" + db.Ado.SqlExecutionTime.ToString()); - Console.WriteLine($@"{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)}"); }; } }); diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index 3ece757..5d917e6 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -143,6 +143,13 @@ + + + 同步视图 + + + + 分享上传文件 @@ -178,7 +185,7 @@ 文件Id - + 获取用户列表 @@ -332,6 +339,19 @@ + + + 客户端操作 + + + + + + + 更新视图 + + + 加入频道 @@ -353,6 +373,17 @@ + + + 发送客户端指令 + + + + + + 程序启动前,删除redis中得数据 + + 添加认证和授权 diff --git a/WGShare.Domain/DTOs/User/UserOutputDTO.cs b/WGShare.Domain/DTOs/User/UserOutputDTO.cs index 38f148a..e3ff39d 100644 --- a/WGShare.Domain/DTOs/User/UserOutputDTO.cs +++ b/WGShare.Domain/DTOs/User/UserOutputDTO.cs @@ -35,5 +35,10 @@ namespace WGShare.Domain.DTOs.User /// 是否关闭摄像头 /// public bool EnableCamera { get; set; } + + /// + /// 是否在线 + /// + public bool IsOnline { get; set; } } }