干货 | 携程动态表单DynamicForm的设计与实现

动态表单设计 自定一表单数据结构。内容展示如有必要行转列。前端根据题目类型自定义组件后端跟俊题目类型用策略模式校验各种类型这样有统计功能的简单动态问卷就可以了展示时可能某些场景需要行转列。大概估摸使用的话有可能kmic_form_data_detail表的记录数比较大,后期再考虑数据或者表迁移或拆分。 阅读详情

作者简介

 

Daryl,携程高级研发经理,关注业界大前端及高并发应用解决方案。

一、简介

在很多软件系统中,表单开发都是很重要的一个部分。在表单开发中,往往会遇到重复开发的问题,例如在页面搭建系统中,除了组件本身的逻辑,配置组件数据的表单通常也需要开发人员重复手动开发。这就导致开发人员不仅要维护组件本身的逻辑,还要维护组件的配置表单,严重影响组件的开发和迭代效率。

fd3550b1093ecc86e930372562f2f7e0.png

为了让开发人员更加专注于组件本身的逻辑处理,我们开发了DynamicForm动态表单配置系统,可以通过拖拽的方式,快速创建一个表单。

DynamicForm是由携程市场营销”活动平台”及”会员平台”共同设计的React表单组件,它包括表单可视化设计、校验、预览、渲染等功能。目前最重要的应用场景,是为乐高平台提供组件属性配置的动态化表单配置能力。

乐高平台是探索组件化构建页面的实际应用,期望通过归纳常规web组件和业务组件,归纳单一职责服务接口从而构建出通过配置自动生成h5页面的方案,以达到代码复用,逻辑复用,节省开发时间,经验积累,节省页面上线时间等目的。

二、乐高早期表单的实现

实现阶段1:手动开发

乐高最初完全使用定制化开发的形式来实现属性表单,这样做的好处是表单外观可以随心所欲,界面对于运营可以做的非常友好。当然,缺点也是显而易见的,定制化的开发无法满足快速迭代的活动运营要求,往往一个需求来了立马就要上线,这个时候定制化的开发和发布流程就会严重制约生产力。

实现阶段2:动态表单1.0

乐高表单第二版使用的是半自动化表单,支持动态配置表单控件类型和表单校验等。

配置面板如图:

68e611437503743fee02222c36ea0df7.png

此版本的表单不支持可视化拖拽,控件自上而下顺序排列。解决了需求快读迭代的问题,但因为无法自定义布局,随之带来了属性的臃肿以及运营人员操作复杂的问题。

因此我们开发了动态表单2.0(DynamicForm)。

DynamicForm在乐高平台的应用

为了应对乐高组件快速迭代的业务需求,必须研发出一种能够让组件属性快速得到应用的表单技术框架,这样以保证在组件新增属性时,无需进行新代码的开发,仅需通过简单的配置即可生成新的组件属性。

为了达到表单配置的灵活性,DynamicForm必须满足以下几个条件:

1)丰富的表单控件类型

DynamicForm包含了以下内容,满足了多样化的配置要求。

  • 通用控件:文本框、单选框、多选框、下拉选择、颜色选择、图片上传等

  • 自定义控件:组件可视化选择,热区定义,JSON可视化配置控件等。

2)DIY表单界面

运维人员可以通过对控件拖拽,实时编辑的形式,对表单进行自由设计,以达到理想的UI效果。

3)表单控件配置

可以对控件的默认值、是否必填、提示信息、控件宽度、正则匹配等进行自由配置,以达到理想效果。

4)表单数据关联

为了达到表单的属性项的关联,需配置数据关联,控制分组关联等。

配置界面示例见下图:

523926e08715c5fd166e2635fbcc7671.png

二、亮点

已实现的DynamicForm具有如下亮点:

  • 可视化:可视化搭建、修改和预览表单

  • 可拖拽布局:控件可在画布内拖拽至任意坐标,以搭建最佳布局

  • 可扩展:可二次开发,可扩展控件集

  • 可联动:某个控件可以控制别的控件的显示和隐藏

  • 支持复杂数据类型:支持对象结构以及对象数组结构等复杂数据类型(JSON)的配置

三、架构

DynamicForm架构设计的目的是降低表单的维护成本、降低开发人力,解决表单开发中常见的联动、校验、自定义展示等问题。

3.1 功能梳理

Dynamic的核心功能包括联动、校验、扩展、可视化等。

  • 联动:某个控件变化后,改变其他控件的显示和隐藏。

  • 校验:通过正则表达式(预留或者自定义)进行表单校验。

  • 扩展:支持自定义控件和校验。

  • 可视化:支持可视化拖拽和可视化编辑,节省开发表单时间,并降低运营的配置成本。

