应用开发平台集成表单设计器系列之2——深入了解与技术验证

背景

上一篇,对表单设计器进行了技术预研,在三款组件form-generator、FormMaking、form-create-designer中初步选择了form-create-designer,接下来的工作,是需要深入了解,进行技术验证,确保该组件功能基本功能能满足我们的平台集成需求,有良好的开放性可以满足未来的扩展。这样可以避免投入了大量时间精力,集成工作进行了大半,突然发现功能受限,特别是关键性或核心需求实现不了,意味着已经做的集成工作实际是无效劳动,需要更换技术组件,开发成本增加,开发周期变长。

基础资料

官网:http://www.form-create.com/
文档:http://www.form-create.com/v3/guide/
预览:http://form-create.com/v3/designer
简介:form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持3个UI框架,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。

注意:这里有个重要的概念不要混淆,form-create 和form-create-designer并不是指的同一个组件,这是两个组件,前者是内核,能独立使用,可以视为表单的模型+API,并没有UI部分;后者是在前者基础上二次封装提供出来的表单设计器,有界面,如下图所示:
image.png
前者文档资料比较详细,后者文档资料比较少,二者有联系但也不完全等同,特别是API方面,在这地方踩坑花费了较多的时间,后面会详细说。

换个角度理解这两个组件更合适,form-create是运行时,而form-create-designer是设计时(或称之为组态时/开发时)。form-create-designer是基于form-create的模型和API二次封装出来的,用于表单设计的工具,其输出的表单配置,以json数据的方式赋给form-create组件,在页面运行时由form-create解析json数据,生成表单,展示并运行。

基本使用

首先来说下form-create组件。
对于vue3版本,除了支持element-plus外,还支持其他几套UI库,

  • ant-design-vue
  • naive-ui
  • arco-design
  • TDesign

安装

执行命令安装

pnpm i @form-create/element-ui@next

安装完成,前端项目中package.json中增加了如下库引用:

  "@form-create/element-ui": "^3.1.24",

配置

采用全局配置的模式,修改main.js,加入以下配置:

// 表单构建器
import FormCreate from '@form-create/element-ui'

……

// 创建实例
const setupAll = async () => {
  const app = createApp(App)

  await setupI18n(app)

  setupStore(app)

  setupGlobCom(app)

  setupRouter(app)

  setupPermission(app)

  // 全量注册element-plus组件
  app.use(ElementPlus)

  // 表单构造器
  app.use(FormCreate)
  …………
  // echart图表
  app.component('v-chart', ECharts)

  app.mount('#app')
  
}

注意,这里官方文档没提,但经测试只能采用上面这种全局配置模式,若在某个具体页面,引用
import FormCreate from '@form-create/element-ui’后使用,加载环节就会直接报错,无法正常运行。

若要在具体使用该组件的vue页面,获取到组件实例,可以直接使用this.$formCreate这种方式。

使用

<div id="app">
  <form-create v-model="value" v-model:api="fApi" :rule="rule" :option="option"></form-create>
</div>

        

export default {
    data() {
        return {
            //实例对象
            fApi: {},
            //表单数据
            value: {},
            //表单生成规则
            rule: [
                {
                    type: 'input',
                    field: 'goods_name',
                    title: '商品名称'
                },
                {
                    type: 'datePicker',
                    field: 'created_at',
                    title: '创建时间'
                }
            ],
            //组件参数配置
            option: {
                //表单提交事件
                onSubmit: function (formData) {
                    alert(JSON.stringify(formData))
                }
            }
        }
    }
}

运行效果如下:
image.png
可以正常输入文本和选择日期,点击提交按钮,获取的表单数据如下图所示:
image.png

技术验证

平台已实现的低代码配置部分,可以通过实体和视图的元数据配置+模板化技术生成前端vue页面,封装了大量的自定义组件,如依托于数据字典的下拉列表和单选按钮组、部门选择、用户选择、实体参照等。
引入表单设计器,需要考虑二者的关系,是视为两种独立的表单配置模式,还是二者相互协作。

自定义组件

虽然form-create内置了大量的组件,但这些组件是独立运行的,有着自己的运行模式。以常见常用的下拉列表为例,内置组件提供了fetch方法,用于向后端服务获取字典数据,因此要设置后端的服务地址,并且需要处理认证问题。
平台已封装的基于数据字典的下拉列表,只需要直接使用一个组件,赋予字典类型编码即可,如下所示:

   <dictionary-select v-model="onSaleFlag" code="YesOrNo" />

官方文档明确指出,form-create 支持的在表单内部生成任何 vue 组件。
我们要进行技术验证,就拿平台已封装的基于数据字典的下拉列表DictionarySelect来进行尝试。
参照官方说明,自定义组件在使用时,需要先挂载,相当于向form-create组件注册,通过下面这种方式挂载

this.$formCreate.component(
'DictionarySelect', DictionarySelect)

即调用form-create组件的API,使用component方法,第一个参数是组件类型的命名,第二个参数是组件。

