增加搜索和添加好友功能

This commit is contained in:
heiye111
2026-05-24 20:11:54 +08:00
parent ac264e0c0a
commit cf25f3ed6a
3 changed files with 94 additions and 17 deletions

View File

@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using StackExchange.Redis; using StackExchange.Redis;
using System.Diagnostics; using System.Diagnostics;
using System.Security.Cryptography.Xml;
using WebAppServer1.ApplicationDbContext; using WebAppServer1.ApplicationDbContext;
using WebAppServer1.Authentication; using WebAppServer1.Authentication;
using WebAppServer1.Models; using WebAppServer1.Models;
@@ -130,8 +131,23 @@ namespace WebAppServer1.Chat
await Clients.Caller.SendAsync("SendPrivateMessage", false, message, Context.UserIdentifier,newMesssage.Id); await Clients.Caller.SendAsync("SendPrivateMessage", false, message, Context.UserIdentifier,newMesssage.Id);
} }
//添加好友申请
public async Task<bool> 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<SearchFriendsResultResponse> SearchFriends(string username) public async Task<object> SearchFriends(string username)
{ {
User? user = null; User? user = null;
@@ -145,12 +161,16 @@ namespace WebAppServer1.Chat
user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username); user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username);
} }
return user == null return user == null
? new SearchFriendsResultResponse { success = false } ? new { success = false }
: new SearchFriendsResultResponse : new
{ {
success = true, success = true,
userid = user.Id, 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<LoginResultResponse> LoginAuthentication(string username, string password, string ua)
{ {
var exists = await pgSql.Users.AnyAsync(a => a.Username == username && a.PasswordHash == password); var user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username && a.PasswordHash == password);
if (!exists) if (user == null)
{ {
await Clients.Client(Context.ConnectionId).SendAsync("LoginResult",false,"用户名或密码错误!"); //await Clients.Client(Context.ConnectionId).SendAsync("LoginResult",false,"用户名或密码错误!");
return; return new LoginResultResponse { Success = false };
} }
var user = await pgSql.Users.FirstOrDefaultAsync(a => a.Username == username); if (user == null) { return new LoginResultResponse { Success = false }; }
if (user == null) { return; }
var accessToken = jwtService.GenerateAccessToken(user.Username,user.Id); var accessToken = jwtService.GenerateAccessToken(user.Username,user.Id);
var refreshToken = await jwtService.GenerateRefreshToken(user.Id, username); 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}"); 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<object> Register()
{ {
var newUser = new User var newUser = new User
{ {
Username = "user_" + Guid.NewGuid().ToString("N").Substring(0, 8), Username = "user_" + Guid.NewGuid().ToString("N").Substring(0, 8),
Nickname = GenerateTool.GenerateRandomNickname(), Nickname = GenerateTool.GenerateRandomNickname(),
PasswordHash = GenerateTool.GeneratePassword(), PasswordHash = GenerateTool.GeneratePassword(),
Signature = GenerateTool.GenerateRandomSignature(),
AvatarUrl = GenerateTool.GenerateRandomAvatarUrl(),
CreatedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow,
LastActive = DateTime.UtcNow LastActive = DateTime.UtcNow
}; };
pgSql.Add(newUser); pgSql.Add(newUser);
await pgSql.SaveChangesAsync(); await pgSql.SaveChangesAsync();
logger.LogInformation($"新用户:{newUser.Username}正在进行登录注册操作!密码:{newUser.Nickname}"); 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, "恭喜注册成功!");
} }
//统计在线人数 //统计在线人数

View File

@@ -26,5 +26,11 @@ namespace WebAppServer1.Models
public string Signature { get; set; } = string.Empty; public string Signature { get; set; } = string.Empty;
[Key("IsOnline")] [Key("IsOnline")]
public bool IsOnline { get; set; } 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; }
} }
} }

View File

@@ -41,5 +41,30 @@ namespace WebAppServer1.Tool
return nickname; 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;
}
} }
} }