新增数据字段拦截器,json序列化解析器

This commit is contained in:
YUN-PC5\user 2023-09-26 17:07:40 +08:00
parent 4199736bc7
commit 764a77456e
16 changed files with 314 additions and 4 deletions

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Newtonsoft.Json.Serialization;
namespace ZR.Infrastructure.Resolver;
public class JsonPropertyContractResolver : CamelCasePropertyNamesContractResolver
{
private HashSet<string> _propertySet;
public JsonPropertyContractResolver(IEnumerable<string> propertyNames)
{
if (propertyNames != null)
{
_propertySet = new HashSet<string>(propertyNames, StringComparer.Ordinal);
}
}
// protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
// {
// var list = base.CreateProperties(type, memberSerialization).ToList();
// var resList = list
// .Where(a => !this._lstInclude.Contains(a.PropertyName))
// .ToList();
// return resList;
// // .FindAll(p => _lstInclude.Contains(p.PropertyName));
// }
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
List<MemberInfo> serializableMembers = null;
var allMembers = base.GetSerializableMembers(objectType);
if (_propertySet != null && _propertySet.Count > 0)
{
serializableMembers = allMembers.Where(m => !_propertySet.Contains(m.Name)).ToList();
}
return serializableMembers != null && serializableMembers.Count > 0 ? serializableMembers : allMembers;
}
}

View File

@ -9,6 +9,7 @@ using ZR.Model;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Model.Generate; using ZR.ServiceCore.Model.Generate;
using ZR.ServiceCore.Services.IService;
namespace ZR.Admin.WebApi.Controllers namespace ZR.Admin.WebApi.Controllers
{ {

View File

@ -1,4 +1,6 @@
using ZR.Admin.WebApi.Filters; using ZR.Admin.WebApi.Filters;
using ZR.ServiceCore.Model;
using ZR.ServiceCore.Services.IService;
namespace ZR.Admin.WebApi.Controllers.System; namespace ZR.Admin.WebApi.Controllers.System;
@ -6,5 +8,80 @@ namespace ZR.Admin.WebApi.Controllers.System;
[Route("system/field")] [Route("system/field")]
public class SysFieldController : BaseController public class SysFieldController : BaseController
{ {
private readonly ISysFieldService _sysFieldService;
public SysFieldController(ISysFieldService sysFieldService)
{
_sysFieldService = sysFieldService;
}
[HttpGet("getModelList")]
public async Task<IActionResult> GetModelList()
{
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()
})
.ToList();
return SUCCESS(serviceCoreModels);
}
[HttpGet("getFields")]
public async Task<IActionResult> GetFields([FromQuery] string fullName)
{
var list = await _sysFieldService.Queryable()
.Where(it => it.FullName == fullName)
.ToListAsync();
return SUCCESS(list);
}
[HttpPost("initFields")]
public async Task<IActionResult> 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<SysField>();
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();
}
return SUCCESS(serviceCoreModels);
}
} }

View File

