/// /// /// /// public async Task Login() { var json = await new StreamReader(this.HttpContextAccessor.HttpContext.Request.Body).ReadToEndAsync(); if (string.IsNullOrEmpty(json)) { throw MessageBox.Show(ResonseCode.NullOrEmpty, "登录方式不合格"); } var account = AccountExtend.GetUserAccount(json, this); if (account == null) { throw MessageBox.Show(ResonseCode.NullOrEmpty, "未找到登录方式"); } var userId = await account.LoginAsync(); T_User? user = null; if (userId > 0) { user = await Dao.DaoUser.Context.T_User.FirstOrDefaultAsync(it => it.Id == userId); } var ip = this.HttpContextAccessor.HttpContext.GetClientIpAddress(); if (user == null) { //注册用户 user = new T_User() { CreatedAt = DateTime.Now, LastLoginAt = DateTime.Now, UpdatedAt = DateTime.Now, IsTest = false, LastLoginType = account.LastLoginType, RegisterType = account.LastLoginType, State = 0, UserIconUrl = AppConfig.UserConfig.UserIconUrl, NickName = $"{AppConfig.UserConfig.NickName}{new Random().Next(1000, 9999)}", Ip = ip }; await Dao.DaoUser.Context.T_User.AddAsync(user); } if (user == null) { throw MessageBox.Show(ResonseCode.Error, "用户注册失败"); } user.LastLoginAt = DateTime.Now; user.UpdatedAt = DateTime.Now; user.Ip = ip; await Dao.DaoUser.Context.SaveChangesAsync(); var userData = await Dao.DaoUser.Context.T_User_Data.FirstOrDefaultAsync(it => it.UserId == user.Id); if (userData == null) { userData = new T_User_Data() { CreateAt = DateTime.Now, UpdateAt = DateTime.Now, PhoneNum = account.GetUserDataProperty(UserDataPropertyEnum.PhoneNum), UserId = user.Id, Email = account.GetUserDataProperty(UserDataPropertyEnum.Email) }; await Dao.DaoUser.Context.T_User_Data.AddAsync(userData); await Dao.DaoUser.Context.SaveChangesAsync(); } var claims = new[] { new Claim("NickName",user.NickName), new Claim("UserId",user.Id.ToString()), }; var jwt = JwtAuthManager.GenerateTokens(user.NickName, claims, DateTime.Now); var accountLogIn = new AccountLogInResponse() { NickName = user.NickName, Token = jwt.AccessToken, UserId = user.Id, }; //获取用户登录的设备 var userLoginList = await Dao.DaoUser.Context.T_User_Token.Where(it => it.UserId == user.Id).ToListAsync(); if (userLoginList == null) { //用户没有登录过 userLoginList = new List(); } var dev = account.DeviceNumber; //如果设备号为空,则使用用户Id+登录方式 if (string.IsNullOrEmpty(dev)) { dev = MD5Encryption.ComputeMD5Hash($"{user.Id}:{account.LastLoginType}"); } // 获取当前时间用于后续多次调用 var currentTime = DateTime.Now; // 获取当前设备号,若为空则生成一个唯一的设备号 var dev = string.IsNullOrEmpty(account.DeviceNumber) ? MD5Encryption.ComputeMD5Hash($"{user.Id}:{account.LastLoginType}") : account.DeviceNumber; // 获取用户的设备列表 var userLoginList = await Dao.DaoUser.Context.T_User_Token .Where(it => it.UserId == user.Id) .OrderBy(it => it.LastLoginAt) .ToListAsync(); // 如果当前登录设备数超过配置的最大设备数 if (userLoginList.Count > AppConfig.UserConfig.MaxDeviceCount) { // 删除多余设备记录,保留最新的设备 var excessDevices = userLoginList.Take(userLoginList.Count - AppConfig.UserConfig.MaxDeviceCount).ToList(); Dao.DaoUser.Context.T_User_Token.RemoveRange(excessDevices); await Dao.DaoUser.Context.SaveChangesAsync(); } // 查找当前设备记录 var existingDevice = userLoginList.FirstOrDefault(it => it.DeviceNumber == dev); if (existingDevice == null) { // 情况1:当前设备不存在,且设备数已达最大值 if (userLoginList.Count == AppConfig.UserConfig.MaxDeviceCount) { // 踢掉最早登录的设备,将其替换为当前设备 var oldestDevice = userLoginList.First(); oldestDevice.DeviceNumber = dev; oldestDevice.TokenMd5 = MD5Encryption.ComputeMD5Hash(jwt.AccessToken); oldestDevice.LastLoginAt = currentTime; oldestDevice.ExpiresAt = currentTime.AddDays(5); oldestDevice.Token = jwt.AccessToken; } else { // 情况2:当前设备不存在,且设备数小于最大值,新增一条设备记录 var newDevice = new T_User_Token { CreateAt = currentTime, ExpiresAt = currentTime.AddDays(5), LastLoginAt = currentTime, Token = jwt.AccessToken, UserId = user.Id, DeviceNumber = dev, TokenMd5 = MD5Encryption.ComputeMD5Hash(jwt.AccessToken) }; await Dao.DaoUser.Context.T_User_Token.AddAsync(newDevice); } } else { // 情况3:当前设备已存在,更新登录时间等参数 existingDevice.LastLoginAt = currentTime; existingDevice.ExpiresAt = currentTime.AddDays(5); existingDevice.Token = jwt.AccessToken; existingDevice.TokenMd5 = MD5Encryption.ComputeMD5Hash(jwt.AccessToken); } // 保存更改 await Dao.DaoUser.Context.SaveChangesAsync(); return accountLogIn; } {"phoneNumber":"17521010998","verificationCode":"1645"}