From 158cab9f9b9ae0195fe5614129e2a48a18508a3b Mon Sep 17 00:00:00 2001 From: chenchun <454313500@qq.com> Date: Sun, 12 Feb 2023 18:43:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E3=80=81=E8=A7=92=E8=89=B2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ReadOnlyAppService.cs | 19 ++++-- .../Identity/Dtos/Account/RestPasswordDto.cs | 13 ++++ .../Dtos/Account/UpdatePasswordDto.cs | 14 +++++ .../Identity/Dtos/Role/RoleCreateInputVo.cs | 11 ++-- .../Dtos/Role/RoleGetListOutputDto.cs | 2 + .../Identity/Dtos/Role/RoleGetOutputDto.cs | 2 + .../Identity/Dtos/Role/RoleUpdateInputVo.cs | 9 ++- .../Identity/Dtos/User/UserCreateInputVo.cs | 1 + .../Identity/Dtos/User/UserGetOutputDto.cs | 2 + .../ApplicationSwaggerDoc.xml | 29 +++++++++ .../Identity/AccountService.cs | 32 ++++++++++ .../Identity/MenuService.cs | 12 ++++ .../Identity/RoleService.cs | 28 +++++++++ .../rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml | 8 +++ .../Yi.RBAC.Domain/Identity/AccountManager.cs | 27 ++++++++- .../Yi.RBAC.Domain/Identity/RoleManager.cs | 47 +++++++++++++++ .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 110592 -> 110592 bytes Yi.RuoYi.Vue3/src/api/system/dept.js | 2 +- Yi.RuoYi.Vue3/src/api/system/menu.js | 2 +- Yi.RuoYi.Vue3/src/api/system/user.js | 24 ++------ Yi.RuoYi.Vue3/src/views/system/role/index.vue | 55 +++++++++-------- Yi.RuoYi.Vue3/src/views/system/user/index.vue | 57 +++++++++--------- 22 files changed, 304 insertions(+), 92 deletions(-) create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/RestPasswordDto.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdatePasswordDto.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/RoleManager.cs diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/ReadOnlyAppService.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/ReadOnlyAppService.cs index 152ae845..912dccd2 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/ReadOnlyAppService.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/ReadOnlyAppService.cs @@ -84,14 +84,15 @@ where TEntityDto : IEntityDto /// public virtual async Task> GetListAsync(TGetListInput input) { - - var totalCount = await _repository.CountAsync(_ => true); + var totalCount = -1; var entities = new List(); var entityDtos = new List(); - if (totalCount > 0) - { + bool isPageList = true; + + //if (totalCount > 0) + //{ //这里还可以追加如果是审计日志,继续拼接条件即可 if (input is IPageTimeResultRequestDto timeInput) @@ -103,6 +104,8 @@ where TEntityDto : IEntityDto } + + if (input is IPagedAndSortedResultRequestDto sortInput) { entities = await _repository.GetPageListAsync(_ => true, sortInput,sortInput.SortBy, sortInput.SortType); @@ -111,11 +114,17 @@ where TEntityDto : IEntityDto else { + isPageList = false; entities = await _repository.GetListAsync(); } entityDtos = await MapToGetListOutputDtosAsync(entities); - } + //} + //如果是分页查询,还需要统计数量 + if (isPageList) + { + totalCount = await _repository.CountAsync(_ => true); + } return new PagedResultDto( totalCount, entityDtos diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/RestPasswordDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/RestPasswordDto.cs new file mode 100644 index 00000000..22d40ec5 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/RestPasswordDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.RBAC.Application.Contracts.Identity.Dtos.Account +{ + public class RestPasswordDto + { + public string Password = string.Empty; + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdatePasswordDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdatePasswordDto.cs new file mode 100644 index 00000000..132cd43b --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdatePasswordDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.RBAC.Application.Contracts.Identity.Dtos.Account +{ + public class UpdatePasswordDto + { + public string NewPassword { get; set; } = string.Empty; + public string OldPassword { get; set; } = string.Empty; + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleCreateInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleCreateInputVo.cs index 3b5415e5..16eaf991 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleCreateInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleCreateInputVo.cs @@ -12,13 +12,16 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos /// public class RoleCreateInputVo { - public long Id { get; set; } - public DateTime CreationTime { get; set; } = DateTime.Now; - public long? CreatorId { get; set; } public string? RoleName { get; set; } public string? RoleCode { get; set; } public string? Remark { get; set; } public DataScopeEnum DataScope { get; set; } = DataScopeEnum.ALL; - public bool State { get; set; } + public bool State { get; set; } = true; + + public int OrderNum { get; set; } + + public List DeptIds { get; set; } + + public List MenuIds { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetListOutputDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetListOutputDto.cs index 17c9bd64..4b88acb7 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetListOutputDto.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetListOutputDto.cs @@ -18,5 +18,7 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public string? Remark { get; set; } public DataScopeEnum DataScope { get; set; } = DataScopeEnum.ALL; public bool State { get; set; } + + public int OrderNum { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetOutputDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetOutputDto.cs index bfdb63a1..8b843468 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetOutputDto.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleGetOutputDto.cs @@ -18,5 +18,7 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public string? Remark { get; set; } public DataScopeEnum DataScope { get; set; } = DataScopeEnum.ALL; public bool State { get; set; } + + public int OrderNum { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleUpdateInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleUpdateInputVo.cs index ee97fc02..a70f10c1 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleUpdateInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Role/RoleUpdateInputVo.cs @@ -9,13 +9,16 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos { public class RoleUpdateInputVo { - public long Id { get; set; } - public DateTime CreationTime { get; set; } = DateTime.Now; - public long? CreatorId { get; set; } public string? RoleName { get; set; } public string? RoleCode { get; set; } public string? Remark { get; set; } public DataScopeEnum DataScope { get; set; } = DataScopeEnum.ALL; public bool State { get; set; } + + public int OrderNum { get; set; } + + public List DeptIds { get; set; } + + public List MenuIds { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserCreateInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserCreateInputVo.cs index acf5fdd6..c5f0ac0b 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserCreateInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserCreateInputVo.cs @@ -27,5 +27,6 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public List? RoleIds { get; set; } public List? PostIds { get; set; } public long? DeptId { get; set; } + public bool State { get; set; } = true; } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserGetOutputDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserGetOutputDto.cs index d43fde2a..474c02a0 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserGetOutputDto.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserGetOutputDto.cs @@ -26,6 +26,8 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public bool State { get; set; } public DateTime CreationTime { get; set; } + public long DeptId { get; set; } + public DeptGetOutputDto Dept { get; set; } public List Posts { get; set; } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml index 91a733e9..67079074 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml @@ -58,6 +58,21 @@ + + + 更新密码 + + + + + + + 重置密码 + + + + + Dept服务实现 @@ -81,6 +96,13 @@ Menu服务实现 + + + 查询当前角色的菜单 + + + + Post服务实现 @@ -91,6 +113,13 @@ Role服务实现 + + + 添加角色 + + + + User服务实现 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs index 9343ab1a..913b548e 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs @@ -140,5 +140,37 @@ namespace Yi.RBAC.Application.Identity var imgbyte = _securityCode.GetEnDigitalCodeByte(code); return new CaptchaImageDto { Img = imgbyte, Uuid = code }; } + + /// + /// 更新密码 + /// + /// + /// + public async Task UpdatePasswordAsync(UpdatePasswordDto input) + { + if (input.OldPassword.Equals(input.NewPassword)) + { + throw new UserFriendlyException("无效更新!输入的数据,新密码不能与老密码相同"); + } + await _accountManager.UpdatePasswordAsync(_currentUser.Id, input.NewPassword, input.OldPassword); + return true; + } + + /// + /// 重置密码 + /// + /// + /// + /// + [HttpPut] + public async Task RestPasswordAsync(long userId, RestPasswordDto input) + { + if (!string.IsNullOrEmpty(input.Password)) + { + throw new UserFriendlyException("重置密码不能为空!"); + } + await _accountManager.RestPasswordAsync(userId, input.Password); + return true; + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs index 7327aa96..6061e0bc 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs @@ -3,6 +3,7 @@ using NET.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; +using SqlSugar; namespace Yi.RBAC.Application.Identity { @@ -13,5 +14,16 @@ namespace Yi.RBAC.Application.Identity public class MenuService : CrudAppService, IMenuService, IAutoApiService { + /// + /// 查询当前角色的菜单 + /// + /// + /// + public async Task> GetListRoleIdAsync(long roleId) + { + var entities= await _DbQueryable.Where(m => SqlFunc.Subqueryable().Where(rm => rm.RoleId == roleId && rm.MenuId == m.Id).Any()).ToListAsync(); + + return await MapToGetListOutputDtosAsync(entities); + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs index f9c346ec..1add1a2d 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs @@ -3,6 +3,9 @@ using NET.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; +using Yi.RBAC.Domain.Identity; +using Microsoft.AspNetCore.Identity; +using Yi.Framework.Uow; namespace Yi.RBAC.Application.Identity { @@ -13,5 +16,30 @@ namespace Yi.RBAC.Application.Identity public class RoleService : CrudAppService, IRoleService, IAutoApiService { + [Autowired] + private RoleManager _roleManager { get; set; } + + [Autowired] + private IUnitOfWorkManager _unitOfWorkManager { get; set; } + + /// + /// 添加角色 + /// + /// + /// + public override async Task CreateAsync(RoleCreateInputVo input) + { + RoleGetOutputDto outputDto; + using (var uow = _unitOfWorkManager.CreateContext()) + { + var entity = await MapToEntityAsync(input); + await _repository.InsertAsync(entity); + outputDto = await MapToGetOutputDtoAsync(entity); + await _roleManager.GiveRoleSetMenuAsync(new List { entity.Id }, input.MenuIds); + uow.Commit(); + } + + return outputDto; + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml index 43218a62..99550148 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml @@ -669,6 +669,14 @@ + + + 给角色设置菜单 + + + + + 给用户设置角色 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/AccountManager.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/AccountManager.cs index 809bdb68..ad438541 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/AccountManager.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/AccountManager.cs @@ -1,4 +1,5 @@ -using System; +using Mapster; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -103,6 +104,30 @@ namespace Yi.RBAC.Domain.Identity return claims; } + public async Task UpdatePasswordAsync(long userId, string newPassword, string oldPassword) + { + var user = await _repository.GetByIdAsync(userId); + + if (!user.JudgePassword(oldPassword)) + { + throw new UserFriendlyException("无效更新!新密码不能与老密码相同"); + } + user.Password = newPassword; + user.BuildPassword(); + await _repository.UpdateAsync(user); + } + + + public async Task RestPasswordAsync(long userId, string password) + { + var user = await _repository.GetByIdAsync(userId); + user.Id = userId; + user.Password = password; + user.BuildPassword(); + return await _repository.UpdateAsync(user); + + + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/RoleManager.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/RoleManager.cs new file mode 100644 index 00000000..50ce5211 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/RoleManager.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Ddd.Repositories; +using Yi.RBAC.Domain.Identity.Entities; + +namespace Yi.RBAC.Domain.Identity +{ + [AppService] + public class RoleManager + { + private IRepository _repository; + private IRepository _roleMenuRepository; + public RoleManager(IRepository repository, IRepository roleMenuRepository) + { + _repository = repository; + _roleMenuRepository = roleMenuRepository; + } + + /// + /// 给角色设置菜单 + /// + /// + /// + /// + public async Task GiveRoleSetMenuAsync(List roleIds, List menuIds) + { + //这个是需要事务的,在service中进行工作单元 + await _roleMenuRepository.DeleteAsync(u => roleIds.Contains(u.RoleId)); + //遍历用户 + foreach (var roleId in roleIds) + { + //添加新的关系 + List roleMenuEntity = new(); + foreach (var menu in menuIds) + { + roleMenuEntity.Add(new RoleMenuEntity() {Id=SnowflakeHelper.NextId, RoleId = roleId, MenuId = menu }); + } + //一次性批量添加 + await _roleMenuRepository.InsertRangeAsync(roleMenuEntity); + } + + } + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db index 4496b7a4c4d1fba82f8189323bff38933e106737..0e56644380bf4ab67007ed99561d402fbeeb88f7 100644 GIT binary patch delta 1248 zcmZ{jOH30{6o&6~rq`)3y<-R^g%ThFCWMxGwe&%QZLuJ(| zd{je(AKOAiczf)5TRFvC1V}W0WKNii`GNWhCY|Y_tdItvCgbsgDj;7CGz{SvZL+La zynhm80Wa_(FNmSx?yh-zJUAHXA5Nqaf#l$HDl#rIW-|9D_JPSN3UNv&kbzZ+M6XG=TsPA|tf+TEUh1I{OVo0=+loNw*z)9oNjBZk&J4gW~0HnK=Hl&GZ5pr}{X z#&`&If3?PhjVM|SN>p$j^ZGBGQEe6tjxrdf!BGlQgQFA%QYEDngrSUt%2~rO0E2!4 z3gN@~4eg*!Bp=KL)S)A3xVeyJac=dSmG|xC9&6B%C@RiWFYTg?53yso3+C zvZa;ls-YHCT~BQk+K85N5^bIh;ls%~{I3|8`1djJU*X@!zYnNo1ON1W@{Dd=Od#`trX!m_{k}e - +