diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs new file mode 100644 index 00000000..7197366a --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/BbsUser/BbsUserGetListOutputDto.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Bbs.Domain.Shared.Enums; +using Yi.Framework.Rbac.Application.Contracts.Dtos.User; + +namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser +{ + public class BbsUserGetListOutputDto: UserGetListOutputDto + { + /// + /// 用户等级 + /// + public int Level { get; set; } + + /// + /// 用户限制 + /// + public UserLimitEnum UserLimit { get; set; } + } +} diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs index fc50f834..df37566f 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetListOutputDto.cs @@ -1,4 +1,5 @@ using Volo.Abp.Application.Dtos; +using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser; using Yi.Framework.Bbs.Domain.Shared.Consts; using Yi.Framework.Bbs.Domain.Shared.Enums; using Yi.Framework.Rbac.Application.Contracts.Dtos.User; @@ -47,7 +48,7 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss public List? PermissionUserIds { get; set; } - public UserGetListOutputDto User { get; set; } + public BbsUserGetListOutputDto User { get; set; } public void SetBan() { diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs index cb0b1806..27ec1708 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application.Contracts/Dtos/Discuss/DiscussGetOutputDto.cs @@ -1,4 +1,5 @@ using Volo.Abp.Application.Dtos; +using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser; using Yi.Framework.Bbs.Domain.Shared.Enums; using Yi.Framework.Rbac.Application.Contracts.Dtos.User; @@ -35,6 +36,6 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss public DiscussPermissionTypeEnum PermissionType { get; set; } public List? PermissionUserIds { get; set; } - public UserGetListOutputDto User { get; set; } + public BbsUserGetListOutputDto User { get; set; } } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/EventHandlers/UserCreateEventHandler.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/EventHandlers/UserCreateEventHandler.cs new file mode 100644 index 00000000..55674057 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/EventHandlers/UserCreateEventHandler.cs @@ -0,0 +1,27 @@ +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus; +using Yi.Framework.Bbs.Domain.Entities; +using Yi.Framework.Bbs.Domain.Shared.Enums; +using Yi.Framework.Rbac.Domain.Shared.Etos; + +namespace Yi.Framework.Rbac.Application.EventHandlers +{ + public class UserCreateEventHandler : ILocalEventHandler, ITransientDependency + { + private IRepository _repository; + public UserCreateEventHandler(IRepository repository) + { + _repository = repository; + } + public async Task HandleEventAsync(UserCreateEventArgs eventData) + { + //创建主表 + var bbsUser = new BbsUserExtraInfoEntity(eventData.UserId) + { + + }; + await _repository.InsertAsync(bbsUser); + } + } +} diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/DiscussService.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/DiscussService.cs index 7fe70ea6..f4107307 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/DiscussService.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/DiscussService.cs @@ -6,6 +6,7 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.EventBus.Local; using Volo.Abp.Users; +using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser; using Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss; using Yi.Framework.Bbs.Application.Contracts.IServices; using Yi.Framework.Bbs.Domain.Entities; @@ -55,10 +56,20 @@ namespace Yi.Framework.Bbs.Application.Services //查询主题发布 浏览主题 事件,浏览数+1 var item = await _forumManager._discussRepository._DbQueryable.LeftJoin((discuss, user) => discuss.CreatorId == user.Id) - .Select((discuss, user) => new DiscussGetOutputDto + .LeftJoin((discuss, user, info) => user.Id == info.UserId) + .Select((discuss, user, info) => new DiscussGetOutputDto { - User = new UserGetListOutputDto() { UserName = user.UserName, Nick = user.Nick, Icon = user.Icon ,Id=user.Id} - }, true).SingleAsync(discuss => discuss.Id == id); + User = new BbsUserGetListOutputDto() + { + UserName = user.UserName, + Nick = user.Nick, + Icon = user.Icon, + Id = user.Id, + Level = info.Level, + UserLimit = info.UserLimit + } + }, true) + .SingleAsync(discuss => discuss.Id == id); if (item is not null) { @@ -87,18 +98,26 @@ namespace Yi.Framework.Bbs.Application.Services .WhereIF(input.IsTop == true, x => x.IsTop == input.IsTop) .LeftJoin((discuss, user) => discuss.CreatorId == user.Id) + .LeftJoin((discuss, user, info) => user.Id == info.UserId) .OrderByDescending(discuss => discuss.OrderNum) .OrderByIF(input.Type == QueryDiscussTypeEnum.New, discuss => discuss.CreationTime, OrderByType.Desc) .OrderByIF(input.Type == QueryDiscussTypeEnum.Host, discuss => discuss.SeeNum, OrderByType.Desc) .OrderByIF(input.Type == QueryDiscussTypeEnum.Suggest, discuss => discuss.AgreeNum, OrderByType.Desc) - .Select((discuss, user) => new DiscussGetListOutputDto + .Select((discuss, user,info) => new DiscussGetListOutputDto { Id = discuss.Id, IsAgree = SqlFunc.Subqueryable().WhereIF(CurrentUser.Id != null, x => x.CreatorId == CurrentUser.Id && x.DiscussId == discuss.Id).Any(), - User = new UserGetListOutputDto() { Id = user.Id, UserName = user.UserName, Nick = user.Nick, Icon = user.Icon } + User = new BbsUserGetListOutputDto() { + Id = user.Id, + UserName = user.UserName, + Nick = user.Nick, + Icon = user.Icon, + Level = info.Level, + UserLimit = info.UserLimit + } }, true) .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/UserLimitEnum.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/UserLimitEnum.cs new file mode 100644 index 00000000..adc5e927 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Enums/UserLimitEnum.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Bbs.Domain.Shared.Enums +{ + + public enum UserLimitEnum + { + /// + /// 正常 + /// + Normal, + + /// + /// 危险 + /// + Dangerous, + + /// + /// 已禁止 + /// + Ban + + } +} diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs new file mode 100644 index 00000000..a1d6b0d2 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Entities/BbsUserExtraInfoEntity.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SqlSugar; +using Volo.Abp.Domain.Entities; +using Yi.Framework.Bbs.Domain.Shared.Enums; + +namespace Yi.Framework.Bbs.Domain.Entities +{ + /// + /// 评论表 + /// + [SugarTable("BbsUserExtraInfo")] + public class BbsUserExtraInfoEntity : Entity + { + public BbsUserExtraInfoEntity() { } + + public BbsUserExtraInfoEntity(Guid userId) { this.UserId = userId; } + + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public override Guid Id { get; protected set; } + + /// + /// 用户id + /// + public Guid UserId { get; set; } + + /// + /// 用户等级 + /// + public int Level { get; set; } = 1; + + /// + /// 用户限制 + /// + public UserLimitEnum UserLimit { get; set; } = UserLimitEnum.Normal; + } + +} diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.SqlSugarCore/DataSeeds/BbsUserInfoDataSeed.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.SqlSugarCore/DataSeeds/BbsUserInfoDataSeed.cs new file mode 100644 index 00000000..4093e115 --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.SqlSugarCore/DataSeeds/BbsUserInfoDataSeed.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Yi.Framework.Bbs.Domain.Entities; +using Yi.Framework.Rbac.Domain.Entities; +using Yi.Framework.SqlSugarCore.Abstractions; + +namespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds +{ + public class BbsUserInfoDataSeed : IDataSeedContributor, ITransientDependency + { + private ISqlSugarRepository _repository; + private ISqlSugarRepository _userRepository; + public BbsUserInfoDataSeed(ISqlSugarRepository repository, ISqlSugarRepository userReponse) + { + _repository = repository; + _userRepository = userReponse; + } + public async Task SeedAsync(DataSeedContext context) + { + //如果没有bbs的用户额外数据,自动插入 + if (!await _repository.IsAnyAsync(x => true)) + { + var userList = await _userRepository.GetListAsync(x => true); + var userInfoList = userList.Select(x => new BbsUserExtraInfoEntity(x.Id)).ToList(); + await _repository.InsertManyAsync(userInfoList); + } + } + } +} 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 04dcf05e..148ee3f7 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 @@ -298,6 +298,8 @@ namespace Yi.Framework.Rbac.Application.Services { await _userManager.GiveUserSetRoleAsync(new List { entity.Id }, new List { role.Id }); } + + await _localEventBus.PublishAsync(new UserCreateEventArgs(entity.Id)); return true; } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/UserService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/UserService.cs index b3a16cb2..a8f3bf8c 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/UserService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/UserService.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using SqlSugar; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.EventBus.Local; using Volo.Abp.Uow; using Volo.Abp.Users; using Yi.Framework.Ddd.Application; @@ -12,6 +13,7 @@ using Yi.Framework.Rbac.Domain.Entities; using Yi.Framework.Rbac.Domain.Managers; using Yi.Framework.Rbac.Domain.Repositories; using Yi.Framework.Rbac.Domain.Shared.Consts; +using Yi.Framework.Rbac.Domain.Shared.Etos; using Yi.Framework.Rbac.Domain.Shared.OperLog; using Yi.Framework.SqlSugarCore.Abstractions; @@ -23,10 +25,10 @@ namespace Yi.Framework.Rbac.Application.Services public class UserService : YiCrudAppService //IUserService { - public UserService(ISqlSugarRepository repository, UserManager userManager, IUserRepository userRepository, ICurrentUser currentUser, IDeptService deptService) : base(repository) + public UserService(ISqlSugarRepository repository, UserManager userManager, IUserRepository userRepository, ICurrentUser currentUser, IDeptService deptService, ILocalEventBus localEventBus) : base(repository) => - (_userManager, _userRepository, _currentUser, _deptService, _repository) = - (userManager, userRepository, currentUser, deptService, repository); + (_userManager, _userRepository, _currentUser, _deptService, _repository, _localEventBus) = + (userManager, userRepository, currentUser, deptService, repository, localEventBus); private UserManager _userManager { get; set; } private ISqlSugarRepository _repository; private IUserRepository _userRepository { get; set; } @@ -34,6 +36,7 @@ namespace Yi.Framework.Rbac.Application.Services private ICurrentUser _currentUser { get; set; } + private ILocalEventBus _localEventBus; /// /// 查询用户 /// @@ -102,6 +105,9 @@ namespace Yi.Framework.Rbac.Application.Services //uow.Commit(); var result = await MapToGetOutputDtoAsync(returnEntity); + + + await _localEventBus.PublishAsync(new UserCreateEventArgs(returnEntity.Id)); return result; //} } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserCreateEventArgs.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserCreateEventArgs.cs new file mode 100644 index 00000000..2500fd83 --- /dev/null +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Etos/UserCreateEventArgs.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Rbac.Domain.Shared.Etos +{ + /// + /// 用户创建的id + /// + public class UserCreateEventArgs + { + public UserCreateEventArgs(Guid userId) + { + UserId = userId; + } + public Guid UserId { get; set; } + } +}