3.2 架构模块

246fb079d836cd390e19ee05d42ce7ed.png

渲染流程:

b8052eb132c4defaea622496c90b0e9a.png

系统有表单生成器编辑面板Form Generator,表单渲染入口Form Viewer两个主要模块。

这两个模块共用常规的基础组件如输入框,颜色选择等,还有一些基于业务扩展的复杂组件,例如热区选择,视频上传,数据聚合(JSON列表)等。

1bca06a4d2dba4ecfba25c85722266c4.png

动态表单一个比较重要的点是需要解决JSON可视化配置,为此表单也开发了table列表式的JSON列表组件,子项的配置就基于嵌套表单实现配置字段,并且能够增删改查条目,excel导入,导出数据。

66543300a1f6f8ddb6396398563ceb4f.png

其他复杂数据类型配置,如["a","b"]和["a","c"],表单提交数据结构即为{a:{b:"",c:""}} 

af997d223124ba3f2737335ffed72a33.png

da40568ab1d88b434833fb13072a81bf.png

另外一个功能点是解决动态属性间的联动问题,为此表单通过配置联动表达式解决了控件联动问题,例如控制显隐等。

20bde5d9015408ed6d64b8a88730a9b8.png

ba47617691d617e0734c5b811d326071.png

表单底层则依赖React(hooks),Ant Design的主题UI库,Mobx。

3.3 灵活的布局

  • 组件自由拖拽布局,自动对齐等

  • 组件可控制添加分组,从而批量操作布局

1ee1bcd207fbd67c92c0a1ca32276168.png

3.4 校验

提供预留的常规校验,如中文,英文校验等,以及可自定义扩展的校验配置。

6c2211404cd881b5f44c8535101d4247.png

四、后续计划

DynamicForm将作为独立的npm模块使用,为其他动态表单场景提供公共功能,打造泛应用动态表单。

DynamicForm代码开源,与社区共同交流与进步。

【推荐阅读】

ddd3a562ee17af28aa8cf2c5e046a8d8.png

 “携程技术”公众号

  分享,交流,成长

动态表单实现思路 表单模板设计:将表单拆分为表头属性、表单模板和数据存储三部分。表头属性包含表单的基本信息,如表单名称、描述等;表单模板定义表单的结构和字段,包括字段名称、类型、是否必填等;数据存储则用于保存用户提交的数据。字段配置:抽象出一般化的字段属性,如属性编码(保证唯一性)、属性名称、显示类型(如只读文本、输入框、下拉列表等)、输入类型(如数字、字符串、日期等)。这些属性可以通过后台管理系统进行配置,实现表单的灵活扩展。动态表单的实现思路是通过灵活配置表单模板和字段,结合前后端技术实现表单的动态渲染和交互。 阅读详情

相关推荐

Web开发中动态表单的实现与最佳实践

本文还有配套的精品资源,点击获取 简介:动态添加表单是在Web开发中实现用户自定义表单元素的关键功能,它能够提升用户交互体验。本文将介绍动态表单的核心概念、实现方法、技术栈以及最佳实践,包括如何使用HTML、JavaScript、前端框架、表单库和后端技术。文章还将通过实际项目案例,展示动态表单在增强Web应用交互性中的应用。 1. 动态表单定义与用户交互体验 ...

weixin_30299319的博客 2092

实现动态表单功能设计思路

实现动态表单功能设计思路 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录**实现动态表单功能设计思路**业务场景一、设计思路二、使用步骤1.引入库2.读入数据总结 业务场景 功能要求把人工记录的各种表单(XX使用记录、XX检查记录)通过系统录入保存并展示,当表单类型过多时不适合一一对应建表维护数据 一、设计思路 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as

weixin_43881512的博客 1万+

动态表单系统设计与实现完整Demo项目

为了提升用户体验,验证系统应支持自定义错误消息,而非仅返回“格式错误”这类模糊提示。可通过扩展属性实现:"taxId": {"pattern": "税号格式应为:两位大写字母 + 六位数字 + 一位校验字母(如 AB123456X)"},"title": "纳税人识别号"在复杂表单中,多个字段之间存在依赖关系。例如,“国家”字段变化会影响“省份”下拉列表的内容;“是否已婚”为“是”时才显示“配偶姓名”字段。这种跨组件通信不应通过直接 DOM 操作或全局状态硬编码来实现,而应采用。

weixin_42372837的博客 1115

【开源】基于Vue.js的无代码动态表单系统的设计和实现

基于Vue+SpringBoot+MySQL的无代码平台的表单平台,包括了系统数据中心模块,用来存放管理系统通用的模块,另外分别设计了动态类型模块、动态文件模块、动态字段模块和动态值模块这四大模块,用于实现档案管理系统的核心表单逻辑。

