京东低代码平台:浅谈水滴拖拽画布的设计与实现

news2024/11/23 11:12:59

水滴低代码平台简介

京东水滴平台面向企业内部后台管理系统场景,提供可视化搭建等低代码配置、构建及部署能力。

水滴画布作为水滴低代码的核心能力之一,具备灵活、易用的特点,用户可以通过简单拖拉拽的方式,在不需要具备前端知识的前提下,即可搭建出理想的页面。下面将为大家介绍水滴低代码画布的设计与实现。

低代码画布的概念及类型

画布的概念: 用户可以向画布中添加物料,并对物料进行拖/拉/拽布局,搭建出自己想要的页面。
这个概念延伸于艺术家的画板,画家在绘画的过程中,会将颜料进行调色,并在画布中进行绘制。而低代码平台用户在页面搭建的过程中,需要选择相应的物料,在画布中使用拖拉拽的方式放置到正确的位置,并对物料进行一些属性配置来达到最理想的展示效果。用户的搭建过程与艺术家的绘制方式非常的相似,因此这个概念也来源于此。 

 画布的类型: 低代码画布可以根据业务场景的不同可分为多种类型,目前主要的类型有以下几种:

  1. 页面类型:用于网页的搭建,包含 web 页面及 H5 页面
  2. 流程类型:用于流程图的搭建,包含审批流程及函数流程
  3. 数据大屏类型:用于数据报表与可视化分析工具的搭建

水滴低代码画布目前主要用于页面的搭建,也是本次需要介绍和讲解的画布的类型 - 页面类型

主流低代码画布的调研情况

在开发水滴画布之前,就京东内其他低代码平台和国外的主流低代码平台 Retool 做了调研。下面将对这些低代码平台的画布能力做一个分析,并和水滴画布进行对比。

画布特点京东内其他平台Retool水滴
面向用户前端开发普通用户普通用户
是否可拖动
宽高拖拽宽度宽度宽度 + 高度
布局blockgridabsolute + grid
配置复杂度复杂简单简单
UI还原度
上手成本

通过调研的情况和一些能力的对比,我们可以发现:京东内其他平台使用了 Block 块布局、Retool 使用了 Grid 网格布局,这些布局特性在带来页面自适应能力的同时,也会丢失物料自定义宽高的适配能力,使得一旦需要固定宽高和自适应内容高度的时候,就会让展示的效果不够理想。
京东内其他平台和 Retool 都对此做了一些弥补和取舍,例如京东内其他平台将前端的布局配置展示了出来,让用户自己去调整,在增加了布局场景的同时,也提高了非前端用户的使用门槛。而 Retool 则在精准搭建方面做了一部分的妥协,为了提高易用性,做了一些强制性的约束。

水滴画布的研发目标

水滴画布面向的人群有运营、产品、测试、开发人员等,这些人群中有些是有前端的基础,而大部分都不具备前端的知识,所以在设计画布的过程中,要尽可能地降低用户的学习成本和上手成本。于是,我们选取了以下几种功能特性,并做出了开发的目标:

  • 布局: absolute绝对定位布局 + grid网格布局
  • 拖拽:
    1. 支持物料宽度和高度的拖拽、缩放;
    2. 支持物料在画布中灵活定位
  • 目标:
    1. 简单易用 - 拖拽搭建无限制,自由灵活;
    2. 操作流畅 - 保证用户频繁操作过程中的页面性能;
    3. 覆盖面广 - 支持展示、内容、工作台、管理等 B 端常见场景。

水滴画布的设计方案

水滴画布 drip-layout 给出了一种新的低代码画布的设计方案,将搭建层和渲染层分离,并且通过算法转换层来适配搭建页在不同屏幕下的展示效果。

  • 首先在搭建层获得物料的在页面中的定位信息 - layouts 和 物料的个性化布局配置 - config。
  • 通过算法转换层来适配页面在不同屏幕下的位置/宽高信息 - layouts。
  • 渲染层根据算法转换后的layouts信息,对页面内的所有物料进行渲染、展示。渲染层的画布会在浏览器视口大小发生变化时,进行回流到算法转换层,重新布局计算、动态适配页面大小。

下图展示了水滴画布的方案设计:

 在搭建层的物料拖拽和缩放的交互上,使用了 react-grid-layout 底层库,并将 grid 网格的 row col 大小都设置成了 1,使得以绝对定位的方式拖拉拽后的物料定位信息 layouts,单位都精确到了 1px。最后在渲染层,根据真实页面的宽高,对渲染区域进行 grid 网格划分,并根据计算层转换后的位置信息 layouts,将物料使用 grid 的方式进行布局渲染。