@ -8,6 +8,7 @@ using ZR.Service.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Services.IService;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {

View File

@ -4,6 +4,7 @@ using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Services.IService;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {

View File

@ -5,6 +5,7 @@ using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Services.IService;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {

View File

@ -7,12 +7,17 @@ using System.Text.Json;
using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Redis; using Microsoft.Extensions.Caching.Redis;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Quartz;
using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Extensions;
using ZR.Common.Cache; using ZR.Common.Cache;
using ZR.Infrastructure.Resolver;
using ZR.Infrastructure.WebExtensions; using ZR.Infrastructure.WebExtensions;
using ZR.ServiceCore.Model;
using ZR.ServiceCore.Services.IService; using ZR.ServiceCore.Services.IService;
using ZR.ServiceCore.Signalr; using ZR.ServiceCore.Signalr;
using ZR.ServiceCore.SqlSugar; using ZR.ServiceCore.SqlSugar;
using IpRateLimitPolicy = AspNetCoreRateLimit.IpRateLimitPolicy;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -185,4 +190,33 @@ foreach (var assembly in serviceCoreModel)
} }
var user = new SysUser
{
UserName = "admin",
Password = "123456"
};
var props = new HashSet<string>
{
"Name",
"Children"
};
var article = new Article
{
Title = "aadad",
ArticleCategoryNav = new ArticleCategory
{
Name = "adsad",
Children = new List<ArticleCategory>
{
new()
{
Name = "1213"
}
}
}
};
var json = JsonConvert.SerializeObject(article, new JsonSerializerSettings
{
ContractResolver = new JsonPropertyContractResolver(props)
});
app.Run(); app.Run();

View File

@ -0,0 +1,120 @@
using System.Collections;
using Infrastructure;
using Infrastructure.Model;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json.Serialization;
using NLog;
namespace ZR.ServiceCore.Filters;
public class DataFieldFilter : ActionFilterAttribute
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public DataFieldFilter(Type resultType)
{
ResultType = resultType;
}
public Type ResultType { get; set; }
public string RulePath { get; set; }
public override void OnResultExecuting(ResultExecutingContext context)
{
// var list = DbScoped.SugarScope.Queryable<PoRequirement>().ToList();
// var list = DbScoped.SugarScope.Queryable<S>()
var httpContext = context.HttpContext;
var url = httpContext.Request.Path;
var info = JwtUtil.GetLoginUser(context.HttpContext);
// 获取原始的结果
var originalResult = context.Result as ContentResult;
var apiResult = (JsonConvert.DeserializeObject<ApiResult>(originalResult?.Content!)) as ApiResult;
// 创建泛型类型
// var resObj = typeof(JObject).GetMethod("ToObject", Type.EmptyTypes)?
// .MakeGenericMethod(ResultType).Invoke(apiResult?.Data, null)!;
// SetPropertiesToNull(resObj, new List<string>
// {
// "Reqno"
// });
// var json = JsonConvert.SerializeObject(resObj, new JsonSerializerSettings
// {
// ContractResolver = new CamelCasePropertyNamesContractResolver()
// });
// var jObject = JObject.Parse(json);
// jObject.Add(new JProperty("props", new List<string>
// {
// "Reqno"
// }.Select(ToLowerFirstLetter).ToList()));
// apiResult.Data = jObject;
context.Result = new ContentResult{ Content = JsonConvert.SerializeObject(apiResult, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
}),
ContentType = "application/json"} ;
base.OnResultExecuting(context);
}
private static void SetPropertiesToNull(object obj, IEnumerable<string> props)
{
var type = obj.GetType();
var properties = type.GetProperties();
foreach (var property in properties)
{
if (obj.IsEmpty())
{
return;
}
if (props.Contains(property.Name))
{
property.SetValue(obj, null);
}
else if (property.PropertyType.IsArray)
{
var arrayValue = (Array)property.GetValue(obj);
if (arrayValue != null)
{
foreach (var element in arrayValue)
{
SetPropertiesToNull(element, props);
}
}
}
else if (property.PropertyType.IsGenericType &&
property.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
{
// 属性的类型是 List<T>
var listValue = (IEnumerable)property.GetValue(obj);
if (listValue != null)
{
foreach (var element in listValue)
{
SetPropertiesToNull(element, props);
}
}
}
else if (property.PropertyType.GetInterface("IDictionary") != null ||
property.PropertyType.GetInterface("IDictionary`2") != null)
{
}
else if (property.PropertyType.IsClass && property.PropertyType != typeof(string))
{
var name = property.Name;
var prop = property.GetValue(obj);
SetPropertiesToNull(prop, props);
}
}
}
private static string ToLowerFirstLetter(string str)
{
if (!str.IsNotEmpty())
{
return str;
}
var charArray = str.ToCharArray();
charArray[0] = char.ToLower(charArray[0]);
return new string(charArray);
}
}

View File

@ -11,4 +11,8 @@ public class SysField
public string FieldName { get; set; } public string FieldName { get; set; }
public string FullName { get; set; } public string FullName { get; set; }
public string FieldType { get; set; }
public string IsClass { get; set; }
} }

View File

@ -0,0 +1,14 @@
using ZR.Service;
using ZR.ServiceCore.Model;
namespace ZR.ServiceCore.Services.IService;
public interface ISysFieldService : IBaseService<SysField>
{
}
public interface ISysRoleFieldService : IBaseService<SysRoleField>
{
}

View File

@ -1,11 +1,10 @@
using System.Collections.Generic; using ZR.Service;
using ZR.Model.System;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Model.Generate; using ZR.ServiceCore.Model.Generate;
using ZR.ServiceCore.Model.Vo; using ZR.ServiceCore.Model.Vo;
namespace ZR.Service.System.IService namespace ZR.ServiceCore.Services.IService
{ {
public interface ISysMenuService : IBaseService<SysMenu> public interface ISysMenuService : IBaseService<SysMenu>
{ {

View File

@ -0,0 +1,12 @@
using Infrastructure.Attribute;
using ZR.Service;
using ZR.ServiceCore.Model;
using ZR.ServiceCore.Services.IService;
namespace ZR.ServiceCore.Services;
[AppService(ServiceType = typeof(ISysFieldService), ServiceLifetime = LifeTime.Transient)]
public class SysFieldService : BaseService<SysField>, ISysFieldService
{
}

View File

@ -13,6 +13,7 @@ using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Model.Enums; using ZR.ServiceCore.Model.Enums;
using ZR.ServiceCore.Model.Generate; using ZR.ServiceCore.Model.Generate;
using ZR.ServiceCore.Model.Vo; using ZR.ServiceCore.Model.Vo;
using ZR.ServiceCore.Services.IService;
namespace ZR.Service namespace ZR.Service
{ {

View File

@ -4,6 +4,7 @@ using System.Collections.Generic;
using ZR.Model.System; using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Services.IService;
namespace ZR.Service.System namespace ZR.Service.System
{ {

View File

@ -2,6 +2,7 @@
using ZR.Model.System; using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Services.IService;
namespace ZR.Service.System namespace ZR.Service.System
{ {

View File

@ -11,6 +11,7 @@ using ZR.Repository;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.ServiceCore.Model; using ZR.ServiceCore.Model;
using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Model.Dto;
using ZR.ServiceCore.Services.IService;
namespace ZR.Service namespace ZR.Service
{ {