askf01的博客 1661

动态表单系统设计与实现

动态表单系统设计与实现【硕士学位毕业论文

100多台物理GPU服务器,每台服务器上有8张GPU卡,组网

计算网用 IB/RoCEv2 保证低延迟高带宽,支撑 800+GPU 的分布式训练;管理网和存储网独立部署,避免干扰核心通信;全链路冗余和规范布线,确保集群稳定运行;搭配 Slurm/K8s 和监控工具,实现高效管理。该方案可支撑千亿参数大模型训练,且具备极强的扩展性,未来可平滑扩容至 200 + 台服务器。

weixin_42795092的博客 2020

【转】动态表单设计与实现

  动态表单的意义  对于动态表单的探讨现在越来越多了。原因无非是表单在信息管理系统中的重要作用,基本上采用表单+流程就可以实现一个OA系统。然而数量众多的表单和易变动性让开发人员感到疲惫。为了让开发人员把注意力集中在业务流程上来,也可以让系统操作人员参与到表单的管理,就出现了动态表单技术。    通常情况下,表单加流程,就构成了一个信息管理系统。   在对信息管理系统的探索中我们发现,按业务...

学习笔记 1万+

UE4入门实例17(Unreal制作卡通Post Process材质球)

效果展示 #1 创建Post Porcess材质球 #2 编写Shader功能 #3 设置场景区域内风格化渲染 #1 创建Post Porcess材质球 #2 编写Shader功能 创建基础效果 移除现有通道渲染 设置视图渲染范围 #3 设置场景区域内风格化渲染 #4 加群下载Shader源码:284105567 ...

Unity3d 攻城师一枚 1345

Vue实现动态表单

动态表单的核心是:根据用户在表单中的输入,自动调整后续表单项的显示内容。例如,用户在某个表单输入特定的值时,会显示下一个问题或选项,而如果用户输入不同的值,则会跳转到另外一套问题。这种交互使得表单流程更加智能和灵活。在本文中,我们将创建一个递归的动态表单,表单项之间通过逻辑相互连接。当某个表单项的值发生变化时,它将动态显示下一个表单项,或者结束表单流程。通过本文的讲解,我们一步一步构建了一个递归动态表单。使用 Vue 的响应式系统和递归组件,我们可以根据用户输入的内容动态展示后续表单项。

而世之奇伟、瑰怪,非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也! 5326

1panel面板实战:Docker容器存储路径迁移与优化指南

本文详细介绍了在1panel面板中迁移Docker容器存储路径的完整流程与优化方法。针对系统盘空间不足的常见问题,通过停服务、搬数据、改配置三个核心步骤,指导用户安全地将Docker数据目录迁移至更大容量的独立分区,并提供了迁移后的深度管理技巧与常见避坑指南,帮助用户优化服务器存储资源。

ol789012的博客 865

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1572

基于vue+element的动态表单的设计与实现(1)

