结构

September 7, 2022 · View on GitHub

{
  "version": "版本",
  "inject": {}, // 需要在最终特殊注入的参数,不会展示
  "formatter": { // 重定义最终参数字段,不定义时候,按照layouts结构返回
  },
  "layouts": [
    {
      "key": "后端接口 key",
      "alias": "前端字段显示的 label",
      "help": "label 旁边的 ❓ hover 提示",
      "type": "支持的类型", // 下表详细提供
      "default": "默认值",
      "options": [ // 可选字段,支持 string 或 object
        "普通字符串",
        { // or Object
          "text": "前端展示的文字",
          "value": "后端映射的值"
        }
      ],
      "layouts": [
        ... // 嵌套循环字段
      ],

      // 以下功能为增强型功能
      "rules": [ // 规则校验参数,支持 string
        "Required" // 必须填写
      ],
      "disabled": false, // 是否禁用
      "visible": { // 条件显示
        [key]: "等于某个值时起作用"
      },
      "invisible": { // 条件隐藏
        [key]: "等于某个值时起作用"
      },

      // 以下为保留字段
      "role": "角色",
      "style": {}, // 自定义样式,暂不支持
    }
  ]
}

配置

特殊参数

字段类型备注默认值
injectObject需要在最终特殊注入的参数,不会展示N
versionString版本控制预留字段N
formatterObject格式化提交结果,如果配置了,则覆盖原 schema 格式N

基本参数

