🤔如何实现一个可视化搭建平台🧐 | 移动端商城

前言

无论大公司还是小公司,靠纯人工撸代码已经无法跟上需求增长速度,那对于开发如何把这些重复的工作去解决?加班?招人?显得不够明智😤,在前端资源紧缺的情况下,是否可直接有工具直接就可以搭建出我想要的前端页面?🧠于是业界的页面可视化搭建工具就出现了

Github地址:github.com/Tooy8/TooyL...

可视化搭建平台是什么🧐

这些平台大多数拥有用户友好的界面和各种各样的模板,让用户可以快速选择适合自己的网站风格并进行个性化定制。这些平台也具备了一系列必要的工具,如文本、图片、视频等,让用户可以轻松添加和编辑网站内容。 通过该平台建设的网站还可以实现响应式设计,自适应移动设备和各种屏幕尺寸。这对于现今的移动化生活来说非常重要。

可视化平台开发的核心💞

可视化平台开发的核心是什么?

是一个可拖拽的组件列表,一个展示组件画布,一个组件属性控制面板组成的控制中心?是一套看起功能眼花缭乱的布局方式?

不,是规范,一套规范。

每个成熟的可视化平台,都会经历长期的迭代升级,无数实用的业务组件会在其后大量的新增与迭代,一套标准的规范才能使平台健康成长直至成熟稳定。

那怎么要定义规范?定义规范有什么用?

我们说个最简单的,定义组件的规范。

一个标题组件接入平台,我不会关心你的内部实现,我只关心你的props入参,我怎么通过属性配置面板去控制你。

「原始方式」 写一个包含title字段输入框的表单的配置面板

「进阶方式」 为每个组件写一个JSON去描述组件的关键信息