动态表单的设计与实现实现功能基础结构的设计代码实现 备注:细节可能有误,主要提供思路 实现功能 目前主要实现了以下4个功能 表单的可配置化; 具体字段的实时监听(观察者模式); 一个字段控制另一个字段的是否可编辑(发布订阅模式); 支持三种模式:新建、更新、详情 基础结构的设计 首先定义我们需要解析的json配置,基础结构如下: [ { groupNo: "basic", groupName: "基本信息", fields: [ { compone

Soul_mate_61的博客 2813

解密微信DAT图片:一键转换JPG/PNG/GIF的实用指南

本文详细解析微信DAT图片的加密机制及转换方法,提供从定位文件到使用WeijieSoft工具一键转换JPG/PNG/GIF的完整指南。涵盖新旧版微信存储路径差异、批量处理技巧及常见问题解决方案,帮助用户高效恢复重要图片并释放存储空间。

weixin_29305337的博客 3618

数据库到页面实现动态表单

del_flag: 逻辑删除标记(0显示,1隐藏),对应的mapper层方法deleteByLogic,生成的代码中,使用删除方法时,默认都是使用的物理删除delete方法,如果想使用逻辑删除deleteByLogic,请手动修改生成的Controller方法。Java属性名称:如果是基本类型(例如:int,string)使用字符串,如果是对象类型(例如User,Office,自定义java对象),请选择需要关联查询的字段,id必选,除了id之外还必须选择至少一个字段。创建单表时,推荐使用默认的字段配置。

m0_62164670的博客 1475

混沌系统在图像加密中的应用(二维离散Hénon混沌映射)

Hénon映射是一种二维离散时间动力系统,由美国数学家Michel Hénon在1976年引入。它是混沌动力系统中的经典模型之一,具有简单的形式和复杂的行为。

weixin_42207434的博客 2489

四旋翼黑科技揭秘:如何利用PX4隐藏的角加速度数据提升控制性能

本文深入探讨了如何利用PX4飞控中隐藏的角加速度数据,结合增量非线性动态逆(INDI)控制方法,显著提升四旋翼无人机的控制性能。通过实战教程,指导开发者从数据订阅、INDI原理到代码实现,构建响应更快、鲁棒性更强的控制回路,有效应对突风与快速机动。

lake5的博客 719

动态表单设计与实现_通过JsonSchema协助完成动态表单页面实现

动态表单页面一直是做中后台管理系统中让人头疼的部分,这里就记录一下自己在这一块实现过程中的一些架构方案吧。上图来自我们项目原型中的一小部分(实际项目中粗略估计大概有几百种筛选组合情况)。这种页面如果采用if...else去写的话,不说后期维护起来怎么做,就说开发过程中就能给人整懵逼了,所以在动笔(键盘?)之前我们需要先想好该采用怎样的架构模式去实现我们的页面。接下来就是我在实现过程中的一些思路分析...

weixin_39672680的博客 1796

CloudCompare 二次开发:插件中的 PCL 环境配置与编程

在进行 CloudCompare 的二次开发过程中,我们常常需要使用点云库(Point Cloud Library,简称 PCL)来处理和分析点云数据。在 CloudCompare 的界面中,选中一个点云对象,然后点击菜单栏中的 “插件” -> “MyPluginAction”。插件将对选中的点云对象进行体素滤波处理,并更新显示结果。下面我们将展示一个简单的插件编程示例,该示例使用 PCL 对输入的点云数据进行体素滤波处理。方法进行体素滤波处理,并将结果点云赋值给选中的点云对象。文件并点击 “打开”。

2301_79331387的博客 283

实现vue图片缩放-拖拽组件

实现效果如下: 这几天做了个没做过的组件,以此记录下,需要的效果是在一个dom内,缩放拖拽图片。 封装的子组件imgbox.Vue。父组件中使用,需要在父组件中准备一个盒子用来装图片,在这个盒子中可以缩放拽拽图片。 父组件如下 父组件html部分 <!-- 普通方形盒子 --> <div class="box1"> <imgbox :config="data1" @enlarge="enlargeImg" @narrow="narrowImg" @changeIm

zhou15184409854的博客 2896

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用el-form组件生成动态表单

肯定是没问题的 但是想一下 如果这种表单 在一个页面同时出现N个类似的 或者在N个页面都需要这样的表单输入 怎么办呢 疯狂的定义el-form-item和校验规则疯狂的CV吗 肯定是不符合我们干完活想摸摸鱼的习惯了 此时此刻就可以看一下这个动态生成了。这里的关键内容是提前定义好一个el-form的HTML结构 然后准备一个json定义我们的表单内容 然后交给表单组件渲染就OK了。这里的JSON数据我使用了mixin的方法 嫌麻烦的同学也可以直接在data中写入。

qq_40673807的博客 2122

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基于mongodb的动态表单实现

动态表单,代码自动生成,mongodb

KelvinLiu 4260

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Form动态表单设计的开发

表单设计 1.应用场景   项目中往往需要动态的创建一个表单,或者添加一个新的数据模板,这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重。 2.实现工具   Struts2.x + mongodb + jquery   Struts2  作为控制层起到连接页面到后台的数据交互桥梁。   mongodb  做为nosql数据库,在

lzy_persist的专栏 2977

react实现页面动态表单设计器(自定义推拽表单)-含完整代码讲解

左侧多个表单控件,可自由选择拖拽至中间中间对推拽后的空间进行值的输入和选择右侧。

ll_883963的博客 3764

vue3+ Ant Design Vue实现动态表单+动态校验规则+动态验证

vue3+ Ant Design Vue实现动态表单+动态校验规则+动态验证 快速使用

mrorry的博客 4601

(一)vForm 动态表单设计器之使用

VForm是一款基于Vue 2/Vue 3的低代码表单,支持Element UI、iView两种UI库,定位为前端开发人员提供快速搭建表单、实现表单交互和数据收集的功能

刘一线的博客 1万+

动态表单(Dynamic Forms)

效果图如下: 主要文件dynamic.html,dynamic.js。 dynamic.html view sourceprint? 01.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 02. 03. 0

zhangyabin_520的专栏 1435
上一篇: 携程Tech Girl:做勇敢的女孩
下一篇: 干货 | 用DDD(领域驱动设计)和ADT(代数数据类型)提升代码质量
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值