JVS低代码完整源码解析:如何二次开发自己的表单组件?

低代码平台用久了,难免会遇到内置组件不够用的时候。比如标准表单组件里没有你需要的"地图选点"或"OCR识别",怎么办?JVS低代码的优势之一是源码全量交付,你可以直接修改和扩展源码。本文从源码层面拆解JVS低代码的表单组件体系,手把手教你开发一个自定义表单组件并注册到设计器中。

一、JVS低代码表单组件体系概述

JVS低代码平台采用 Spring Cloud + VUE 3 的技术架构,表单引擎是其六大核心引擎之一。表单组件体系主要分为三层:

text

javascript 复制代码
┌─────────────────────────────────────────────────────────────┐
│                   表单组件体系三层架构                       │
├─────────────────────────────────────────────────────────────┤
│  设计器层(Designer)                                      │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  拖拽面板、属性配置面板、预览画布                    │  │
│  └─────────────────────────────────────────────────────┘  │
│                    ↓                                      │
│  组件层(Components)                                      │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  基础组件(输入框/下拉框/日期选择器...)             │  │
│  │  高级组件(表格/树形选择/文件上传...)               │  │
│  │  自定义组件(按需扩展)                             │  │
│  └─────────────────────────────────────────────────────┘  │
│                    ↓                                      │
│  渲染层(Renderer)                                        │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  动态表单渲染引擎(根据配置JSON生成实际表单)         │  │
│  └─────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

核心设计思想是:表单的配置与渲染分离。表单设计器产出一份JSON格式的配置描述,渲染引擎根据这份JSON动态生成实际表单。这种设计使得自定义组件只需要遵循统一的配置规范,即可被设计器和渲染引擎同时识别。

二、源码结构解析

JVS低代码的前端代码基于Vue 3 + Element Plus构建。表单组件相关的源码主要分布在以下目录:

text

python 复制代码
jvs-ui/
├── src/
│   ├── components/
│   │   └── form-designer/          # 表单设计器核心
│   │       ├── designer/           # 设计器主画布
│   │       ├── component-panel/    # 组件面板
│   │       ├── property-panel/     # 属性配置面板
│   │       └── components/         # 内置表单组件
│   │           ├── input/          # 输入框
│   │           ├── select/         # 下拉框
│   │           ├── date-picker/    # 日期选择器
│   │           └── ...             # 其他组件
│   ├── renderer/
│   │   └── form-renderer/          # 表单渲染引擎
│   └── types/
│       └── form-config.ts          # 表单配置类型定义

关键模块说明

  • component-panel:组件面板,展示所有可拖拽的组件列表。新增自定义组件后需要在此注册。
  • property-panel:属性配置面板,选中组件后展示可配置的属性。自定义组件需要定义自己的属性配置表单。
  • form-renderer:表单渲染引擎,根据配置JSON递归渲染组件树,是自定义组件最终展示的地方。

三、开发一个自定义表单组件

以开发一个"手机号输入框(带验证码发送)"组件为例,完整演示二次开发流程。

第一步:创建组件文件

src/components/form-designer/components/ 目录下创建 phone-input/ 文件夹:

vue

xml 复制代码
<!-- phone-input/index.vue -->
<template>
  <div class="phone-input-wrapper">
    <el-input
      :model-value="modelValue"
      :placeholder="placeholder"
      @update:model-value="handleInput"
      class="phone-input"
    />
    <el-button
      :disabled="countdown > 0"
      @click="sendCode"
      class="send-btn"
    >
      {{ countdown > 0 ? `${countdown}s后重发` : '发送验证码' }}
    </el-button>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const props = defineProps({
  modelValue: { type: String, default: '' },
  placeholder: { type: String, default: '请输入手机号' }
})

const emit = defineEmits(['update:modelValue'])

const countdown = ref(0)
let timer = null

const handleInput = (val) => {
  emit('update:modelValue', val)
}

const sendCode = () => {
  // 实际项目调用发送验证码API
  console.log('发送验证码至:', props.modelValue)
  countdown.value = 60
  timer = setInterval(() => {
    countdown.value--
    if (countdown.value <= 0) clearInterval(timer)
  }, 1000)
}
</script>

