diff --git a/WGShare.API/Controllers/AuthController.cs b/WGShare.API/Controllers/AuthController.cs index e8aab5a..fc303ec 100644 --- a/WGShare.API/Controllers/AuthController.cs +++ b/WGShare.API/Controllers/AuthController.cs @@ -10,6 +10,7 @@ using WGShare.API.Helpers; using WGShare.Domain.DTOs.Login; using WGShare.Domain.Entities; using WGShare.Domain.FriendlyException; +using WGShare.Domain.FriendlyException.Exceptions; namespace WGShare.API.Controllers { @@ -80,6 +81,7 @@ namespace WGShare.API.Controllers btnAutn.Add(new Claim("tenant", user.TenantId)); btnAutn.Add(new Claim("account", user.Account)); btnAutn.Add(new Claim("uname", user.UserName)); + btnAutn.Add(new Claim("ssid", user.ScreenShareId)); var refreshToken = Guid.NewGuid().ToString(); RedisHelper.Instance.Set($@"refresh:{refreshToken}", user, TimeSpan.FromDays(30).TotalSeconds.ToInt32()); @@ -94,7 +96,8 @@ namespace WGShare.API.Controllers tenantName = tenant.TenantName, expire = _configuration["Jwt:Expires"].ToInt32(), account = user.Account, - uid = user.Id + uid = user.Id, + screenShareId = user.ScreenShareId }); } @@ -109,7 +112,7 @@ namespace WGShare.API.Controllers var user = RedisHelper.Instance.Get($@"refresh:{refreshToken}"); if (user == null || string.IsNullOrWhiteSpace(user.Id)) { - throw Oops.Oh("登录已失效,请重新登录"); + throw new FriendlyInternalException("登录已失效,请重新登录", null, 1403); } var btnAutn = new List(); @@ -118,6 +121,7 @@ namespace WGShare.API.Controllers btnAutn.Add(new Claim("tenant", user.TenantId)); btnAutn.Add(new Claim("account", user.Account)); btnAutn.Add(new Claim("uname", user.UserName)); + btnAutn.Add(new Claim("ssid", user.ScreenShareId)); var refreshTokenNew = Guid.NewGuid().ToString(); @@ -134,7 +138,8 @@ namespace WGShare.API.Controllers tenantName = user.TenantName, expire = _configuration["Jwt:Expires"].ToInt32(), account = user.Account, - uid = user.Id + uid = user.Id, + screenShareId = user.ScreenShareId }); } @@ -142,7 +147,7 @@ namespace WGShare.API.Controllers /// 匿名登录,直接进入会议室 /// /// - [HttpPost("anon-login")] + [HttpPost("anon-login"),Obsolete] public async Task Login([FromBody] AnonymousLoginDTO loginDTO) { diff --git a/WGShare.API/Controllers/Backend/UserController.cs b/WGShare.API/Controllers/Backend/UserController.cs index ed62b55..c842263 100644 --- a/WGShare.API/Controllers/Backend/UserController.cs +++ b/WGShare.API/Controllers/Backend/UserController.cs @@ -57,7 +57,14 @@ namespace WGShare.API.Controllers.Backend public async Task Add([FromBody] UserInputDTO userInput) { var entity = userInput.Adapt(); - entity.Id = YitIdHelper.NextId().ToString(); + + // 获取当前时间的Unix时间戳(以毫秒为单位) + long unixTimeMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + // 将Unix时间戳转换为字符串并截取最后7位 + string last7Digits = unixTimeMilliseconds.ToString().Substring(unixTimeMilliseconds.ToString().Length - 7); + + entity.ScreenShareId = $@"{last7Digits}{new Random().Next(10, 100)}"; + if (await _sqlSugar.Queryable().AnyAsync(x => x.Account == entity.Account)) { throw Oops.Oh("账号已存在!"); @@ -77,7 +84,7 @@ namespace WGShare.API.Controllers.Backend } return await _sqlSugar.Updateable(entity) - .IgnoreColumns(x => new { x.Pwd }).ExecuteCommandAsync() > 0; + .IgnoreColumns(x => new { x.Pwd, x.ScreenShareId }).ExecuteCommandAsync() > 0; } [HttpPut("pwd")] diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 24b74fd..b57b060 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.SignalR; using Microsoft.IdentityModel.Tokens; using SqlSugar; using SqlSugar.Extensions; +using System.Security.Principal; using WGShare.API.Controllers.Basic; using WGShare.API.Helpers; using WGShare.API.Hubs; @@ -207,7 +208,7 @@ namespace WGShare.API.Controllers.Frontend _configuration["Agora:appId"], _configuration["Agora:appSecret"], roomNum, - Account, + "*", RtcTokenBuilder2.Role.ROLE_PUBLISHER, _configuration["Agora:tokenExpireTimeInSecond"].ToInt32(), _configuration["Agora:tokenExpireTimeInSecond"].ToInt32()); @@ -349,14 +350,32 @@ namespace WGShare.API.Controllers.Frontend [HttpGet("show-user")] public async Task GetShowUser([FromQuery] string roomNum) { - var channelUsers = RedisHelper.HGetAll(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); - + // 获取全部用户 + var channelUsers = RedisHelper.Instance.HGetAll(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); if (channelUsers.IsNullOrEmpty()) { throw Oops.Oh("无效会议号!"); } - return channelUsers.FirstOrDefault().Key; + // 获取全员观看用户 + var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.RoomManager.GetChannelShowUserKey(TenantId), roomNum); + if (!string.IsNullOrWhiteSpace(showUserId) && channelUsers.Any(x => x.Value.UID == showUserId)) + { + return showUserId; + } + + return channelUsers.FirstOrDefault().Value.UID; + } + + /// + /// 设置全员观看 + /// + /// + [HttpPost("show-user")] + public async Task SetShowUser([FromQuery] string roomNum, [FromQuery] string uid) + { + // 设置房间全员观看用户 + RedisHelper.Instance.HSet(RedisKeyConstant.RoomManager.GetChannelShowUserKey(TenantId), roomNum, uid); } #region 文件分享 diff --git a/WGShare.API/Controllers/Frontend/UserController.cs b/WGShare.API/Controllers/Frontend/UserController.cs index 1bdbd06..67d25cd 100644 --- a/WGShare.API/Controllers/Frontend/UserController.cs +++ b/WGShare.API/Controllers/Frontend/UserController.cs @@ -71,15 +71,21 @@ namespace WGShare.API.Controllers.Frontend public async Task AddUser([FromBody] UserInputDTO inputDTO) { var user = inputDTO.Adapt(); - user.Id = YitIdHelper.NextId().ToString(); + //user.Id = YitIdHelper.NextId().ToString(); user.TenantId = TenantId; + // 获取当前时间的Unix时间戳(以毫秒为单位) + long unixTimeMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + // 将Unix时间戳转换为字符串并截取最后7位 + string last7Digits = unixTimeMilliseconds.ToString().Substring(unixTimeMilliseconds.ToString().Length - 7); + + user.ScreenShareId = $@"{last7Digits}{new Random().Next(10, 100)}"; + if (await _sqlSugar.Queryable().AnyAsync(x => x.Account == user.Account)) { throw Oops.Oh("账号已存在!"); } - return await _sqlSugar.Insertable(user).ExecuteCommandAsync() > 0; } @@ -99,7 +105,7 @@ namespace WGShare.API.Controllers.Frontend } return await _sqlSugar.Updateable(entity) - .IgnoreColumns(x => new { x.Pwd, x.TenantId }).ExecuteCommandAsync() > 0; + .IgnoreColumns(x => new { x.Pwd, x.TenantId, x.ScreenShareId }).ExecuteCommandAsync() > 0; } /// diff --git a/WGShare.API/Helpers/RedisHelper.cs b/WGShare.API/Helpers/RedisHelper.cs index adb80d9..bcf82c7 100644 --- a/WGShare.API/Helpers/RedisHelper.cs +++ b/WGShare.API/Helpers/RedisHelper.cs @@ -46,73 +46,73 @@ namespace WGShare.API.Helpers /// public static int RandomExpired(int minTimeoutSeconds, int maxTimeoutSeconds) => rnd.Value.Next(minTimeoutSeconds, maxTimeoutSeconds); - public static List HVals(string key) where T : class - { - var valueStrings = Instance.HVals(key); - if (valueStrings.IsNullOrEmpty()) - { - return null; - } + //public static List HVals(string key) where T : class + //{ + // var valueStrings = Instance.HVals(key); + // if (valueStrings.IsNullOrEmpty()) + // { + // return null; + // } - return valueStrings.ToList().ConvertAll(x => JsonConvert.DeserializeObject(x)); - } + // return valueStrings.ToList().ConvertAll(x => JsonConvert.DeserializeObject(x)); + //} - public static T HGet(string key, string field) where T : class - { - var valueString = Instance.HGet(key, field); - if (valueString.IsNullOrEmpty()) - { - return null; - } - return JsonConvert.DeserializeObject(valueString); - } + //public static T HGet(string key, string field) where T : class + //{ + // var valueString = Instance.HGet(key, field); + // if (valueString.IsNullOrEmpty()) + // { + // return null; + // } + // return JsonConvert.DeserializeObject(valueString); + //} - public static List HMGet(string key, params string[] fields) where T : class - { - var valueStrings = Instance.HMGet(key, fields); - if (valueStrings.IsNullOrEmpty()) - { - return null; - } - return valueStrings.ToList().ConvertAll(x => JsonConvert.DeserializeObject(x)); - } + //public static List HMGet(string key, params string[] fields) where T : class + //{ + // var valueStrings = Instance.HMGet(key, fields); + // if (valueStrings.IsNullOrEmpty()) + // { + // return null; + // } + // return valueStrings.ToList().ConvertAll(x => JsonConvert.DeserializeObject(x)); + //} - public static Dictionary HGetAll(string key) where T : class - { - var dic = Instance.HGetAll(key); - if (dic == null || dic.Count == 0) - { - return null; - } - Dictionary result = new Dictionary(); + //public static Dictionary HGetAll(string key) where T : class + //{ + // var dic = Instance.HGetAll(key); + // if (dic == null || dic.Count == 0) + // { + // return null; + // } + // Dictionary result = new Dictionary(); - foreach (var kv in dic) - { - if (string.IsNullOrWhiteSpace(kv.Key) || string.IsNullOrWhiteSpace(kv.Value)) - { - continue; - } - result.Add(kv.Key, JsonConvert.DeserializeObject(kv.Value)); - } + // foreach (var kv in dic) + // { + // if (string.IsNullOrWhiteSpace(kv.Key) || string.IsNullOrWhiteSpace(kv.Value)) + // { + // continue; + // } + // result.Add(kv.Key, JsonConvert.DeserializeObject(kv.Value)); + // } - return result; - } + // return result; + //} - public static long HSet(string key, string fields, T value) where T : class - { - return Instance.HSet(key, fields, value.ToJsonString()); - } + //public static long HSet(string key, string fields, T value) where T : class + //{ + // return Instance.HSet(key, fields, value.ToJsonString()); + //} - public static void HMSet(string key, Dictionary keyValues) where T : class - { - var dic = new Dictionary(); - foreach (var kv in keyValues) - { - dic.Add(kv.Key,kv.Value.ToJsonString()); - } - Instance.HMSet(key, dic); - } + //public static void HMSet(string key, Dictionary keyValues) where T : class + //{ + // var dic = new Dictionary(); + // foreach (var kv in keyValues) + // { + // dic.Add(kv.Key,kv.Value.ToJsonString()); + // } + // Instance.HMSet(key, dic); + //} } } diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index 677ac18..ee22c93 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -24,11 +24,14 @@ namespace WGShare.API.Hubs { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; + 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); + await ClearUserChannel(uid, tenant, account); // 存储在线信息 RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid, Context.ConnectionId); } @@ -37,37 +40,41 @@ namespace WGShare.API.Hubs { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; Console.WriteLine($"{DateTime.Now}断开连接 当前租户:" + tenant); + 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)) { - Console.WriteLine($"{DateTime.Now}断开连接 True"); + Console.WriteLine($"{DateTime.Now}断开连接 未重连,开始删除用户频道信息"); // 断开后未重连则清退频道 - await ClearUserChannel(uid, tenant); + await ClearUserChannel(uid, tenant, account); } } - private async Task ClearUserChannel(string uid, string tenant) + private async Task ClearUserChannel(string uid, string tenant, string account) { - Console.WriteLine($"{DateTime.Now} 执行删除"); + Console.WriteLine($"{DateTime.Now} 执行删除开始"); + // 获取用户参加得频道 var roomNums = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); using (var pipe = RedisHelper.Instance.StartPipe()) { - // 获取用户参加得频道 - //var roomNums = pipe.HKeys(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); + Console.WriteLine($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNums)}"); if (!roomNums.IsNullOrEmpty()) { - Console.WriteLine($@"{DateTime.Now}uid:{uid} 退出以下频道:{string.Join(',', roomNums)}"); // 所有房间移除该用户 roomNums.ForEach(roomNum => { pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); - //pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, -1); + + var script = $@"if (redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[2]) then return redis.call('HDEL', KEYS[1], ARGV[1]) else return -1 end"; + // 执行 eval 命令 + pipe.Eval(script, [RedisKeyConstant.RoomManager.GetChannelShowUserKey(tenant)], roomNum, uid); }); } @@ -80,7 +87,7 @@ namespace WGShare.API.Hubs pipe.EndPipe(); } - Console.WriteLine($"{DateTime.Now} 执行删除 完成"); + Console.WriteLine($"{DateTime.Now} 执行删除完成"); } /// @@ -94,15 +101,17 @@ namespace WGShare.API.Hubs { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; + var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; - Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); - Console.WriteLine($"{DateTime.Now}加入频道 uid:" + uid); + Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); + Console.WriteLine($"{DateTime.Now}加入频道 account:" + account); Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant); using (var pipe = RedisHelper.Instance.StartPipe()) { - var userInfo = new ChannelUserInfo(uid, Context.ConnectionId, enableMicr, enableCamera); + 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); @@ -121,17 +130,20 @@ namespace WGShare.API.Hubs { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum); - Console.WriteLine($" {DateTime.Now}离开频道 uid:" + uid); - Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant); + Console.WriteLine($" {DateTime.Now}离开频道 account:" + account); + Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant); using (var pipe = RedisHelper.Instance.StartPipe()) { + var script = $@"if (redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[2]) then return redis.call('HDEL', KEYS[1], ARGV[1]) else return -1 end"; + // 执行 eval 命令 + pipe.Eval(script, [RedisKeyConstant.RoomManager.GetChannelShowUserKey(tenant)], roomNum, uid); pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); pipe.HDel(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum); - //pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, -1); pipe.EndPipe(); } @@ -149,8 +161,8 @@ namespace WGShare.API.Hubs var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; - Console.WriteLine($" {DateTime.Now}发送消息 uname:" + uname); - Console.WriteLine($" {DateTime.Now}发送消息 roomNum:" + rooNum); + Console.WriteLine($" {DateTime.Now}发送消息 uname:" + uname); + Console.WriteLine($" {DateTime.Now}发送消息 roomNum:" + rooNum); Console.WriteLine($" {DateTime.Now}发送消息 msg:" + msg); await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); diff --git a/WGShare.API/Program.cs b/WGShare.API/Program.cs index dc28d8a..0aa53f9 100644 --- a/WGShare.API/Program.cs +++ b/WGShare.API/Program.cs @@ -1,18 +1,14 @@ 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; using WGShare.API.ServiceConfigs; +using WGShare.Domain.Constant; using Yitter.IdGenerator; namespace WGShare.API @@ -31,7 +27,6 @@ namespace WGShare.API { Serialize = (x) => x.ToJsonString(), Deserialize = (x, t) => JsonConvert.DeserializeObject(x, t), - //DeserializeRaw = (x, t) => JsonConvert.DeserializeObject(x, t), }); ResetRedisKey(); @@ -128,7 +123,7 @@ namespace WGShare.API } while (nextCursor != 0); - var keysArr = keys.ConvertAll(x => x.Replace("wgshare:", "")).Distinct().ToArray(); + var keysArr = keys.ConvertAll(x => x.Replace("wgshare:", "")).Where(x => !x.StartsWith("refresh")).Distinct().ToArray(); if (!keysArr.IsNullOrEmpty()) { Console.WriteLine($@"ɾֵ{Environment.NewLine}{string.Join(Environment.NewLine, keysArr)}"); diff --git a/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs b/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs index 971fd3a..70b1cbf 100644 --- a/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs +++ b/WGShare.API/ServiceConfigs/SqlsugarServiceExtensions.cs @@ -59,6 +59,7 @@ namespace WGShare.API.ServiceConfigs }); services.AddSingleton(sqlSugar); + StaticConfig.Check_StringIdentity = false; return services; } diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index e86c5e7..571d373 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -163,6 +163,12 @@ + + + 设置全员观看 + + + 分享上传文件 diff --git a/WGShare.Domain/Constant/RedisKeyConstant.cs b/WGShare.Domain/Constant/RedisKeyConstant.cs index 4597744..94e3843 100644 --- a/WGShare.Domain/Constant/RedisKeyConstant.cs +++ b/WGShare.Domain/Constant/RedisKeyConstant.cs @@ -44,5 +44,19 @@ namespace WGShare.Domain.Constant [Obsolete("废弃")] public static string GetChannelUserCountKey(string tenantId) => $@"te_{tenantId}:ChannelUserCount"; } + + /// + /// 房间管理 + /// + public class RoomManager + { + /// + /// 获取频道全员观看对象 + /// + /// + /// + /// + public static string GetChannelShowUserKey(string tenantId) => $@"te_{tenantId}:room_show_user"; + } } } diff --git a/WGShare.Domain/Entities/ChannelUserInfo.cs b/WGShare.Domain/Entities/ChannelUserInfo.cs index a1492a3..c5dcd41 100644 --- a/WGShare.Domain/Entities/ChannelUserInfo.cs +++ b/WGShare.Domain/Entities/ChannelUserInfo.cs @@ -22,18 +22,22 @@ namespace WGShare.Domain.Entities /// /// 是否关闭麦克风,默认关 /// 是否关闭摄像头,默认关 - public ChannelUserInfo(string uid, string connectId, bool enableMicr, bool enableCamera) + public ChannelUserInfo(string uid, string connectId, bool enableMicr, bool enableCamera, string account, string screenShareId) { this.UID = uid; this.ConnectId = connectId; this.EnableMicr = enableMicr; this.EnableCamera = enableCamera; - + this.Account = account; + this.ScreenShareId = screenShareId; } + public string UID { get; set; } public string ConnectId { get; set; } + public string Account { get; set; } + /// /// 是否关闭麦克风 /// @@ -43,5 +47,7 @@ namespace WGShare.Domain.Entities /// 是否关闭摄像头 /// public bool EnableCamera { get; set; } + + public string ScreenShareId { get; set; } } } diff --git a/WGShare.Domain/Entities/User.cs b/WGShare.Domain/Entities/User.cs index 914c5a6..ef25a98 100644 --- a/WGShare.Domain/Entities/User.cs +++ b/WGShare.Domain/Entities/User.cs @@ -14,7 +14,7 @@ namespace WGShare.Domain.Entities /// /// /// - [SugarColumn(ColumnName = "id", IsPrimaryKey = true)] + [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)] public string Id { get; set; } = YitIdHelper.NextId().ToString(); /// /// 是否删除 @@ -58,6 +58,11 @@ namespace WGShare.Domain.Entities /// [SugarColumn(ColumnName = "tenant_id")] public string TenantId { get; set; } + /// + /// 共享屏幕Id + /// + [SugarColumn(ColumnName = "screen_share_id", IsOnlyIgnoreUpdate = true)] + public string ScreenShareId { get; set; } [SugarColumn(IsIgnore = true)] public string RoleName { get; set; }