表单设计器

willian fu 2022 ~

表单设计器

数据结构

为了考虑后期对不同UI框架的兼容及数据传输的便捷,表单使用json来进行描述,前端通过json再反向渲染该表单

表单数据存储在vuex中,具体对象为 $store.state.process.formItems,是个数组

表单组件

表单组件是构成表单的基本元素,一个表单可以有多个组件,在UI中体现为如下图

image-20220724222124900

组件值类型

每个组件都有对应的值,我们需要定义值的类型,有如下类型定义

const ValueType = {
  string: 'String',
  object: 'Object',
  array: 'Array',
  number: 'Number',
  date: 'Date', //yyyy-MM-dd xxx类型的字符串日期格式
  user: 'User', //人员
  dept: 'Dept', //部门
  dateRange: 'DateRange'
}

组件数据结构

每个组件需要预先定义好数据结构,存在于文件 /src/views/common/form/ComponentsConfigExport.js中,此文件中定义的组件将被展示到表单设计器左侧组件候选区。

结构如下:

  {
    title: '多行文本输入', //组件标题
    name: 'TextareaInput', //组件名,组件是根据组件名来决定渲染哪个组件的
    icon: 'el-icon-more-outline', //组件在设计器候选区的图标
    value: '', //组件的值,该字段暂未使用
    valueType: ValueType.string, //组件值数据类型
    props: { //组件的附加属性
      required: false,  //公共属性,是否必填
      enablePrint: true //公共属性,是否允许打印
      //组件其他设置项,根据组件类型来自定义
    }
  }

表单渲染

📢 wflow已经封装好了表单渲染逻辑的通用组件,任何地方只需要引入即可渲染出多端表单,并支持双向数据绑定及校验。

wflow 表单组件

表单组件位于 src\views\common\form\FormRender.vue,在需要渲染表单的地方引入该组件

<template>
	<FormRender ref="form" v-model="formData" :forms="formConfig" :mode="mode"/>
</template>
<script>
import FormRender from '@/views\common\form\FormRender'
export default {
   components: {FormRender},
   data() {
    return {
      mode: 'PC', //渲染模式: PC 、MOBILE、DESIGN
      formConfig: [], //表单设计器的配置,也就是保存在后端表里面的formItems字段里的json
      formData: {} //表单数据,表单渲染后,如果输入数据,那么将会双向绑定同步到本变量,
    }
  },
}
</script>

权限控制

在流程设计器中,发起人、审批、抄送节点可以设置表单字段的【只读、可编辑、隐藏】权限,在表单中体现为由表单字段项的props.perm字段控制分别是三个值

  • R 只读 (渲染为只读模式)
  • E 可编辑 (渲染为正常表单组件可编辑输入的模式)
  • H 隐藏(此时表单字段不可见)
image-20221014171740832

**注意:**接口返回的该字段由后端进行设置,当权限为H时,该表单组件配置将不返回,前端也可以修改该字段为R/H来控制是否可编辑

表单校验

表单校验如下,通过ref 调用wflow表单FormRendervalidate(callback)函数,参数传入回调函数即可获取校验结果

//form为 FormRender 绑定的ref
this.$refs.form.validate(valid => {
	if(valid){
        //校验成功
    }else{
        //校验失败
    }
})

由于存在分栏组件-SpanLayout明细表-TableList,导致很多地方都要特殊处理,需要递归 ,详细实现参见 FormRender.vue 组件