尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

低代码平台设计核心:模块拆解与技术架构实践

低代码平台设计核心:模块拆解与技术架构实践 1. 设计低代码平台前先想清楚这四件事低代码平台这几年几乎成了企业软件领域的“标配话题”团队里只要有几个人写过前端表单、后端CRUD就会萌生“要不我们自己搞一个低代码平台”的念头。我先泼一盆冷水市面上开源低代码引擎一大把商业产品更是多到数不过来真正能在一个团队里稳定跑起来、被业务方持续使用的其实很少。大部分平台死在同一个问题上——设计者只想着“怎么把代码藏起来”却没想清楚“业务人员到底需要什么研发人员又愿意为什么买单”。所以在动手画架构图之前我建议先回答四个问题平台的使用者是谁平台要解决的核心场景是什么平台与现有开发流程如何共存平台的可扩展边界在哪里使用者是谁如果是业务人员运营、销售、人事那么交互必须足够简单表单设计器、流程设计器都要可视化最好连“数据模型”这个概念都不要出现如果是研发人员那么要的是“能快速搭出管理后台、能嵌入现有工程、能被Git管理”这种平台本质上是代码生成器或开发框架的升级版。两种用户对应的设计思路几乎是两条路混着做必然两头不讨好。核心场景是什么低代码平台最适合的场景是“企业内部管理系统”和“标准化流程应用”典型如审批、工单、资产管理、报表填报。这类系统功能高度相似、业务逻辑可枚举低代码平台只要能覆盖80%的常规需求剩下20%通过扩展点支持就能形成生产力。如果你想让低代码平台去搞复杂的电商交易、实时推荐引擎那多半会把自己逼疯。如何与现有开发流程共存我见过最理想的用法是“双轨制”——简单页面和流程用低代码搭复杂模块由专业研发写代码两者通过平台的扩展机制互相调用。低代码平台不是一个封闭的“应用生成器”它应该能输出标准工程、暴露API、支持自定义组件这样研发才敢把核心逻辑交给平台。可扩展边界在哪里这是最容易忽略的问题。低代码平台的底层是“元数据驱动”相当于所有页面都由一套JSON配置解释执行那么业务一旦复杂起来你必然需要写自定义逻辑。平台设计之初就要想好扩展点自定义API、自定义组件、自定义校验规则、事件钩子、脚本注入。没有扩展点的低代码平台做出来就是个大号表单工具用三个月就会被吐槽。把这四个问题想清楚了再进入具体设计方向才不会跑偏。2. 核心模块拆解低代码平台到底要做什么一个能落地的低代码平台在我看来至少要包含六个核心模块表单设计器、流程设计器、数据模型管理、页面编排器、权限体系和集成中心。下面逐个拆开聊重点说设计思路和容易踩的坑。2.1 表单设计器从“拖拽控件”到“字段即配置”表单是管理系统的基础也是大多数低代码平台做得最表面的一层。很多团队做了一个能拖拽输入框、下拉框的画布就觉得表单引擎完成了实际上真正的复杂度在控件之外。首先每个表单控件背后至少要有三组配置基础属性字段名、标签、占位符、是否必填、数据规则选项数据源、联动逻辑、格式化方式、校验表达式、布局规则栅格跨度、显隐条件、只读条件。这三组配置不能散落在不同面板里最好统一收敛到一份控件Schema描述里。我习惯用JSON Schema做载体既有标准可循又方便后续做版本对比。其次是字段联动能力。联动不只是“A选了B就显示”还包含“B的选项要按A的值过滤”“C的值由AB自动计算”“保存时根据A的值决定是否校验D”。很多团队做到显示/隐藏就停了遇到计算逻辑就要求用户“去写代码”这是非常劝退的体验。一个合格的低代码表单引擎至少要内置完算术计算、字段引用、简单条件判断的能力才能在业务侧撑起“无代码”这三个字。再就是校验。服务端校验一定要有前端校验只是体验兜底。因为平台生成的表单可能被嵌入到任何环境如果有人绕过前端直接调接口提交数据就会出问题。低代码平台在校验上最好采用“声明式规则表达式引擎”比如“字段金额必须大于0”“请假结束时间晚于开始时间”不要用一门自创的脚本语言直接用类似amount 0的可读表达式语法用户和学习成本都低很多。2.2 数据模型管理多数平台失败的地方如果说表单是门面数据模型就是地基。这里最容易犯的错是把“建模”做成“建表”——让用户直接去定义数据库字段、类型、长度。对于研发这没问题但对业务人员来说“这是什么类型”足以劝退。数据模型管理的设计目标应该是“让用户描述业务对象”而不是“让用户设计数据库表”。举个例子用户只需要说“我要一个客户对象包括名称、等级、联系人、电话”平台应该自动完成数据库建表、API生成、页面初始化的全过程。具体到技术实现我推荐“动态Schema”方案也就是每个业务对象的核心数据以“实体表字段定义表数据存储表”的元数据方式存储。这里有一个关键选型数据存储用“宽表”还是“JSONB列”还是“标准关系表”。这三种方式都有坑标准关系表直观、可索引、兼容性最好但每一次字段变更都要执行DDL遇到多租户隔离、字段动态扩展会非常痛苦。宽表模式预留大量备用字段实现简单但后期维护极其痛苦索引、数值溢出、类型混乱都是现实问题。JSONB大字段模式以PostgreSQL为代表灵活度高、改字段不用重建表但查询性能和索引设计需要专门优化复杂关联查询会比较别扭。我的建议是数据量可控单表百万以内优先标准关系表配合“预定义字段扩展JSON字段”的混合模式只有明确要做极强动态扩展的时候才考虑全量JSONB。别为了“灵活”一开始就上极端方案绝大多数内部系统是撑不到那个体量的。另外一个必须考虑的机制是“字段变更版本管理”。业务对象上线后字段增删改几乎是必然的。每次变更都要生成版本记录明确“哪个版本的表单对应哪个阶段的数据”否则历史数据很容易出现“新页面看老数据为空/null”的问题。很多低代码平台上线三个月后报表对不上数根子就出在这。2.3 流程设计器别一上来就画BPMN流程设计器听起来很酷BPMN、泳道、网关、子流程一套组合拳下来似乎很专业。但实际给业务人员用的时候复杂模型会直接把他们吓跑。我见过一些平台把Activiti的模型直接暴露给用户结果业务方根本不知道怎么画网关最后还是回到“找研发画流程”的老路。我认为流程设计器应该采用“分层复杂度”设计默认提供“简单审批流”模式只有“开始节点-审批节点-结束节点”审批人可以是“指定人、角色、部门主管、发起人自选”支持加签、转办、会签、或签。这些高频能力用卡片式配置就能完成用户不需要理解“并行网关”是什么。高级模式里才暴露“条件分支”“子流程”“定时事件”这类BPMN元素并且在界面上用中文解释每个元素的作用。流程引擎的选型也值得说一句。如果团队精通Java直接用Flowable或Camunda配备流程模型翻译层把用户设计的“简化模型”翻译成BPMN XML如果团队是Node技术栈可以考虑基于状态机自研引擎或者是用成熟的轻量级工作流库。自研流程引擎不是不行但要做到“会签、退回、驳回、追回、超时自动提醒”这些功能工作量比想象中大得多建议优先复用成熟引擎。流程和数据是紧密关联的。一个典型场景是“单据在审批中发起人能不能改内容”。这个权限必须可配置有的流程允许修改有的流程任何节点通过后都不允许修改。低代码平台里要把“流程状态”和“数据版本”绑定在一起实现上一般是流程实例ID挂到业务数据行上每次审批动作都做并发控制防止多人同时操作同一张单子。2.4 页面编排器布局、容器和路由缺一不可很多人理解的页面设计器就是画表单但真实管理系统还需要“页面”这个层级一个页面可以包含多个区块筛选区、统计卡片、表格、详情抽屉区块之间可以有联动点击表格行详情区刷新页面要有自己的路由、权限和菜单挂载关系。页面编排器核心就三件事布局容器、组件通信、路由约定。布局容器就是栅格系统常用的是24列栅格配合“行/列容器”实现区块划分这块可以做得很简单不必去对标那些前端可视化建站工具。组件通信要提前设计好事件总线比如“表格行点击事件”可以让“详情组件”接收并加载数据这里不要用复杂的响应式状态库一个轻量级EventBus足够。路由约定建议按照“菜单-页面-路由”自动映射用户新建页面时选择挂载的菜单项平台自动生成路由。这样业务人员不需要理解URL、路由表这些概念访问路径完全由平台托管。还有一个细节容易被忽略页面级缓存。列表页筛选条件、分页信息、Tab切换后的状态在低代码平台里都应该默认保存用户刷新后能恢复到上次操作状态。体验上这些细节是拉开“能用”和“好用”差距的关键。2.5 权限体系不能只有“管理员和普通用户”低代码平台做权限最怕的就是“角色-用户”两级模型遇到复杂组织架构就崩。成熟的权限设计至少要拆成五层功能权限谁能访问哪个菜单、看到哪个按钮通常基于RBAC的“用户-角色-权限点”模型。数据权限同一张列表销售只能看自己创建的客户销售总监能看整个团队的财务只能看金额字段不能看成本字段。这类“行级权限”和“字段级权限”必须落到数据模型层由后端统一过滤平台生成的查询要自动拼接权限条件。操作权限“新增”和“编辑”可以拆开“删除”还能再分“逻辑删除”和“物理删除”操作按钮的显隐要支持配置。审批权限流程节点上谁能审批、谁能加签这是流程引擎自己的权限体系要求支持按角色、按部门、按汇报关系动态解析。白名单/外部访问权限如果平台生成的页面需要嵌入企业微信、钉钉或第三方系统要支持免登和授权码校验。权限体的核心难点是“数据权限”。我见过很多团队把数据权限写在代码里平台只做菜单控制结果业务方要求“销售部只能看自己区域的客户”时又变成研发改代码。正确做法是在数据模型层的“查询接口”里内置权限解析器列表查询时自动拼上WHERE条件无论这个查询是从低代码页面来的还是从开放API来的都必须经过权限过滤。3. 技术架构与实现关键元数据驱动和扩展机制模块拆完了落到技术实现上有几个关键架构决策几乎是所有可用低代码平台的共同选择。这里重点说元数据驱动、DSL设计、扩展机制和版本管理这四件事。3.1 一切皆元数据把“配置”变成一等公民低代码平台和传统开发的本质区别在于传统开发的交付物是“代码”低代码平台的交付物是“元数据”JSON、XML、YAML。因此平台架构的第一条原则就是一切业务产物都要能以元数据形式存储、传输、解析。页面结构是JSON Schema表单字段是JSONSchema流程定义是BPMN XML权限规则是结构化条件表达式。以页面为例一个列表页的元数据大致长这样{ pageId: customer_list, title: 客户列表, layout: { type: container, children: [ { type: filterForm, fields: [keyword, level] }, { type: dataTable, columns: [name, level, owner, createdAt], rowAction: [detail, edit] }, { type: detailDrawer, bindTo: dataTable:rowClick } ] }, permission: { menu: customer:list, action: [create, export] } }平台启动时解释器读取这份元数据动态渲染页面数据提交时后端引擎读取字段定义做校验、落库、触发流程。所有逻辑都不需要硬编码到工程里这就是“低代码”的技术本质。元数据驱动还有个好处是“多端一致”。同一份元数据理论上可以渲染出Web页面、移动端H5未来甚至可以直接对接小程序端。当然实际做起来还是会有适配差异但元数据作为中枢至少保证了业务逻辑不分裂。3.2 DSL设计不要自创语言用表达式解决问题平台里必然需要一些条件表达式比如“当请假天数大于3天时走部门经理审批”“当库存小于预警值时标红显示”。这里最重要的是克制自创语言的冲动。我建议内置一套受限表达式语法语法尽量贴近JavaScript/Java表达式支持比较运算符、逻辑运算符、算术运算符、字符串拼接以及少量函数如today()、sum()、contains()。不需要支持循环、变量声明、函数定义这样既能满足绝大多数业务场景又不需要面对“教用户编程”的困境。安全性上表达式必须要做白名单校验禁止直接访问系统对象、文件、网络等敏感能力。最好用沙箱方式执行避免用户写一个死循环把服务端拖垮。3.3 扩展机制给专业研发留下“逃生舱”低代码平台能不能被研发团队真正接受核心就看扩展机制设计得好不好。扩展机制至少要有三层代码级扩展允许加载自定义Vue/React组件、自定义后端API组件注册到组件库后设计器里就能直接拖拽使用。钩子级扩展在数据处理的关键环节留出钩子比如“保存前执行的函数”“列表查询后处理的函数”钩子函数既可以用平台内置函数也可以调用外部HTTP API。集成级扩展通过Webhook、消息队列或开放API把平台的“新增、更新、删除、审批完成”等事件推送到外部系统。我见过一个特别好的实践平台留了一个“重写页面”开关当某个页面生成效果无法满足需求时用户可以把它“降级”成一个自由编码的工程页面代码由平台脚手架生成研发直接改代码改完还能再上传回平台托管。这种方式让平台不再是“围城”研发随时能深入到代码层解决问题。3.4 版本管理与发布回滚没有版本概念的平台不是好平台低代码平台天然面临“改了配置就影响线上”的风险。如果一份元数据没有版本管理改错了找不到原因改坏了没法回滚那这个平台用起来会非常危险。所以在设计里要内置“环境隔离”机制开发环境随意修改、调试不影响线上用户。测试环境配置变更后自动生成测试版本供QA验证。生产环境只能从测试环境的稳定版本“发布上线”发布记录完整留痕。发布时建议做“元数据快照”这样线上运行时不依赖最新的元数据配置而是从快照加载避免“我还在编辑流程线上已经变成半成品状态”这种事故。用Git管理元数据也是一种选择但对非技术用户不太友好最好是平台内置版本列表每次发布自动生成历史版本记录。4. 常见问题与排查技巧实录上线后踩过的那些坑最后分享一些真实使用中容易踩的问题。这些坑有些来自我们的实际项目有些是我调研其他平台时看到的用户吐槽整理出来供大家参考。4.1 页面加载慢首屏一堆空白接口低代码平台生成的页面很容易出现一个列表页加载了十几次请求用户信息、字典数据、菜单权限、页面Schema、列表数据、表单Schema、按钮权限……每一个都是必要的但合在一起就成了性能灾难。排查思路是页面Schema和权限信息要做缓存尽量放到本地存储或浏览器缓存里设置短时效比如5分钟首屏只加载当前页面必要的数据其他数据懒加载。另外列表查询要做服务端分页别一次传几千条记录到前端。4.2 流程实例乱掉并发提交导致重复审批流程引擎最容易出问题的地方是并发。用户连续提交两次表单、审批人和发起人同时操作容易出现重复创建流程实例、审批记录覆盖等问题。处理办法是业务表单和流程实例之间要建立唯一关联提交时加锁或使用数据库唯一索引兜底。在流程节点上做操作时每一次“通过”“驳回”都要校验当前任务版本防止过期任务覆盖新状态。我自己在项目中还碰到过一个问题流程节点的“或签”实现时只处理了“一个人通过就流转”却没处理“一个人驳回后其他人的待办怎么取消”结果流程已经结束了别人的待办还挂在列表里。这类问题靠测试很难全部覆盖上线后一定要有定时的“待办任务一致性巡检”把已结束流程的残留待办自动归档。4.3 数据字典改动后历史数据全部显示异常低代码平台常做带字典的下拉框比如客户等级、单据状态。问题往往出在字典改value不改label或者字典删除了某个值导致历史数据展示成“未知”或空白。这块在设计上要注意业务数据保存时推荐把字段值和字典文本冗余存储一份展示的时候优先取冗余值字典仅用于选项录入。这样就算字典改了历史数据也不会错乱。4.4 权限过滤在列表生效但导出漏了这也是经典坑列表查询做了行级权限过滤但“导出Excel”功能复用了另一套查询逻辑结果用户把全量数据导出去了。排查方案很笨但很有效导出功能必须走和列表查询完全同一个查询方法前端也好后端也好不要为导出单独写“查询全部”的逻辑。更稳妥的是在导出请求中强制带上“当前用户数据权限范围”并在导出结果中加入“数据范围水印”一旦泄露能溯源。4.5 用户说“还不如写代码”怎么办最后说一个非技术问题。低代码平台推广最大的阻力永远不是技术而是“用户习惯”。研发觉得配置比写代码还慢业务觉得平台限制太多两边都不满意。根据我自己的观察能让平台活下去的往往不是功能最强而是“有一个能扛事的运维角色”。这个角色需要懂一点开发、懂一点业务专门负责把业务需求翻译成平台配置并且在用户说“这个功能做不了”的时候能够判断是平台真的做不了还是“默认配置做不了、需要扩展开发”。一个低代码平台如果配置了这样一个人存活率会高很多。平台本身只是工具真正让它发挥价值的是人和流程。我个人在实际项目中的体会是低代码平台的设计没有银弹关键是把“简单场景做极致复杂场景留出口”。每一步设计决策都要反问自己——“这个功能如果用户不用我做的复杂度值不值得”。如果答案犹豫就砍掉等真实需求出现了再加远比一开始就堆一堆看似强大但没人用的功能要靠谱。
返回列表