TDucKX技术文档
产品能力分析
表单数据对接
TDuckX 后端项目
TDuckX 前端项目
项目概览
技术栈简介
项目结构
本地启动
浏览器兼容性
低版本浏览器适配
拖拽表单开发原理
表单组件开发
CDN配置
Uniapp 移动端
用户登录集成
多数据库适配
系统配置
如何部署或更新

表单组件开发

表单组件开发文档

本文档说明如何在 TDUCK 表单系统中新增一个自定义组件,示例以 Nps 组件为例,涉及后端注册、前端配置、组件实现、组件配置及图标引入等步骤。


1. 后端注册组件类型

在后端项目中打开枚举文件:

com.tduck.cloud.form.entity.enums.FormItemTypeEnum

在枚举中新增 NPS 类型:

NPS("NPS", "Nps组件"),

2. 前端组件注册

打开前端路径:

src/views/formgen/components/GenerateForm/config.ts

在组件注册数组中添加如下对象:

{
  typeId: 'NPS',
  config: {
    label: 'Nps组件',
    tag: 't-nps',
    tagIcon: 'nps',
    defaultValue: 0,
    span: 24,
    showLabel: true,
    showRegList: false,
    labelWidth: null,
    required: true,
    regList: []
  },
  max: 10,
  disabled: false
}

注:额外配置(如 max, disabled)将以 prop 的形式传入组件。


字段说明

字段名 类型 描述 示例或默认值
typeId string 组件类型 ID,需与后端保持一致 "NPS"
config object 基础配置对象
├─ label string 显示名称 "Nps组件"
├─ tag string Vue 组件标签名 "t-nps"
├─ tagIcon string 图标名(SVG 文件名) "nps"
├─ defaultValue number 默认值 0
├─ span number 所占栅格宽度(24 栅格制) 24
├─ showLabel boolean 是否显示标题 true
├─ showRegList boolean 是否显示正则配置项 false
├─ labelWidth number/null 标签宽度,null 表示不设置 null
├─ required boolean 是否为必填项 true
├─ regList array 正则验证配置项 []
其他自定义字段 any max,scoreLimit等扩展配置

3. 新建组件文件

目录结构

在路径:

src/views/formgen/components/FormItem/

创建目录 TNps,并在其中创建 index.vue 文件。

然后在 index.ts 中注册组件:

export const TNps = defineAsyncComponent(() =>
  import("@/views/formgen/components/FormItem/TNps/index.vue")
);

注意:组件名需与 config.ts 中的 config.tag 保持一致(如 t-nps 对应 TNps

组件实现示例

<template>
  <el-input-number
    v-bind="{ ...item }"
    v-model="changeValue"
    @change="handleChange"
  />
</template>

<script setup lang="ts" name="TNps">
import { useFormItemExam } from "@/views/formgen/components/FormItem/hooks/useExamHook";
import { formEmits, formItemProps, useFormItem } from "@/views/formgen/components/FormItem/hooks/useFormItemHook";
import { BasicComponent } from "@/views/formgen/components/GenerateForm/types/form";

const props = defineProps({ ...formItemProps });
const emits = defineEmits(formEmits);

const formItemHook = useFormItem(props, emits);
const { changeValue } = formItemHook;

const handleChange = (val: any) => {
  // 值更新处理逻辑
};
</script>

4. 组件配置(用于表单设计器)

打开路径:

src/views/formgen/components/FormDesign/ItemConfig/index.ts

注册组件配置面板:

export const nps = defineAsyncComponent(() =>
  import("@/views/formgen/components/FormDesign/ItemConfig/nps.vue")
);

5. 图标配置

图标为 SVG 格式,存放路径:

src/views/formgen/assets/icons/svg/

文件名需与 config.tagIcon 保持一致,例如 nps.svg


TypeScript 类型定义

export interface NpsComponentConfig {
  typeId: 'NPS';
  config: {
    label: string;
    tag: string;
    tagIcon: string;
    defaultValue: number;
    span: number;
    showLabel: boolean;
    showRegList: boolean;
    labelWidth: number | null;
    required: boolean;
    regList: any[];
  };
  [key: string]: any;
}

6. 数据列表

表单收集后有几个地方显示数据,如果你的值是复杂对象或者数组,需要进行数据格式化处理,不然会直接显示个[Object]之类的。

代码入口添加具体的判断

src/views/form/data/table/formatTableColumn.ts:8 数据表格格式化

src/views/form/data/view/ViewData.vue:22 点击数据详情显示

官方文档·
约 7 分钟阅读 (2651 字)