另外,还有一种更便捷的方式,是指定form-create组件的rule属性的时候,在component属性中直接指定组件,同时配置type属性指定组件的类型的命名

const rule = {
   type:'DictionarySelect',
   component: DictionarySelect
}

需要注意的是,后面这种方式并不能完全替代挂载的方式,在基于API方式构建表单组件的情况下,还是需要前面那种注册组件的方式,后面集成的时候会给出范例。

在官方示例基础上,添加了字典下拉列表组件,前端测试页面的源码如下:

<template>
  <form-create v-model="value" v-model:api="fApi" :rule="rule" :option="option" v-show="true" />
</template>

<script lang="ts">
import DictionarySelect from '@/components/abc/DictionarySelect/DictionarySelect.vue'
export default {
  components: { DictionarySelect },
  data() {
    return {
      //实例对象
      fApi: {},
      //表单数据
      value: {},
      //表单生成规则
      rule: [
        {
          type: 'input',
          field: 'goods_name',
          title: '商品名称'
        },
        {
          type: 'datePicker',
          field: 'created_at',
          title: '创建时间'
        },
        {
          type: 'DictionarySelect',
          component: DictionarySelect,
          field: 'onSaleFlag',
          title: '是否在售',
          props: {
            code: 'YesOrNo'
          }
        }
      ],
      //组件参数配置
      option: {
        //表单提交事件
        onSubmit: function (formData) {
          alert(JSON.stringify(formData))
        }
      }
    }
  },

  mounted() {},
  methods: {}
}
</script>

<style></style>

运行效果如下:
image.png
页面功能测试正常,可以自动请求后端拿到字典数据,不过浏览器显示了警告:
image.png
大概意思是组件自身已经是响应式的了,没必要再包一层,影响性能,建议使用markRaw,因此做了改造:

import { markRaw } from 'vue'

  ……
 		{
        type: 'DictionarySelect',
        component: markRaw(DictionarySelect),
        field: 'onSaleFlag',
        title: '是否在售',
        props: {
          code: 'YesOrNo'
        }
      }

调整后浏览器控制台干净了。
这部分处理是自己摸索解决的,官方文档并没有提到。

在上面基础上,又验证了平台封装的几个典型组件,包括实体参照,即弹出对话框选择其他实体对象,如组织机构,功能正常。

综上,自定义组件的支持没问题。

组件属性

对于vue组件,属性很重要,这块form-create(以下统一简称为fc)组件通过props属性来适配,无论是ElementPlus的组件,还是自封装的组件,属性都可以方便的设置,这方面fc的设计上考虑周到,用起来友好,赞一个。
以平台已封装的基于数据字典的下拉列表DictionarySelect为例,组件上有个属性code,用于指明数据字典的类型编码,通过form-create的内置属性props解决。

 {
    type: 'DictionarySelect',
    component: DictionarySelect,
    field: 'onSaleFlag',
    title: '是否在售',
    props: {
      // 在这里指定属性及值
      code: 'YesOrNo'
    }
  }

再举一个例子,对于日期时间选择,平台进行了二次封装,通过元数据配置,基于自定义的js方法来设置el-datetimePicker的属性,经测试通常可以正常运行。

valueFormat: this.$dateFormatter.getDatetimeFormat(item.formatPattern),
type: this.$dateFormatter.getDatetimeType(item.formatPattern)

开发平台资料

平台名称:一二三开发平台
简介: 企业级通用开发平台
设计资料:csdn专栏
开源地址:Gitee
开源协议:MIT
开源不易,欢迎收藏、点赞、评论。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安防视频监控EasyCVR平台使用海康ehome接入,配置信息不对是什么原因?该如何将解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

VMware ubuntu 新虚拟机的创建

根据自己指定的路径安装好vm后。 创建新的虚拟机。 记录一下&#xff0c;下次用到别再忘记了。 如需转载&#xff0c;注明出处&#xff01; 点赞收藏关注我 以资鼓励 打开vm 软件&#xff0c;点击创建新的虚拟机 选择典型&#xff0c;点击下一步 选择你的ubuntu镜像iso文件 …

【算法训练-链表 零】链表高频算法题看这一篇就够了

一轮的算法训练完成后&#xff0c;对相关的题目有了一个初步理解了&#xff0c;接下来进行专题训练&#xff0c;以下这些题目就是汇总的高频题目 题目题干直接给出对应博客链接&#xff0c;这里只给出简单思路、代码实现、复杂度分析 反转链表 依据难度等级分别为反转链表、…

Window安装MongoDB

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

Python 如何实现访问者设计模式?什么是访问者(Visitor)模式?实际案例中有什么作用?

什么是访问者设计模式&#xff1f;访问者&#xff08;Visitor&#xff09;设计模式介绍&#xff1a; 访问者&#xff08;Visitor&#xff09;设计模式是一种行为设计模式&#xff0c;用于在不修改被访问对象的前提下定义新的操作。它通过将操作封装到独立的访问者类中&#xf…

