低代码与零代码引擎是将应用定义转换为界面、数据操作和业务行为的运行系统。本词条以表单、列表和审批类应用为范围,说明实现此类系统涉及的知识及其联系;以下模块划分和学习顺序属于设计建议,并非所有平台的统一标准。
配置如何变成应用
一种可采用的结构是:设计器生成应用定义,发布环节校验并保存版本,运行时读取定义、维护状态,再调用组件、数据服务和流程执行器。应用定义可以使用 JSON,但 JSON 只是数据表示形式,执行语义仍需平台约定。
已有实现中,amis 使用 JSON 配置生成后台页面,并明确区分前端低代码框架与完整平台。因此,完成页面渲染不等于已经具备数据建模、权限和审批能力。源码仓库
低代码与零代码可以共享运行机制。设计上可让零代码界面将字段选择、条件组合和流程编排转换成结构化定义;可表达的业务范围取决于平台提供的组件、操作符和连接器。
所需知识与对应职责
| 知识 | 用在什么地方 | 需要理解的内容 |
|---|---|---|
| 编程语言与类型系统 | 定义配置协议和组件接口 | 对象、函数、模块、异步操作、联合类型、运行时校验;静态类型不能代替外部配置校验 |
| 数据结构与算法 | 表示页面树、规则依赖和流程关系 | 树的递归遍历、映射索引、有向图、拓扑排序、循环检测 |
| Schema 与元数据建模 | 描述字段、组件、数据源及其引用 | 数据类型、必填约束、嵌套结构、引用解析、协议版本;数据 Schema 与 UI 定义的边界 |
| 组件化与状态管理 | 根据配置生成页面并响应输入 | 组件注册、属性传递、受控输入、作用域、派生状态、订阅和资源清理 |
| 语言解释与规则计算 | 执行条件、公式和动作定义 | 抽象语法树(AST)、名称解析、类型检查、求值、错误定位和资源限制 |
| 数据库与服务端开发 | 保存配置、业务记录和任务 | 表关系、索引、事务、并发控制、接口契约、分页与错误处理 |
| 状态机与工作流 | 处理审批、等待、超时和失败恢复 | 状态转移、持久化任务、事件、重试、幂等和补偿 |
| 应用安全 | 限制用户、配置和扩展能力 | 身份认证、服务端授权、数据隔离、输入校验和凭据保护 |
| 软件演进与测试 | 保持旧应用可运行并排查故障 | 发布版本、兼容迁移、单元测试、集成测试、运行日志和执行追踪 |
Schema:区分结构合法与业务合法
JSON Schema 可以表达类型、必填字段、嵌套对象和引用;校验器根据 Schema 检查输入实例。官方文档
在引擎设计中,建议分三层检查:
- 结构校验:组件定义是否包含必要属性,金额是否为数值。
- 引用校验:字段名、组件类型和动作名称是否存在。
- 业务校验:当前用户是否有权提交,申请是否允许从当前状态继续流转。
Schema 通过不意味着业务操作获得授权,也不意味着一个流程不存在不可达节点或循环等待。
渲染与规则:树负责结构,图负责依赖
页面可以表示为组件树:容器包含表单,表单包含金额和事由字段。渲染器递归遍历树,通过注册表查找实际组件。
字段联动则可建立依赖图。例如“金额大于 5000 时显示补充说明”依赖金额;金额改变后,只重新计算相关规则。建议区分字段值、校验错误、加载状态和计算得到的可见性,避免多处同时修改同一含义的状态。
规则可使用受限表达式或条件树实现。学习重点是如何表示、检查和执行一门小型领域专用语言(DSL),而不必一开始实现完整编程语言。CEL 提供了可嵌入表达式语言的实例,其规范将解析、检查和求值分开。规范与源码
实现时还应定义缺失值、类型不匹配、循环依赖和异步结果过期的处理方式。允许扩展函数时,应明确它们可访问的数据和可产生的副作用。
数据与流程:事务、恢复和幂等
数据库事务可以让一组数据库操作整体成功或回滚。官方文档
例如,在使用同一事务数据库的设计中,可以将“创建报销单”和“创建首个审批任务”放入同一事务。外部通知不自动包含在这个事务中,需要另外设计可靠投递和重复执行处理;不能将一串前端请求视为原子事务。
对于持续数天的审批,建议持久化流程实例、任务、状态及执行记录。Temporal 的实现展示了通过事件历史和重放恢复工作流的方式,但这是具体实现路线,并非所有工作流都必须采用事件重放。官方文档
幂等解决同一操作重复到达的问题;事务解决一组操作的提交边界,二者不能互相替代。
安全与版本边界
界面隐藏按钮不能替代服务端授权。服务端需要验证每次请求是否允许执行,不能信任客户端传来的角色、所属组织或记录归属。官方指南
建议将草稿和已发布定义分开,将流程实例绑定到明确的流程版本。组件、Schema 和规则语言升级时,需要分别考虑旧配置能否解析、旧行为是否改变,以及已有实例如何继续执行。版本回滚也不等于撤销已经发生的业务操作。
学习与验证顺序
以下为学习建议,可按已有基础跳过已掌握部分:
- 学会一门应用语言、组件框架、HTTP 接口和 SQL,完成一个普通表单及列表。
- 学习树遍历、Schema 校验和组件注册,将手写页面改为配置驱动,并处理未知组件和非法配置。
- 学习状态管理、依赖图和表达式求值,实现字段联动,并测试循环、缺失值及类型错误。
- 学习事务、授权和并发控制,使表单数据可靠保存,验证越权和重复提交。
- 学习状态机、持久化任务和幂等,实现审批等待、重试及服务重启后的继续处理。
- 在运行语义明确后学习设计器交互、撤销重做和发布管理,让可视化操作生成同一套应用定义。
报销申请示例
“填写金额 → 判断是否需要补充说明 → 提交 → 经理审批”可以用于贯通上述知识:
- Schema 描述金额和事由字段,组件树描述表单布局。
- 状态容器保存输入值,依赖图定位金额变化影响的规则。
- 条件解释器计算补充说明是否显示,动作执行器发起提交。
- 服务端验证字段、身份和权限,通过事务保存申请及任务。
- 工作流保存等待状态,收到审批操作后验证并执行状态转移。
- 日志关联应用版本、申请、流程实例及失败节点,帮助定位问题。