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 4496b7a4..0e566443 100644 Binary files a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db and b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db differ diff --git a/Yi.RuoYi.Vue3/src/api/system/dept.js b/Yi.RuoYi.Vue3/src/api/system/dept.js index 0e0dcf67..3976dfa6 100644 --- a/Yi.RuoYi.Vue3/src/api/system/dept.js +++ b/Yi.RuoYi.Vue3/src/api/system/dept.js @@ -55,7 +55,7 @@ export function delDept(deptId) { // 根据角色ID查询菜单下拉树结构 export function roleDeptTreeselect(roleId) { return request({ - url: '/dept/getListByRoleId/' + roleId, + url: '/dept/role-id/' + roleId, method: 'get' }) } \ No newline at end of file diff --git a/Yi.RuoYi.Vue3/src/api/system/menu.js b/Yi.RuoYi.Vue3/src/api/system/menu.js index 14d58f26..f9536b06 100644 --- a/Yi.RuoYi.Vue3/src/api/system/menu.js +++ b/Yi.RuoYi.Vue3/src/api/system/menu.js @@ -28,7 +28,7 @@ export function treeselect() { // 根据角色ID查询菜单下拉树结构 export function roleMenuTreeselect(roleId) { return request({ - url: '/menu/getListByRoleId/' + roleId, + url: '/menu/role-id/' + roleId, method: 'get' }) } diff --git a/Yi.RuoYi.Vue3/src/api/system/user.js b/Yi.RuoYi.Vue3/src/api/system/user.js index 90160258..0ab0332c 100644 --- a/Yi.RuoYi.Vue3/src/api/system/user.js +++ b/Yi.RuoYi.Vue3/src/api/system/user.js @@ -21,7 +21,7 @@ export function getUser(userId) { // 新增用户 export function addUser(data) { return request({ - url: '/user/add', + url: '/user', method: 'post', data: data }) @@ -32,22 +32,7 @@ export function updateUser(id, data) { return request({ url: `/user/${id}`, method: 'put', - data: { - - userName: data.user.userName, - nick: data.user.nick, - password: data.user.password, - phone: data.user.phone, - email: data.user.email, - sex: data.user.sex, - state: data.user.state, - remark: data.user.remark, - postIds: data.postIds, - roleIds: data.roleIds, - deptId: data.deptId - - - } + data: data }) } @@ -62,13 +47,12 @@ export function delUser(userId) { // 用户密码重置 export function resetUserPwd(id, password) { const data = { - id, password } return request({ - url: '/user/restPassword', + url: `/account/rest-password/${id}`, method: 'put', data: data }) @@ -106,7 +90,7 @@ export function updateUserPwd(oldPassword, newPassword) { newPassword } return request({ - url: '/account/UpdatePassword', + url: '/account/password', method: 'put', data: data }) diff --git a/Yi.RuoYi.Vue3/src/views/system/role/index.vue b/Yi.RuoYi.Vue3/src/views/system/role/index.vue index c9371273..21259a1e 100644 --- a/Yi.RuoYi.Vue3/src/views/system/role/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/role/index.vue @@ -24,9 +24,9 @@ @keyup.enter="handleQuery" /> - +