地图作业平台低代码实战(搭建能力提升)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 该内容是关于地图数据作业平台从大型WebGIS的“综合作业”模式向人机结合、所见即所得的“简单作业”模式转变的探讨。平台在低代码建设过程中,遇到的问题是如何让非研发人员(如产品经理、工艺人员)能独立搭建车间,而无需理解前端基本概念如事件驱动、数据不可变原则等。为解决这一问题,文章提出了数据筛选器和saveEffect对象的解决方案,简化了数据处理和组件间联动的实现,使非研发人员也能通过可视化方式构建组件通信和联动逻辑。此外,还展示了如何将普通UI组件接入saveEffect的改造方法。最后,文中提到了未来的规划,包括引入逻辑编排能力和图形化表达逻辑代码,以支持更复杂的车间搭建。

背景


1、地图数据作业平台由大型的WebGIS"综合作业"逐步转换为人机结合,所见即所得的流水化"简单作业";

image.png

图1-1 综合作业与流水化作业


2、流水化作业的特点是单一车间交互简单,但每个车间都有定制的业务逻辑(难以配置化实现,适合有扩展能力的低代码方式);


3、作业平台低代码建设过程中,即使是任何一个简单作业车间也存在数据校验,组件联动,保存结果转换等逻辑(下图标牌场景车间为例);


4、作业平台低代码的建设目标是让产品,工艺等非研发同学能独立搭建车间,因而要尽可能将逻辑操作可视化,少写或不写逻辑代码;


5、非前端研发同学并不能很好的理解一些前端的基本概念:例如事件驱动,数据不可变 immutable原则, 数据双向绑定,组件(非)受控等;

问题与分析


一个简单的联动示例

image.png 图2-1 标牌场景判定车间


涉及组件7个


组件联动说明:初始化时第二、三个作业项置灰禁用;当前一个作业项选"否"时,激活下一个作业项;当前一个作业项选"是"时,之后的作业项清空;


问题: 对于这样一个最基础的组件间联动,低代码引擎的解决方案是WebIDE中绑定事件回调函数,在函数中通过写代码来实现逻辑。这样的方案对于前端研发来说,十几行代码很快就可以完成,但是对于非研发的同学(产品、工艺)等,他们需要理解事件驱动,数据不可变原则等,实现起来就非常困难,因此我们需要探索一个更加友好的方案:无须代码或一个表达式便可以实现以上联动功能。


示例中代码分析


// 以上示例的伪代码实现 

class Main extends PurComponents {
  constructor() {
    this.state = {
      A: '',
      B: '',
      C: '',
    }
  }
  
  // 响应逻辑
  handleAChange = (e) => {
    // 1.数据源筛选
    const { target: { value } } = e;
    // 2.双向绑定,组织数据结构
    let stateOptions = {
      A: value;
    };
    
    // 3.数据联动
    if (value === '1') {
      stateOptions = {
         ...stateOptions,
        B: '',
        C: '',
      }
    } 
    // 4.更新数据
    this.setState(stateOptions);
  };
  
  // UI组件
  render() {
    <div className="pic-wrapper">
      <PicPlayer ... />
    </div>
    <div className="task-oper">
      <Text>标牌是否是施工场景</Text>
      <ButtonGroup onChange={(e) => this.handleAChange(e)} />
      ...
      <ButtonGroup disabled={A !== '2'} ... />
      ...
      <ButtonGroup disabled={B !== '2'} ... />
    </div>
    ... bla bla bla
  }
}


  • 由上方伪代码可以看到,一个车间的实现分为:UI + 逻辑


  • 在可视化搭建中,UI部分和简单交互由组件内部实现,跨组件的逻辑部分则由事件回调实现,回调函数可以拆分为以下四部分主体功能和相关概念


  • 数据筛选:从函数参数中筛选需要的数据(涉及事件驱动的概念)
  • 双向绑定:受控组件由外部数据驱动,状态变化后需要更新依赖的数据源(受控组件,双向绑定,不可变原则)
  • 数据联动:其它数据的更新,组件间的联动通信;(业务逻辑)
  • 数据更新:前端框架Api;


示例中基本概念如何简化的思考


如何让非研发同学忽略前端的基本概念与语法,可视化的实现组件通信与联动,是降低可视化搭建难度的关键。为此,我们将函数主体的四个部分(数据筛选,双向绑定,业务逻辑联动,数据更新)分开来看:


  • 针对事件驱动中回调函数中的数据筛选能力,我们开发了数据筛选器,在设计页面的组件设置器中用树形结构静态声明函数参数,用户只需选择对应的参数即可实现类似数据解构和赋值的功能

image.png

图2-1 搭建页面中的数据筛器


  • 针对双向绑定,数据联动,immutable不可变原则,我们约定了简洁的数据存储语法,并针对此语法开发了特定的语法的解析插件,具体设计如下:
  • 页面中一个组件状态变更触发联动其它组件状态变化的场景,我们认为这是一个组件的状态变更过程的"副作用"saveEffect;
  • 每一条"副作用"包含三部分,分别是源数据,目标数据,转换逻辑,以上面联动为例:源数据A, 目标数据B, 转换逻辑是当A为1时,B清空, 对应数据结构是:
