应用开发平台集成表单设计器系列之4——表单构造器深度了解

news2024/11/21 2:22:18

背景

平台需要实现自定义表单功能,作为低代码开发的一部分,通过技术预研和技术选型,选择form-create和form-create-designer这两个组件进行集成作为实现方案。通过深入了解和技术验证,确认了组件的功能能满足需求,具备良好的开放性和扩展性。
上篇介绍了整体集成思路以及表单设计器的深入了解,接下来则是对表单构造器的深度了解。

搭建测试页面

官方的文档比较简略,仅看文档远远不够,因此搭建了一个简单页面,通过阅读文档结合动手实践的方式来达到深度了解的目的。

在上篇验证表单设计器组件form-create-designer的基础上,增加form-create组件,然后通过fcd的自定义按钮功能,点击后,读取fcd通过配置产生的规则(rule),然后赋值给fc组件的属性,达到预览的效果。

拿自定义的组件字典下拉为例,源码如下:

<template>
  <el-row><form-create :rule="rule" v-model:api="fApi" :option="options" /></el-row>
  <el-row>
    <fc-designer v-model="value" ref="designer">
      <template #handle>
        <el-button type="primary" @click="preview">预览</el-button>
      </template>
    </fc-designer>
  </el-row>
</template>

<script lang="ts">
import DictionarySelectDesigner from '@/components/abc/FormCreateComponent/DictionarySelect.js'
import DictionarySelect from '@/components/abc/DictionarySelect/DictionarySelect.vue'

export default {
  components: { DictionarySelectDesigner, DictionarySelect },
  data() {
    return {
      //form-create属性
      fApi: {},
      options: {
        onSubmit: (formData) => {
          alert(JSON.stringify(formData))
        },
        resetBtn: true
      },
      rule: [],
      //fc-designer属性
      //表单数据
      value: {},
      //组件参数配置
      option: {
        //表单提交事件
        onSubmit: function (formData) {
          alert(JSON.stringify(formData))
        }
      }
    }
  },
  created() {},
  mounted() {
    //插入组件规则
    this.$refs.designer.addComponent(DictionarySelectDesigner)

    //读取自定义组件信息,生成左侧组件对象
    const dictionarySelect = {
      icon: DictionarySelectDesigner.icon,
      name: DictionarySelectDesigner.name,
      label: DictionarySelectDesigner.label
    }
    // //插入自定义分组及自定义组件
    this.$refs.designer.addMenu({
      title: '自定义',
      name: 'custom',
      list: [dictionarySelect]
    })
  },
  methods: {
    preview() {
      this.$formCreate.component(DictionarySelect.name, DictionarySelect)
      this.rule = this.$refs.designer.getRule()
    }
  }
}
</script>

<style></style>

实现效果如下:
image.png

基于平台低代码配置扩展

增加表单设计功能

上篇开始部分提到了,原有低代码配置的功能,与表单设计器二者的关系,最终选择是协作模式,即对于简单的实体,直接通过配置化功能快速实现;对于复杂的实体,系统根据实体配置自动生成一个两列的表单,填充到表单设计器上,再进行二次修改与调整。
因此在实体配置功能的视图列表,给类型为修改的视图,增加了一个按钮“配置界面”,
image.png
该按钮指向上一章节测试页面。

初始化逻辑梳理

低代码配置功能已经实现了在修改类型要显示哪些字段及次序,集成了表单设计器来做二次配置(通过表单设计器来实现配置下文统一称之为高级配置),不应该从头开始,而是依据前者的基础来实现,因此,在该页面加载时,就需要首先判断是否存在高级配置信息,若存在,则读取配置信息进行初始化,否则根据实体视图配置信息,默认生成两列的一个表单。
该功能实际需要在实体视图的库表中增加字段来存储表达设计器生成的页面配置和规则,当前处于尝试阶段,该工作延后进行,即先实现进入页面时读取实体视图配置信息,双列显示的功能。

读取视图配置信息

低代码配置功能的视图部分已经配置了编辑视图需要显示的属性,如下图所示:
image.png
通过如下api可以方便地取回配置信息

//读取视图配置信息
    this.$api.entityconfig.viewProperty.listByView(this.$route.query.id).then((res) => {
      const propertyList = res.data
      console.log(propertyList)
    })

基于配置信息双列填充

该环节遇到了挑战,form-create组件和form-create-designer组件关于布局方面的定义和处理存在差异。

fc组件实现方式

对于fc组件,有两种设置组件布局的方式http://www.form-create.com/v3/examples/layout
一种是使用内置col布局规则

rule: [
        {
          type: 'input',
          title: 'col24',
          field: 'col24_1',
        },
        {
          type: 'input',
          title: 'col12',
          field: 'col12_1',
          col: {
            span: 12
          }
        },
        {
          type: 'input',
          title: 'col12',
          field: 'col12_2',
          col: {
            span: 12
          }
        },
        {
          type: 'input',
          title: 'col8',
          field: 'col8_1',
          col: {
            span: 8
          }
        }
		]

