低代码平台实践:打造高效动态表单解决方案的探索与思考

news2025/1/16 5:32:04

🔥需求背景

我司业务同事在抓取到候选人的简历之后,经常会出现,很多意向候选人简历信息不完整,一个个打电话确认的情况,严重影响了HR的工作效率,于是提出我们可以通过发送邮件、短信、H5链接的方式来提醒候选人完善自身简历信息和基本信息。

🔥如何实现

经过前期的技术调研,我们决定采用后台低代码方式结合H5动态表单,实现一次开发配置多次使用的目的。HR在后台配置完成之后,对应模板会进入集团模板池,其他同事也可快捷方便引用,大大提高工作效率。

🔥组件库设计

  • 输入框
  • 数字输入框
  • 单选框
  • 多选框
  • select选择器
  • 时间
  • 评分滑块
  • 省市区选择
  • 开关switch
  • 文本分割
  • 超链接

🔥部分界面

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🔥组件DSL配置基本介绍

{
	component_type:'base_com' ||  'assist_com',
	ui_type:input,input_number,selcet,radio,checkboxs....
	lable_name:label  标题,
	label_width:  lable宽度,
	label_tip: lable 提示,
	placeholder: 默认占位文本,
	show_clear_icon: 是否显示清除按钮,
	disable:是否只读,
	col_width: 布局宽度,8,12,24
	border_color: 边框颜色,
	border_radius: 圆角,
	required: 是否必填,
	rules:校验规则 Array ;required为 true 时候 触发
	 eg:[{filed_type:字段类型(字符串、URL、邮箱、自定义)),change_type:blur,change, validate_type:验证方式,(长度,正则,最小值,最大值),error_msg:错误信息)}]is_dict_data: 是否字典取值
	dict_name: 字典取值 Name
	filed__id: 字段id (uuid 生成唯一) - 后端数据库使用 
	filed_type: string,number,boolen,date  字段类型-后端数据库使用,
	filed_name:''  字段名称-后端数据库使用,
}

🔥Form DSL配置基本介绍

{
	form_title: 表单名称,
	form_size: lager、default、small
	label_position:left,right,top
	is_line: 是否行内表单,
	show_require: 显示必填红色星号
	show_cancel:显示重置、取消按钮,
	show_save: 显示提交按钮
}

🔥H5端组件库部分代码

编写对应的组件库组件:(我们业务目前有 20个 组件,根据 不同的 ui_type 结合 Vue 动态组件 渲染我们所配置的动态表单页面)

import InputComponents from '@/components/InputComponents'
import InputNumberComponents from '@/components/InputNumberComponents'
import SelectComponents from '@/components/SelectComponents'
import DatePickerComponents from '@/components/DatePickerComponents'
import RadioComponents from '@/components/RadioComponents'
import CheckboxComponents from '@/components/CheckboxComponents'
import CascaderComponents from '@/components/CascaderComponents'
import RateComponents from '@/components/RateComponents'
import ColorPickerComponents from '@/components/ColorPickerComponents'
import SliderComponents from '@/components/SliderComponents'
import UploadComponents from '@/components/UploadComponents'
import SwitchComponents from '@/components/SwitchComponents'
import TextComponents from '@/components/TextComponents'
import PasswordComponents from '@/components/PasswordComponents'

const componentsType = [
    {
        type:'input',
        components:InputComponents,
    },
    {
        type:'input_number',
        components:InputNumberComponents,
    },
    {
        type:'select',
        components:SelectComponents,
    },
    {
        type:'date_picker',
        components:DatePickerComponents,
    },
    {
        type:'radio',
        components:RadioComponents,
    },
    {
        type:'checkbox',
        components:CheckboxComponents,
    },
    {
        type:'cascader',
        components:CascaderComponents,
    },
    {
        type:'rate',
        components:RateComponents,
    },
    {
        type:'slider',
        components:SliderComponents,
    },
    {
        type:'upload',
        components:UploadComponents,
    },
    {
        type:'switch',
        components:SwitchComponents,
    },
    {
        type:'text',
        components:TextComponents,
    },
    {
        type:'password',
        components:PasswordComponents,
    },
]

🔥基础组件内部实现逻辑

<el-col :span="info.col_width" >
   <el-form-item :label="info.lable_name" :rules="info.rules">
    <el-input v-bind="$attrs"  v-model="ruleForm[filed_name]" :placeholder="info.placeholder" :disabled="info.disable" :clearable="info.show_clear_icon"/>
   </el-form-item> 
</el-col>
const props = defineProps({
      info:{
           type:Object,
           default:{}
      }
})

<style lang="scss">
.el-input {
  .el-input-group__prepend {
    .el-input__wrapper {
      border-radius:v-bind(info.border_radius);
    }
  }
  .el-input-border {
    background: v-bind(info.border_color);
    padding: 0 12px;
  }
}
</style>

🔥后端返回数据结构解析结构