字段类型备注默认值
layoutsArray<Object>布局,嵌套循环字段(数组嵌套时,需要配合type=arrayY
keyString后端接口 keyY
aliasString前端字段显示的 labelY
helpStringlabel 旁边的 ❓ hover 提示N
descriptionString描述提示信息N
placeholderString输入框内提示信息N
typeString支持的类型,参考表 TypeY
default字段默认值。(返回值必要时,请填写)N
optionsArray`<StringObject>`根据不同type 进行配合使用,参考表 Options

Type

字段备注
text文本格式
input输入框
stringinput
multi_input多值输入框,返回数组
multi_stringmulti_input
number数字输入框
select下拉选择框,需配合 options 参数
arrayselect
multi_select下拉多选择框,需配合 options 参数
multi_arraymulti_select
radio单选组,需配合 options 参数
checkbox多选组,需配合 options 参数
switchBoolean 值切换
booleanswitch
jsonjson格式文本输入
button按钮(保留字段,暂不支持),需配合 options 参数

Options

字段备注
text前端展示的文字
value后端映射的值
disabled是否禁用当前选项
color保留字段,暂不支持
event保留字段,暂不支持

增强参数

字段类型备注是否必需
rulesArray<String>校验规则,参考表 RulesN
disabledBoolean是否禁用N
visibleBoolean | Object条件显示N
invisibleBoolean | Object条件隐藏N

Rules

rules 中,未在下表中声明的内置规则,都是按照正则表达式进行解析。

字段备注
Required必须填写
Number有效的正整数
Name由字母、中文、数字、下划线或中划线组成
MaxLength(200)最大长度 200 位
MinLength(100)最小长度 100 位
MaxNumber(999)最大数字 999
MinNumber(1)最小数字 1
Unique数组类型时,可检测是否重复
ArrayMaxLength(10)数组类型时,最大 10 组
ArrayMinLength(1)数组类型时,最小 1 组

自定义正则

            "rules": [
                "Required",
                {
                    "pattern": "^\\d+$",
                    "flags": "", // 正则表达式修饰符:  i	执行对大小写不敏感的匹配。g	执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。m	执行多行匹配。
                    "message": "自定义提示,必须是数字",
                }
            ]

正则表达式修饰符:

image.png

保留参数

字段类型备注是否必需
roleString内置角色行为(保留字段,暂不支持)N
styleObject保留字段,暂不支持N

特殊字段解释

inject

inject 参数是用来定义一些特殊的不再前端展示的内容,最终会合并到主结构体一起提交。

例如:

schema 定义如下

{
    "layouts": [
        {
            "key": "a",
            "alias": "a",
            "layouts": [
                {
                    "key": "b",
                    "alias": "b",
                    "type": "input",
                }
            ]
        },
        {
            "key": "c",
            "alias": "c",
            "type": "input",
        }
    ]
}

正常返回时的结构为:

{
    "a": {
        "b": "",
    },
    "c": "",
}

如果我们定义了 inject 参数,如:

{
    "inject": {
        "kind": "abc",
        "a": {
            "d": "ddd",
        }
    },
    "layouts": [
        ...
    ]
}

则返回的最终结果将是如下:

{
    "kind": "abc",
    "a": {
        "b": "",
        "d": "ddd",
    },
    "c": "",
}

formatter

formatter 更强大的自定义返回结构体,最总格式将按照 formatter 定义的结构进行重构,如下:

例如:

schema 定义如下

{
    "layouts": [
        {
            "key": "a",
            "alias": "a",
            "layouts": [
                {
                    "key": "b",
                    "alias": "b",
                    "type": "input",
                }
            ]
        },
        {
            "key": "c",
            "alias": "c",
            "type": "input",
        }
    ]
}

正常返回时的结构为:

{
    "a": {
        "b": "bbb",
    },
    "c": "ccc",
}

如果我们定义了 formatter 参数(其中 + 为内置连接符号),如:

连接符号为:+
取值为:&, key和value都要 & 开头取值,否则为字符串
@号开头的 value 数组,会拉平为 map。数组种必须要有 { key: '', value: '' } 两个字段'

注意: 如果使用了上述的符号,请把原 layouts 定义字段结构映射到 formatter 的原始位置上。否则更新取值无法实现!

{
    "formatter": {
        "Result": "&a.b+c"
    },
    "layouts": [
        ...
    ]
}

则返回的最终结果将是如下:

{
    "Result": "bbbccc",
}

例子 (可不看)

{
    "inject": {
        "name": "ianus-rate-limiting",
        "kind": "ianus-rate-limiting",
        "limit_by_list": {
            "kind": "abc"
        }
    },
    "layouts": [{
            "key": "type_text",
            "description": "text 类型的 Demo",
            "default": "我是文本",
            "alias": "text",
            "type": "text"
        },
        {
            "key": "type_switch",
            "description": "switch 类型的 Demo",
            "alias": "switch",
            "type": "switch"
        },
        {
            "key": "type_input",
            "description": "input 类型的 Demo",
            "alias": "input",
            "type": "input"
        },
        {
            "key": "type_multi_input",
            "description": "multi_input 类型的 Demo",
            "alias": "multi_input",
            "type": "multi_input"
        },
        {
            "key": "type_number",
            "description": "number 类型的 Demo",
            "alias": "number",
            "type": "number"
        },
        {
            "key": "type_select",
            "description": "select 类型的 Demo",
            "alias": "select",
            "type": "select",
            "options": ["A", "B"]
        },
        {
            "key": "type_multi_select",
            "description": "multi_select 类型的 Demo",
            "alias": "multi_select",
            "type": "multi_select",
            "options": ["A", "B"]
        },
        {
            "key": "type_radio",
            "description": "radio 类型的 Demo",
            "alias": "radio",
            "type": "radio",
            "options": ["A", "B"]
        },
        {
            "key": "type_checkbox",
            "description": "checkbox 类型的 Demo",
            "alias": "checkbox",
            "type": "checkbox",
            "options": ["A", "B"]
        },
        {
            "key": "type_json",
            "description": "json 类型的 Demo",
            "alias": "json",
            "type": "json",
            "default": { "info": "我是默认值" }
        },
        {
            "key": "limit_by_list",
            "help": "1.频率限制是指限制带同一标识请求在给定时间段内可处理的次数;\n2.user-开头的是指用户在某维度的参数, 不以user-开头的是指下游服务器的参数;\n3.使用user-xxx参数的前提是\"请求转换插件\"已经将xxx参数转换为user-xxx.;\n4.当前版本计数方式限制为local, 所以实际频控限制=配置的限制*集群节点数量",
            "alias": "复杂类型",
            "type": "array",
            "layouts": [{
                    "key": "identifier_extractor",
                    "help": "用于计算请求标识,以供计数使用;例如,Ip, Header[User-Agent]",
                    "alias": "标识提取策略",
                    "type": "string"
                },
                {
                    "key": "pre_condition",
                    "help": "满足前置条件的请求才会进入频控流程. 左变量为identifier_extractor提取的值",
                    "alias": "频控前置条件",
                    "type": "array",
                    "layouts": [{
                            "key": "right_value",
                            "alias": "right_value",
                            "type": "string"
                        },
                        {
                            "key": "operator",
                            "alias": "operator",
                            "type": "select",
                            "default": "=",
                            "options": ["≈", "!≈", "=", "!="]
                        }
                    ]
                },
                {
                    "key": "key",
                    "alias": "KEY",
                    "type": "input"
                },
                {
                    "key": "value",
                    "alias": "VALUE",
                    "type": "input"
                },
                {
                    "key": "day",
                    "alias": "每天请求数",
                    "type": "number"
                },
                {
                    "key": "minute",
                    "alias": "每分钟请求数",
                    "type": "number"
                },
                {
                    "key": "second",
                    "alias": "每秒请求数",
                    "type": "number"
                },
                {
                    "key": "limit_by_list",
                    "help": "1.频率限制是指限制带同一标识请求在给定时间段内可处理的次数;\n2.user-开头的是指用户在某维度的参数, 不以user-开头的是指下游服务器的参数;\n3.使用user-xxx参数的前提是\"请求转换插件\"已经将xxx参数转换为user-xxx.;\n4.当前版本计数方式限制为local, 所以实际频控限制=配置的限制*集群节点数量",
                    "alias": "限制标识列表3",
                    "layouts": [{
                            "visible": {
                                "true": ["this", "month"]
                            },
                            "key": "identifier_extractor",
                            "help": "用于计算请求标识,以供计数使用;例如,Ip, Header[User-Agent]",
                            "alias": "标识提取策略",
                            "type": "string"
                        },
                        {
                            "key": "month",
                            "alias": "每月请求数",
                            "type": "switch"
                        },
                        {
                            "key": "hour",
                            "alias": "每小时请求数",
                            "type": "number"
                        }
                    ]
                }
            ]
        },
        {
            "key": "rules",
            "description": "rules 校验的 Demo, 必须填写,且只能输入数字",
            "alias": "rules",
            "type": "input",
            "rules": [
                "Required",
                "^\\d+$"
            ]
        }
    ]
}