新增数据字段拦截器,json序列化解析器
This commit is contained in:
parent
4199736bc7
commit
764a77456e
42
Infrastructure/Resolver/JsonPropertyContractResolver.cs
Normal file
42
Infrastructure/Resolver/JsonPropertyContractResolver.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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();
|
||||||
120
ZR.ServiceCore/Filters/DataFieldFilter.cs
Normal file
120
ZR.ServiceCore/Filters/DataFieldFilter.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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; }
|
||||||
}
|
}
|
||||||
14
ZR.ServiceCore/Services/IService/ISysFieldService.cs
Normal file
14
ZR.ServiceCore/Services/IService/ISysFieldService.cs
Normal 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>
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@ -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>
|
||||||
{
|
{
|
||||||
|
|||||||
12
ZR.ServiceCore/Services/SysFieldService.cs
Normal file
12
ZR.ServiceCore/Services/SysFieldService.cs
Normal 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
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user