记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-动态表单(2)

接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内容
其他的字段信息就没啥可说的了!

动态字段

一个动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贴代码科技-致力于开发更加适用的应用

要不请我喝杯咖啡!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值