水滴画布的实现架构

下图展示水滴画布的一些底层库的选取,和提供的一些能力,以及在计算层使用的一些主要的算法:

水滴画布计算层实现算法

容器自适应物料高度 - moduleResizeObserver

在大多数场景下,物料在页面中需要能够根据自身的真实高度进行展示,例如表格的一页数据全展示、表单内容的动态删减导致模块高度变化。这些动态的高度,都需要实时地体现在画布中,那么就需要动态监听物料的框高的变化,并将真实宽高展示在画布中。
这里使用了浏览器的 ResizeObserver api,对物料的宽高实时监听,下面是实现的逻辑代码: 

 

页面扩张情况自适应 - 固定宽度模块的收缩对相邻模块的影响

在一些大屏幕下,页面的宽度大小是要比画布中的宽度要大,画布就需要被拉伸扩展。在这种情况下,画布内的弹性模块就可以直接被等比拉伸,固定模块由于宽度需要保持固定,就会空出空间(下图紫色区域),那么相邻的模块就会受到影响。受到的影响主要有以下几种情况:

  • 相邻为弹性模块,可以被直接拉伸,来填充空间
  • 相邻为固定模块,且对齐方式相同,则会被影响,因此需要平移相同的距离
  • 相邻为固定模块,且对齐方式不相同,则不会被影响
    【ps】: “对齐方式”是用来确定在页面发生形变的情况下,模块在画布的水平轴上的对齐方式 

由于模块之间的影响具有传染性,通过深度优先遍历的方式,处理了所有固定模块,及其相邻的模块,来消除固定模块的收缩带来的影响。 

页面压缩情况自适应 - 固定模块的拉伸对相邻模块的影响

在一些屏幕下,页面的大小是要比画布中的宽度要小,画布就需要被压缩。画布内的弹性模块可以被直接等比压缩,固定模块由于宽度需要保持固定,就会发生一定比例的膨胀(下图紫色区域),那么相邻的模块就会受到挤压。相邻模块受到的影响主要有以下几种情况:

  • 相邻为弹性模块,则会被直接压缩
  • 相邻为固定模块,由于宽度固定,受到挤压之后,需要进行等距离的平移
  • 所以当前行的整体宽度不够,那么右侧的模块需要进行换行处理
    【ps】: “对齐方式”是用来确定在页面发生形变的情况下,模块在画布的水平轴上的对齐方式 

由于模块之间的影响具有传染性,通过深度优先遍历的方式,处理了所有固定模块,及其相邻的模块,来消除固定模块的拉伸带来的影响。 

边界处理

由于 JavaScript 在进行数值计算时,存在精度丢失的情况,可能会导致两个紧密相邻模块的计算结果,在定位上出现交叉的情况。这种定位交叉的情况,又会在画布的边界碰撞检测处理下,出现画布布局错乱的问题。但是如果使用保留 n 位小数的方式进行精度计算,又会导致相邻模块之间由于取整导致小数位丢失,从而模块间会出现缝隙的视觉效果。
精度丢失计算场景:A.x + A.w === B.x => 1.3 + 1.6 === 2.9 => 结果:false
因此水滴画布做了一些假设:如果两个模块边界之间的差距小于 1px,则对两个模块的边界之间进行粘合,来消除 JavaScript 精度丢失带来的影响。 

水滴画布的几种通用布局展示

目前水滴画布归纳了常规页面搭建场景中,主要使用的几种基础布局类型。在已经支持的组合组件的嵌套能力下,用户可以对物料进行简单地排列、组合和布局配置,就可以搭建出丰富、精细化的页面场景。下图是这些基础布局场景的渲染效果:

  • 左右布局场景(左侧固定,右侧自适应) 

  • 右左布局场景(右侧固定,左侧自适应) 

  • 左中右布局场景(左右两侧自适应,中间居中固定) 

  • 高度自适应场景(表格高度跟随内容的大小自适应,将表格数据一页全展示) 

  • 一屏展示场景(高度支持百分比设置,让物料撑满页面可视区域) 

  • 组合嵌套,精细化搭建(支持组合的概念,组合的布局能力继承外部画布,形成嵌套结构)

水滴画布的搭建/渲染效果展示

搭建页面的操作场景

从图中可以看出,用户通过简单的拖拉拽,就可以快速地搭建出自己想要的页面效果。 

复杂页面的渲染效果

目前水滴低代码平台已经完成了页面自举的能力,平台历史开发的页面,已经使用搭建化的方式进行了替代,下图展示的是平台首页搭建的效果。