第二步:注册组件到组件面板

src/components/form-designer/component-panel/index.ts 中注册:

typescript

javascript 复制代码
// 引入自定义组件
import PhoneInput from '../components/phone-input/index.vue'

// 组件配置
export const CUSTOM_COMPONENTS = {
  phoneInput: {
    component: PhoneInput,
    // 设计器中的展示名称
    label: '手机号输入',
    // 组件图标
    icon: 'phone',
    // 默认属性配置
    defaultProps: {
      placeholder: '请输入手机号',
      required: false
    },
    // 组件分类(用于面板分组)
    category: '高级组件'
  }
}

第三步:定义属性配置

property-panel 中为自定义组件添加属性配置:

vue

xml 复制代码
<!-- property-panel/PhoneInputProps.vue -->
<template>
  <el-form-item label="占位文本">
    <el-input v-model="localProps.placeholder" />
  </el-form-item>
  <el-form-item label="是否必填">
    <el-switch v-model="localProps.required" />
  </el-form-item>
</template>

<script setup>
const props = defineProps(['value'])
const localProps = computed({
  get: () => props.value,
  set: (val) => emit('update:value', val)
})
</script>

四、组件与数据模型的联动

JVS低代码的组件与数据模型通过统一元数据 实现联动。表单字段定义存储在 meta_field 表中:

sql

sql 复制代码
CREATE TABLE `meta_field` (
  `id` varchar(32) NOT NULL,
  `model_id` varchar(32) NOT NULL COMMENT '所属模型',
  `field_name` varchar(64) NOT NULL COMMENT '字段名',
  `field_label` varchar(128) NOT NULL COMMENT '字段标签',
  `field_type` varchar(32) NOT NULL COMMENT '字段类型',
  `options` json DEFAULT NULL COMMENT '组件配置',
  PRIMARY KEY (`id`)
);

自定义组件需要确保其输出的数据格式与元数据定义一致。在手机号输入组件中,输出的 modelValue 是字符串类型,对应 field_type = 'string',并可通过 options 字段存储组件的特有配置。

五、二次开发建议

1. 优先复用现有组件

JVS低代码提供了500+字段类型和验证规则,在开发自定义组件前,先确认是否可通过配置现有组件实现需求。

2. 遵循配置规范

自定义组件应遵循 modelValue / update:modelValue 的Vue v-model规范,便于与表单渲染引擎无缝集成。

3. 测试覆盖

form-renderer 的测试环境中单独渲染自定义组件,验证其在表单中的表现是否符合预期。

六、总结

JVS低代码源码全量交付,为企业提供了深度定制的可能性。通过理解其表单组件体系的三层架构------设计器层、组件层、渲染层------开发者可以快速定位扩展点,开发满足业务需求的自定义组件并注册到设计器中。核心原则是:遵循配置规范、复用现有基础设施、保持与元数据模型的一致性

标签:#低代码 #源码解析 #表单组件 #Vue3 #JVS

相关推荐
QN1幻化引擎2 小时前
Gravity-Anchored Cognitive Field Architecture: The DalinX V8/V10 Implementation
java·前端·算法
一生有你20202 小时前
Spring AI ChatMemory 监控与排查:从指标到排错全链路
java·人工智能·spring
程序员黎剑2 小时前
我把算卦变成了一段if-else
java·vue.js·spring boot·后端·ai编程
头茬韭菜2 小时前
4.1-4.2 工具注册 — Fail-Closed 类型安全设计与四层工具架构
java·安全·架构
SimonKing2 小时前
Base62编码生成6位不重复短码的背后设计
java·后端·程序员
折哥的程序人生 · 物流技术专研2 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:状态 vs 策略 —— if-else 消除的两条路,你走对了吗?
java·spring·状态模式·策略模式·java面试·java设计模式·从踩坑到精通
等什么秋2 小时前
idea2024下载
java·ide·intellij-idea
学计算机的计算基2 小时前
LeetCode 图论四题精讲:BFS、拓扑排序、Trie 树的模板与优化
java·笔记·算法
浩瀚地学2 小时前
【面试算法笔记】0202-链表-基本功能实现
java·经验分享·笔记·算法·面试