接1的内容,那么有这么一个需求!
需求分析
需要修改某一个配置的时候
1.从对应的api中读取消息,消息内容为Json格式的
2.基于当前的Json渲染成表单提供给管理端的客户呈现
3.管理端的用户可以基于这个表单的内容进行修改,然后提交
4.服务端基于用户提交的信息,提交给IIS Administration以便更新到IIS的网站中!
所以我们需要一个东西,可以动态编辑Json内容的东西!!!
关键点在于这个编辑非开发也能玩,当然我们也可以提供2个版本,一个表单版本,一个字符串版本
方案一
由上面的步骤可知,1获取到的数据是变动的,或者你可以说可以把几种的格式都创建成表然后入库
只入库表的结构,获取到数据后和表的结构相互结合,然后使用PasteForm提供给用户进行更新!
不要在意CRUD的规范一个表一个API,在这个需求中完全可以使用动态Route进行单API处理!
{
"title":"标题",
"desc":"描述信息",
"value":97.5
}
以上的方案你会可见的发现,将会有非常多的工作量,可能增加的表不下100个!!!
方案二
结合现有的PasteForm框架知识,是否也可以搞一个动态的表单,理想的状态有
1.无论来的Json数据是咋样的,都给他在表单中显示
2.可以针对性质的一些字段进行配置,也就是结合方案一的内容做一个表结构的信息
3.区别于方案一的是,方案一比如有100个结构表,你得先创建100个表及对应得CRUD,而这里得动态是可以不出创建的
比如有
{
"title":"标题",
"desc":"描述信息",
"value":97.5
}
其实在文章1中还有一个隐藏的知识点就是Json不是单层级的,比如
{
"name": "iis_temp",
"id": "UYZcrUKt9eaMiolk-rH_GA",
"status": "started",
"auto_start": "true",
"pipeline_mode": "integrated",
"managed_runtime_version": "",
"enable_32bit_win64": "false",
"queue_length": "1000",
"start_mode": "OnDemand",
"cpu": {
"limit": "0",
"limit_interval": "5",
"action": "NoAction",
"processor_affinity_enabled": "false",
"processor_affinity_mask32": "0xFFFFFFFF",
"processor_affinity_mask64": "0xFFFFFFFF"
},
"process_model": {
"idle_timeout": "20",
"max_processes": "1",
"pinging_enabled": "true",
"ping_interval": "30",
"ping_response_time": "90",
"shutdown_time_limit": "90",
"startup_time_limit": "90",
"idle_timeout_action": "Terminate"
},
"identity": {
"identity_type": "ApplicationPoolIdentity",
"username": "",
"load_user_profile": "true"
},
"recycling": {
"disable_overlapped_recycle": "false",
"disable_recycle_on_config_change": "false",
"log_events": {
"time": "true",
"requests": "true",
"schedule": "true",
"memory": "true",
"isapi_unhealthy": "true",
"on_demand": "true",
"config_change": "true",
"private_memory": "true"
},
"periodic_restart": {
"time_interval": "1740",
"private_memory": "0",
"request_limit": "0",
"virtual_memory": "0",
"schedule": []
}
},
"rapid_fail_protection": {
"enabled": "true",
"load_balancer_capabilities": "HttpLevel",
"interval": "5",
"max_crashes": "5",
"auto_shutdown_exe": "",
"auto_shutdown_params": ""
},
"process_orphaning": {
"enabled": "false",
"orphan_action_exe": "",
"orphan_action_params": ""
}
}
上面只是二级的,还有一些是Array格式的,更加负责了,还可能有多级,不止二级!
结合上面的消息,所以选择的是方案二
实现单元
结合上面的内容,我的习惯是搞一个测试项目,然后做单元测试,在一个现有的项目中要添加比较大的模块的时候,
我的步骤就是先梳理大脉络,大需求,大方向
然后拆分成小的功能点
整理下有难点的,不太确定的功能点
搞一个案例项目,实现后进行单元测试下
结合以上的内容,由于也用到了贴代码PasteForm框架的内容,所以我打算在PasteTemplate案例项目上实现这个功能!
动态分析
按照方案二的说明,比如有以下内容
{
"va":"aabbcc",
"score":98,
"avg":67.5
}
按照默认的显示应该是这样的
如果是一些简单的单词还好,有一些单词就不是这么好识别了,比如如下的
{
"title":"这个是标题",
"desc":"描述信息",
"value":97.5
}
我们希望他的显示是如下的,比如title这个字段
结合以上的内容,所以我们知道了这个动态的意思,就是如果我配置中有这个比如title字段的信息,则在表单中对应的显示
如果没有则使用JSON的字段直接显示(一般为英文字母)
以上是单元的内容的需求分析,那么还有一个需求,就是多层级的JSON,比如
{
"name":"abc",
"age":19,
"actions":[
{
"va":"aabbcc",
"score":98,
"avg":67.5
}
],
"info":{
"title":"标题",
"desc":"描述信息",
"value":97.5
}
}
这个时候的显示,我希望他能分组,否则会有一大堆,
有一个关键点在于名称重复,比如name和info.name最终显示都是name,如果全显示可能非常长!
对于用户来说很容易搞混,实现后大概是这样的
注意看上图,按照JSON的内容,做了分组,上面的info或者actions是可以收缩的,如下
结合以上的需求,我设定添加2个表,一个动态表,一个动态字段!
动态表
直接上代码,创建CodeFirst
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Entities;
namespace PasteTemplate.dynamicmodels
{
/// <summary>
/// 动态表
/// </summary>
[Index(nameof(Code), IsUnique = true)]
public class DynamicTable : Entity<int>
{
/// <summary>
/// 代码 示例:userInfo
/// </summary>
[MaxLength(32)]
public string Code {
get; set; }
/// <summary>
/// 名称 示例:用户信息
/// </summary>
[MaxLength(16)]
public string Name {
get; set; }
/// <summary>
/// 说明 示例:修改用户基本信息
/// </summary>
[MaxLength(128)]
public string Desc {
get; set; }
/// <summary>
/// 状态
/// </summary>
public bool IsEnable {
get; set; } = true;
/// <summary>
/// 空字符 空字符串移除对象
/// </summary>
public bool RemoveEmptyStr {
get; set; }
/// <summary>
/// 数值0 数值为0移除对象
/// </summary>
public bool RemoveZeroNumber {
get; set; }
/// <summary>
/// 特性
/// </summary>
public string AttributeJson {
get; set; }
/ <summary>
/ 数据提交地址
/ </summary>
//[MaxLength(256)]
//public string PostUrl { get; set; }
}
}
注意上面的特性是使用贴代码PasteForm的特性的JSON内容
其他的字段信息就没啥可说的了!
动态字段
一个动