From bc901d928f7a5bf0c10f9c9eecdc7ccfcd3b3d23 Mon Sep 17 00:00:00 2001 From: youngq Date: Fri, 13 Dec 2024 11:40:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E9=AA=8C=E6=88=BF=E9=97=B4=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=AD=98=E5=9C=A8=20=EF=BC=8C=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E5=8C=BF=E5=90=8D=E7=94=A8=E6=88=B7=E6=A3=80=E9=AA=8C=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=20=E7=99=BB=E5=BD=95token=E6=96=B0=E5=A2=9E=E5=8C=BF?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E6=AE=B5=20=E6=96=B0=E5=A2=9E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=9C=A8=E4=BC=9A=E6=98=B5=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WGShare.API/AntDeploy.json | 4 +- WGShare.API/Controllers/AuthController.cs | 11 ++-- .../Controllers/Basic/BasicController.cs | 30 +++++++++-- .../Controllers/Frontend/HomeController.cs | 8 +-- .../Controllers/Frontend/RoomController.cs | 50 +++++++++++++++++-- WGShare.API/Hubs/IMessageClient.cs | 8 +++ WGShare.API/WGShare.API.xml | 20 ++++++++ WGShare.Domain/DTOs/Room/RoomInputDTO.cs | 6 +++ .../DTOs/User/UserModifyNickNameDto.cs | 15 ++++++ WGShare.Domain/Entities/Room.cs | 6 +++ 10 files changed, 141 insertions(+), 17 deletions(-) create mode 100644 WGShare.Domain/DTOs/User/UserModifyNickNameDto.cs diff --git a/WGShare.API/AntDeploy.json b/WGShare.API/AntDeploy.json index 83bbf8a..20d2005 100644 --- a/WGShare.API/AntDeploy.json +++ b/WGShare.API/AntDeploy.json @@ -115,11 +115,11 @@ "DockerConfig": { "Prot": "5192:5192", "AspNetCoreEnv": "", - "LastEnvName": "marking001", + "LastEnvName": "29dev", "RemoveDaysFromPublished": "10", "WorkDir": "", "Volume": "", - "Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Production -e TZ=Asia/Shanghai", + "Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Development -e TZ=Asia/Shanghai", "EnvPairList": [ { "EnvName": "29dev", diff --git a/WGShare.API/Controllers/AuthController.cs b/WGShare.API/Controllers/AuthController.cs index 6a6b0ec..3f81065 100644 --- a/WGShare.API/Controllers/AuthController.cs +++ b/WGShare.API/Controllers/AuthController.cs @@ -94,6 +94,7 @@ namespace WGShare.API.Controllers btnAutn.Add(new Claim("ssid", user.ScreenShareId)); btnAutn.Add(new Claim("year", user.Year.ToString())); btnAutn.Add(new Claim("subject", ((int)user.Subject).ToString())); + btnAutn.Add(new Claim("anonymous", user.IsAnonymous ? "1" : "0")); // 获取已登录的token var tokens = RedisHelper.Instance.Get(RedisKeyConstant.Data.GetAccessTokenKey(user.Id)); @@ -169,6 +170,7 @@ namespace WGShare.API.Controllers btnAutn.Add(new Claim("ssid", user.ScreenShareId)); btnAutn.Add(new Claim("year", user.Year.ToString())); btnAutn.Add(new Claim("subject", ((int)user.Subject).ToString())); + btnAutn.Add(new Claim("anonymous", user.IsAnonymous ? "1" : "0")); var accessToken = _jwtHelper.CreateToken(user.Id, btnAutn); var refreshTokenNew = Guid.NewGuid().ToString(); @@ -251,10 +253,10 @@ namespace WGShare.API.Controllers } // 修改用户名 - await _sqlSugar.Updateable() - .SetColumns(x => x.UserName == loginDTO.NickName) - .Where(x => x.Id == user.Id) - .ExecuteCommandHasChangeAsync(); + await _sqlSugar.Updateable() + .SetColumns(x => x.UserName == loginDTO.NickName) + .Where(x => x.Id == user.Id) + .ExecuteCommandHasChangeAsync(); } var btnAutn = new List(); @@ -264,6 +266,7 @@ namespace WGShare.API.Controllers btnAutn.Add(new Claim("account", user.Account)); btnAutn.Add(new Claim("uname", loginDTO.NickName)); btnAutn.Add(new Claim("ssid", user.ScreenShareId)); + btnAutn.Add(new Claim("anonymous", user.IsAnonymous ? "1" : "0")); var accessToken = _jwtHelper.CreateToken(user.Id, btnAutn); return Ok(new diff --git a/WGShare.API/Controllers/Basic/BasicController.cs b/WGShare.API/Controllers/Basic/BasicController.cs index 6614270..c4ec312 100644 --- a/WGShare.API/Controllers/Basic/BasicController.cs +++ b/WGShare.API/Controllers/Basic/BasicController.cs @@ -58,7 +58,7 @@ namespace WGShare.API.Controllers.Basic { get { - var roleId = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "roleid").Value; + var roleId = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value; if (string.IsNullOrWhiteSpace(roleId) || !int.TryParse(roleId, out int role) || role == 0) { throw Oops.Oh("用户信息有误,请重新登录"); @@ -72,7 +72,7 @@ namespace WGShare.API.Controllers.Basic { get { - var tenant = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "tenant").Value; + var tenant = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; if (string.IsNullOrWhiteSpace(tenant)) { throw Oops.Oh("用户信息有误,请重新登录"); @@ -85,7 +85,7 @@ namespace WGShare.API.Controllers.Basic { get { - var ssId = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "ssid").Value; + var ssId = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; if (string.IsNullOrWhiteSpace(ssId)) { throw Oops.Oh("用户信息有误,请重新登录"); @@ -121,7 +121,7 @@ namespace WGShare.API.Controllers.Basic return year; } - var year_str = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "year").Value; + var year_str = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "year")?.Value; if (string.IsNullOrWhiteSpace(year_str) || !int.TryParse(year_str, out year)) { throw Oops.Oh("用户信息有误,请重新登录"); @@ -140,7 +140,7 @@ namespace WGShare.API.Controllers.Basic return (SubjectType)subject; } - var subject_str = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "subject").Value; + var subject_str = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "subject")?.Value; if (string.IsNullOrWhiteSpace(subject_str) || !int.TryParse(subject_str, out subject)) { throw Oops.Oh("用户信息有误,请重新登录"); @@ -149,5 +149,25 @@ namespace WGShare.API.Controllers.Basic } } + /// + /// 匿名用户 + /// + public bool IsAnonymous + { + get + { + if (!HttpContext.User.Identity.IsAuthenticated) + { + return true; + } + var anonymous_str = HttpContext.User.Claims.FirstOrDefault(x => x.Type == "anonymous")?.Value; + if (string.IsNullOrWhiteSpace(anonymous_str) || !int.TryParse(anonymous_str, out int anonymous)) + { + return false; + } + return anonymous == 1; + } + } + } } diff --git a/WGShare.API/Controllers/Frontend/HomeController.cs b/WGShare.API/Controllers/Frontend/HomeController.cs index 5cf3f4c..096400f 100644 --- a/WGShare.API/Controllers/Frontend/HomeController.cs +++ b/WGShare.API/Controllers/Frontend/HomeController.cs @@ -109,7 +109,9 @@ namespace WGShare.API.Controllers.Frontend entity.Id = YitIdHelper.NextId().ToString(); entity.TenantId = TenantId; - if (await _sqlSugar.Queryable().AnyAsync(x => x.RoomNum == inputDTO.RoomNum)) + + var room = await _sqlSugar.Queryable().FirstAsync(x => x.RoomNum == inputDTO.RoomNum); + if (room == null) { throw Oops.Oh("无效会议号,请重新输入"); } @@ -127,7 +129,7 @@ namespace WGShare.API.Controllers.Frontend { var entity = inputDTO.Adapt(); return await _sqlSugar.Updateable(entity) - .UpdateColumns(x => new { x.Year, x.Subject }) + .UpdateColumns(x => new { x.Year, x.Subject, x.RoomName, x.AllowAnonymous }) .ExecuteCommandHasChangeAsync(); } @@ -337,7 +339,7 @@ namespace WGShare.API.Controllers.Frontend var imgStr = Convert.ToBase64String(imageArr); imgStr = QrCodeOptimizerHelper.CompressImage(imgStr, 50); - RedisHelper.Instance.Set(RedisKeyConstant.WxMiniProgram.GetRoomQrCode(roomNum, env), imgStr, TimeSpan.FromDays(1)); + RedisHelper.Instance.Set(RedisKeyConstant.WxMiniProgram.GetRoomQrCode(roomNum, env), imgStr, TimeSpan.FromDays(1)); return imgStr; } else if (contentType != null && contentType.Contains("json")) diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 1296ac1..e604326 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -3,6 +3,7 @@ using Hangfire.MemoryStorage.Database; using Mapster; using Masuit.Tools; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using Microsoft.IdentityModel.Tokens; @@ -63,9 +64,9 @@ namespace WGShare.API.Controllers.Frontend public async Task SetRoomManager([FromBody] RoomManagerInputDTO inputDTO) { var users = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum)); - if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 12) + if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 32) { - throw Oops.Oh("房间已达到12个发言人限制。请移除一位发言人"); + throw Oops.Oh("房间已达到32个发言人限制。请移除一位发言人"); } var user = users.FirstOrDefault(x => x.UID == inputDTO.UserId); if (user == null) @@ -192,7 +193,34 @@ namespace WGShare.API.Controllers.Frontend [HttpGet("checkout"), AllowAnonymous] public async Task ExistsRoom([FromQuery] string roomNum) { - return await _sqlSugar.Queryable().AnyAsync(x => x.RoomNum == roomNum && x.IsDelete == false); + if (IsAnonymous) + { + // 匿名用户 + var room = await _sqlSugar.Queryable().FirstAsync(x => x.RoomNum == roomNum && x.IsDelete == false); + if (room == null) + { + return false; + } + if (!room.AllowAnonymous) + { + throw Oops.Oh("房间不允许匿名用户进入"); + } + return true; + } + else + { + // 非匿名用户 + var room = await _sqlSugar.Queryable() + .WhereIF(Year > 0 && RoleId == RoleEnums.User, x => x.Year == Year || x.Year == 0) + .WhereIF(Subject > 0 && RoleId == RoleEnums.User, x => x.Subject == Subject || x.Subject == 0) + .FirstAsync(x => x.RoomNum == roomNum && x.IsDelete == false); + if (room == null) + { + return false; + } + return true; + } + } /// @@ -688,5 +716,21 @@ namespace WGShare.API.Controllers.Frontend await _sqlSugar.Insertable(entitys).ExecuteCommandAsync(); } + + /// + /// 修改昵称 + /// + /// + /// + [HttpPut("alter-uname")] + public async Task ModifyNickName([FromBody] UserModifyNickNameDto dto) + { + var user = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, dto.RoomNum), dto.UId.ToString()); + user.UserName = dto.NickName; + + RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, dto.RoomNum), dto.UId.ToString(), user); + + await _hubContext.Clients.Group(dto.RoomNum).ModifyNickName(dto.UId, dto.NickName); + } } } diff --git a/WGShare.API/Hubs/IMessageClient.cs b/WGShare.API/Hubs/IMessageClient.cs index 29730f2..9dbc21e 100644 --- a/WGShare.API/Hubs/IMessageClient.cs +++ b/WGShare.API/Hubs/IMessageClient.cs @@ -144,5 +144,13 @@ namespace WGShare.API.Hubs /// /// Task ShowDriverList(string driversJsonString); + + /// + /// 修改昵称 + /// + /// + /// + /// + Task ModifyNickName(long UId, string NickName); } } diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index d50e7fd..e801979 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -68,6 +68,11 @@ + + + 匿名用户 + + Agora接口 @@ -323,6 +328,13 @@ + + + 修改昵称 + + + + 获取用户列表 @@ -676,6 +688,14 @@ + + + 修改昵称 + + + + + 加入频道 diff --git a/WGShare.Domain/DTOs/Room/RoomInputDTO.cs b/WGShare.Domain/DTOs/Room/RoomInputDTO.cs index 6c5ab27..80485f9 100644 --- a/WGShare.Domain/DTOs/Room/RoomInputDTO.cs +++ b/WGShare.Domain/DTOs/Room/RoomInputDTO.cs @@ -28,6 +28,7 @@ namespace WGShare.Domain.DTOs.Room /// 科目 /// public SubjectType Subject { get; set; } + } @@ -47,5 +48,10 @@ namespace WGShare.Domain.DTOs.Room /// 会议室名称 /// public string RoomName { get; set; } + + /// + /// 是否允许匿名 + /// + public bool AllowAnonymous { get; set; } } } diff --git a/WGShare.Domain/DTOs/User/UserModifyNickNameDto.cs b/WGShare.Domain/DTOs/User/UserModifyNickNameDto.cs new file mode 100644 index 0000000..af783b7 --- /dev/null +++ b/WGShare.Domain/DTOs/User/UserModifyNickNameDto.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.DTOs.User +{ + public class UserModifyNickNameDto + { + public string RoomNum { get; set; } + public string NickName { get; set; } + public long UId { get; set; } + } +} diff --git a/WGShare.Domain/Entities/Room.cs b/WGShare.Domain/Entities/Room.cs index 70de651..71c2eed 100644 --- a/WGShare.Domain/Entities/Room.cs +++ b/WGShare.Domain/Entities/Room.cs @@ -62,5 +62,11 @@ namespace WGShare.Domain.Entities /// [SugarColumn(ColumnName = "subject")] public SubjectType Subject { get; set; } + + /// + /// 是否允许匿名 + /// + [SugarColumn(ColumnName = "allow_anonymous")] + public bool AllowAnonymous { get; set; } } }