# 基于Vue3+ElementPlus的低代码表单设计器 **Repository Path**: xbos1314/workfox-form-generator ## Basic Information - **Project Name**: 基于Vue3+ElementPlus的低代码表单设计器 - **Description**: WorkfoxFormGennerator 是一个基于 Vue 3 和 Element Plus 构建的动态表单设计器与低代码表单渲染器。它提供了灵活的表单设计与渲染功能,支持表单字段的动态管理和自定义组件渲染。该项目主要面向需要自定义动态表单的开发者,支持表单设计、字段渲染、表单验证、自定义组件配置和数据交互等功能。 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: main - **Homepage**: http://129.204.236.115:8090/ - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2025-05-05 - **Last Updated**: 2025-06-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: 表单设计器, 低代码 ## README # workfox-form-generator WorkfoxFormGennerator 是一个基于 Vue 3 和 Element Plus 构建的动态表单生成与渲染库。它提供了灵活的表单设计与渲染功能,支持表单字段的动态管理和自定义组件渲染。该项目主要面向需要自定义动态表单的开发者,支持表单设计、字段渲染、表单验证和数据交互等功能。 WorkfoxFormGennerator 支持用户以 JSON 的形式配置自定义组件,用户只需通过定义组件名称(type)、标签名(label)、属性(attributes)、事件(events)等信息,即可实现组件的注册、渲染和交互逻辑,从而满足个性化的表单设计与业务扩展需求,无需修改核心代码即可灵活扩展组件体系。 ## 更新日志 | 版本 | 更新内容 | |------------------------|-----------------------------| | 1.0.5 | 渲染器添加props.disabled、选项值统一修改为数字、子表单拖入组件限制逻辑修改 | ## 项目预览 [在线预览地址](http://129.204.236.115:8090/) ## 主要功能 1. 动态表单设计器 (Form Designer):通过图形化界面设计表单,支持字段拖拽、表单布局自定义,方便用户快速构建表单。 2. 表单渲染器 (Form Renderer):通过 JSON 配置生成表单,支持动态展示设计好的表单,并且支持与后端 API 交互,获取表单数据或提交表单。 3. 自定义字段组件:提供灵活的字段组件,支持根据业务需求自由组合自定义表单字段和组件。 4. 表单验证:内置多种表单验证规则,支持主子表数据的统一验证,确保数据的正确性。 5. 文件上传:支持集成文件图片上传功能,方便与后端进行文件上传操作。 6. 高度可配置:通过传入配置 JSON,可以自由配置字段、表单样式、验证规则、从后端接口获取选项数据等。 ## 技术栈 • Vue 3:响应式、灵活的前端框架。 • Element Plus:为 Vue 3 提供的 UI 组件库,提供高质量的组件支持。 • vuedraggable:用于表单项拖拽排序功能,增强表单交互性。 • quill:富文本编辑器,用于提供强大的富文本输入框。 • codemirror: 代码编辑器,预览表单JSON及编写事件代码 • axios: 发起网络请求 ## 已支持的组件 更多组件请使用属性customWidgetList进行配置 ### 容器组件 | 组件名 | 描述 | |------------|------------------| | 栅格布局 | 实现响应式布局 | | 卡片 | 卡片式区域容器 | | 标签页 | 多标签页切换容器 | | Flex 行 | 灵活布局容器 | | 子表单 | 支持嵌套子表单 | ### 表单组件 | 组件名 | 描述 | |----------------|----------------------| | 输入框 | 文本输入 | | 数字输入框 | 仅允许输入数字 | | 选择框 | 单/多项下拉选择框 | | 树形选择框 | 树状结构数据选择框 | | 单选框 | 多个选项中选一个 | | 多选框 | 多个选项中选多个 | | 开关 | 二元状态切换 | | 日期时间 | 日期、时间选择 | | 图片上传 | 上传图片 | | 文件上传 | 上传文件 | | 评分 | 星级评分输入 | | 富文本 | 支持图文编辑 | 单选框、多选框、树形选择框、选择框 可配置接口从后端获取数据 ### 基础组件 | 组件名 | 描述 | |--------|------------| | 按钮 | 可配置操作按钮 | | 标题 | 用于展示标题 | | 文字 | 展示说明文字 | | 提示 | 警告/提示信息 | | 分割线 | 页面分隔线 | ## 安装与使用 可以通过 npm 安装并在 Vue 项目中使用,通过简单的 API 调用和配置,快速实现表单设计与渲染。 ### 安装 ```sh npm install element-plus npm install vuedraggable npm install workfox-form-generator ``` ### 使用 ```js import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import Draggable from 'vuedraggable' import WorkfoxFormGenerator from 'workfox-form-generator' import 'workfox-form-generator/dist/workfox-form-generator.css' app.component('Draggable', Draggable) app.use(ElementPlus) app.use(WorkfoxFormGenerator)//注册设计器FormDesigner、渲染器FormRenderer ``` ```vue ``` ```js const formDesignerRef = ref()// 设计器ref const formRendererRef = ref() // 渲染器ref // 设计器配置 const config = ref({ showSaveButton: true,// 显示保存按钮 showCloseButton: true,// 显示关闭按钮 loadLocalData: true// 设计器挂载时加载本地数据 }) // 请求头 const requestHeaders = ref({ Authorization: '' }) // 文件图片上传地址 const uploadApi = ref('/api/upms/file/upload') // 表单配置数据 const formJson = ref() //字段数据 const fieldData = ref({ "fields": [ { "label": "字段描述", "value": "字段名称" }, ], "children": [ { "label": "子表描述", "value": "子表名称", "fields": [ { "label": "字段描述", "value": "字段名称" }, ] }, ] }) //自定义组件列表 const customWidgetList = ref([])// 请查看对应章节 // 设计器保存事件 const save = (data) => { console.log('保存表单设计器数据', data) } // 设计器关闭事件 const close = () => { console.log('触发关闭表单设计器事件') } // 异步设置设计器的表单内容 formDesignerRef.value.setFormJson(formJson.value) // 清空设计器内容 formDesignerRef.value.resetFormJson() // 异步设置渲染器的表单内容 formRendererRef.value.setFormJson(formJson.value) // 获取表单填写内容,会检查填写内容是否正确,错误会抛出异常 formRendererRef.value.getFormData() // 设置表单数据 formRendererRef.value.setFormData(formData.value) ``` ## 事件执行器使用说明(Event Executor) ### 上下文参数 | 参数名 | 说明 | |----------------|-------------------------------| | `widgetConfig` | 当前组件的配置内容 | | `formData` | 当前整个表单的填写数据 | | `widgetList` | 当前表单组件树 | | `value` | 当前组件的值(仅在 onChange 中可用) | --- ### 可用方法 #### 1. `setHidden(hidden: boolean)` 设置当前组件的隐藏状态。 #### 2. `getValue(): any` 获取当前组件的值。 #### 3. `setValue(value: any)` 设置当前组件的值。 #### 4. `getFieldValue(fieldId: string): any` 通过id获取指定组件的填写内容 #### 5. `setFieldValue(fieldId: string, value: any)` 通过id设置指定组件的内容 #### 6. `setFieldHidden(fieldId: string, hidden: boolean)` 通过id设置指定组件显示状态 #### 7. `notify(message: string, type?: 'success' | 'info' | 'warning' | 'error', duration?: number)` 弹出提示消息。: ```js notify('保存成功', 'success') ``` #### 8. `request` 发起网络请求,会携带传入的请求头信息 ```js // GET 请求 request.get('/api/user', { id: 1 }).then(res => { console.log(res) }) // POST 请求 request.post('/api/user', { name: '' }) // PUT 请求 request.put('/api/user/1', { name: '' }) // DELETE 请求 request.delete('/api/user/1') ``` ## 自定义组件配置说明 自定义组件的实现原理:通过一套统一的数据结构(customWidgetList)定义组件的类型(:is="config.type")、属性(v-bind="config.attributes")、事件(如 @change="handleChange")、校验规则(rules),并结合 WidgetContainer 和 FormItemWidget 两个包装组件实现拖拽控制、表单校验等通用功能,最终通过动态组件机制在运行时渲染成真正的 Vue 组件,使设计器和渲染器都可以以 JSON 驱动的方式复用这些组件。 ### 举个例子 ```js const customWidgetList = ref([{ type: 'el-color-picker',//组件的名称,需要全局注册(必须) label: '颜色选择',//左侧列表对应组件名称(必须) id: 'color',//生成id时的前缀(必须) isCustomWidget: true,//是否是自定义组件(必须且固定为true) isFormItem: true,//是否属于表单组件(必须) attributes: {//此处填写的属性会使用v-bind绑定到对应组件上 hidden: false, //是否隐藏 label: '颜色选择',//标签名称 (表单组件必须) labelWidth: '',//标签宽度 (表单组件必须) showLabel: true,// 显示标签 (表单组件必须) disabled: false,//是否禁用 size: 'default',//组件尺寸 showAlpha: true,//自定义组件的单独属性,需要在attributesConfig下单独配置属性编辑器 }, attributesConfig: {//属性的描述,部分属性已内置无需定义 showAlpha: { label: '支持透明度选择', component: {//属性所使用的编辑器控件,需全局注册 name: 'el-switch',//使用el-switch作为属性配置器 bind: {// 对应配置器的v-bind属性 activeText: '是', inactiveText: '否', inlinePrompt: true, activeValue: true, inactiveValue: false } } } }, rules: [],//验证规则,如果是表单组件则必须且固定为[] events: { onChange: '',//内容改变 onMounted: ''//组件创建 } },]) ```