diff --git a/ZR.Admin.WebApi/Controllers/System/ArticleController.cs b/ZR.Admin.WebApi/Controllers/System/ArticleController.cs index 4015401..59cbee9 100644 --- a/ZR.Admin.WebApi/Controllers/System/ArticleController.cs +++ b/ZR.Admin.WebApi/Controllers/System/ArticleController.cs @@ -2,8 +2,10 @@ using SqlSugar; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; +using ZR.Model; using ZR.Model.System; using ZR.Service.System.IService; +using ZR.ServiceCore.Filters; using ZR.ServiceCore.Model; using ZR.ServiceCore.Model.Dto; @@ -34,7 +36,8 @@ namespace ZR.Admin.WebApi.Controllers /// /// [HttpGet("list")] - [ActionPermissionFilter(RolePermi = "admin")] + // [ActionPermissionFilter(RolePermi = "admin")] + [DataFieldFilter(typeof(PagedInfo))] public IActionResult Query([FromQuery] ArticleQueryDto parm) { var response = _ArticleService.GetList(parm); diff --git a/ZR.Admin.WebApi/Controllers/System/SysFieldController.cs b/ZR.Admin.WebApi/Controllers/System/SysFieldController.cs index e1a0abe..7d83a42 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysFieldController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysFieldController.cs @@ -1,5 +1,4 @@ using ZR.Admin.WebApi.Filters; -using ZR.ServiceCore.Model; using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Services.IService; @@ -19,7 +18,7 @@ public class SysFieldController : BaseController } [HttpGet("getModelList")] - public async Task GetModelList() + public IActionResult GetModelList() { var serviceCoreModels = AppDomain.CurrentDomain .GetAssemblies() @@ -37,98 +36,15 @@ public class SysFieldController : BaseController [HttpGet("getFields")] public async Task GetFields([FromQuery] string fullName, long roleId) - { - var fields = await _sysFieldService.Queryable() - .Where(it => it.FullName == fullName) - .ToListAsync(); - var roleFields = await _sysRoleFieldService - .Queryable() - .Where(it => it.RoleId == roleId) - .Select(it => it.FieldId) - .ToListAsync(); - var list = new List(); - list = fields.Select(it => new SysFieldDto - { - FieldName = it.FieldName, - FieldType = it.FieldType, - FullName = it.FullName, - Id = it.Id, - IsClass = it.IsClass, - IsPermission = roleFields.Contains(it.Id) - }).ToList(); - // fields.ForEach(it => - // { - // if (it.Id != 0 && roleFields.Contains(it.Id)) - // { - // list.Add(new SysFieldDto - // { - // FieldName = it.FieldName, - // FieldType = it.FieldType, - // FullName = it.FullName, - // Id = it.Id, - // IsClass = it.IsClass, - // IsPermission = true - // }); - // } - // else - // { - // list.Add(new SysFieldDto - // { - // FieldName = it.FieldName, - // FieldType = it.FieldType, - // FullName = it.FullName, - // Id = it.Id, - // IsClass = it.IsClass, - // IsPermission = false - // }); - // } - // }); - return SUCCESS(list); - } + => SUCCESS(await _sysFieldService.GetFields(fullName, roleId)); [HttpPost("initFields")] public async Task InitFields() - { - var serviceCoreModels = AppDomain.CurrentDomain - .GetAssemblies() - .First(it => it.FullName.Contains("ZR.ServiceCore")) - .ExportedTypes - .Where(p => p.FullName.StartsWith("ZR.ServiceCore.Model")) - .Select(it => new - { - FullName = it.FullName, - Properties = it.GetProperties().Select(pt => new - { - FieldName = pt.Name, - FieldType = pt.PropertyType.FullName, - IsClass = pt.PropertyType.IsClass, - IsArray = pt.PropertyType.IsArray, - // IsList = pt.PropertyType.IsClass ? pt.DeclaringType.FullName : string.Empty - }).ToList() - // Properties = it.GetProperties() - }) - .ToList(); - - foreach (var serviceCoreModel in serviceCoreModels) - { - var sysFields = new List(); - foreach (var property in serviceCoreModel.Properties) - { - var sysField = new SysField - { - FieldName = property.FieldName, - FullName = serviceCoreModel.FullName, - FieldType = property.FieldType, - IsClass = property.IsClass ? "1" : "0" - }; - sysFields.Add(sysField); - } - await _sysFieldService.Insertable(sysFields).ExecuteReturnSnowflakeIdListAsync(); - } + => SUCCESS(await _sysFieldService.InitFields()); + + [HttpPut("addOrUpdateSysRoleField/{roleId}")] + public async Task AddOrUpdateSysRoleField([FromBody] List sysFieldDtos, + [FromRoute] long roleId) + => SUCCESS(await _sysRoleFieldService.InsertOrUpdateSysRoleField(sysFieldDtos, roleId)); - - return SUCCESS(serviceCoreModels); - } - - public async Task AddOrUpdateSysRoleField([FromBody] List sysFieldDtos){} } \ No newline at end of file diff --git a/ZR.Admin.WebApi/Program.cs b/ZR.Admin.WebApi/Program.cs index d6903d0..5558e1c 100644 --- a/ZR.Admin.WebApi/Program.cs +++ b/ZR.Admin.WebApi/Program.cs @@ -215,7 +215,8 @@ var article = new Article } } }; -var json = JsonConvert.SerializeObject(article, new JsonSerializerSettings +var apiResult = new ApiResult(200, "SUCCESS", article); +var json = JsonConvert.SerializeObject(apiResult, new JsonSerializerSettings { ContractResolver = new JsonPropertyContractResolver(props) }); diff --git a/ZR.ServiceCore/Filters/DataFieldFilter.cs b/ZR.ServiceCore/Filters/DataFieldFilter.cs index 9651c48..a7af285 100644 --- a/ZR.ServiceCore/Filters/DataFieldFilter.cs +++ b/ZR.ServiceCore/Filters/DataFieldFilter.cs @@ -3,8 +3,12 @@ using Infrastructure; using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; +using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using NLog; +using SqlSugar.IOC; +using ZR.Infrastructure.Resolver; +using ZR.ServiceCore.Model; namespace ZR.ServiceCore.Filters; public class DataFieldFilter : ActionFilterAttribute @@ -15,42 +19,50 @@ public class DataFieldFilter : ActionFilterAttribute { ResultType = resultType; } - + + public DataFieldFilter() + { + } + public Type ResultType { get; set; } public string RulePath { get; set; } public override void OnResultExecuting(ResultExecutingContext context) { - // var list = DbScoped.SugarScope.Queryable().ToList(); - // var list = DbScoped.SugarScope.Queryable() - var httpContext = context.HttpContext; - var url = httpContext.Request.Path; + // var url = httpContext.Request.Path; var info = JwtUtil.GetLoginUser(context.HttpContext); + var roleIds = info.Roles.Select(it => it.RoleId).ToList(); + // var list = DbScoped.SugarScope.Queryable().ToList(); + var list = DbScoped.SugarScope.Queryable() + .LeftJoin((sf, srf) => sf.Id == srf.FieldId) + .Where((sf, srf) => roleIds.Contains(srf.RoleId)) + .ToList(); + // 获取原始的结果 var originalResult = context.Result as ContentResult; var apiResult = (JsonConvert.DeserializeObject(originalResult?.Content!)) as ApiResult; // 创建泛型类型 - // var resObj = typeof(JObject).GetMethod("ToObject", Type.EmptyTypes)? - // .MakeGenericMethod(ResultType).Invoke(apiResult?.Data, null)!; - // SetPropertiesToNull(resObj, new List - // { - // "Reqno" - // }); + var resObj = typeof(JObject).GetMethod("ToObject", Type.EmptyTypes)? + .MakeGenericMethod(ResultType).Invoke(apiResult?["data"], null)!; + SetPropertiesToNull(resObj, list.Select(it => it.FieldName).ToList()); // var json = JsonConvert.SerializeObject(resObj, new JsonSerializerSettings // { // ContractResolver = new CamelCasePropertyNamesContractResolver() // }); // var jObject = JObject.Parse(json); - // jObject.Add(new JProperty("props", new List + apiResult["data"] = resObj; + var jsonRes = JsonConvert.SerializeObject(apiResult, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + // JsonConvert.SerializeObject(apiResult, new JsonSerializerSettings // { - // "Reqno" - // }.Select(ToLowerFirstLetter).ToList())); - // apiResult.Data = jObject; - context.Result = new ContentResult{ Content = JsonConvert.SerializeObject(apiResult, new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver() - }), + // ContractResolver = new JsonPropertyContractResolver( + // list.Select(it => ToLowerFirstLetter(it.FieldName)).ToList() + // ) + // }) + context.Result = new ContentResult{ Content = jsonRes, ContentType = "application/json"} ; base.OnResultExecuting(context); } diff --git a/ZR.ServiceCore/Model/Article.cs b/ZR.ServiceCore/Model/Article.cs index 2680deb..677373f 100644 --- a/ZR.ServiceCore/Model/Article.cs +++ b/ZR.ServiceCore/Model/Article.cs @@ -79,5 +79,7 @@ namespace ZR.ServiceCore.Model [Navigate(NavigateType.OneToOne, nameof(CategoryId), nameof(ArticleCategory.CategoryId))] //自定义关系映射 public ArticleCategory ArticleCategoryNav { get; set; } + [SugarColumn(IsIgnore = true)] + public string IsPaa { get; set; } } } diff --git a/ZR.ServiceCore/Services/IService/ISysFieldService.cs b/ZR.ServiceCore/Services/IService/ISysFieldService.cs index da6e010..1fb1d61 100644 --- a/ZR.ServiceCore/Services/IService/ISysFieldService.cs +++ b/ZR.ServiceCore/Services/IService/ISysFieldService.cs @@ -1,14 +1,11 @@ using ZR.Service; using ZR.ServiceCore.Model; +using ZR.ServiceCore.Model.Dto; namespace ZR.ServiceCore.Services.IService; public interface ISysFieldService : IBaseService { - -} - -public interface ISysRoleFieldService : IBaseService -{ - + Task> GetFields(string fullName, long roleId); + Task InitFields(); } \ No newline at end of file diff --git a/ZR.ServiceCore/Services/IService/ISysRoleFieldService.cs b/ZR.ServiceCore/Services/IService/ISysRoleFieldService.cs index f21a380..72689ba 100644 --- a/ZR.ServiceCore/Services/IService/ISysRoleFieldService.cs +++ b/ZR.ServiceCore/Services/IService/ISysRoleFieldService.cs @@ -1,6 +1,10 @@ -namespace ZR.ServiceCore.Services.IService; +using ZR.Service; +using ZR.ServiceCore.Model; +using ZR.ServiceCore.Model.Dto; -public class ISysRoleFieldService +namespace ZR.ServiceCore.Services.IService; + +public interface ISysRoleFieldService : IBaseService { - + Task InsertOrUpdateSysRoleField(List sysFieldDtos, long roleId); } \ No newline at end of file diff --git a/ZR.ServiceCore/Services/SysFieldService.cs b/ZR.ServiceCore/Services/SysFieldService.cs index 3815387..b8c1e1b 100644 --- a/ZR.ServiceCore/Services/SysFieldService.cs +++ b/ZR.ServiceCore/Services/SysFieldService.cs @@ -1,12 +1,93 @@ using Infrastructure.Attribute; using ZR.Service; using ZR.ServiceCore.Model; +using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Services.IService; namespace ZR.ServiceCore.Services; [AppService(ServiceType = typeof(ISysFieldService), ServiceLifetime = LifeTime.Transient)] public class SysFieldService : BaseService, ISysFieldService { - + private readonly ISysRoleFieldService _sysRoleFieldService; + + public SysFieldService(ISysRoleFieldService sysRoleFieldService) + { + _sysRoleFieldService = sysRoleFieldService; + } + + public async Task> GetFields(string fullName, long roleId) + { + var fields = await Queryable() + .Where(it => it.FullName == fullName) + .ToListAsync(); + var roleFields = await _sysRoleFieldService + .Queryable() + .Where(it => it.RoleId == roleId) + .Select(it => it.FieldId) + .ToListAsync(); + var list = fields.Select(it => new SysFieldDto + { + FieldName = it.FieldName, + FieldType = it.FieldType, + FullName = it.FullName, + Id = it.Id, + IsClass = it.IsClass, + IsPermission = !roleFields.Contains(it.Id) + }).ToList(); + return list; + } + + public async Task InitFields() + { + var serviceCoreModels = AppDomain.CurrentDomain + .GetAssemblies() + .First(it => it.FullName.Contains("ZR.ServiceCore")) + .ExportedTypes + .Where(p => p.FullName.StartsWith("ZR.ServiceCore.Model")) + .Select(it => new + { + it.FullName, + Properties = it.GetProperties().Select(pt => new + { + FieldName = pt.Name, + FieldType = pt.PropertyType.FullName, + IsClass = pt.PropertyType.IsClass, + IsArray = pt.PropertyType.IsArray, + // IsList = pt.PropertyType.IsClass ? pt.DeclaringType.FullName : string.Empty + }).ToList() + // Properties = it.GetProperties() + }) + .ToList(); + + foreach (var serviceCoreModel in serviceCoreModels) + { + var sysFields = serviceCoreModel.Properties + .Select(property => new SysField + { + FieldName = property.FieldName, + FullName = serviceCoreModel.FullName, + FieldType = property.FieldType, + IsClass = property.IsClass ? "1" : "0" + }).ToList(); + await Deleteable() + .Where(it => + !sysFields.Select(sf => sf.FieldName) + .ToArray().Contains(it.FieldName)) + .Where(it => it.FullName == serviceCoreModel.FullName) + .ExecuteCommandAsync(); + var sysFieldStore = await Storageable(sysFields) + .WhereColumns(it => new { it.FieldName, it.FullName }) + .ToStorageAsync(); + await sysFieldStore + .AsInsertable + .ExecuteReturnSnowflakeIdListAsync(); + await sysFieldStore + .AsUpdateable + .IgnoreColumns(it => it.Id) + .ExecuteCommandAsync(); + } + + return true; + } } diff --git a/ZR.ServiceCore/Services/SysRoleFieldService.cs b/ZR.ServiceCore/Services/SysRoleFieldService.cs index 6eeebd3..87a6183 100644 --- a/ZR.ServiceCore/Services/SysRoleFieldService.cs +++ b/ZR.ServiceCore/Services/SysRoleFieldService.cs @@ -1,11 +1,57 @@ using Infrastructure.Attribute; using ZR.Service; using ZR.ServiceCore.Model; +using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Services.IService; namespace ZR.ServiceCore.Services; [AppService(ServiceType = typeof(ISysRoleFieldService), ServiceLifetime = LifeTime.Transient)] public class SysRoleFieldService : BaseService, ISysRoleFieldService { - + public async Task InsertOrUpdateSysRoleField(List sysFieldDtos, long roleId) + { + try + { + await Context.Ado.BeginTranAsync(); + await Deleteable() + .Where(it => it.RoleId == roleId) + .Where(it => sysFieldDtos.Select(sf => sf.Id).ToArray() + .Contains(it.FieldId)) + .ExecuteCommandAsync(); + var ids = sysFieldDtos + .Where(it => it.IsPermission != true) + .Select(it => new SysRoleField + { + FieldId = it.Id, + RoleId = roleId + }) + .ToList(); + await Insertable(ids).ExecuteCommandAsync(); + await Context.Ado.CommitTranAsync(); + return true; + } + catch (Exception e) + { + Console.WriteLine(e); + await Context.Ado.RollbackTranAsync(); + throw; + } + // var list = await + // Queryable() + // .LeftJoin((rf, f) => rf.FieldId == f.Id) + // .Where((rf, f) => rf.RoleId == roleId && f.FullName == sysFieldDtos[0].FullName) + // .ToListAsync(); + // + // + // list.AddRange(ids); + // list = list.Distinct().ToList(); + // var sysRoleFieldStore = await + // Storageable(ids) + // .WhereColumns(it => new { it.FieldId, it.RoleId }) + // .ToStorageAsync(); + // await sysRoleFieldStore.AsInsertable.ExecuteCommandAsync(); + // await sysRoleFieldStore.AsUpdateable.ExecuteCommandAsync(); + // await sysRoleFieldStore.AsDeleteable.ExecuteCommandAsync(); + // return true; + } } \ No newline at end of file