增加搜索和添加好友功能
This commit is contained in:
80
Chat/Chat.cs
80
Chat/Chat.cs
@@ -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, "恭喜注册成功!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//统计在线人数
|
//统计在线人数
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user