一个"副作用"对象由三部分构成

{
  // 源数据
  fromPath: 'e.target.value', 
  // 目标数据
  toPath: 'state.B',
  // 转换逻辑
  formatFunc: 'function switchStoreValue(value, state) { return A == '1' ? '' : state.B };'
}
  • 我们在低代码组件中提供了saveEffect设置器, 让用户自行选择"副作用"的源数据、确定目标值,并书写转换逻辑,这部分逻辑被注入到组件中,组件在回调函数中将输出值 和 saveEffect对象同时抛出,最终交由我们的语法解析插件解析并执行,实现组件联动;
  • 针对数据更新,我们认为用户根本无须关注框架层的API,所以开发了自动绑定设置器@ali/lowcode-setter-a-event-setter 会将组件的回调函数绑定到saveState全局函数中,在saveState全局函数中自动执行数据更新操作, 以下是一条联动"副作用"示例
// saveEffect 副作用对象的简单示例

// 变更前全局数据
state = {
  temp: {
    imageIndex: 0,
  },
  workResult: {
    imageList: [
      {
        attr1: 1,
        attr2: 2,
      },
      ...
    ]
  }
}

// 用户确定的saveEffect对象
{
  // 源数据
  fromPath: 'value' // 1
  // 目标数据
  toPath: 'workResult.imageList[state.temp.imageIndex].activeKey';
  // 默认值,用户无须书写
  formatFunc: 'function switchStoreValue(value, state) { return value }';
}

// 无转换逻辑,则经过插件解析后会生成以下结构并merge到state中
{
  temp: {
    imageIndex: 0,
  },
  workResult: {
    imageList: [
      {
        attr1: 1,
        attr2: 2,
        ...
        activeKey:1
      },
      ...
    ]
  }
}


以上saveEffect对象,用户仅需指定目标值路径,插件会自动解析路径的语法,并将activeKey所有父级结构生成新的引用,最后自动调用setState实现组件更新;

image.png

图 2-2 插件将解析路径自动更新为新引用

使用效果



一个线上车间的例子

使用saveEffect设置器节省代码的前后对比,以引导线内容车间为例,我们需要为一个引导线方向赋值一个属性,UI操作如下图,选中车道,更新车道的类型

image.png

图 3-1 更新车道属性


原生低代码引擎需要在页面JS中自行实现如下代码:


function handleButtonGroupClick(value) {
  
  // 获取当前选中的箭头选项
  const { arrowList, currentIndex } = this.state;
  const currentArrow = arrowList[currentIndex];
  
  // 数据更新
  const newArrow = {
    ...currentArrow,
    type: value
  };
  
  // 数据不可变;
  const newArrowList = arrowList.slice(0, currentIndex).concat([newArrow]).concat(arrowList.slice(currentIndex + 1));
  
  // lowcode API更新数据
  this.setState({
    arrowList: newArrowList
  });
}

使用saveEffect对象结合语法解析插件,使用者仅需在目标值中填写一句即可(大部分情况下转换函数是不用修改的);


state.arrowList[state.currentIndex].type = value

对应的setter UI 如下:

image.png


procode组件如何接入saveEffect


了解saveEffect原理后,如果想将普通的ui组件接入saveEffect, 该如何改造, 改造成本是否很大?

image.png

由上图可以看到


  • 一个普通的组件是由userInterface 和 api驱动组件内部逻辑的运行;
  • saveEffect可以通过lowcode的setter层以api(props)的方式动态注入,然后在onChange等对外的接口中抛出即可,完全不影响组件的内部逻辑;
  • 组件抛出value和saveEffect后,系统会自动调用我们开发的解析插件进行数据解析和保存,从而实现组件的"副作用"间联动效果;

总结与展望


这篇文章主要介绍了我们通过自定义插件,设置器,组件标准化等一些方式,降低了作业平台内组件间联动,数据处理的难度,实现了让非研发同学可以独立搭建我们小粒度车间的目标。除此之外,我们还在可视化方面开发了for循环组件if/else 等逻辑组件,意图用可视化组件的方式实现一些基本的模板语法,结合我们开发的车间模板,使得用户只需在页面内完成少量定制逻辑可以实现车间开发。


未来我们计划在低代码平台中加入逻辑编排能力,最终实现逻辑代码的图形化表达,进一步支持更为复杂的车间搭建。

参考

《阿里低代码引擎》:https://lowcode-engine.cn/docV2/intro

《设置器扩展》:https://lowcode-engine.cn/docV2/cl03wo_nmhznb

《setter开发调试》:https://lowcode-engine.cn/docV2/ulvlkz

《物料规范》:https://lowcode-engine.cn/material

