From be621e9ae279ee01620ee8e622e436808e2c0d6f Mon Sep 17 00:00:00 2001 From: nanxun Date: Tue, 20 Jan 2026 20:25:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF&=E5=90=8E=E7=AB=AF=EF=BC=9A?= =?UTF-8?q?=20=E4=BA=92=E5=8F=91=E6=B6=88=E6=81=AF=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=89=93=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/IM_API/Hubs/ChatHub.cs | 16 +++- .../Interface/Services/IMessageSevice.cs | 4 +- backend/IM_API/Services/MessageService.cs | 8 +- frontend/web/src/App.vue | 13 ++- frontend/web/src/services/api.js | 1 - frontend/web/src/stores/auth.js | 27 +++++- frontend/web/src/stores/chat.js | 96 +++++++++++++++++++ frontend/web/src/stores/signalr.js | 37 ++++++- frontend/web/src/utils/db/messageDB.js | 16 ++++ frontend/web/src/utils/sessionIdTools.js | 11 +++ frontend/web/src/views/auth/Login.vue | 2 +- .../web/src/views/messages/MessageContent.vue | 70 ++++++-------- .../web/src/views/messages/MessageList.vue | 1 - 13 files changed, 244 insertions(+), 58 deletions(-) create mode 100644 frontend/web/src/utils/sessionIdTools.js diff --git a/backend/IM_API/Hubs/ChatHub.cs b/backend/IM_API/Hubs/ChatHub.cs index 960af7e..759f1e6 100644 --- a/backend/IM_API/Hubs/ChatHub.cs +++ b/backend/IM_API/Hubs/ChatHub.cs @@ -1,5 +1,6 @@ using IM_API.Dtos; using IM_API.Interface.Services; +using IM_API.Models; using IM_API.Tools; using Microsoft.AspNetCore.SignalR; using System.Security.Claims; @@ -32,7 +33,7 @@ namespace IM_API.Hubs } await base.OnConnectedAsync(); } - public async Task SendPrivateMessage(MessageBaseDto dto) + public async Task SendMessage(MessageBaseDto dto) { if (!Context.User.Identity.IsAuthenticated) { @@ -41,8 +42,17 @@ namespace IM_API.Hubs return; } var userIdStr = Context.User.FindFirstValue(ClaimTypes.NameIdentifier); - await _messageService.SendPrivateMessageAsync(int.Parse(userIdStr),dto.ReceiverId,dto); - await Clients.Users(dto.ReceiverId.ToString()).SendAsync("ReceiveMessage", dto); + MessageBaseDto msgInfo = null; + if(dto.ChatType.ToLower() == ChatType.PRIVATE.ToString().ToLower()) + { + msgInfo = await _messageService.SendPrivateMessageAsync(int.Parse(userIdStr), dto.ReceiverId, dto); + } + else + { + msgInfo = await _messageService.SendGroupMessageAsync(int.Parse(userIdStr), dto.ReceiverId, dto); + } + + await Clients.Users(dto.ReceiverId.ToString()).SendAsync("ReceiveMessage", msgInfo); return; } } diff --git a/backend/IM_API/Interface/Services/IMessageSevice.cs b/backend/IM_API/Interface/Services/IMessageSevice.cs index c49a949..a7fd68f 100644 --- a/backend/IM_API/Interface/Services/IMessageSevice.cs +++ b/backend/IM_API/Interface/Services/IMessageSevice.cs @@ -11,7 +11,7 @@ namespace IM_API.Interface.Services /// 接收人 /// /// - Task SendPrivateMessageAsync(int senderId,int receiverId,MessageBaseDto dto); + Task SendPrivateMessageAsync(int senderId,int receiverId,MessageBaseDto dto); /// /// 发送群聊消息 /// @@ -19,7 +19,7 @@ namespace IM_API.Interface.Services /// 接收群id /// /// - Task SendGroupMessageAsync(int senderId,int groupId,MessageBaseDto dto); + Task SendGroupMessageAsync(int senderId,int groupId,MessageBaseDto dto); /// /// 获取消息列表 /// diff --git a/backend/IM_API/Services/MessageService.cs b/backend/IM_API/Services/MessageService.cs index 6f4c41f..d6e631b 100644 --- a/backend/IM_API/Services/MessageService.cs +++ b/backend/IM_API/Services/MessageService.cs @@ -79,7 +79,7 @@ namespace IM_API.Services throw new NotImplementedException(); } #region 发送群消息 - public async Task SendGroupMessageAsync(int senderId, int groupId, MessageBaseDto dto) + public async Task SendGroupMessageAsync(int senderId, int groupId, MessageBaseDto dto) { //判断群存在 var isExist = await _context.Groups.AnyAsync(x => x.Id == groupId); @@ -92,12 +92,12 @@ namespace IM_API.Services message.StreamKey = StreamKeyBuilder.Group(groupId); _context.Messages.Add(message); await _context.SaveChangesAsync(); - return true; + return _mapper.Map(message); } #endregion #region 发送私聊消息 - public async Task SendPrivateMessageAsync(int senderId, int receiverId, MessageBaseDto dto) + public async Task SendPrivateMessageAsync(int senderId, int receiverId, MessageBaseDto dto) { bool isExist = await _context.Friends.AnyAsync(x => x.FriendId == receiverId); if (!isExist) throw new BaseException(CodeDefine.FRIEND_RELATION_NOT_FOUND); @@ -107,7 +107,7 @@ namespace IM_API.Services message.StreamKey = StreamKeyBuilder.Private(dto.SenderId, dto.ReceiverId); _context.Messages.Add(message); await _context.SaveChangesAsync(); - return true; + return _mapper.Map(message); } #endregion } diff --git a/frontend/web/src/App.vue b/frontend/web/src/App.vue index 5668470..79bb67b 100644 --- a/frontend/web/src/App.vue +++ b/frontend/web/src/App.vue @@ -7,8 +7,19 @@ +import { onMounted } from 'vue'; +import { useAuthStore } from './stores/auth'; +//import { useSignalRStore } from './stores/signalr'; +onMounted(async () => { + const { useSignalRStore } = await import('./stores/signalr'); + const authStore = useAuthStore(); + const signalRStore = useSignalRStore(); + if(authStore.token){ + signalRStore.initSignalR(); + } +}) +