跳转到内容

JeecgBoot 元数据驱动的低代码引擎(Online 模块)

JeecgBoot 元数据驱动的低代码引擎(Online 模块)

学习目标

通过本章学习,你将能够:

  • 理解 Online 模块的元数据驱动架构
  • 掌握 cgform 配置表如何驱动运行时 CRUD
  • 了解代码生成器的工作流程与模板机制
  • 了解表单设计器与 23 种控件的底层实现

项目实践

元数据驱动架构

Online 模块的核心理念是配置即代码:通过数据库配置表存储表单结构定义,运行时动态解析并生成增删改查功能,无需手写代码。

核心配置表

Online 模块的元数据存储在以下配置表中:

配置表职责
onl_cgform_head表单头部定义(表名、描述、作者等)
onl_cgform_field字段定义(字段名、类型、控件类型、校验规则等)
onl_cgform_index索引定义
onl_cgform_button按钮配置(查询按钮、操作按钮等)
onl_cgform_enhance_javaJava 增强代码
onl_cgform_enhance_sqlSQL 增强代码
onl_cgform_enhance_jsJS 增强代码

字段定义示例

onl_cgform_field
├── cgform_head_id # 关联的表单 ID
├── field_name # 字段名(如 user_name)
├── field_txt # 字段显示名(如 用户名)
├── field_type # 数据库类型(VARCHAR, INT, DATE 等)
├── field_length # 字段长度
├── is_show # 是否显示(Y/N)
├── is_query # 是否可查询(Y/N)
├── query_mode # 查询模式(=, LIKE, >=, <= 等)
├── field_table_type # 控件类型(text, select, date, radio, checkbox 等 23 种)
├── default_value # 默认值
├── is_readonly # 是否只读
├── is_required # 是否必填
└── ... 更多配置

运行时 CRUD 引擎

Online 表单的核心能力是无需生成代码即可运行

// 伪代码:Online CRUD 引擎
@PostMapping("/online/cgform/api/{code}")
public Result<?> doAdd(@PathVariable String code, @RequestBody Map<String, Object> data) {
// 1. 根据 code 查询表单配置
CgFormHead head = cgFormHeadService.queryByTableName(code);
List<CgFormField> fields = cgFormFieldService.queryByCgformHeadId(head.getId());
// 2. 动态构建 SQL
StringBuilder sql = new StringBuilder("INSERT INTO " + code + " (");
for (field : fields) {
if (data.containsKey(field.getFieldName())) {
sql.append(field.getFieldName()).append(", ");
}
}
// ... 构建完整 SQL
// 3. 执行增强(如果有)
enhanceService.executeJavaEnhance(head.getJavaEnhanceCode(), data);
// 4. 执行 SQL
jdbcTemplate.update(sql.toString(), params);
return Result.OK();
}

查询过滤器自动构建

// HTTP 查询参数 → SQL WHERE 条件
GET /online/cgform/api/user_info?userName=张三&age_=&age_=30
// 自动转换为:
// WHERE user_name LIKE '%张三%' AND age >= ? AND age <= ?

QueryGenerator.initQueryWrapper() 自动将 HTTP 参数解析为查询条件,支持:

  • 精确匹配:fieldName=value
  • 模糊匹配:fieldName*=value
  • 范围查询:fieldName_>=value1&fieldName_<=value2
  • IN 查询:fieldName_in=val1,val2,val3

代码生成器

当 Online 表单需要更高性能或定制化时,可通过代码生成器生成完整代码:

代码生成器输入:表单配置(cgform_* 表)
模板引擎(Freemarker / Velocity)
生成内容:
├── Entity.java # 实体类(@TableName, @TableId 等注解)
├── Mapper.java # Mapper 接口(继承 BaseMapper)
├── Mapper.xml # MyBatis XML 映射文件
├── Service.java # Service 接口
├── ServiceImpl.java # Service 实现
├── Controller.java # Controller(继承 JeecgController)
├── index.vue # 前端页面
└── xxx.api.ts # 前端 API 调用
下载 ZIP 或在线建表

四套风格模板

风格适用场景模板特点
单表风格一简单 CRUD最基础的增删改查
单表风格二带导入导出的单表增加 Excel 导入导出功能
树模型树形数据递归查询、层级展示
一对多主子表主表 + 子表的联合操作

模板自定义

jeecg-boot-module-online/template/
├── java/ # Java 模板
│ ├── controller.ftl
│ ├── service.ftl
│ └── ...
├── vue/ # 前端模板
│ ├── list.vue.ftl
│ └── ...
└── sql/ # SQL 模板
└── create_table.ftl

用户可以替换模板文件,自定义生成代码的风格和结构。

23 种表单控件

Online 表单设计器支持 23 种控件类型:

分类控件类型
文本类text、textarea、password、editor(富文本)
选择类select、radio、checkbox、listbox
日期类date、datetime、time
特殊类popup(弹窗选择)、file(文件上传)、image(图片上传)、switch
业务类user_select(用户选择)、dept_select(部门选择)、dict(字典选择)
高级类markdown、code_editor、subtable(子表)

每种控件在 field_table_type 字段中标识,前端根据类型渲染对应的 Vue 组件。

在线增强

Online 表单支持在配置界面直接编写增强代码:

增强类型执行时机语言
Java 增强增删改查前后Java
SQL 增强数据操作前后执行 SQLSQL
JS 增强前端表单提交前后JavaScript
表单校验增强前端提交时校验JavaScript

增强执行顺序

前端 JS 增强(提交前)
后端 Java 增强(操作前)
执行 CRUD 操作
后端 Java 增强(操作后)
SQL 增强(操作后)

问题与规避

陷阱表现对策
配置表与实际表结构不一致运行时字段缺失或类型不匹配生成表单时同步创建/修改实际业务表
控件类型与数据库类型不匹配select 控件但数据库存 INT表单设计器校验控件类型与字段类型的兼容性
Online 增强代码异常影响全局Java 增强抛出未捕获异常增强代码使用 try-catch 包裹,异常不影响主流程
大量字段时表单性能差50+ 字段的表单渲染慢前端按需渲染可见字段,隐藏字段延迟加载

设计取舍

配置存数据库 vs 配置存文件

JeecgBoot 选择:配置存数据库。

方案优势代价
存数据库(当前方案)运行时可直接读取,支持热更新,多实例共享配置变更无版本控制(需手动导出备份)
存文件版本控制友好,代码审查需要重启或额外的热更新机制

低代码平台的核心价值是”业务人员可配置”,配置存数据库更符合实时生效的需求。

运行时解析 vs 代码生成

JeecgBoot 选择:两者共存。

方案适用场景
运行时解析快速原型、简单 CRUD、频繁变更的表单
代码生成性能要求高、复杂业务逻辑、需深度定制

“Online 配置 → 代码生成 → 手工合并”的渐进式路径,让开发者从低代码平滑过渡到传统编码。


参考来源