《阿里低代码引擎使用文档》:https://www.yuque.com/lce/doc


作者 | 安晨(晨朝)

来源 | 阿里云开发者公众号

相关文章
|
数据可视化 安全 搜索推荐
探析低代码开发平台的核心能力
探析低代码开发平台的核心能力
168 0
|
存储 数据可视化 JavaScript
(低代码)可视化搭建平台数据源设计剖析
低代码平台属于APaaS(应用平台即服务),其解决的是企业内部应用协调和人效成本的问题. 随着计算机技术诸如云服务等的发展, 传统软件服务已无法满足数字化浪潮的压力,
1058 0
|
6月前
|
前端开发 数据可视化 JavaScript
探索前端可视化开发:低代码平台原理与实践
【4月更文挑战第7天】本文探讨了低代码平台在前端开发中的应用,介绍了其模型驱动、组件化和自动化部署的原理,强调了提升效率、降低技术门槛、灵活适应变更和保证一致性等优势。建议开发者明确适用场景,选择合适平台,并培养团队低代码技能,同时规划与现有技术栈的融合,实施持续优化治理。低代码平台正改变开发格局,为业务创新和数字化转型提供新途径。
301 0
|
移动开发 数据可视化 前端开发
低代码引擎核心技术,可视化动作——OneCode技术实践
低代码平台最大的一个技术特点便是开发图形化、可视化,通过拖拉拽方式快速实现企业数字化转型中的创新应用。在实践中通过图形化技术确实在一些特定领域大幅降低了应用开发的准入门槛,使得非专业人员也可以快速的参与到企业的数字化转型中。但随着业务的深入个性化需求也进一步增多,多数的低代码平台都无法满足相关的逻辑,这时仍然需要专业的程序员通过代码的方式来扩展。 但这些业务逻辑的代码繁琐且无用,只能让程序员在做低水平的重复工作。有痛点就会有需求,一些低代码平台推出了可视化逻辑编排能力,能够很好地解决这个问题。本文将结合OneCode平台的可视化逻辑编排设计来进行分析,希望对你有帮助。
|
存储 数据可视化 前端开发
地图作业平台低代码实战(搭建能力提升)
文章主要介绍了地图作业平台借助阿里低代码引擎,通过自定义插件,设置器,组件标准化等一系列方式,降低了作业平台内组件间联动,数据处理的难度,从而实现地图作业平台的可视化搭建
1291 9
【大陈子学低代码】— Vol.3 用宜搭搭建的新项目可行性分析大型计算器
在做项目可行性分析时,只需录入基础数据,计算逻辑全部提前预设好,如同一个大型的计算器,总收入、总成本、利润秒出!
【大陈子学低代码】— Vol.3 用宜搭搭建的新项目可行性分析大型计算器
|
前端开发 数据可视化 IDE
开源|优酷动态模板研发体系为分发提效30%
动态模板技术方案将客户端研发链路实现了串联,通过完备的工具化支撑体系,让开发者可以高效完成组件由原始设计稿到可运行代码的最短通路,本文将对研发体系中涉及到的核心模块就行介绍,希望对技术社区及广大开发者有一定帮助。
开源|优酷动态模板研发体系为分发提效30%
|
移动开发 前端开发 数据可视化
已开源,就等你来!优酷动态模板研发体系为分发提效30%
已开源,就等你来!优酷动态模板研发体系为分发提效30%
303 0
已开源,就等你来!优酷动态模板研发体系为分发提效30%
|
弹性计算 运维 数据可视化
免费下载 | 《可视化架构运维实践》重磅发布——云上架构生命周期管理 所见即所得!
所见即所得(英语:What You See Is What You Get,缩写:WYSIWYG)是由菲利普·威尔逊(Flip Wilson)所提出的一种电脑文本编辑器方面的技术,使得编辑文字时在屏幕上直接呈现最终显示效果,如打印到纸张上的效果,故也称可视化操作。
免费下载 | 《可视化架构运维实践》重磅发布——云上架构生命周期管理 所见即所得!
|
数据可视化 搜索推荐 IDE
一款具备零代码和低代码能力的大数据可视化分析平台
什么是低代码平台: “低代码开发”旨在开发人员可以通过编写少量代码就可以快速生成应用程序的一种方法。 使用低代码开发平台类似于使用IDE,因为它包含了一套可以供开发人员直接使用的功能,和一套供开发人员使用的工具。然而,它实际上能提供的远远超过一个传统的IDE。简单来说,低代码开发就是将已有代码的可视化模块拖放到工作流中以创建应用程序的过程。由于它可以完全取代传统的手工编码应用程序的开发方法,技术娴熟的开发人员可以更智能、更高效地工作,而不会被重复的编码束缚住。相反,他们可以将精力集中于创建应用程序的10%部分,并使其具有与众不同的功能。与“低代码”开发相对的另一种方式是编写数千行复杂的代码和语
一款具备零代码和低代码能力的大数据可视化分析平台