diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Repositories/SqlsugarRepository.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Repositories/SqlsugarRepository.cs index d6043e94..0eb51e8c 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Repositories/SqlsugarRepository.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Repositories/SqlsugarRepository.cs @@ -43,7 +43,11 @@ namespace Yi.Framework.Core.Sqlsugar.Repositories { return await _DbQueryable.Where(whereExpression).OrderByIF(orderBy is not null, orderBy + " " + orderByType.ToString().ToLower()).ToPageListAsync(page.PageNum, page.PageSize); } - + public async Task> GetPageListAsync(List whereExpression, IPagedAndSortedResultRequestDto page, string? orderBy, OrderByEnum orderByType = OrderByEnum.Asc) + { + return await _DbQueryable.Where(whereExpression).OrderByIF(orderBy is not null, orderBy + " " + orderByType.ToString().ToLower()).ToPageListAsync(page.PageNum, page.PageSize); + } + public async Task UpdateIgnoreNullAsync(T updateObj) { diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Attributes/QueryParameterAttribute.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Attributes/QueryParameterAttribute.cs new file mode 100644 index 00000000..20c1740e --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Attributes/QueryParameterAttribute.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Core.Enums; + +namespace Yi.Framework.Core.Attributes +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)] + public class QueryParameterAttribute:Attribute + { + public QueryParameterAttribute() + { + } + public QueryParameterAttribute(QueryOperatorEnum queryOperatorEnum) + { + QueryOperator = queryOperatorEnum; + } + + public QueryOperatorEnum QueryOperator { get; set; } + + /// + /// 验证值为0时是否作为查询条件 + /// true-作为查询条件 false-不作为查询条件 + /// + public bool VerifyIsZero { get; set; } = false; + + /// + /// + /// + public string ColumnName { get; set; } + + public ColumnTypeEnum ColumnType { get; set; } + } + + public enum ColumnTypeEnum + { + datetime, + @bool + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/QueryOperatorEnum.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/QueryOperatorEnum.cs new file mode 100644 index 00000000..13439675 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/QueryOperatorEnum.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Core.Enums +{ + public enum QueryOperatorEnum + { + /// + /// 相等 + /// + Equal, + /// + /// 匹配 + /// + Like, + /// + /// 大于 + /// + GreaterThan, + /// + /// 大于或等于 + /// + GreaterThanOrEqual, + /// + /// 小于 + /// + LessThan, + /// + /// 小于或等于 + /// + LessThanOrEqual, + /// + /// 等于集合 + /// + In, + /// + /// 不等于集合 + /// + NotIn, + /// + /// 左边匹配 + /// + LikeLeft, + /// + /// 右边匹配 + /// + LikeRight, + /// + /// 不相等 + /// + NoEqual, + /// + /// 为空或空 + /// + IsNullOrEmpty, + /// + /// 不为空 + /// + IsNot, + /// + /// 不匹配 + /// + NoLike, + /// + /// 时间段 值用 "|" 隔开 + /// + DateRange + } +} 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/framework/Yi.Framework.Ddd/Dtos/Abstract/IPagedAndSortedResultRequestDto.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/Abstract/IPagedAndSortedResultRequestDto.cs index 8f55de87..2f0c8026 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/Abstract/IPagedAndSortedResultRequestDto.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/Abstract/IPagedAndSortedResultRequestDto.cs @@ -1,4 +1,5 @@ -using System; +using SqlSugar; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -14,5 +15,7 @@ namespace Yi.Framework.Ddd.Dtos string? SortBy { get; set; } OrderByEnum SortType { get; set; } + List Conditions { get; set; } } + } diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs index cde6606f..9cf2d30c 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs @@ -1,4 +1,5 @@ -using System; +using SqlSugar; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -13,5 +14,6 @@ namespace Yi.Framework.Ddd.Dtos public int PageSize { get; set; } = int.MaxValue; public string? SortBy { get; set; } public OrderByEnum SortType { get; set; } = OrderByEnum.Desc; + public List Conditions { get; set; } } } diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Repositories/IRepository.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Repositories/IRepository.cs index b9605f86..8cfd463d 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Repositories/IRepository.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Repositories/IRepository.cs @@ -32,7 +32,8 @@ namespace Yi.Framework.Ddd.Repositories Task> GetPageListAsync(Expression> whereExpression, IPagedAndSortedResultRequestDto page); Task> GetPageListAsync(Expression> whereExpression, IPagedAndSortedResultRequestDto page, Expression>? orderByExpression = null, OrderByEnum orderByType = OrderByEnum.Asc); Task> GetPageListAsync(Expression> whereExpression, IPagedAndSortedResultRequestDto page, string? orderBy, OrderByEnum orderByType = OrderByEnum.Asc); - + Task> GetPageListAsync(List whereExpression, IPagedAndSortedResultRequestDto page, string? orderBy, OrderByEnum orderByType = OrderByEnum.Asc); + //插入 Task InsertAsync(T insertObj); 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..41e0e75e 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 @@ -6,6 +6,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Core.Attributes; using Yi.Framework.Core.Helper; using Yi.Framework.Core.Model; using Yi.Framework.Ddd.Dtos; @@ -84,38 +85,97 @@ 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 (input is IPageTimeResultRequestDto timeInput) { - - //这里还可以追加如果是审计日志,继续拼接条件即可 - if (input is IPageTimeResultRequestDto timeInput) + if (timeInput.StartTime is not null) { - if (timeInput.StartTime is not null) - { - timeInput.EndTime = timeInput.EndTime ?? DateTime.Now; - } + timeInput.EndTime = timeInput.EndTime ?? DateTime.Now; } - - - if (input is IPagedAndSortedResultRequestDto sortInput) - { - entities = await _repository.GetPageListAsync(_ => true, sortInput,sortInput.SortBy, sortInput.SortType); - } - - - else - { - entities = await _repository.GetListAsync(); - } - entityDtos = await MapToGetListOutputDtosAsync(entities); } + if (input is IPagedAndSortedResultRequestDto sortInput) + { + var dependsOnbuild = sortInput.GetType().GetCustomAttributes(typeof(QueryParameterAttribute), false).FirstOrDefault() as QueryParameterAttribute; + if (dependsOnbuild is null) + { + entities = await _repository.GetPageListAsync(_ => true, sortInput, sortInput.SortBy, sortInput.SortType); + } + else + { + sortInput.Conditions = new List(); + System.Reflection.PropertyInfo[] properties = sortInput.GetType().GetProperties(); + foreach (System.Reflection.PropertyInfo item in properties) + { + var query = item.GetCustomAttributes(typeof(QueryParameterAttribute), false).FirstOrDefault() as QueryParameterAttribute; + if (query is not null) + { + object value = item.GetValue(sortInput, null); + if (value is not null) + { + if (value.ToString() == "0") + { + if (query.VerifyIsZero) + { + sortInput.Conditions.Add(new ConditionalModel { FieldValue = value.ToString(), FieldName = item.Name, ConditionalType = (ConditionalType)(int)query.QueryOperator }); + } + } + else { + switch (query.ColumnType) + { + case ColumnTypeEnum.datetime: + if (!string.IsNullOrEmpty(query.ColumnName)) + { + DateTime dt = DateTime.Now; + DateTime.TryParse(value.ToString(), out dt); + sortInput.Conditions.Add(new ConditionalModel { FieldValue = dt.ToString("yyyy-MM-dd HH:mm:ss"), FieldName = query.ColumnName, ConditionalType = (ConditionalType)(int)query.QueryOperator }); + } + else + { + sortInput.Conditions.Add(new ConditionalModel { FieldValue = value.ToString(), FieldName = item.Name, ConditionalType = (ConditionalType)(int)query.QueryOperator }); + } + break; + case ColumnTypeEnum.@bool: + string _Value = ""; + if ((bool)value) + { + _Value = "1"; + } + else { + _Value = "0"; + } + sortInput.Conditions.Add(new ConditionalModel { FieldValue = _Value, FieldName = item.Name, ConditionalType = (ConditionalType)(int)query.QueryOperator }); + break; + default: + sortInput.Conditions.Add(new ConditionalModel { FieldValue = value.ToString(), FieldName = item.Name, ConditionalType = (ConditionalType)(int)query.QueryOperator }); + break; + } + + } + } + } + } + entities = await _repository.GetPageListAsync(sortInput.Conditions, sortInput, sortInput.SortBy, sortInput.SortType); + } + + } + 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/Dept/DeptGetListInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetListInputVo.cs index 2a65631f..c414ccdb 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetListInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Dept/DeptGetListInputVo.cs @@ -3,16 +3,28 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Core.Enums; using Yi.Framework.Ddd.Dtos; namespace Yi.RBAC.Application.Contracts.Identity.Dtos { + [QueryParameter] public class DeptGetListInputVo : PagedAllResultRequestDto { + [QueryParameter(QueryOperatorEnum.Equal)] public long Id { get; set; } + [QueryParameter(QueryOperatorEnum.Equal, ColumnType = ColumnTypeEnum.@bool)] public bool? State { get; set; } + [QueryParameter(QueryOperatorEnum.Like)] public string? DeptName { get; set; } - public string? DeptCode { get; set; } + [QueryParameter(QueryOperatorEnum.Equal)] + public string? DeptCode { get; set; } + [QueryParameter(QueryOperatorEnum.Equal)] public string? Leader { get; set; } + + [QueryParameter(QueryOperatorEnum.GreaterThanOrEqual, ColumnName = "CreationTime",ColumnType =ColumnTypeEnum.datetime)] + public DateTime? StartTime { get; set; } + [QueryParameter(QueryOperatorEnum.LessThanOrEqual, ColumnName = "CreationTime", ColumnType = ColumnTypeEnum.datetime)] + public DateTime? EndTime { 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/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 9c52a361..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 @@ -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,15 @@ 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 long DeptId { 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..d1b5fb09 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服务实现 @@ -69,18 +84,18 @@ - - - 多查 - - - - Menu服务实现 + + + 查询当前角色的菜单 + + + + Post服务实现 @@ -91,6 +106,13 @@ Role服务实现 + + + 添加角色 + + + + User服务实现 @@ -111,5 +133,20 @@ + + + 单查 + + + + + + + 更新用户 + + + + + 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/DeptService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs index 624a2110..96bd907c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs @@ -28,24 +28,24 @@ namespace Yi.RBAC.Application.Identity return await MapToGetListOutputDtosAsync(entities); } - /// - /// 多查 - /// - /// - /// - public override async Task> GetListAsync(DeptGetListInputVo input) - { - RefAsync total = 0; - var entities = await _DbQueryable - .WhereIF(!string.IsNullOrEmpty(input.DeptName), u => u.DeptName.Contains(input.DeptName!)) - .WhereIF(input.State is not null, u => u.State == input.State) - .OrderBy(u => u.OrderNum, OrderByType.Asc) - .ToPageListAsync(input.PageNum, input.PageSize, total); - return new PagedResultDto - { - Items = await MapToGetListOutputDtosAsync(entities), - Total = total - }; - } + ///// + ///// 多查 + ///// + ///// + ///// + //public override async Task> GetListAsync(DeptGetListInputVo input) + //{ + // RefAsync total = 0; + // var entities = await _DbQueryable + // .WhereIF(!string.IsNullOrEmpty(input.DeptName), u => u.DeptName.Contains(input.DeptName!)) + // .WhereIF(input.State is not null, u => u.State == input.State) + // .OrderBy(u => u.OrderNum, OrderByType.Asc) + // .ToPageListAsync(input.PageNum, input.PageSize, total); + // return new PagedResultDto + // { + // Items = await MapToGetListOutputDtosAsync(entities), + // Total = total + // }; + //} } } 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.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/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/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.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 5791274a..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 cf28c932..3976dfa6 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' }) } @@ -60,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 2cab2ce1..f9536b06 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' }) } @@ -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' }) } @@ -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..0ab0332c 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' }) } @@ -21,16 +21,16 @@ export function getUser(userId) { // 新增用户 export function addUser(data) { return request({ - url: '/user/add', + url: '/user', method: 'post', data: data }) } // 修改用户 -export function updateUser(data) { +export function updateUser(id, data) { return request({ - url: '/user/update', + url: `/user/${id}`, method: 'put', data: data }) @@ -38,27 +38,21 @@ export function updateUser(data) { // 删除用户 export function delUser(userId) { - if("string"==typeof(userId)) - { - userId=[userId]; - } return request({ - url: '/user/delList', + url: `/user/${userId}`, method: 'delete', - data:userId }) } // 用户密码重置 export function resetUserPwd(id, password) { const data = { - id, password } return request({ - url: '/user/restPassword', + url: `/account/rest-password/${id}`, method: 'put', data: data }) @@ -85,7 +79,7 @@ export function updateUserProfile(data) { return request({ url: '/user/UpdateProfile', method: 'put', - data: {user:data} + data: { user: data } }) } @@ -96,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/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..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" /> - +