pageSetting:{
    form_setting: {
        form_title: '表单名称',
        form_size: 'default',
        label_position: 'left',
        label_width:'125px',
        is_line: false,
        show_require: true,
        show_cancel: true,
        show_save: true
    },
    components_list: [
        {
            component_type: 'base_com',
            ui_type: 'input',
            lable_name: '姓名',
            label_width: '120px',
            label_tip: '请填写真实姓名',
            placeholder: '请输入姓名',
            show_clear_icon: true,
            disable: false,
            col_width: '12',
            border_color: "#fff",
            border_radius: '4px',
            required: true,
            rules: [{ reauired: true, filed_type: 'string', change_type: 'blur', validate_type: 'length', error_msg: '请输入姓名' }],
            is_dict_data: fasle,
            dict_name: '',
            filed__id: 'bcvssadas1sbx',
            filed_type: 'string',
            filed_name: 'customer_name',
        }
      ...
      // 多个如此格式的对象
    ]
}

🔥H5端页面渲染部分代码

<el-form
    :model="sizeForm"
    :inline="data.form_setting.is_line"
    label-width="data.form_setting.label_width"
    :label-position="data.form_setting.label_position"
    :size="data.form_setting.form_size"
  >
  <template v-for="(item,index) in data.components_list" :key="index"> 
    <component :is="componentsType.find(i=>i.type == item.ui_type).components"   :info="item" />
  </template>
</form>

🔥反思优化

  1. 交互上:
    上线业务使用一段时间之后,反馈表单题目顺序调整比较困难,经过前端和产品的多次讨论决定按照“职责分离”的要求,在表单预览的时候,增加拖拽功能,业务可以按照自己的需求对表单所有的题目顺序进行自定义排列,实现“配置”,“预览",“产出”这样一个闭环的工作流程,并且不会相互影响。
  2. 数据结构上:
    和后端同学讨论进一步优化数据结构,每次保存数据时,前端增加逻辑校验,将未配置选项的冗余字段过滤,只保存配置的字段,未配置的字段一律设置默认值,前端的渲染逻辑也得到了大大的精简。渲染速度也得到了进一步提升
  3. 便捷性上:
    第一批完成的组件数量有限,不能够完全覆盖业务场景,有些组件还有些鸡肋,后续能不能完全实现组件自定义?
    引入全局组件库的概念,开始精细化区分“表单组件",“布局组件”,“辅助组件(分割线、提示文本)” ,“信息展示(播报栏、滚动展示)”,“页面美化(swipper,广告位,card卡片)” 等,进一步完善优化系统。

🔥后续扩展

基于此模块,二次开发 “候选人求职意向调查问卷“,“职业性格测评问卷“等模块, 新增(评分、跳题、一题一页、表格题目、)等功能,使得系统更加健壮,满足业务场景,实现业务需求

🔥结语

通过上述实践,我们不仅解决了业务上的燃眉之急,也为低代码平台的深度应用提供了宝贵经验。未来,我们计划继续深化低代码平台的建设,探索更多创新功能,如集成更多问卷元素(如评分、跳题)、支持多页面表单等,不断拓展平台的边界,为企业数字化转型赋能。

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

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

相关文章

低成本STC32G8K64驱动控制BLDC开源入门学习方案

低成本STC32G8K64驱动控制BLDC开源入门学习方案 ✨采用STC32G8K64单片机&#xff0c;参考梁工的STC32G12K128-LQFP48驱动方案制作&#xff0c;梁工BLDC相关的资料&#xff1a;https://www.stcaimcu.com/forum.php?modviewthread&tid7472&extrapage%3D1&#xff0c;在此…

Node.js是什么(基础篇)

前言 Node.js是一个基于Chrome V8 JavaScript引擎的开源、跨平台JavaScript运行时环境&#xff0c;主要用于开发服务器端应用程序。它的特点是非阻塞I/O模型&#xff0c;使其在处理高并发请求时表现出色。 一、Node JS到底是什么 1、Node JS是什么 Node.js不是一种独立的编程…

算法训练与程序竞赛题目集合(L4)

目录 L4-103 就不告诉你 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; L4-104 Wifi密码 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; L4-105 冠军魔术 输入格式&#xff1a; …

Ocam:高效录屏,屏幕录制最佳?

名人说&#xff1a;&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Ocam2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你…

BarTender中文版安装包下载及安装教程

​根据大数据结果显示可扩充的大容量卷标数据库&#xff1a;利用大量已设计好的标签库,从数以千计的现成标签尺寸中进行选择,也能够定义并加入自己的标签库尺寸。习惯上来说操作简单&#xff1a;BarTender条码打印软件是目前功能最强大、便捷的标签设计打印软件,在150 多个国家…

WMS项目测试点

这里写目录标题 最后附有图片 仓库系统 仓库 / 库区 仓库 新增仓库 编号 必填校验 字段长度校验 20为字符 数据类型校验 名称 必填校验 字段长度校验 20为字符 数据类型校验 备注 填写备注校验 字符长度限制 不填写备注校验 新增仓库之后是否可以通过查询仓库名称和仓库编号查询…

工业互联网的独特UI风格

工业互联网的独特UI风格

