夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 任务管理日历

  • 无代码平台

    • 前言
      • 可视化平台的核心
        • Schema
        • 规范
        • 复合组件
    • 可拖拽组件列表
  • 图书管理系统

  • 《全栈项目》
  • 无代码平台
夜猫子
2024-07-08
目录

前言

# 前言

# 可视化平台的核心

分为三个区域:

  • 可拖拽组件列表
  • 模拟效果的展示画布
  • 组件属性的控制面板

image-20240708160752315

# Schema

# 规范

问题: 应该如何去描述一个组件的信息?

一个成熟的可视化平台,经过大量的迭代,无数实用的业务组件会在其后大量的新增与迭代,那么一套标准的规范就显得很重要。

例如,通过一段 json 数据去描述组件,特别是当需要跨平台、跨技术栈时,这很重要。

因为 json 是无序的、无定性的,因此不同的平台或会有自己定义的 Schema 协议。

{
  "label": "标题组件",     // 组件名
  "icon": "icon-title",  // 组件图标
  "fields": {            // 组件属性
    "title": {                  // 属性名
      "label": "标题",           // 属性label
      "type": "string",         // 属性类型
      "value": "LEADING SERIES" // 属性初始值
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11

上面的一段代码中的 fields.title 部分其实就是下图描述标题内容的一个 Schema 片段

image-20240708161945280

# 复合组件

当一个复合组件,同时需要传入数组、对象、对象数组等复合属性时,那么又该如何定义呢?

比如下面这个导航栏组件:

image-20240708164037604

对这个导航栏的描述分为三个部分:

  • 导航栏列表(对象数组):

    点击查看
        "tabList": {
          "label": "导航栏列表",
          "type": "array",
          "child": {
            "label": {
              "label": "导航名称",
              "type": "string",
              "value": "默认导航"
            },
            "image": {
              "label": "图片上传",
              "type": "string",
              "value": "https://s2.loli.net/2024/07/08/hsmbEeqQVHnGtNk.png"
            },
            "link": {
              "label": "跳转链接",
              "type": "link",
              "value": "https://www.baidu.com"
            }
          },
          "value": [
            {
              "id": "01",
              "label": "推荐酒店",
              "image": "https://s2.loli.net/2024/07/08/hsmbEeqQVHnGtNk.png",
              "link": ""
            },
            {
              "id": "02",
              "label": "热销抢购",
              "image": "https://s2.loli.net/2024/07/08/hsmbEeqQVHnGtNk.png",
              "link": ""
            }
          ]
        }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
  • 导航栏设置

    点击查看
        "attr": {
          "label": "导航栏设置",
          "type": "object",
          "child": {
            "model": {
              "label": "模式选择",
              "type": "select",
              "value": "fixed",
              "data": [
                { "id": "fixed", "label": "固定", "value": "fixed" },
                { "id": "scroll", "label": "滑动", "value": "scroll" }
              ]
            },
            "type": {
              "label": "显示类型",
              "type": "select",
              "value": "image-text",
              "data": [
                { "id": "image", "label": "图片", "value": "image" }
                // ...省略代码
              ]
            },
            "max": {
              "label": "最多显示",
              "type": "select",
              "value": "4",
              "data": [
                { "id": "1", "label": "1个", "value": "1" }
                // ...省略代码
              ]
            }
          }
        }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
  • 导航栏样式

    点击查看
    "styles": {
          "label": "导航栏样式",
          "type": "object",
          "child": {
            "pagePadding": {
              "label": "页面边距",
              "type": "number",
              "value": 0
            },
            "comPaddingTop": {
              "label": "上边距",
              "type": "number",
              "value": 0
            },
            "comPaddingBottom": {
              "label": "下边距",
              "type": "number",
              "value": 0
            },
            "itemPadding": {
              "label": "单项边距",
              "type": "number",
              "value": 0
            }
          }
        }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

组合起来就构成了一个描述组件的 json

点击查看
{
  "name": "图文导航",
  "icon": "icon-daohan",
  "fields": {
    "tabList": {
      "label": "导航栏列表",
      "type": "array",
      "child": {
        "label": {
          "label": "导航名称",
          "type": "string",
          "value": "默认导航"
        },
        "image": {
          "label": "图片上传",
          "type": "string",
          "value": "https://s2.loli.net/2024/07/08/hsmbEeqQVHnGtNk.png"
        },
        "link": {
          "label": "跳转链接",
          "type": "link",
          "value": "https://www.baidu.com"
        }
      },
      "value": [
        {
          "id": "01",
          "label": "推荐酒店",
          "image": "https://s2.loli.net/2024/07/08/hsmbEeqQVHnGtNk.png",
          "link": ""
        },
        {
          "id": "02",
          "label": "热销抢购",
          "image": "https://s2.loli.net/2024/07/08/hsmbEeqQVHnGtNk.png",
          "link": ""
        }
      ]
    },
    "attr": {
      "label": "导航栏设置",
      "type": "object",
      "child": {
        "model": {
          "label": "模式选择",
          "type": "select",
          "value": "fixed",
          "data": [
            { "id": "fixed", "label": "固定", "value": "fixed" },
            { "id": "scroll", "label": "滑动", "value": "scroll" }
          ]
        },
        "type": {
          "label": "显示类型",
          "type": "select",
          "value": "image-text",
          "data": [
            { "id": "image", "label": "图片", "value": "image" }
            // ...省略代码
          ]
        },
        "max": {
          "label": "最多显示",
          "type": "select",
          "value": "4",
          "data": [
            { "id": "1", "label": "1个", "value": "1" }
            // ...省略代码
          ]
        }
      }
    },
    "styles": {
      "label": "导航栏样式",
      "type": "object",
      "child": {
        "pagePadding": {
          "label": "页面边距",
          "type": "number",
          "value": 0
        },
        "comPaddingTop": {
          "label": "上边距",
          "type": "number",
          "value": 0
        },
        "comPaddingBottom": {
          "label": "下边距",
          "type": "number",
          "value": 0
        },
        "itemPadding": {
          "label": "单项边距",
          "type": "number",
          "value": 0
        }
      }
    }
  }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
编辑 (opens new window)
上次更新: 2024/8/27 17:23:20
Serverless部署
可拖拽组件列表

← Serverless部署 可拖拽组件列表→

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式