另外一种是基于栅格布局组件,即最外层使用row,然后嵌套col,最后再嵌入具体的组件

  rule: [
        {
          type: 'row',
          style: {width: '100%'},
          native: true,
          children: [
            {
              type: 'col',
              props: {
                span: 12,
              },
              native: true,
              children: [
                {
                  type: 'datePicker',
                  title: '活动日期',
                  field: 'section_day',
                  value: ['2018-02-12', '2021-11-20'],
                  props: {
                    picker: 'date',
                    range: true
                  },
                  wrap: {
                    labelCol: {
                      span: 8,
                    }
                  }
                },
              ]
            }
          ]

fcd组件实现方式

对于fcd组件,官方文档没有相关的描述,配一个栅格布局出来,效果如下
image.png
借助API,可以看到生成的规则如下:

[
  {
    "type": "FcRow",
    "children": [
      {
        "type": "col",
        "props": {
          "span": 12
        },
        "children": [
          {
            "type": "input",
            "field": "Fb2w1o8ifb6iyy",
            "title": "输入框",
            "info": "",
            "_fc_drag_tag": "input",
            "hidden": false,
            "display": true
          }
        ],
        "_fc_drag_tag": "col",
        "hidden": false,
        "display": true
      }
    ],
    "_fc_drag_tag": "row",
    "hidden": false,
    "display": true
  }
]

最外层的组件,不是row,而是FcRow,而FcRow从未在文档中提及到。

尝试将FcRow手工调整为row,使用官网demo的导入json功能,发现fcd能正常解析和预览,看上去跟使用FcRow无差别。

通过循环实现

基于上述尝试,可以继续往下做了。
遍历配置信息,使用栅格布局,按双列来初始化,逻辑是判断当前是否能被2整除,若能,则添加一行row,同时添加一列col,否则只添加一列,但把该列设置为行的子对象,框架代码如下:

    let row = {}
    let col = {}
    this.$api.entityconfig.viewProperty.listByView(this.$route.query.id).then((res) => {
      const propertyList = res.data
      propertyList.forEach((item, index) => {
        if (index % 2 == 0) {
          row = {
            type: 'row',
            _fc_drag_tag: 'row',
            hidden: false,
            display: true,
            children: []
          }
          col = {
            type: 'col',
            props: {
              span: 12
            },
            _fc_drag_tag: 'col',
            hidden: false,
            display: true
          }
          row.children = [col]
          this.rule.push(row)
        } else {
          col = {
            type: 'col',
            props: {
              span: 12
            },
            _fc_drag_tag: 'col',
            hidden: false,
            display: true
          }
          row.children.push(col)
        }
  }

接下来,就是根据视图配置,生成组件,然后作为col的子对象即可,先不考虑各种组件类型,统一按文本框处理,主要是尝试可行性和查看效果。


 let property = {}
 property = maker.input(item.name, 'entityData.' + item.code, item.defaultValue) 
 		col.children = [property.getRule()]
 })
 this.$refs.designer.setRule(this.rule)

fcd效果如下:
image.png
fc效果如下:
image.png
明显看上去不正常……
然后,尝试把row更改为FcRow,然后显示效果正常了,如下:
image.png
跟使用fcd自身拖放组件效果一致了,并且fc也按两列显示了
image.png
上图不美观是由于我们的fc组件也是临时测试用的,没有控制表单属性特别是宽度,使用fcd内置的预览功能,看上去就好多了。
image.png
并且,无论使用row还是FcRow,实际fcd预览效果都跟上图完全一致,看上去是有点诡异。等回头有时间了再去翻翻fcd的源码,看看二者到底差异在哪,目前粗略推测,FcRow相比row是额外做了一些调整和适配工作。

自定义组件的解析

通过上面操作,页面布局和属性有了,但是属性展示的UI控件都是文本框。再往前迭代一步,通过实体配置中的视图属性配置,根据控件类型和配置来生成相应的UI控件。以组织机构的类型属性,是自定义的字典下拉控件,判断控件类型是下拉列表,则构造一个类型为DictionarySelect的UI控件,并使用props方法设置编码code为视图属性配置中的属性。

  // 注册自定义组件
  this.$formCreate.component(DictionarySelect.name, DictionarySelect)
  let property = {}
  if (item.widgetType == 'TEXT') {
    property = maker
      .create('input', 'entityData.' + item.code, item.name)
      .props({ type: 'text' })
  } else if (item.widgetType == 'DROP_DOWN_LIST') {
    property = maker
      .create(DictionarySelect.name, 'entityData.' + item.code, item.name)
      .props({ code: item.dictionaryType })
  } else {
    property = maker.input(item.name, 'entityData.' + item.code, item.defaultValue)
  }
  col.children = [property.getRule()]

需要注意的是,因为使用maker对象来构造UI控件,maker是从属于fc组件的,需要预先将自定义组件向fc组件注册,即 this.$formCreate.component(DictionarySelect.name, DictionarySelect)。
运行效果如下:
image.png
此处需要跟平台自定义组件进行深度整合。

表单属性的配置

表单属性跟表单规则非常类似,测试页面在预览逻辑中附加一条获取fcd组件的页面选型赋值给fc组件的属性即可。

preview() {
      this.$formCreate.component(DictionarySelect.name, DictionarySelect)
      this.rule = this.$refs.designer.getRule()
      this.options = this.$refs.designer.getOption()
    }

正式使用时,则需要视图配置库表增加字段存放,通过库表存储和传递。

自定义组件的适配

前面几步完成了,实际整个框架已经调试通了,技术验证已通过。
接下来主要工作就是将平台自封装的组件,按照fcd组件对自定义组件的规范和要求,进行适配,前面已经拿字典下拉做了示例,这块的工作量会比较大。
计划在封装适配过程中,也同步重构优化下原自封装组件。

开发平台资料

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

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

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

相关文章

Tensorflow笔记(二):激活函数、优化器等、神经网络模型实现(商品销量预测)

import tensorflow as tf import numpy as np from tqdm import tqdm# ----------------------------- tensor常用函数2 ----------------------------------- a tf.constant([1, 2, 3, 1, 2]) b tf.constant([0, 1, 3, 4, 5]) c tf.where(tf.greater(a, b), a, b) # 若a&g…

6语言交易所/多语言交易所php源码/微盘PHP源码

6语言交易所PHP源码&#xff0c;简单测试了一下&#xff0c;功能基本都是正常的。 由于是在本地测试的运行环境的问题&#xff0c;K线接口有点问题&#xff0c;应该在正式环境下是OK的。 源码下载地址&#xff1a;6语言交易所/多语言交易所php源码/微盘PHP源码.zip 程序截图…

YOLOv5改进 | 图像去雾 | 利用图像去雾网络UnfogNet辅助YOLOv5进行图像去雾检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv5针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv5的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可…

PC电脑如何使用HDMI连接小米电视当显示屏

使用HDMI连接好当时和电脑&#xff0c;HDMI2.0会更清晰&#xff1b;小米电视会自动弹窗提示你有HDMI 接口连接&#xff0c;或者你进入信号源进行选择即可&#xff1b;需要平时我们电脑的显示器正常连接&#xff0c;然后按 win p &#xff0c;选择 扩展 屏幕&#xff1b; 进入设…

Spring MVC文件上传配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 文件上传 Spring MVC文件上传基于Servlet 3.0实现&#xff1b;示例代码如下&#xff1a; Overrideprotected void customizeRegistration(ServletRegistration.Dynamic reg…

【基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸设计】

1.前言 基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸 在当今物联网与智能家居科技日益发达的时代&#xff0c;将先进技术和传统养鱼艺术融合&#xff0c;创造出智能、自动化且极具观赏价值的鱼缸已成为一种创新趋势。SeeedStudio推出的Xiao ESP32-S3 Sense开发板以其卓越的性能…

sadtalker-api/

———— 下载sadtalker工程文件&#xff0c;包括844个模型 。。。。。。。。。。。。。。。。 配置环境&#xff1a; pip源&#xff0c;设置&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple anaconda prompt, 进入命令行 how在 …

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;https://…

蓝桥杯刷题 Day36 倒计时26天 纯练题的一天

[蓝桥杯 2022 省 B] 积木画 题目描述 小明最近迷上了积木画&#xff0c;有这么两种类型的积木&#xff0c;分别为 I 型&#xff08;大小为 2个单位面积) 和 L 型 (大小为 3 个单位面积): 同时&#xff0c;小明有一块面积大小为2N 的画布&#xff0c;画布由2N 个 11 区域构成。…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图&#xff1a; 思路&#xff1a;先生成1个单位的二维码&#xff0c;然后再通过像素填充颜色&#xff0c;颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

docker-compose 部署nginx和jdk步骤

** yum安装jdk ** 1、​​yum -y list java* 查看可安装java版本 选择安装 java-1.8.0-openjdk-accessibility.x86_64 2、​​yum install -y java-1.8.0-openjdk-devel.x86_64 耐心等待安装完成即可 3、​java -version​​ 即可查看当前安装的java版本 4、yum安装的jdk&am…

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

HTML5+CSS3小实例:衣服颜色选择器

实例:衣服颜色选择器 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

262:vue+openlayers 移动地图获取中心点经纬度信息

第262个 点击查看专栏目录 本示例介绍演示如何在vue+openlayers中移动地图并获取中心点经纬度信息。这里主要用到了是view的getCenter方法,这一功能在实际项目中很有用,能给出一个清晰的定位。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

解决后端传给前端的日期问题

解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 2). 方式二&#xff08;推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…

JDBC基础(CRUD)使用详解(mysql)

1. 什么是JDBC JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范.这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访…

测试人员Bug书写规范

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 在测试人员日常工作中&#xff0c;关于bug的编写和定义是一个比较经常的工作&#xff0c;如果bug编写描…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…