js 复制代码
{
 "name": "标题",
 "icon":"icon-biaotizujian",
 "fields": {
   "value": {
     "label": "标题内容",
     "type": "object",
     "child": {
       "title": {
         "label": "标题",
         "type": "string",
         "value": "LEADING SERIES"
       },
       "info": {
         "label": "副标题",
         "type": "string",
         "value": "品牌系列推荐"
       }
     }
   }
 }

一旦进入平台我们就通过解析关键信息,获取组件信息。然后我们开发一个属性配置器,传入组件信息中的属性数据,通过属性配置器生成属性控制面板

进阶方式解耦、工业化,这样才能在后面使大量组件接入平台。然而有一个风险点 「JSON是无规则的」 ,组件描述JSON应该 「按平台定的规则」 来写 「平台才能识别」,所以我们需要用规则来标准化JSON。解决办法就是通过JSON Schema协议来约束JSON,让它根据我们定的标准来编写。

所以 ,我们定义的 「Schema协议」 , 是我们 「平台规范」 的工具,也就是我们可视化开发平台的核心。

项目结构💯

js 复制代码
├─ src                                     
│  ├─ api     
│  ├─ assets                           
│  ├─ components                
│  ├─ config                            // 初始配置文件       
│  ├─ custom-components                 // 物料库  
│  ├─ custom-schema-template            // 属性组件库  
│  ├─ custom-schema-template-set        // 属性面板生成器  
│  ├─ mixin                                
│  ├─ pages          
│  ├─ router    
│  ├─ scss    
│  ├─ store    
│  ├─ utils    
│  ├─ App.vue    
│  └─ main.js                
├─ package.json     
└─ ftpUp.js                              // ftp上传文件  

JSON Schema 👾

基础类型

这是一个基础的属性Form表单,包括输入框、单选器,它们由各种元素组成。接下来我们用JSON来代表元素来组装它们:

js 复制代码
 "value": {
     "label": "标题内容",
     "type": "object",
     "child": {
       "title": {
         "label": "标题",
         "type": "string",
         "value": "LEADING SERIES"
       },
       "info": {
         "label": "副标题",
         "type": "string",
         "value": "品牌系列推荐"
       }
     }
   },
   "attrs": {
     "label": "标题布局",
     "type": "object",
     "child": {
       "model": {
         "label": "布局选择",
         "type": "select",
         "value": "left",
         "data": [
           {
             "id": "1635161793h3mJ",
             "label": "居左",
             "value": "left"
           },
           {
             "id": "1635161794uYJI",
             "label": "居中",
             "value": "center"
           }
         ]
       }
     }
   },

复合类型

我们除了基础类型外,组件经常也需要传入对象、数组、对象数组等复合类型。我们应该支持任何的复合类型。我们来看 「导航栏数据列表」

js 复制代码
 "tabList": {
      "label": "导航栏列表",
      "type": "array",
      "child": {
        "label": {
          "label": "导航名称",
          "type": "string",
          "value": "默认导航"
        },
        "image": {
          "label": "图片上传",
          "type": "upload",
          "value": "http://110.41.150.71:8090/img/1667354717861.png"
        },
        "jump": {
          "label": "页面跳转",
          "type": "jump",
          "value": {}
        }
      },
      "value":[
        {
          "id": "0001",
          "label": "推荐酒店",
          "image":"http://110.41.150.71:8090/img/1667354666114.png"
        },
        {
          "id": "0002",
          "label": "热销抢购",
          "image":"http://110.41.150.71:8090/img/1667354683202.png"
        },
      ]
    },

实例 🥘

从上面我们知道了怎么用JSON表示 「基础类型」「复合类型」 数据,而一个组件props能接收任意数量任意类型的数据。接下来我们用 「轮播组件」 来实际分析:

轮播组件件接收styles(对象)、attrs(对象)、list(数组)

js 复制代码
{
 "name": "广告轮播",
 "icon": "icon-swiper",
 "fields": {
   "list": {
     "label": "轮播列表",
     "type": "array",
     "child": {
       "image": {
         "label": "轮播图片",
         "type": "upload",
         "value": ""
       },
       "jump": {
         "label": "页面跳转",
         "type": "jump",
         "value": {}
       }
     },
     "value":[
      {
        "id": "0001",
        "image": "http://110.41.150.71:8090/img/1667354598861.png"
      },
      {
        "id": "0002",
        "image": "http://110.41.150.71:8090/img/1667354575078.png"
      }
     ]
   },
   "attrs": {
     "label": "轮播设置",
     "type": "object",
     "child": {
       "model": {
         "label": "模式选择",
         "type": "select",
         "value": "basis",
         "data": [
           {
             "id": "1635210812XSKK",
             "label": "基础",
             "value": "basis"
           },
           {
             "id": "1635210812Eis4",
             "label": "卡片",
             "value": "card"
           },
           {
             "id": "1635210821yrmE",
             "label": "横向",
             "value": "line"
           }
         ]
       },
       "autoplay": {
         "label": "自动播放",
         "type": "switch",
         "value": true
       },
       "loop": {
         "label": "是否循环",
         "type": "switch",
         "value": true
       }
     }
   },
   "styles": {
     "label": "轮播样式",
     "type": "object",
     "child": {
       "pagePadding": {
         "label": "页面边距",
         "type": "number",
         "value": 0
       },
       "negativeMarginBottom": {
         "label": "下边间距",
         "type": "number",
         "value": 0
       }
     }
   }
 }
}

这就是一个描述组件的JSON

结尾

此项目的核心是实现从Schema生成到构建一套完整可视化项目的标准,抛砖引玉的让大家了解Schema对可视化平台的重要性。

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ew452182 小时前
ElementUI表格表头自定义添加checkbox,点击选中样式不生效
前端·javascript·elementui
suibian52352 小时前
AI时代:前端开发的职业发展路径拓宽
前端·人工智能
Moon.92 小时前
el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
前端·vue.js·html
垚垚 Securify 前沿站2 小时前
深入了解 AppScan 工具的使用:筑牢 Web 应用安全防线
运维·前端·网络·安全·web安全·系统安全
工业甲酰苯胺5 小时前
Vue3 基础概念与环境搭建
前端·javascript·vue.js
mosquito_lover16 小时前
怎么把pyqt界面做的像web一样漂亮
前端·python·pyqt
柴柴的小记9 小时前
前端vue引入特殊字体不生效
前端·javascript·vue.js
柠檬豆腐脑9 小时前
从前端到全栈:新闻管理系统及多个应用端展示
前端·全栈
bin91539 小时前
DeepSeek 助力 Vue 开发:打造丝滑的颜色选择器(Color Picker)
前端·javascript·vue.js·ecmascript·deepseek