出发前保存

This commit is contained in:
heiye111
2026-05-27 13:37:30 +08:00
parent cf25f3ed6a
commit cc6acc832d
2 changed files with 201 additions and 16 deletions

View File

@@ -1,7 +1,9 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity.Data; using Microsoft.AspNetCore.Identity.Data;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using StackExchange.Redis; using StackExchange.Redis;
using System.Diagnostics; using System.Diagnostics;
using System.Security.Cryptography.Xml; using System.Security.Cryptography.Xml;
@@ -31,14 +33,34 @@ namespace WebAppServer1.Chat
//wss子端点API //wss子端点API
//在线事件
public override async Task OnConnectedAsync() public override async Task OnConnectedAsync()
{ {
var db = _redis.GetDatabase(); var db = _redis.GetDatabase();
await db.SetAddAsync("AllConnections", Context.ConnectionId); await db.SetAddAsync("AllConnections", Context.ConnectionId);
await BroadcastOnlineCount(); await BroadcastOnlineCount();
Console.WriteLine("在线id:"+Context.UserIdentifier);
if (Context.UserIdentifier != null)
{
int userId = int.Parse(Context.UserIdentifier!);
var update = await pgSql.Users.FindAsync(userId);
if (update != null)
{
update.IsOnline = true;
pgSql.Update(update);
await pgSql.SaveChangesAsync();
}
List<int> friends = await pgSql.Friends.Where(f => f.Status == FriendStatus.Accepted &&
(f.UserId == userId || f.FriendId == userId)).Select
(f => f.UserId == userId ? f.FriendId : f.UserId).ToListAsync();
var friendIds = friends.Select(id => id.ToString()).ToList();
await Clients.Users(friendIds).SendAsync("UserStatusChanged", userId, true);
}
await base.OnConnectedAsync(); await base.OnConnectedAsync();
} }
//掉线事件
public override async Task OnDisconnectedAsync(Exception? exception) public override async Task OnDisconnectedAsync(Exception? exception)
{ {
var db = _redis.GetDatabase(); var db = _redis.GetDatabase();
@@ -52,7 +74,26 @@ namespace WebAppServer1.Chat
await BroadcastGroupCount(groupName); await BroadcastGroupCount(groupName);
} }
await BroadcastOnlineCount(); await BroadcastOnlineCount();
Console.WriteLine("掉线id:" + Context.UserIdentifier);
if (Context.UserIdentifier != null)
{
int userId = int.Parse(Context.UserIdentifier!);
var update = await pgSql.Users.FindAsync(userId);
if (update != null)
{
update.IsOnline = false;
pgSql.Update(update);
await pgSql.SaveChangesAsync();
}
List<int> friends = await pgSql.Friends.Where(f => f.Status == FriendStatus.Accepted &&
(f.UserId == userId || f.FriendId == userId)).Select
(f => f.UserId == userId ? f.FriendId : f.UserId).ToListAsync();
var friendIds = friends.Select(id => id.ToString()).ToList();
await Clients.Users(friendIds).SendAsync("UserStatusChanged", userId, false);
}
await base.OnDisconnectedAsync(exception); await base.OnDisconnectedAsync(exception);
} }
@@ -94,30 +135,76 @@ namespace WebAppServer1.Chat
await Clients.Group(groupName).SendAsync("ReceiveMessage", groupName, user, message); await Clients.Group(groupName).SendAsync("ReceiveMessage", groupName, user, message);
} }
//获取聊天记录
[Authorize]
public async Task<List<ChatMessageDto>> GetChatRecord(int friendId)
{
var exfriendId = await pgSql.Users.FindAsync(friendId);
if (exfriendId == null) return new List<ChatMessageDto>();
//if (Context.UserIdentifier == null)
var userId = int.Parse(Context.UserIdentifier!);
return await pgSql.Messages
.Where(a => (a.SenderId == userId && a.ReceiverId == friendId) ||
(a.SenderId == friendId && a.ReceiverId == userId))
.OrderBy(f => f.Id)
.Select(f => new ChatMessageDto
{
MessageId = f.Id,
Message = f.Content,
IsRead = f.IsRead,
SenderId = f.SenderId,
ReceiverId = f.ReceiverId,
IsMine = f.SenderId == userId
})
.ToListAsync();
}
//发送已读回执 //发送已读回执
public async Task SendReadReceipt(int messageId) public async Task SendReadReceipt(int messageId)
{ {
var update = await pgSql.Messages.FindAsync(messageId); var update = await pgSql.Messages.FindAsync(messageId);
if (update == null) { return; }; if (update == null) return;
update.IsRead = true; update.IsRead = true;
pgSql.Messages.Update(update); pgSql.Messages.Update(update);
await pgSql.SaveChangesAsync(); await pgSql.SaveChangesAsync();
await Clients.User(update.SenderId.ToString()).SendAsync("SendReadReceipt",messageId);
// 通知消息发送者该消息已读
await Clients.User(update.SenderId.ToString())
.SendAsync("SendReadReceipt", messageId);
} }
//发送私聊消息 //发送私聊消息
[Authorize] [Authorize]
public async Task SendPrivateMessage(string userid, string message) public async Task SendPrivateMessage(string friendId, string message)
{ {
var receiver = await pgSql.Users.FindAsync(int.Parse(userid));
if (receiver == null) int intFriendId = int.Parse(friendId);
int intUserId = int.Parse(Context.UserIdentifier!);
var receiver = await pgSql.Users.FindAsync(intFriendId);
if (receiver == null) return;
var sender = await pgSql.Users.FindAsync(intUserId);
if (sender == null) return;
bool isfriend = await pgSql.Friends.Where
(a => (a.UserId == intUserId && a.FriendId == intFriendId &&a.Status == FriendStatus.Accepted) ||
(a.UserId == intFriendId && a.FriendId == intUserId && a.Status == FriendStatus.Accepted)).AnyAsync();
if (!isfriend)
{ {
await Clients.Caller.SendAsync("SendPrivateMessage", false, "用户不存在", Context.UserIdentifier); await Clients.Caller.SendAsync("SendPrivateMessage", new ChatMessageDto
{
IsMine = true,
Message = "双方不是朋友关系,暂时无法发送消息,请添加好友后再发送消息!",
SenderId = intUserId,
ReceiverId = receiver.Id
});
return; return;
} }
var newMesssage = new Message
var newMessage = new Message
{ {
SenderId = int.Parse(Context.UserIdentifier!), SenderId = intUserId,
ReceiverId = receiver.Id, ReceiverId = receiver.Id,
Content = message, Content = message,
CreatedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow,
@@ -125,27 +212,85 @@ namespace WebAppServer1.Chat
IsDeleted = false, IsDeleted = false,
IsRead = false IsRead = false
}; };
pgSql.Messages.Add(newMesssage); pgSql.Messages.Add(newMessage);
await pgSql.SaveChangesAsync(); await pgSql.SaveChangesAsync();
await Clients.User(userid).SendAsync("SendPrivateMessage", true, message,Context.UserIdentifier,newMesssage.Id);
await Clients.Caller.SendAsync("SendPrivateMessage", false, message, Context.UserIdentifier,newMesssage.Id); // 发给接收者
await Clients.User(friendId).SendAsync("SendPrivateMessage",new ChatMessageDto
{
IsMine = false,
Message = message,
SenderId = intUserId,
ReceiverId = receiver.Id,
MessageId = newMessage.Id,
Nickname = sender.Nickname,
AvatarUrl = sender.AvatarUrl,
});
// 同时回给发送者,保证前端立即显示
await Clients.Caller.SendAsync("SendPrivateMessage", new ChatMessageDto
{
IsMine = true,
Message = message,
SenderId = int.Parse(Context.UserIdentifier!),
ReceiverId = receiver.Id,
MessageId = newMessage.Id,
Nickname = receiver.Nickname,
AvatarUrl = receiver.AvatarUrl
});
} }
//添加好友申请 //添加好友申请
public async Task<bool> AddFriend(int userId) public async Task<bool> AddFriend(int userId)
{ {
//var user = await pgSql.Users.FindAsync(userId); var senderId = int.Parse(Context.UserIdentifier!);
var exuser = await pgSql.Friends.Where(a => a.UserId == userId && a.FriendId == senderId ||
(a.FriendId == userId && a.UserId == senderId))
.AnyAsync();
Console.WriteLine("测试结果:"+exuser);
if (exuser) return false;
pgSql.Friends.Add(new Friend pgSql.Friends.Add(new Friend
{ {
UserId = int.Parse(Context.UserIdentifier!), UserId = senderId,
FriendId = userId, FriendId = userId,
CreatedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow,
Status = FriendStatus.Pending Status = FriendStatus.Accepted
}); });
await pgSql.SaveChangesAsync(); await pgSql.SaveChangesAsync();
return true; return true;
} }
//获取好友列表
public async Task<List<FriendsResultResponse>> GetFriendsAsync(int userId)
{
var friends = await pgSql.Friends
.Where(f => f.Status == FriendStatus.Accepted &&
(f.UserId == userId || f.FriendId == userId))
.Select(f => f.UserId == userId
? new FriendsResultResponse
{
Id = f.FriendUser.Id,
Nickname = f.FriendUser.Nickname,
Username = f.FriendUser.Username,
Signature = f.FriendUser.Signature,
AvatarUrl = f.FriendUser.AvatarUrl,
IsOnline = f.FriendUser.IsOnline
}
: new FriendsResultResponse
{
Id = f.User.Id,
Nickname = f.User.Nickname,
Username = f.User.Username,
Signature = f.User.Signature,
AvatarUrl = f.User.AvatarUrl,
IsOnline = f.User.IsOnline
})
.ToListAsync();
return friends;
}
//搜索好友 //搜索好友
public async Task<object> SearchFriends(string username) public async Task<object> SearchFriends(string username)
{ {

View File

@@ -33,4 +33,44 @@ namespace WebAppServer1.Models
[Key("Success")] [Key("Success")]
public bool Success { get; set; } public bool Success { get; set; }
} }
[MessagePackObject]
public class FriendsResultResponse
{
[Key("userid")]
public int Id { get; set; }
[Key("nickname")]
public string Nickname { get; set; }
[Key("username")]
public string Username { get; set; }
[Key("signature")]
public string Signature { get; set; }
[Key("isonline")]
public bool IsOnline { get; set; }
[Key("avatarurl")]
public string AvatarUrl { get; set; }
}
[MessagePackObject]
public class ChatMessageDto
{
[Key("MessageId")]
public int MessageId { get; set; }
[Key("Message")]
public string Message { get; set; }
[Key("IsRead")]
public bool IsRead { get; set; }
[Key("SenderId")]
public int SenderId { get; set; }
[Key("ReceiverId")]
public int? ReceiverId { get; set; }
[Key("IsMine")]
public bool IsMine { get; set; } // true 表示自己发的
[Key("Nickname")]
public string Nickname { get; set; }
[Key("AvatarUrl")]
public string AvatarUrl { get; set; }
}
} }