From bc42efe70382b0f7dc8492b173ddd1e800bed237 Mon Sep 17 00:00:00 2001 From: chenchun <454313500@qq.com> Date: Sat, 11 Feb 2023 15:56:54 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20rbac=E6=9F=A5=E8=AF=A2=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Yi.Framework.Data/Entities/IState.cs | 2 +- .../Identity/Dtos/Dept/DeptGetOutputDto.cs | 5 +- .../Dtos/Post/PostGetListOutputDto.cs | 1 - .../Identity/Dtos/User/UserGetOutputDto.cs | 13 +- .../Identity/Dtos/User/UserUpdateInputVo.cs | 17 ++- .../ApplicationSwaggerDoc.xml | 15 ++ .../Identity/UserService.cs | 46 +++++- .../Yi.RBAC.Domain/DataSeeds/DeptDataSeed.cs | 138 ++++++++++++++++++ .../Yi.RBAC.Domain/DataSeeds/PostDataSeed.cs | 69 +++++++++ .../Yi.RBAC.Domain/DataSeeds/RoleDataSeed.cs | 51 +++++++ .../Dictionary/Entities/DictionaryEntity.cs | 2 +- .../Identity/Entities/DeptEntity.cs | 2 +- .../Identity/Entities/MenuEntity.cs | 2 +- .../Identity/Entities/PostEntity.cs | 2 +- .../Identity/Entities/RoleEntity.cs | 2 +- .../Identity/Entities/UserEntity.cs | 2 +- .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 110592 -> 110592 bytes Yi.RuoYi.Vue3/src/api/system/dept.js | 17 +-- Yi.RuoYi.Vue3/src/api/system/menu.js | 18 +-- Yi.RuoYi.Vue3/src/api/system/post.js | 19 +-- Yi.RuoYi.Vue3/src/api/system/role.js | 17 +-- Yi.RuoYi.Vue3/src/api/system/user.js | 34 +++-- Yi.RuoYi.Vue3/src/views/system/dept/index.vue | 2 +- Yi.RuoYi.Vue3/src/views/system/menu/index.vue | 4 +- Yi.RuoYi.Vue3/src/views/system/post/index.vue | 2 +- Yi.RuoYi.Vue3/src/views/system/role/index.vue | 4 +- Yi.RuoYi.Vue3/src/views/system/user/index.vue | 15 +- .../src/views/tool/gen/genInfoForm.vue | 2 +- 28 files changed, 405 insertions(+), 98 deletions(-) create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/DeptDataSeed.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/PostDataSeed.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/RoleDataSeed.cs diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Data/Entities/IState.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Data/Entities/IState.cs index 55e08fc5..fee2f365 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Data/Entities/IState.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Data/Entities/IState.cs @@ -8,6 +8,6 @@ namespace Yi.Framework.Data.Entities { public interface IState { - public bool? State { get; set; } + public bool State { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetOutputDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetOutputDto.cs index 9de98d68..78ce84d1 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetOutputDto.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetOutputDto.cs @@ -10,13 +10,12 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public class DeptGetOutputDto : IEntityDto { public long Id { get; set; } - public DateTime CreationTime { get; set; } = DateTime.Now; - public long? CreatorId { get; set; } public bool State { get; set; } public string DeptName { get; set; }=string.Empty; public string DeptCode { get; set; } = string.Empty; public string? Leader { get; set; } - public long ParentId { get; set; } public string? Remark { get; set; } + + public long? deptId { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Post/PostGetListOutputDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Post/PostGetListOutputDto.cs index 239bf3b0..34088d31 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Post/PostGetListOutputDto.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Post/PostGetListOutputDto.cs @@ -11,7 +11,6 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos { public long Id { get; set; } public DateTime CreationTime { get; set; } = DateTime.Now; - public long? CreatorId { get; set; } public bool State { get; set; } public string PostCode { get; set; }=string.Empty; public string PostName { get; set; } = string.Empty; 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 9c52a361..d43fde2a 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 @@ -14,8 +14,6 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public string? Name { get; set; } public int? Age { get; set; } public string UserName { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public string Salt { get; set; } = string.Empty; public string? Icon { get; set; } public string? Nick { get; set; } public string? Email { get; set; } @@ -25,10 +23,13 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public string? Introduction { get; set; } public string? Remark { get; set; } public SexEnum Sex { get; set; } = SexEnum.Unknown; - public long? DeptId { get; set; } - public DateTime CreationTime { get; set; } = DateTime.Now; - public long? CreatorId { get; set; } - public bool State { get; set; } + public DateTime CreationTime { get; set; } + + public DeptGetOutputDto Dept { get; set; } + + public List Posts { get; set; } + + public List Roles { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserUpdateInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserUpdateInputVo.cs index 84e0badd..c191ea6d 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserUpdateInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/UserUpdateInputVo.cs @@ -1,3 +1,4 @@ +using Mapster; using System; using System.Collections.Generic; using System.Linq; @@ -9,12 +10,12 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos { public class UserUpdateInputVo { - public long Id { get; set; } public string? Name { get; set; } public int? Age { get; set; } - public string UserName { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public string Salt { get; set; } = string.Empty; + public string? UserName { get; set; } + + [AdaptIgnore] + public string? Password { get; set; } public string? Icon { get; set; } public string? Nick { get; set; } public string? Email { get; set; } @@ -23,11 +24,11 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos public long? Phone { get; set; } public string? Introduction { get; set; } public string? Remark { get; set; } - public SexEnum Sex { get; set; } = SexEnum.Unknown; + public SexEnum? Sex { get; set; } public long? DeptId { get; set; } - public DateTime CreationTime { get; set; } = DateTime.Now; - public long? CreatorId { get; set; } + public List? PostIds { get; set; } - public bool State { get; set; } + public List? RoleIds { get; set; } + public bool? State { 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 2cc21a17..91a733e9 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 @@ -111,5 +111,20 @@ + + + 单查 + + + + + + + 更新用户 + + + + + diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs index 85e99807..729cbb54 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs @@ -8,6 +8,8 @@ using Yi.RBAC.Domain.Identity; using Yi.Framework.Uow; using Yi.Framework.Ddd.Dtos; using Yi.RBAC.Domain.Identity.Repositories; +using SqlSugar; +using Mapster; namespace Yi.RBAC.Application.Identity { @@ -36,7 +38,7 @@ namespace Yi.RBAC.Application.Identity { var entity = await MapToEntityAsync(input); - int total = 0; + RefAsync total = 0; var entities = await _DbQueryable.WhereIF(!string.IsNullOrEmpty(input.UserName), x => x.UserName.Contains(input.UserName!)). WhereIF(input.Phone is not null, x => x.Phone.ToString()!.Contains(input.Phone.ToString()!)). @@ -80,5 +82,47 @@ namespace Yi.RBAC.Application.Identity return result; } } + /// + /// 单查 + /// + /// + /// + public override async Task GetAsync(long id) + { + //使用导航树形查询 + var entity = await _DbQueryable.Includes(u => u.Roles).Includes(u => u.Posts).Includes(u => u.Dept).InSingleAsync(id); + + return await MapToGetOutputDtoAsync(entity); + } + + /// + /// 更新用户 + /// + /// + /// + /// + public async override Task UpdateAsync(long id, UserUpdateInputVo input) + { + if (await _repository.IsAnyAsync(u => input.UserName!.Equals(u.UserName) && !id.Equals(u.Id))) + { + throw new UserFriendlyException("用户已经在,更新失败"); + } + var entity = await _repository.GetByIdAsync(id); + //更新密码,特殊处理 + if (input.Password is not null) + { + entity.Password = input.Password; + entity.BuildPassword(); + } + await MapToEntityAsync(input, entity); + using (var uow = _unitOfWorkManager.CreateContext()) + { + var res1 = await _repository.UpdateAsync(entity); + await _userManager.GiveUserSetRoleAsync(new List { id }, input.RoleIds); + await _userManager.GiveUserSetPostAsync(new List { id }, input.PostIds); + uow.Commit(); + } + return await MapToGetOutputDtoAsync(entity); + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/DeptDataSeed.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/DeptDataSeed.cs new file mode 100644 index 00000000..65d59a66 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/DeptDataSeed.cs @@ -0,0 +1,138 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Data.DataSeeds; +using Yi.Framework.Ddd.Repositories; +using Yi.RBAC.Domain.Dictionary.Entities; +using Yi.RBAC.Domain.Identity.Entities; + +namespace Yi.RBAC.Domain.DataSeeds +{ + [AppService(typeof(IDataSeed))] + public class DeptDataSeed : AbstractDataSeed + { + public DeptDataSeed(IRepository repository) : base(repository) + { + } + + public override List GetSeedData() + { + var entities =new List(); + + DeptEntity chengziDept = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "橙子科技", + DeptCode = "Yi", + OrderNum = 100, + IsDeleted = false, + ParentId = 0, + Leader = "橙子", + Remark = "如名所指" + }; + entities.Add(chengziDept); + + + DeptEntity shenzhenDept = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "深圳总公司", + OrderNum = 100, + IsDeleted = false, + ParentId = chengziDept.Id + }; + entities.Add(shenzhenDept); + + + DeptEntity jiangxiDept = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "江西总公司", + OrderNum = 100, + IsDeleted = false, + ParentId = chengziDept.Id + }; + entities.Add(jiangxiDept); + + + + DeptEntity szDept1 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "研发部门", + OrderNum = 100, + IsDeleted = false, + ParentId = shenzhenDept.Id + }; + entities.Add(szDept1); + + DeptEntity szDept2 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "市场部门", + OrderNum = 100, + IsDeleted = false, + ParentId = shenzhenDept.Id + }; + entities.Add(szDept2); + + DeptEntity szDept3 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "测试部门", + OrderNum = 100, + IsDeleted = false, + ParentId = shenzhenDept.Id + }; + entities.Add(szDept3); + + DeptEntity szDept4 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "财务部门", + OrderNum = 100, + IsDeleted = false, + ParentId = shenzhenDept.Id + }; + entities.Add(szDept4); + + DeptEntity szDept5 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "运维部门", + OrderNum = 100, + IsDeleted = false, + ParentId = shenzhenDept.Id + }; + entities.Add(szDept5); + + + DeptEntity jxDept1 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "市场部门", + OrderNum = 100, + IsDeleted = false, + ParentId = jiangxiDept.Id + }; + entities.Add(jxDept1); + + + DeptEntity jxDept2 = new DeptEntity() + { + Id = SnowflakeHelper.NextId, + DeptName = "财务部门", + OrderNum = 100, + IsDeleted = false, + ParentId = jiangxiDept.Id + }; + entities.Add(jxDept2); + + + return entities; + } + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/PostDataSeed.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/PostDataSeed.cs new file mode 100644 index 00000000..c09838f7 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/PostDataSeed.cs @@ -0,0 +1,69 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Data.DataSeeds; +using Yi.Framework.Ddd.Repositories; +using Yi.RBAC.Domain.Identity.Entities; + +namespace Yi.RBAC.Domain.DataSeeds +{ + [AppService(typeof(IDataSeed))] + public class PostDataSeed : AbstractDataSeed + { + public PostDataSeed(IRepository repository) : base(repository) + { + } + + public override List GetSeedData() + { + var entites=new List(); + + PostEntity Post1 = new PostEntity() + { + Id = SnowflakeHelper.NextId, + PostName = "董事长", + PostCode = "ceo", + OrderNum = 100, + IsDeleted = false + }; + entites.Add(Post1); + + PostEntity Post2 = new PostEntity() + { + Id = SnowflakeHelper.NextId, + PostName = "项目经理", + PostCode = "se", + OrderNum = 100, + IsDeleted = false + }; + entites.Add(Post2); + + PostEntity Post3 = new PostEntity() + { + Id = SnowflakeHelper.NextId, + PostName = "人力资源", + PostCode = "hr", + OrderNum = 100, + IsDeleted = false + }; + entites.Add(Post3); + + PostEntity Post4 = new PostEntity() + { + Id = SnowflakeHelper.NextId, + PostName = "普通员工", + PostCode = "user", + OrderNum = 100, + IsDeleted = false + }; + + entites.Add(Post4); + return entites; + } + } + + +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/RoleDataSeed.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/RoleDataSeed.cs new file mode 100644 index 00000000..203f71dc --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/RoleDataSeed.cs @@ -0,0 +1,51 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Data.DataSeeds; +using Yi.Framework.Ddd.Repositories; +using Yi.RBAC.Domain.Identity.Entities; +using Yi.RBAC.Domain.Shared.Identity.EnumClasses; + +namespace Yi.RBAC.Domain.DataSeeds +{ + [AppService(typeof(IDataSeed))] + public class RoleDataSeed : AbstractDataSeed + { + public RoleDataSeed(IRepository repository) : base(repository) + { + } + + public override List GetSeedData() + { + var entities = new List(); + RoleEntity role1 = new RoleEntity() + { + Id = SnowflakeHelper.NextId, + RoleName = "管理员", + RoleCode = "admin", + DataScope = DataScopeEnum.ALL, + OrderNum = 999, + Remark = "管理员", + IsDeleted = false + }; + entities.Add(role1); + + RoleEntity role2 = new RoleEntity() + { + Id = SnowflakeHelper.NextId, + RoleName = "测试角色", + RoleCode = "test", + DataScope = DataScopeEnum.ALL, + OrderNum = 1, + Remark = "测试用的角色", + IsDeleted = false + }; + entities.Add(role2); + + return entities; + } + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Dictionary/Entities/DictionaryEntity.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Dictionary/Entities/DictionaryEntity.cs index f2153621..1a5e7713 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Dictionary/Entities/DictionaryEntity.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Dictionary/Entities/DictionaryEntity.cs @@ -33,7 +33,7 @@ namespace Yi.RBAC.Domain.Dictionary.Entities /// /// 状态 /// - public bool? State { get; set; } = true; + public bool State { get; set; } = true; /// /// 描述 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/DeptEntity.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/DeptEntity.cs index 4eb5027b..022c416a 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/DeptEntity.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/DeptEntity.cs @@ -54,7 +54,7 @@ namespace Yi.RBAC.Domain.Identity.Entities /// /// 状态 /// - public bool? State { get; set; } + public bool State { get; set; } = true; /// /// 部门名称 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/MenuEntity.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/MenuEntity.cs index cb829e36..00c36374 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/MenuEntity.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/MenuEntity.cs @@ -56,7 +56,7 @@ namespace Yi.RBAC.Domain.Identity.Entities /// /// 状态 /// - public bool? State { get; set; } + public bool State { get; set; } /// /// 菜单名 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/PostEntity.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/PostEntity.cs index cd8989a7..57f3922c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/PostEntity.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/PostEntity.cs @@ -55,7 +55,7 @@ namespace Yi.RBAC.Domain.Identity.Entities /// /// 状态 /// - public bool? State { get; set; } + public bool State { get; set; }=true; /// /// 岗位编码 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/RoleEntity.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/RoleEntity.cs index 8c729679..f64a1ec2 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/RoleEntity.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/RoleEntity.cs @@ -79,7 +79,7 @@ namespace Yi.RBAC.Domain.Identity.Entities /// /// 状态 /// - public bool? State { get; set; } + public bool State { get; set; }=true; [Navigate(typeof(RoleMenuEntity), nameof(RoleMenuEntity.RoleId), nameof(RoleMenuEntity.MenuId))] diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/UserEntity.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/UserEntity.cs index 67d3d071..221fd070 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/UserEntity.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Identity/Entities/UserEntity.cs @@ -133,7 +133,7 @@ namespace Yi.RBAC.Domain.Identity.Entities /// /// 状态 /// - public bool? State { get; set; } = true; + public bool State { get; set; } = true; /// 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 5791274a0953590892065fec52790cc26c6b84ef..4496b7a4c4d1fba82f8189323bff38933e106737 100644 GIT binary patch delta 1741 zcmai!L1+_M7{}k6nM@|JlW*eEy6FlHYFN;`C`cW-^_aDIWjB_xnU_~~M{ooo#Isz03!H7; z9XQ*G11yJ7H4!NAJwh%N;LsjY!*Mldjt3(H0y@>(f9kKF+fMWCCr;G&^c_QV>)!nb zl<1c2#UEK8Ll-M(^7>S6k{DB%vuoj@x}b#*SFeEcpTO_4K zP>gYeP!$l9q20Qw3}(s?(m`8{ZMN~^5<~iOzH0Vnetbbq&MCh?R0d~@BaR8EgL34c z5~l()lT~iW6__q;VM6`@7pgg^uN&bzbHuoMe^_~x*6wB0RPxt^p_ID=O8T;TA*o*a z(@Qqj3lf5lpurL>!ZVQJE)2sZkYs;*4@gxsi%U!GwF$S!CRolUTyC3SSeu|-HbF5q zfoYpS)H<5=7|~%t{@mvZRxuzTcnK-!0^yFo9i&}MRq5hYhsd>?9ewazC|i(7v?&r5 z8|zydo8!Or_nuUTCkx3DC39Vw8IRIdx8Le6+YEd6(Ub3UIVClke|%oerK1$-m5e*T z+H9?aK1zFYe{W&zi8eZ^%?)blKU%Q$<8SIp$1WS+YHuXo)7zKN+ePZ0q^E_wx)~*jZut} zY#fptl8u(Ol9G}PK$av2hci$)2ZvZqo`PwU07G#}QD$B`gq$2k z5@3MYvdQ5Q|MW-tj6zb}%xs(>QIIUy;pm3gLk;0z11a;xFvOoxhy`TG_8qz CIZI#w diff --git a/Yi.RuoYi.Vue3/src/api/system/dept.js b/Yi.RuoYi.Vue3/src/api/system/dept.js index cf28c932..0e0dcf67 100644 --- a/Yi.RuoYi.Vue3/src/api/system/dept.js +++ b/Yi.RuoYi.Vue3/src/api/system/dept.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询部门列表 export function listDept(query) { return request({ - url: '/dept/SelctGetList', + url: '/dept', method: 'get', params: query }) @@ -20,7 +20,7 @@ export function listDept(query) { // 查询部门详细 export function getDept(deptId) { return request({ - url: '/dept/getById/' + deptId, + url: '/dept/' + deptId, method: 'get' }) } @@ -28,7 +28,7 @@ export function getDept(deptId) { // 新增部门 export function addDept(data) { return request({ - url: '/dept/add', + url: '/dept', method: 'post', data: data }) @@ -37,7 +37,7 @@ export function addDept(data) { // 修改部门 export function updateDept(data) { return request({ - url: '/dept/update', + url: '/dept', method: 'put', data: data }) @@ -45,14 +45,9 @@ export function updateDept(data) { // 删除部门 export function delDept(deptId) { - if("string"==typeof(deptId)) - { - deptId=[deptId]; - } return request({ - url: '/dept/delList', - method: 'delete', - data:deptId + url: `/dept/${deptId}`, + method: 'delete' }) } diff --git a/Yi.RuoYi.Vue3/src/api/system/menu.js b/Yi.RuoYi.Vue3/src/api/system/menu.js index 2cab2ce1..14d58f26 100644 --- a/Yi.RuoYi.Vue3/src/api/system/menu.js +++ b/Yi.RuoYi.Vue3/src/api/system/menu.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询菜单列表 export function listMenu(query) { return request({ - url: '/menu/selctGetList', + url: '/menu', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function listMenu(query) { // 查询菜单详细 export function getMenu(menuId) { return request({ - url: '/menu/getById/' + menuId, + url: '/menu/' + menuId, method: 'get' }) } @@ -36,7 +36,7 @@ export function roleMenuTreeselect(roleId) { // 新增菜单 export function addMenu(data) { return request({ - url: '/menu/add', + url: '/menu', method: 'post', data: data }) @@ -45,7 +45,7 @@ export function addMenu(data) { // 修改菜单 export function updateMenu(data) { return request({ - url: '/menu/update', + url: '/menu', method: 'put', data: data }) @@ -53,13 +53,9 @@ export function updateMenu(data) { // 删除菜单 export function delMenu(menuId) { - if("string"==typeof(menuId)) - { - menuId=[menuId]; - } + return request({ - url: '/menu/delList', - method: 'delete', - data:menuId + url: `/menu/${menuId}`, + method: 'delete' }) } \ No newline at end of file diff --git a/Yi.RuoYi.Vue3/src/api/system/post.js b/Yi.RuoYi.Vue3/src/api/system/post.js index dd1eebf4..073347dc 100644 --- a/Yi.RuoYi.Vue3/src/api/system/post.js +++ b/Yi.RuoYi.Vue3/src/api/system/post.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询岗位列表 export function listPost(query) { return request({ - url: '/post/pageList', + url: '/post', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function listPost(query) { // 查询岗位详细 export function getPost(postId) { return request({ - url: '/post/getById/' + postId, + url: '/post/' + postId, method: 'get' }) } @@ -20,7 +20,7 @@ export function getPost(postId) { // 新增岗位 export function addPost(data) { return request({ - url: '/post/add', + url: '/post', method: 'post', data: data }) @@ -29,7 +29,7 @@ export function addPost(data) { // 修改岗位 export function updatePost(data) { return request({ - url: '/post/update', + url: '/post', method: 'put', data: data }) @@ -37,21 +37,16 @@ export function updatePost(data) { // 删除岗位 export function delPost(postId) { - if("string"==typeof(postId)) - { - postId=[postId]; - } return request({ - url: '/post/delList', - method: 'delete', - data:postId + url: `/post/${postId}`, + method: 'delete' }) } // 获取角色选择框列表 export function postOptionselect() { return request({ - url: '/post/getList', + url: '/post', method: 'get' }) diff --git a/Yi.RuoYi.Vue3/src/api/system/role.js b/Yi.RuoYi.Vue3/src/api/system/role.js index f000bd81..f2aa3db4 100644 --- a/Yi.RuoYi.Vue3/src/api/system/role.js +++ b/Yi.RuoYi.Vue3/src/api/system/role.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询角色列表 export function listRole(query) { return request({ - url: '/role/pageList', + url: '/role', method: 'get', params: query }) @@ -14,7 +14,7 @@ export function listRole(query) { // 查询角色详细 export function getRole(roleId) { return request({ - url: '/role/getById/' + roleId, + url: '/role/' + roleId, method: 'get' }) } @@ -22,7 +22,7 @@ export function getRole(roleId) { // 新增角色 export function addRole(data) { return request({ - url: '/role/add', + url: '/role', method: 'post', data: data }) @@ -31,7 +31,7 @@ export function addRole(data) { // 修改角色 export function updateRole(data) { return request({ - url: '/role/update', + url: '/role', method: 'put', data: data }) @@ -56,14 +56,9 @@ export function changeRoleStatus(roleId, isDel) { // 删除角色 export function delRole(roleId) { - if("string"==typeof(roleId)) - { - roleId=[roleId]; - } return request({ - url: '/role/delList', + url: `/role/${roleId}`, method: 'delete', - data:roleId }) } @@ -122,7 +117,7 @@ export function authUserSelectAll(data) { // 获取角色选择框列表 export function roleOptionselect() { return request({ - url: '/role/getList', + url: '/role', method: 'get' }) diff --git a/Yi.RuoYi.Vue3/src/api/system/user.js b/Yi.RuoYi.Vue3/src/api/system/user.js index aa88ec0f..90160258 100644 --- a/Yi.RuoYi.Vue3/src/api/system/user.js +++ b/Yi.RuoYi.Vue3/src/api/system/user.js @@ -4,7 +4,7 @@ import { parseStrEmpty } from "@/utils/ruoyi"; // 查询用户列表 export function listUser(query) { return request({ - url: '/user/pageList', + url: '/user', method: 'get', params: query }) @@ -13,7 +13,7 @@ export function listUser(query) { // 查询用户详细 export function getUser(userId) { return request({ - url: '/user/getById/' + parseStrEmpty(userId), + url: '/user/' + parseStrEmpty(userId), method: 'get' }) } @@ -28,24 +28,34 @@ export function addUser(data) { } // 修改用户 -export function updateUser(data) { +export function updateUser(id, data) { return request({ - url: '/user/update', + url: `/user/${id}`, method: 'put', - data: data + 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 + + + } }) } // 删除用户 export function delUser(userId) { - if("string"==typeof(userId)) - { - userId=[userId]; - } return request({ - url: '/user/delList', + url: `/user/${userId}`, method: 'delete', - data:userId }) } @@ -85,7 +95,7 @@ export function updateUserProfile(data) { return request({ url: '/user/UpdateProfile', method: 'put', - data: {user:data} + data: { user: data } }) } diff --git a/Yi.RuoYi.Vue3/src/views/system/dept/index.vue b/Yi.RuoYi.Vue3/src/views/system/dept/index.vue index ca4fbc60..4afca6e1 100644 --- a/Yi.RuoYi.Vue3/src/views/system/dept/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/dept/index.vue @@ -191,7 +191,7 @@ const { queryParams, form, rules } = toRefs(data); function getList() { loading.value = true; listDept(queryParams.value).then(response => { - deptList.value = proxy.handleTree(response.data, "id"); + deptList.value = proxy.handleTree(response.data.items, "id"); loading.value = false; }); } diff --git a/Yi.RuoYi.Vue3/src/views/system/menu/index.vue b/Yi.RuoYi.Vue3/src/views/system/menu/index.vue index 83f71ca7..145d4d88 100644 --- a/Yi.RuoYi.Vue3/src/views/system/menu/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/menu/index.vue @@ -329,7 +329,7 @@ const { queryParams, form, rules } = toRefs(data); function getList() { loading.value = true; listMenu(queryParams.value).then(response => { - menuList.value = proxy.handleTree(response.data, "id"); + menuList.value = proxy.handleTree(response.data.items, "id"); loading.value = false; }); } @@ -338,7 +338,7 @@ function getTreeselect() { menuOptions.value = []; listMenu().then(response => { const menu = { id: 0, menuName: "主类目", children: [] }; - menu.children = proxy.handleTree(response.data, "id"); + menu.children = proxy.handleTree(response.data.items, "id"); menuOptions.value.push(menu); }); } diff --git a/Yi.RuoYi.Vue3/src/views/system/post/index.vue b/Yi.RuoYi.Vue3/src/views/system/post/index.vue index d1b66a4c..62d76580 100644 --- a/Yi.RuoYi.Vue3/src/views/system/post/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/post/index.vue @@ -186,7 +186,7 @@ const { queryParams, form, rules } = toRefs(data); function getList() { loading.value = true; listPost(queryParams.value).then(response => { - postList.value = response.data.data; + postList.value = response.data.items; total.value = response.data.total; loading.value = false; }); diff --git a/Yi.RuoYi.Vue3/src/views/system/role/index.vue b/Yi.RuoYi.Vue3/src/views/system/role/index.vue index 3650904e..c9371273 100644 --- a/Yi.RuoYi.Vue3/src/views/system/role/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/role/index.vue @@ -442,7 +442,7 @@ function getList() { loading.value = true; listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then( (response) => { - roleList.value = response.data.data; + roleList.value = response.data.items; total.value = response.data.total; loading.value = false; } @@ -525,7 +525,7 @@ function handleAuthUser(row) { function getMenuTreeselect() { listMenu().then((response) => { const options = []; - response.data.forEach((m) => { + response.data.items.forEach((m) => { options.push({ id: m.id, label: m.menuName, diff --git a/Yi.RuoYi.Vue3/src/views/system/user/index.vue b/Yi.RuoYi.Vue3/src/views/system/user/index.vue index 5946e12a..6e6e11f2 100644 --- a/Yi.RuoYi.Vue3/src/views/system/user/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/user/index.vue @@ -81,9 +81,9 @@ @change="handleStatusChange(scope.row)"> - + @@ -321,7 +321,7 @@ watch(deptName, val => { function getDeptTree() { listDept().then(response => { const selectList = []; - response.data.forEach(res => { + response.data.items.forEach(res => { selectList.push({ id: res.id, label: res.deptName, parentId: res.parentId, orderNum: res.orderNum, children: [] }) } @@ -335,7 +335,7 @@ function getList() { listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => { loading.value = false; - userList.value = res.data.data; + userList.value = res.data.items; total.value = res.data.total; }); }; @@ -469,10 +469,10 @@ function reset() { if (postOptions.value.length == 0 || roleOptions.value.length == 0) { roleOptionselect().then(response => { //岗位从另一个接口获取全量 - roleOptions.value = response.data; + roleOptions.value = response.data.items; }) postOptionselect().then(response => { - postOptions.value = response.data; + postOptions.value = response.data.items; } @@ -512,7 +512,6 @@ response.data.posts.forEach(post => { }); form.value.deptId= response.data.deptId; - response.data.roles.forEach(role => { form.value.roleIds.push(role.id) }); @@ -529,7 +528,7 @@ function submitForm() { proxy.$refs["userRef"].validate(valid => { if (valid) { if (form.value.user.id != undefined) { - updateUser(form.value).then(response => { + updateUser(form.value.user.id,form.value).then(response => { proxy.$modal.msgSuccess("修改成功"); open.value = false; getList(); diff --git a/Yi.RuoYi.Vue3/src/views/tool/gen/genInfoForm.vue b/Yi.RuoYi.Vue3/src/views/tool/gen/genInfoForm.vue index bd14ccc2..56815603 100644 --- a/Yi.RuoYi.Vue3/src/views/tool/gen/genInfoForm.vue +++ b/Yi.RuoYi.Vue3/src/views/tool/gen/genInfoForm.vue @@ -269,7 +269,7 @@ function setSubTableColumns(value) { /** 查询菜单下拉树结构 */ function getMenuTreeselect() { listMenu().then(response => { - menuOptions.value = proxy.handleTree(response.data, "menuId"); + menuOptions.value = proxy.handleTree(response.data.items, "menuId"); }); } 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 2/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=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 - +