JumpServer管理虚拟机

环境准备 1.虚拟机192.168.1.111在线安装JumpServer https://blog.csdn.net/tongxin_tongmeng/article/details/1340166222.虚拟机192.168.1.112创建用户changwq、wangwj useradd changwq && passwd changwq、useradd wangwj && passwd wangwj3.虚拟机192.168.…

springboot容器

1.主要指的是servlet容器 servlet组件由sevlet Filter Listener等 2.自动配置原理 通过ServletWebServerFactoryAutoConfiguration 配置这些内容 (自动配置类开始分析功能) conditionalOnclass开启条件 ServletRequest类 import导入嵌入式的tomcat Jetty等 这些是配置类&…

本地化工具:Soluling Localization Crack

Soluling 是一个本地化工具&#xff0c;包含本地化项目所需的所有功能。Solling 使本地化变得非常容易。Soluling 是桌面应用程序和命令行工具的组合 。Solling支持100多种文件格式。通过 Soluling&#xff0c;您可以本地化桌面应用程序、移动应用程序、Web 应用程序、文档和在…

如何在thingsboard的规则链中对一个遥测属性进行求平均值

背景 有这样一个需求,一个温度传感器每5秒,上传一次数据。要求算出该设备2分钟内的平均温度,如果超过某个值,则发送告警邮件。 具体操作实现 下面在规则链中实现求平均值。 使用的节点是 配置如下 必填 Timeseries keys,是要求的平均值的属性名。 我这里求的是四个…

【教学类-17-03】20231105《世界杯随机参考图七巧板 3份一页》(大班)

效果展示&#xff1a; 单页效果 多页效果 预设样式&#xff1a; 背景需求&#xff1a; 2022年11月24日&#xff0c;大1班随机抽取的9位幼儿制作了9张拼图&#xff0c;发现以下三个问题&#xff1a; 1、粉红色辅助纸选择量多——9份作业有4位幼儿的七巧板人物是粉红色的 2、…

嵌入式杂记 -- MCU的大小端模式

MCU的大小端模式 大端模式小端模式大小端模式测试联合体概念MCU大小端模式测试大端模式测试小端模式测试 大小端模式转换 在进行MCU开发的时候&#xff0c;我们需要注意MCU的数据存储模式&#xff0c;在嵌入式中有两种不同的存储模式&#xff0c;分别是 大端模式和小端模式。 …

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…

Apache Airflow (六) :DAG catchup 参数设置

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

软件测试 —— 常见的自动化测试架构!

一个自动化测试架构就是一个集成体系&#xff0c;其中定义了一个特殊软件产品的自动化测试规则。这一体系中包含测试功能函数库、测试数据源、测试对象识别标准&#xff0c;以及各种可重用的模块。这些组件作为小的构建模块&#xff0c;被组合起来代表某种商业流程。自动化测试…

求最大公约数math.gcd()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 求最大公约数 math.gcd() [太阳]选择题 下列代码执行输出的结果是&#xff1f; import math print("【执行】print(math.gcd(6, 8))") print(math.gcd(6, 8)) print(&quo…

【汇编】汇编语言的介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、汇编是什么&#xff1f;二、为什么要学习汇编语言&#xff1f;三、学习汇编语言的好处四、安装汇编环境4.1 下载虚拟环境4.2 配置虚拟环境 总结 前言 计算…

我的创作纪念日-我在csdn的三周年

文章目录 机缘收获日常成就憧憬 机缘 2020 年 11 月 09 日&#xff0c;撰写了第 1 篇技术博客&#xff0c;到现在不知不觉三周年了。 慢慢的也会将自己的感受和知识梳理成专栏&#xff0c;记录日常的学习以及通过文章进行技术交流&#xff0c;和大家分享一个我认为比较好的成…

Unity Hub无法登陆的两种终极解决办法

最近换了个电脑&#xff0c;需要重装Unity&#xff0c; 然后unity hub 怎么都无法登陆&#xff0c;登陆不了就不能激活personal license。试了很多次&#xff0c;包括unity hub 2.5.8 和unity hub 3.3都不行&#xff0c;真的是很崩溃。因为是公司的电脑&#xff0c;限制比较多&…

西门子精智屏数据记录U盘插拔问题总结

西门子精智屏数据记录U盘插拔问题总结 注意: 数据记录过程中不允许带电插拔 U 盘! 数据记录的相关功能可参考以下链接中的内容: TIA博途wincc V16 如何进行变量周期归档?

AI大模型低成本快速定制秘诀:RAG和向量数据库

文章目录 1. 前言2. RAG和向量数据库3. 论坛日程4. 购票方式 1. 前言 当今人工智能领域&#xff0c;最受关注的毋庸置疑是大模型。然而&#xff0c;高昂的训练成本、漫长的训练时间等都成为了制约大多数企业入局大模型的关键瓶颈。 这种背景下&#xff0c;向量数据库凭借其独特…