未来规划

1. 辅助搭建

在搭建场景使用绝对定位布局的方式,给用户的操作带来了很大的开放性,但随之而来的问题就是搭建精确度的保证。很多情况下,用户需要手动调整模块的间隔,以及模块之间的对齐。这样势必会带来用户操作次数的增加,同时也会造成精准度的丢失。

因此,参考我们日常使用 PPT 的行为方式,水滴画布会给用户在搭建过程中提供一些辅助搭建工具,并帮助用户自动完成一些细节上的操作。 

2. 布局模板

通过沉淀搭建过程中常用的页面布局,物料模块会新增一些布局模版的物料,让用户可以一键添加自己想要的布局场景,快速搭建页面。

3. 拓展布局配置项

增加更多的语义化布局配置项,来适配特殊场景的搭建。因为目前对一些通用的布局场景做到了覆盖,后续会在开发和用户搭建的过程中,沉淀更多的特殊场景的布局能力,添加布局配置项,使得布局场景覆盖的能力更加广泛。

结尾

水滴画布采用了不同于主流的低代码搭建和布局的方式,给出了一种新的低代码画布的设计方案。但是依然存在不少有待改进的地方,比如各种功能模块内容的丰富、降低学习及上手门槛等等。本着灵活、易用的研发目标,水滴低代码画布会持续加强画布的能力,不断提升用户的搭建体验。

水滴低代码平台目前还在京东内部使用,期待未来与大家见面!后续有新的设计感悟和研发进展,水滴团队也会继续给大家带来分享~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【应用回归分析】CH4 假设检验与预测1——一般线性假设

目录 前言 引例 1.【例1】 2.【例2】 一、假设检验的基本思想 二、定理【4.1.1】 1.定理内容 2.定理证明 前言 在上一章,我们讨论了回归参数的几种估计方法,依据这些方法得到回归系数的估计,就可以建立经验回归方程。但是,…

python+django汽车租赁系统pycharm项目

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行性 6 3.2系统现状分析 6 3.3功能需求分析 7 …

Transformer for CV

文章目录Transformer 的基础结构NLP StructureVITSWINDERTTransformer 常用terms分块的batch-size自动计算Batch normLayer normMultihead Self AttentionGELU/ELU/RELUTransformer Vs CNN每个模型的详细笔记Vit图片分割自己的思考计算过程Segmenter运行 TrainTrain 里的结构DE…

命名空间提示“http://schemas.microsoft.com/xaml/behaviors”不存在Interation的解决办法

以下面的部分wpf程序为例&#xff1a; <Button Grid.Column"3" Margin"5" Content"<" FontSize"18" Background"Transparent" Foreground"LightGray"><b:Interaction.Triggers><b:EventTrigge…

static应用知识:单例设计模式

1、什么是设计模式&#xff08;Design pattern&#xff09; 开发中经常遇到一些问题&#xff0c;一个问题通常有n种解法的&#xff0c;但其中肯定有一种解法是最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 设计模式有20多种&#xff0c;对应2…

轻松上手 | 使用国内资源安装 K3s 全攻略

作者&#xff1a; 王海龙&#xff0c;SUSE Rancher 中国社区技术经理&#xff0c;Linux Foundation APAC Evangelist&#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 8 年的云计算领域经验&#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革&#xff0c;无论底层…

3D帧间匹配-----剔除动态障碍物

0. 简介 作为SLAMer在建图时最怕的就是大量的动态障碍物存在&#xff0c;这会导致建图的不精确&#xff0c;而本文主要围绕着如何剔除动态障碍物开始讲起&#xff0c;并提供一种快速的过滤障碍物的方法。 1. 主要方法 在调研的过程中主要存在有两种方法&#xff0c;第一种如…

安全标准汇总

文章目录资源导航法律法规0x01常见标准代号0x02 2022年新发布0x03 按体系分类一般性法律规定规范和惩罚信息网络犯罪的法律直接针对信息安全的特别规定具体规范信息安全技术、信息安全管理0x04 安全等级保护0x05 数据安全声明资源导航 国家标准全文公开系统&#xff1a;国家标…

代码随想录训练营第35天|LeetCode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

参考 代码随想录 题目一&#xff1a;LeetCode 860.柠檬水找零 这个题在做的时候有误解&#xff0c;第一不能对数组bills排序&#xff0c;只能按照给定的顺序处理&#xff1b;第二&#xff0c;只能从头开始处理&#xff0c;不能中间的某个点开始。 其实这个题很简单&#xff…

