From 641217085f6a425eaacfad35be3c9f5b847d715d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= <454313500@qq.com> Date: Mon, 8 Apr 2024 18:57:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ChatMessageService.cs | 22 ++++++- .../Model/MessageContext.cs | 22 ++++++- .../Yi.Framework.ChatHub.Domain.Shared.csproj | 1 + .../Services/AccountService.cs | 34 ++--------- .../Etos/UserRoleMenuQueryEventArgs.cs | 22 +++++++ .../EventHandlers/UserInfoHandler.cs | 33 ++++++++++ .../Managers/UserManager.cs | 61 +++++++++++++++++-- 7 files changed, 156 insertions(+), 39 deletions(-) create mode 100644 Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserRoleMenuQueryEventArgs.cs create mode 100644 Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/EventHandlers/UserInfoHandler.cs diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Application/Services/ChatMessageService.cs b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Application/Services/ChatMessageService.cs index 258419ec..6d60e4c8 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Application/Services/ChatMessageService.cs +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Application/Services/ChatMessageService.cs @@ -13,6 +13,7 @@ using Yi.Framework.ChatHub.Application.Contracts.Dtos; using Yi.Framework.ChatHub.Domain.Managers; using Yi.Framework.ChatHub.Domain.Shared.Enums; using Yi.Framework.ChatHub.Domain.Shared.Model; +using Yi.Framework.Rbac.Domain.Shared.Etos; namespace Yi.Framework.ChatHub.Application.Services { @@ -30,8 +31,14 @@ namespace Yi.Framework.ChatHub.Application.Services public async Task SendPersonalMessageAsync(PersonalMessageInputDto input) { var mesageContext = MessageContext.CreatePersonal(input.Content, input.UserId, CurrentUser.Id!.Value); - await _userMessageManager.SendMessageAsync(mesageContext); + var userRoleMenuQuery = new UserRoleMenuQueryEventArgs(CurrentUser.Id!.Value, input.UserId); + //调用用户领域事件,获取用户信息,第一个发送者用户信息,第二个为接收者用户信息 + await _localEventBus.PublishAsync(userRoleMenuQuery); + mesageContext.SetUserInfo(userRoleMenuQuery.Result.First(), userRoleMenuQuery.Result.Last()); + + + await _userMessageManager.SendMessageAsync(mesageContext); await _userMessageManager.CreateMessageStoreAsync(mesageContext); } @@ -47,11 +54,16 @@ namespace Yi.Framework.ChatHub.Application.Services //领域调用,群主消息调用bbs领域 //如果钱钱不足,将自动断言 - await _localEventBus.PublishAsync(new MoneyChangeEventArgs { UserId = CurrentUser.Id.Value, Number = -1 }); + await _localEventBus.PublishAsync(new MoneyChangeEventArgs { UserId = CurrentUser.Id.Value, Number = -1 },false); var mesageContext = MessageContext.CreateAll(input.Content, CurrentUser.Id!.Value); - await _userMessageManager.SendMessageAsync(mesageContext); + UserRoleMenuQueryEventArgs userRoleMenuQuery = new UserRoleMenuQueryEventArgs(CurrentUser.Id!.Value); + //调用用户领域事件,获取用户信息,第一个发送者用户信息,第二个为接收者用户信息 + await _localEventBus.PublishAsync(userRoleMenuQuery, false); + mesageContext.SetUserInfo(userRoleMenuQuery.Result.First(),null); + + await _userMessageManager.SendMessageAsync(mesageContext); await _userMessageManager.CreateMessageStoreAsync(mesageContext); } @@ -64,6 +76,8 @@ namespace Yi.Framework.ChatHub.Application.Services [RemoteService(IsEnabled = false)] public async Task> GetListAsync(ChatMessageGetListInput input) { + //需要关联用户信息 + var entities = await _userMessageManager._repository._DbQueryable .WhereIF(input.MessageType is not null, x => x.MessageType == input.MessageType) .WhereIF(input.ReceiveId is not null, x => x.ReceiveId == input.ReceiveId) @@ -83,6 +97,8 @@ namespace Yi.Framework.ChatHub.Application.Services [HttpGet("chat-message/account")] public async Task> GetAccountMessageListAsync() { + //需要关联用户信息 + //默认显示1个月的个人数据 var userId = CurrentUser.Id!.Value; //3个类型数据 diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Model/MessageContext.cs b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Model/MessageContext.cs index f95b771b..30120a3f 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Model/MessageContext.cs +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Model/MessageContext.cs @@ -5,14 +5,15 @@ using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks; using Yi.Framework.ChatHub.Domain.Shared.Enums; +using Yi.Framework.Rbac.Domain.Shared.Dtos; namespace Yi.Framework.ChatHub.Domain.Shared.Model { public class MessageContext { - public static MessageContext CreatePersonal(string content, Guid userId,Guid sendUserId) + public static MessageContext CreatePersonal(string content, Guid userId, Guid sendUserId) { - return new MessageContext() { MessageType = MessageTypeEnum.Personal, Content = content, ReceiveId = userId ,SendUserId= sendUserId }; + return new MessageContext() { MessageType = MessageTypeEnum.Personal, Content = content, ReceiveId = userId, SendUserId = sendUserId }; } public static MessageContext CreateAll(string content, Guid sendUserId) @@ -20,7 +21,12 @@ namespace Yi.Framework.ChatHub.Domain.Shared.Model return new MessageContext() { MessageType = MessageTypeEnum.All, Content = content, SendUserId = sendUserId }; } + public void SetUserInfo(UserRoleMenuDto sendUserInfo, UserRoleMenuDto? receiveInfo) + { + this.SendUserInfo = sendUserInfo; + this.ReceiveInfo = receiveInfo; + } /// /// 消息类型 /// @@ -31,15 +37,25 @@ namespace Yi.Framework.ChatHub.Domain.Shared.Model /// public Guid? ReceiveId { get; set; } + /// + /// 接收者用户信息 + /// + public UserRoleMenuDto? ReceiveInfo { get; set; } + /// /// 发送者的用户id /// public Guid SendUserId { get; set; } + + /// + /// 发送者用户信息 + /// + public UserRoleMenuDto SendUserInfo { get; set; } /// /// 消息内容 /// public string Content { get; set; } - public DateTime CreationTime { get;protected set; }=DateTime.Now; + public DateTime CreationTime { get; protected set; } = DateTime.Now; } diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Yi.Framework.ChatHub.Domain.Shared.csproj b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Yi.Framework.ChatHub.Domain.Shared.csproj index 6c143959..ebe5b3d6 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Yi.Framework.ChatHub.Domain.Shared.csproj +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain.Shared/Yi.Framework.ChatHub.Domain.Shared.csproj @@ -11,5 +11,6 @@ + diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs index c2344166..e8abf3fb 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs @@ -35,6 +35,7 @@ namespace Yi.Framework.Rbac.Application.Services private readonly RbacOptions _rbacOptions; private readonly IAliyunManger _aliyunManger; private IDistributedCache _userCache; + private UserManager _userManager; public AccountService(IUserRepository userRepository, ICurrentUser currentUser, IAccountManager accountManager, @@ -44,7 +45,8 @@ namespace Yi.Framework.Rbac.Application.Services ICaptcha captcha, IGuidGenerator guidGenerator, IOptions options, - IAliyunManger aliyunManger) + IAliyunManger aliyunManger, + UserManager userManager) { _userRepository = userRepository; _currentUser = currentUser; @@ -56,6 +58,7 @@ namespace Yi.Framework.Rbac.Application.Services _rbacOptions = options.Value; _aliyunManger = aliyunManger; _userCache = userCache; + _userManager = userManager; } @@ -268,32 +271,7 @@ namespace Yi.Framework.Rbac.Application.Services throw new UserFriendlyException("用户未登录"); } //此处优先从缓存中获取 - UserRoleMenuDto output = null; - - var cacheData = await _userCache.GetAsync(new UserInfoCacheKey(userId.Value)); - if (cacheData is not null) - { - output = cacheData.Info; - } - else - { - var data = await _userRepository.GetUserAllInfoAsync(userId.Value); - //系统用户数据被重置,老前端访问重新授权 - if (data is null) - { - throw new AbpAuthorizationException(); - } - data.Menus.Clear(); - - output = data; - - var tokenExpiresMinuteTime = LazyServiceProvider.GetRequiredService>().Value.ExpiresMinuteTime; - //将用户信息放入缓存,下次获取直接从缓存中获取即可,过期时间为token过期时间 - await _userCache.SetAsync(new UserInfoCacheKey(userId.Value), new UserInfoCacheItem(data), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(tokenExpiresMinuteTime) }); - } - - - + var output = await _userManager.Get(userId.Value); return output; } @@ -336,7 +314,7 @@ namespace Yi.Framework.Rbac.Application.Services if (userId is null) { return false; - // throw new UserFriendlyException("用户已退出"); + // throw new UserFriendlyException("用户已退出"); } await _userCache.RemoveAsync(new UserInfoCacheKey(userId.Value)); //Jwt去中心化登出,只需用记录日志即可 diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserRoleMenuQueryEventArgs.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserRoleMenuQueryEventArgs.cs new file mode 100644 index 00000000..ab68256b --- /dev/null +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserRoleMenuQueryEventArgs.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Rbac.Domain.Shared.Dtos; + +namespace Yi.Framework.Rbac.Domain.Shared.Etos +{ + public class UserRoleMenuQueryEventArgs + { + public UserRoleMenuQueryEventArgs() { } + + public UserRoleMenuQueryEventArgs(params Guid[] userIds) + { + UserIds.AddRange(userIds.ToList()); + } + public List UserIds { get; set; } = new List(); + + public List? Result { get; set; } + } +} diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/EventHandlers/UserInfoHandler.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/EventHandlers/UserInfoHandler.cs new file mode 100644 index 00000000..f5e10032 --- /dev/null +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/EventHandlers/UserInfoHandler.cs @@ -0,0 +1,33 @@ +using Mapster; +using Microsoft.AspNetCore.Identity; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus; +using Yi.Framework.Rbac.Domain.Managers; +using Yi.Framework.Rbac.Domain.Repositories; +using Yi.Framework.Rbac.Domain.Shared.Caches; +using Yi.Framework.Rbac.Domain.Shared.Dtos; +using Yi.Framework.Rbac.Domain.Shared.Etos; + +namespace Yi.Framework.Rbac.Domain.EventHandlers +{ + public class UserInfoHandler : ILocalEventHandler, ITransientDependency + { + private UserManager _userManager; + public UserInfoHandler(UserManager userManager) + { + _userManager = userManager; + } + public async Task HandleEventAsync(UserRoleMenuQueryEventArgs eventData) + { + //数据库查询方式 + eventData.Result = new List(); + + //缓存查询方式 + foreach (var userId in eventData.UserIds) + { + eventData.Result.Add(await _userManager.Get(userId)); + } + } + } +} diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs index edbb875f..6dc14d3a 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs @@ -1,6 +1,16 @@ -using Volo.Abp.Domain.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.Authorization; +using Volo.Abp.Caching; +using Volo.Abp.Domain.Services; using Volo.Abp.Guids; using Yi.Framework.Rbac.Domain.Entities; +using Yi.Framework.Rbac.Domain.Repositories; +using Yi.Framework.Rbac.Domain.Shared.Caches; +using Yi.Framework.Rbac.Domain.Shared.Dtos; +using Yi.Framework.Rbac.Domain.Shared.Options; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.Rbac.Domain.Managers @@ -10,11 +20,12 @@ namespace Yi.Framework.Rbac.Domain.Managers public readonly ISqlSugarRepository _repository; public readonly ISqlSugarRepository _repositoryUserRole; public readonly ISqlSugarRepository _repositoryUserPost; - + private IDistributedCache _userCache; private readonly IGuidGenerator _guidGenerator; - public UserManager(ISqlSugarRepository repository, ISqlSugarRepository repositoryUserRole, ISqlSugarRepository repositoryUserPost, IGuidGenerator guidGenerator) => - (_repository, _repositoryUserRole, _repositoryUserPost, _guidGenerator) = - (repository, repositoryUserRole, repositoryUserPost, guidGenerator); + private IUserRepository _userRepository; + public UserManager(ISqlSugarRepository repository, ISqlSugarRepository repositoryUserRole, ISqlSugarRepository repositoryUserPost, IGuidGenerator guidGenerator, IDistributedCache userCache, IUserRepository userRepository) => + (_repository, _repositoryUserRole, _repositoryUserPost, _guidGenerator, _userCache, _userRepository) = + (repository, repositoryUserRole, repositoryUserPost, guidGenerator, userCache, userRepository); /// /// 给用户设置角色 @@ -75,6 +86,46 @@ namespace Yi.Framework.Rbac.Domain.Managers } } + + /// + /// 查询用户信息,已缓存 + /// + /// + public async Task Get(Guid userId) + { + //if (userId is null) + //{ + // throw new UserFriendlyException("用户未登录"); + //} + //此处优先从缓存中获取 + UserRoleMenuDto output = null; + + var cacheData = await _userCache.GetAsync(new UserInfoCacheKey(userId)); + if (cacheData is not null) + { + output = cacheData.Info; + } + else + { + var data = await _userRepository.GetUserAllInfoAsync(userId); + //系统用户数据被重置,老前端访问重新授权 + if (data is null) + { + throw new AbpAuthorizationException(); + } + data.Menus.Clear(); + + output = data; + + var tokenExpiresMinuteTime = LazyServiceProvider.GetRequiredService>().Value.ExpiresMinuteTime; + //将用户信息放入缓存,下次获取直接从缓存中获取即可,过期时间为token过期时间 + await _userCache.SetAsync(new UserInfoCacheKey(userId), new UserInfoCacheItem(data), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(tokenExpiresMinuteTime) }); + } + return output; + } + + + } } \ No newline at end of file