diff --git a/Chat/Chat.cs b/Chat/Chat.cs index 8c78a0b..478990a 100644 --- a/Chat/Chat.cs +++ b/Chat/Chat.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using StackExchange.Redis; using System.Diagnostics; +using System.Security.Cryptography.Xml; using WebAppServer1.ApplicationDbContext; using WebAppServer1.Authentication; using WebAppServer1.Models; @@ -130,8 +131,23 @@ namespace WebAppServer1.Chat await Clients.Caller.SendAsync("SendPrivateMessage", false, message, Context.UserIdentifier,newMesssage.Id); } + //添加好友申请 + public async Task AddFriend(int userId) + { + //var user = await pgSql.Users.FindAsync(userId); + pgSql.Friends.Add(new Friend + { + UserId = int.Parse(Context.UserIdentifier!), + FriendId = userId, + CreatedAt = DateTime.UtcNow, + Status = FriendStatus.Pending + }); + await pgSql.SaveChangesAsync(); + return true; + } + //搜索好友 - public async Task SearchFriends(string username) + public async Task SearchFriends(string username) { User? user = null; @@ -145,12 +161,16 @@ namespace WebAppServer1.Chat user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username); } return user == null - ? new SearchFriendsResultResponse { success = false } - : new SearchFriendsResultResponse + ? new { success = false } + : new { success = true, userid = user.Id, - username = user.Nickname + username = user.Username, + nickname = user.Nickname, + avatarurl = user.AvatarUrl, + signature = user.Signature, + isonline = user.IsOnline }; } @@ -193,39 +213,65 @@ namespace WebAppServer1.Chat } //登录认证 - public async Task LoginAuthentication(string username, string password) + public async Task LoginAuthentication(string username, string password, string ua) { - var exists = await pgSql.Users.AnyAsync(a => a.Username == username && a.PasswordHash == password); - if (!exists) + var user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username && a.PasswordHash == password); + if (user == null) { - await Clients.Client(Context.ConnectionId).SendAsync("LoginResult",false,"用户名或密码错误!"); - return; + //await Clients.Client(Context.ConnectionId).SendAsync("LoginResult",false,"用户名或密码错误!"); + return new LoginResultResponse { Success = false }; } - var user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username); - if (user == null) { return; } + if (user == null) { return new LoginResultResponse { Success = false }; } var accessToken = jwtService.GenerateAccessToken(user.Username,user.Id); var refreshToken = await jwtService.GenerateRefreshToken(user.Id, username); - await Clients.Client(Context.ConnectionId).SendAsync("LoginResult", true, accessToken, refreshToken); + //await Clients.Client(Context.ConnectionId).SendAsync("LoginResult", true, accessToken, refreshToken); logger.LogInformation($"用户:{username}正在进行登录认证!密码:{password}===accessToken:{accessToken}"); + var ip = Context.GetHttpContext()?.Connection?.RemoteIpAddress?.ToString(); + if (ip == null ) { return new LoginResultResponse { Success = false }; } + pgSql.LoginRecords.Add(new LoginRecord + { + UserId = user.Id, + LoginTime = DateTime.UtcNow, + IpAddress = ip, + DeviceInfo = ua, + IsSuccess = true + }); + await pgSql.SaveChangesAsync(); + return new LoginResultResponse + { + Success = true, + AccessToken = accessToken, + RefreshToken = refreshToken, + Nickname = user.Nickname, + Id = user.Id, + IsOnline = true, + AvatarUrl = user.AvatarUrl, + Signature = user.Signature + }; } //新用户注册 - public async Task Register() - { - + public async Task Register() + { var newUser = new User { Username = "user_" + Guid.NewGuid().ToString("N").Substring(0, 8), Nickname = GenerateTool.GenerateRandomNickname(), PasswordHash = GenerateTool.GeneratePassword(), + Signature = GenerateTool.GenerateRandomSignature(), + AvatarUrl = GenerateTool.GenerateRandomAvatarUrl(), CreatedAt = DateTime.UtcNow, LastActive = DateTime.UtcNow }; pgSql.Add(newUser); await pgSql.SaveChangesAsync(); logger.LogInformation($"新用户:{newUser.Username}正在进行登录注册操作!密码:{newUser.Nickname}"); + return new + { + Username = newUser.Username, + Password = newUser.PasswordHash, + Success = true + }; - await LoginAuthentication(newUser.Username,newUser.PasswordHash); - await Clients.Client(Context.ConnectionId).SendAsync("RegisterResult", true, "恭喜注册成功!"); } //统计在线人数 diff --git a/Models/ResultResponse.cs b/Models/ResultResponse.cs index 7a37eba..7adc85d 100644 --- a/Models/ResultResponse.cs +++ b/Models/ResultResponse.cs @@ -26,5 +26,11 @@ namespace WebAppServer1.Models public string Signature { get; set; } = string.Empty; [Key("IsOnline")] public bool IsOnline { get; set; } + [Key("AccessToken")] + public string AccessToken { get; set; } = string.Empty; + [Key("RefreshToken")] + public string RefreshToken { get; set; } = string.Empty; + [Key("Success")] + public bool Success { get; set; } } } diff --git a/Tool/GenerateTool.cs b/Tool/GenerateTool.cs index 6d45359..b99b95d 100644 --- a/Tool/GenerateTool.cs +++ b/Tool/GenerateTool.cs @@ -41,5 +41,30 @@ namespace WebAppServer1.Tool return nickname; } + public static string GenerateRandomSignature() + { + string[] part1 = { "自由的", "快乐的", "孤独的", "勇敢的", "神秘的" }; + string[] part2 = { "小鸟", "星星", "花朵", "少年", "旅人" }; + string[] part3 = { "在唱歌", "在飞翔", "在微笑", "在流浪", "在思考" }; + + var random = new Random(); + string nickname = part1[random.Next(part1.Length)] + + part2[random.Next(part2.Length)] + + part3[random.Next(part3.Length)]; + return nickname; + } + + public static string GenerateRandomAvatarUrl() + { + string[] part1 = { "https://auth.zotv.ru/webapp/"}; + string[] part2 = { "8111", "9666", "6222", "2501", "4974", "3322" }; + string[] part3 = { ".webp" }; + + var random = new Random(); + string nickname = part1[random.Next(part1.Length)] + + part2[random.Next(part2.Length)] + + part3[random.Next(part3.Length)]; + return nickname; + } } }