记录Nuxt3部署线上pm2启动项目修改端口

看官方文档&#xff1a; TNND&#xff0c;修改这个端口号顶个P用&#xff0c;毛用也没有 实际上应该是这样&#xff1a; 好了&#xff0c;误人子弟&#xff5e;

快速生成基于vue-element的后台管理框架,实现短时间二次开发

你是否遇到过当你想要独立开发一个项目时对反复造轮子的烦扰&#xff1f; 这种流水线的操作实在让人受不了 而vue-element-template很好的帮你解决了这个烦恼 只需克隆下来&#xff0c;改改图标&#xff0c;模块名&#xff0c;甚至样式&#xff0c;就会变成一个全新的自己的项目…

【Java】pcm 与 wav 格式互转工具类 (附测试用例)

文章目录 1. 前言1.1 背景1.2 目标1.3 亮点 2. 用例说明3. 补充验证4. 相关链接 1. 前言 git 仓库 https://github.com/ChenghanY/pcm-wav-converter 1.1 背景 系统新接入语音引擎。 语音引擎只认 pcm 格式数据。前端只认 wav 格式 。 需要后端对 pcm 和 wav 格式实现互转&a…

计算机组成原理 —— 存储系统(DRAM和SRAM)

计算机组成原理 —— 存储系统&#xff08;DRAM和SRAM&#xff09; DRAM和SRAMDRAM的刷新DRAM地址复用 我们今天来看DRAM和SRAM&#xff1a; DRAM和SRAM DRAM&#xff08;动态随机存取存储器&#xff09;和SRAM&#xff08;静态随机存取存储器&#xff09;都是半导体存储器&a…

中国真实婚恋相亲交友服务平台有哪些?全国靠谱恋爱脱单软件APP大全

终于成功脱单了&#xff01;在过去的这两年里&#xff0c;我动用了身边所有的资源&#xff0c;却始终未能找到理想的男朋友。无奈之下&#xff0c;只好将目光转向线上。经过长达半年的不懈坚持&#xff0c;终于寻觅到了心仪的对象&#xff01;接下来&#xff0c;我要把自己用过…

AtCoder Beginner Contest 359 A~C(D~F更新中...)

A.Count Takahashi 题意 给出 N N N个字符串&#xff0c;每个字符串为以下两种字符串之一&#xff1a; "Takahashi" "Aoki" 请你统计"Takahashi"出现了多少次。 分析 输入并统计即可。 代码 #include <bits/stdc.h>using namespa…

RNN循环卷积神经网络

1.定义 RNN &#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;循环卷积神经网络&#xff0c;用于处理序列数据。 序列数据&#xff1a;按照一定的顺序排列的数据&#xff0c;可以是时间顺序、空间顺序、逻辑顺序。 eg:电影、语言 2.特点 传统神经网络模型无法…

ping命令返回结果实例分析

测试在各相关情况下ping命令回复信息。 网络环境搭建如下图所示&#xff1a; 【1】R1、R2、PC1和PC2没有配置&#xff0c;测试ping命令回复 在路由器没有配置端口IP地址和路由&#xff0c;PC没有配置IP地址、子网掩码和网关的情况下&#xff0c;PC2 ping 192.168.1.1。 在PC没…

前后端经验分享:秋招春招赛道如何选择

前言&#xff1a;考研考公&#xff1f;国企互联网&#xff1f;老白小粉也曾对未来的方向选择产生迷茫&#xff0c;但最终老白小粉都选择了就业 →前端春招秋招经验分享 →后端春招秋招经验分享 因此今天这篇文章主要针对秋招春招的就业赛道给予学弟学妹们一些建议。 对于计算机…

38.MessageToMessageCodec线程安全可被共享Handler

handler被注解@Sharable修饰的。 这样的handler,创建一个实例就够了。例如: ByteToMessageCodec的子类不能被@Sharable修饰 如果自定义类是MessageToMessageCodec的子类就是线程共享的,可以被@Sharable修饰的 package com.xkj.protocol;import com.xkj.message.Message; i…

Python编程技巧:下划线的11种妙用,看看你知道几种?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 用法一:Python控制台中的上次结果📝 用法二:命名变量的蛇形命名法(snake_case)📝 用法三:大数字的可读性📝 用法四:忽略不重要的值📝 用法五:用于吸收中间值📝 用法六:在for循环中忽略变量…

视频AI分析定时任务思路解析

序言&#xff1a; 最近项目中用到视频ai分析&#xff0c;由于sdk涉及保密&#xff0c;不便透露&#xff0c;仅对定时任务分析的思路作出分享&#xff0c;仅供参考。 1、定时任务 由于ai服务器的性能上限&#xff0c;只能同时对64个rtsp流分析一种算法&#xff0c;或者对8个rts…

物联网系统运维——数据库部署

一.MySQL 1.概要 MySQL是一种关联数据库管理系统&#xff0c;关联数据:而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性库将数据保存在不同的表中。性能高、成本低、可靠性好&#xff0c;已经成为最流行的开源数据库。 二.MySQL安装与配置 1. …