synchronized锁升级过程

【一些面试真题】&#xff1a; 阿里P9——0x80的执行过程。 【 重温CAS过程 】&#xff1a; 【硬件】&#xff1a; Lock指令在执行后面指令的时候锁定一个北桥信号&#xff08;不采用锁总线的方式&#xff09;。 【用户态 与 内核态】&#xff1a; 作为操作系统来说&#x…

WebRTC学习笔记二 基础概念

一、WebRTC与架构 简单来说&#xff0c;WebRTC 是一个可以在 Web 应用程序中实现音频&#xff0c;视频和数据的实时通信的开源项目。在实时通信中&#xff0c;音视频的采集和处理是一个很复杂的过程。比如音视频流的编解码、降噪和回声消除等&#xff0c;但是在 WebRTC 中&…

C. Strange Test(位运算或)

Problem - 1632C - Codeforces 伊戈尔正在读11年级。明天他将不得不写一份信息学测试&#xff0c;由学校最严格的老师帕维尔-杰尼索维奇负责。 伊戈尔知道测试将如何进行&#xff1a;首先&#xff0c;老师会给每个学生两个正整数a和b&#xff08;a<b&#xff09;。之后&…

[2022-11-28]神经网络与深度学习 hw10 - LSTM和GRU

contentshw10 - LSTM 和GRU相关习题task 1题目内容题目分析题目解答题目总结task 2题目内容题目分析题目解答题目总结task 3题目内容题目分析题目解答题目总结task 4题目内容题目分析题目解答问题总结hw10 - LSTM 和GRU相关习题 task 1 题目内容 当使用公式htht−1g(xt,ht−…

Linux系统中利用C语言控制LED的方法

大家好&#xff0c; 今天主要和大家聊一聊&#xff0c;如何利用C语言控制LED灯的实验。 目录 ​第一&#xff1a;C语言板控制LED灯简介 第二&#xff1a;实验程序实现 ​第三&#xff1a;C语言实验控制程序 ​第一&#xff1a;C语言板控制LED灯简介 实际工作中很少会使用到汇…

分离变数法

今天是2022年11月28号 我的方程学的不太好&#xff0c;一些讲宇宙的&#xff0c;讲技术的&#xff0c;方程实在是看不懂很多方程的解与参数不可分割期末来了 有的人回去了有的人要看光学了我呢&#xff0c;已经废物了&#xff0c;节日快乐&#xff0c;大家伙节日快乐啊&#xf…

Spirng 痛苦源码学习(二)——手写spring大致总框架(一)

文章目录前言一、总体步骤如下1、spring 文件夹2、myProject 文件夹二、主要coding1、配置文件2、容器3、一些spring中的重要的注解4、项目中的使用5.重要的bean定义信息6、postProcessor重要&#xff0c;前置通知和后置主要项目的截图前言 本文主要基于spring的注解的方式完成…

Spring相关源码解读

框架1.ApplicationContext refresh的流程2.spring bean 的生命周期3.spring事务失效的几种场景以及原因4.springMVC执行流程5.一些注解&#xff08;1&#xff09;Configuration&#xff08;2&#xff09;Import&#xff08;3&#xff09;SpringBootApplication6.spring中有哪些…

BP神经网络详解,Python实现求解异或问题

BP神经网络 符号及其含义 nln_lnl​表示第lll层神经元的个数&#xff1b;f(⋅)f()f(⋅)表示神经元的激活函数&#xff1b;W(l)∈Rni∗ni−1W^{(l)}\in\mathbb R^{n_i*n_{i-1}}W(l)∈Rni​∗ni−1​表示第l−1l-1l−1层到第lll层的权重矩阵&#xff1b;wij(l)w_{ij}^{(l)}wij(l…

基于tensorflow的ResNet50V2网络识别动物

前言 之前很多人在&#xff0c;如何进行XXX的识别&#xff0c;对应的神经网络如何搭建。对应神经网络怎么搭建&#xff0c;我也是照本宣科&#xff0c;只能说看得懂而已&#xff0c;没有对这块进行深入的研究&#xff0c;但是现在tensorflow&#xff0c;paddle这些工具&#x…

长期稳定的项目—steam搬砖

大家好&#xff0c;我是阿阳 steam搬砖项目一直稳稳定定的进行着&#xff0c;有些朋友基本都观察了近2年 所以很多人问我公众号的项目是不能做了吗&#xff1f;怎么最近做新的去了&#xff1f;很明显这是几乎不可能的事情&#xff0c;steam做2年了&#xff0c;本公众号都能翻到…