Figma 交互式决策树与规则引擎编排系统(Interactive Decision Tree & Rule Engine Architecture)组件架构实战:从判断/动作原子节点插槽(Condition/Action/Branch Slot)、正交贝塞尔折线连接导轨(Orthogonal Branch Connectors)、分支权重与条件折叠到 Variables 路径高亮状态机与 Dev Mode 前端 React Flow / XState 生产级代码交付
为什么企业级复杂业务与 AI Agent 架构迫切需要标准化的决策树系统? #
在当今以数据驱动决策和智能编排为核心的现代软件体系中,决策树(Decision Tree)与业务规则引擎(Rule Engine) 扮演着不可替代的基础底座角色。从金融信贷风控审批、智慧医疗鉴别诊断、电商精准营销人群分流,到复杂微前端权限路由乃至当下大火的多智能体协作(Multi-Agent Reasoning & Branching Logic),几乎所有高商业价值业务背后都运行着庞大而精密的条件决策网络。
然而,在 Figma 设计与原型研发阶段,传统的决策树设计往往陷入严重的工程化困局:
- 图元连接脆弱,连线维护成本极高:传统做法多依赖手工钢笔绘制箭头与折线,一旦上游判断节点增加一行文案、拉伸卡片高度或调整节点顺序,整条树状连线便彻底脱节断层,设计资产脆弱不堪;
- 缺乏原子化状态插槽,规则表达混乱:一个标准决策节点往往混合了“判定条件(Condition)”、“运算符(Operator)”、“阈值(Threshold)”以及“分流分支(Branches)”。若缺乏严密的原子级插槽解耦,设计团队无法快速复用与组合不同维度的风控规则;
- 交互验证停留在静态展示:决策树的核心价值在于“路径推演与边界命中”。静态画板完全无法展示“当输入指标满足条件 A 时,系统高亮流向分支 B 并触发动作 C”的动态判定闭环;
- 设计资产与前端运行时严重割裂:工程师在落地决策树时,底层通常采用
React Flow、XState有限状态机或json-rules-engine。设计稿若没有严格对齐抽象语法树(AST)数据结构、端口锚点(Port Handles)与正交路由算法,开发只能推倒重来,交付效率极其低下。
本文将系统拆解如何在 Figma 中运用先进的嵌套 Auto Layout、绝对定位端口锚点、正交连接导轨、Figma Variables 逻辑状态机,搭建一套工业级交互式决策树与规则引擎编排系统,并无缝打通 Dev Mode 到现代前端代码的交付链路。
决策树与规则引擎核心节点拓扑与形态选型对比 #
在构建规范化组件库之前,必须确立决策树各节点类型与连接导轨的拓扑几何规范。不同节点在决策流中承担着截然不同的逻辑语义:
| 节点类型 / 连接拓扑 | 核心业务语义 | 几何布局与尺寸规范 | 状态复杂度 | 连接锚点(Port Handles)规范 | 现代前端工程技术映射 |
|---|---|---|---|---|---|
| 根触发节点(Root Trigger Node) | 决策网络入口,接收原始输入实体数据(如用户画像、风控请求上下文) | 顶层单向卡片(Width: 260px,Hug Contents) | 2 态(Idle / Triggered) | 仅设输出端口(Bottom/Right 单一锚点) | React Flow Custom Source Node |
| 条件判断节点(Condition Rule Node) | 核心计算中枢,执行条件比较(>, <, IN, MATCH)并决定后续流向 | 复合分支卡片(Width: 280px,支持动态行插入) | 4 态(Pending / Passed / Rejected / Error) | 左/顶单一输入锚点,右/底多分支输出锚点 | json-rules-engine Rule AST |
| 分支与权重徽标(Branch & Weight Slot) | 承载条件判别真假(True/False)或多路分支分流权重(如 70% 流量) | 行内胶囊标签(Auto Layout Hug,Min-H: 24px) | 3 态(Default / Active Path / Disabled) | 紧贴连接导轨中点,跟随连线几何自适应吸附 | Edge Label Component / SVG foreignObject |
| 动作执行节点(Action Node) | 决策终点或阶段性动作执行(如发送通知、降额审批、放行通过) | 胶囊形/圆角卡片(Accent Color 填充,Hug Width) | 3 态(Ready / Executing / Completed) | 仅设输入端口(Top/Left 锚点) | XState Action Callback / Service Execution |
| 正交折线连接导轨(Orthogonal Connector) | 建立节点间的拓扑血缘与数据流动路径,支持曼哈顿(Manhattan)正交路由 | 矢量导轨组合帧(Stroke: 2px,Radius: 8~12px) | 3 态(Default Gray / Highlight Flow / Dimmed) | 双端物理锚定于 Source Node 与 Target Node 端口 | React Flow getSmoothStepPath / D3 Orthogonal |
阶段一:原子级决策节点卡片组件化与插槽解耦 #
一个高可用、可扩展的决策树节点绝不是一个扁平的矩形,而是由多个职能分明的子组件通过 Auto Layout 嵌套聚合而成。
1. 三段式卡片容器架构 #
推荐将条件决策节点解耦为标准三层架构:
[Decision Node Frame: Auto Layout Vertical (Hug Height, Fixed Width 280px)]
├── Header Slot: [Icon + Rule Category + Node ID + Status Tag]
├── Divider Line: 1px 水平分割线
├── Condition Body Slot: [Field Selector + Operator Badge + Value Field]
├── Multi-Branch Output Container: [Branch 1 Slot, Branch 2 Slot, ...]
└── Port Anchors: [Input Handle (Top-Center), Output Handles (Bottom/Right)]
- Header Slot(头部槽位):包含业务领域图标(如风控盾牌、营销火箭)、规则编号(
RULE_102)以及规则开关(Toggle Switch)。支持通过 Component Property(组件属性)快速显隐; - Condition Body Slot(条件体槽位):使用水平 Auto Layout 组装变量选择器(如
user.credit_score)、逻辑运算符(>=)与阈值输入框(650),并设置弹性拉伸(Fill container),保证修改阈值时卡片自动伸展; - Multi-Branch Container(多分支容器):采用垂直 Auto Layout 堆叠各个分支输出行(如
满足条件: 放行与不满足: 人工审核),每一行右侧暴露独立的输出锚点。
2. 绝对定位端口锚点(Port Handles)防位移规范 #
在 Figma 中,最困扰设计师的问题是:当卡片高度随内容变化时,连接线如何始终对齐节点的端口?
- 锚点独立解耦:创建一个专用的
Port Handle原子组件(尺寸为12x12px圆形,内嵌6x6px高对比圆点,外部带2px边框); - 开启绝对定位(Absolute Position):将
Port Handle放置在节点容器内,点击右上角开启绝对定位; - 约束规则设置(Constraints):
- 输入端口(Input Handle):Constraints 设为
Center水平居中,Top顶部吸附,位置微调至y = -6px(恰好半露出卡片边缘); - 输出端口(Output Handle):若为纵向决策流,Constraints 设为
Center水平居中,Bottom底部吸附(y = 100% - 6px);若为横向决策流,输出锚点放置于各分支行内,开启右侧吸附。
- 输入端口(Input Handle):Constraints 设为
- 如此一来,无论卡片内增加了多少条规则说明,端口锚点始终稳稳锁死在卡片边界的正中几何坐标上。
阶段二:正交折线连接导轨(Orthogonal Connectors)与分支权重徽标 #
在复杂规则引擎中,连线若随意斜拉,画布将迅速沦为杂乱无章的“蜘蛛网”。工业级决策图纸统一采用曼哈顿正交折线算法(Orthogonal / SmoothStep Routing)。
1. 正交折线图元的矢量构建秘诀 #
在 Figma 中制作可拉伸且不失真的 90° 正交拐角导轨,切忌使用简单的钢笔直接画一条长线拉伸,而应采用分段拼装架构:
- 基础拐角原子(Elbow Corner):绘制一个
24x24px的矢量路径,由一段平直横线与 90° 圆角(Radius:12px)平滑连接一段平直竖线组成; - 三段式正交组件(Step Connector):
- 第一段:垂直出发线(Vertical Stub,高度
24px); - 第二段:水平转折导轨(Horizontal Bus,开启
Fill container自适应两节点间水平偏移); - 第三段:垂直到达线(Vertical Ingress,对齐下游目标节点)。
- 第一段:垂直出发线(Vertical Stub,高度
- 描边与端点规范:统一设置描边宽度为
2px,描边颜色绑定全局 Tokenborder-connector-default(#CBD5E1),端点可选用带有3px实体箭头的连接线(Figma Line Arrow)。
2. 分支胶囊徽标与通过概率指示器(Branch Badge & Weight) #
在多路分流连线上,明确标注分支条件与统计流量是规则编排的核心需求:
- 创建一个自适应胶囊容器
Branch Badge,内部横向排版:[判断结果: True/False] + [流量占比: 75%]; - 将该徽标嵌套在水平转折导轨正中,设置 Auto Layout 居中对齐,背景填充白色或深色卡片底色(添加
1px细边框与微弱外发光),物理遮挡下方的连接线,营造专业工业软件中的浮动连线标签质感; - 赋予组件变体属性:
Variant: Success (绿) | Danger (红) | Neutral (蓝灰),与风控通过/拒绝语义完全呼应。
阶段三:Figma Variables 驱动的决策路径高亮与折叠展开状态机 #
通过引入 Figma Variables 变量系统与条件原型交互(Conditional Prototyping),我们可以让原本静态的决策树真正“跑”起来,模拟真实业务场景下的规则评估与分支推演。
1. 变量体系设计(Variables Schema) #
在 Local Variables 面板中建立 RuleEngine 专有集合,定义以下关键变量:
| 变量名称 | 变量类型 | 默认初始值 | 作用范围与用途 |
|---|---|---|---|
selectedScenario | String | "Normal_User" | 控制当前推演的用户画像场景(如低风险、高风险欺诈、临界灰度) |
isSubtreeCollapsed | Boolean | false | 控制次要分支子树的展开与折叠,降低复杂画布的认知负荷 |
ruleStep1Passed | Boolean | true | 第一道规则(如年龄/黑名单检测)是否通过 |
ruleStep2Passed | Boolean | false | 第二道规则(如还款能力/信用积分评估)是否通过 |
activePathStroke | Color | #10B981 | 决策激活路径描边主色(翡翠绿,表示命中放行) |
inactivePathStroke | Color | #E2E8F0 | 未命中路径置灰弱化色(降低不透明度至 30%) |
2. 交互式路径推演与高亮状态机闭环 #
利用 Figma 高级原型能力,实现端到端的交互体验:
- 场景切换触发器:在决策树顶栏放置一个 Segmented Control(分段控制器),提供
场景 A: 征信良好用户与场景 B: 存在逾期高危用户; - 设置条件动作(Conditional Actions):
- 当点击
场景 A时,设置动作序列:Set variable: ruleStep1Passed = true Set variable: ruleStep2Passed = true Set variable: selectedScenario = "Low_Risk" - 当点击
场景 B时,设置动作序列:Set variable: ruleStep1Passed = true Set variable: ruleStep2Passed = false Set variable: selectedScenario = "High_Risk"
- 当点击
- 绑定图元属性与变体联动:
- 将主干连线的 Stroke Color 绑定至变量表达式;当
ruleStep2Passed == true时,通向“自动放款”的动作节点背景色切换为高亮翡翠绿,连线加粗至3px; - 未被命中的“人工复核”分支连线自动退化为浅灰色,且不透明度变为
25%;
- 将主干连线的 Stroke Color 绑定至变量表达式;当
- 子树一键折叠(Subtree Collapse):在节点底部放置
[-] / [+]徽标,点击时切换isSubtreeCollapsed变量。将下游子级 Frame 的Layer Visibility(图层可见性)绑定至该布尔变量,一秒实现树状图分支的动态折叠与空间回缩。
阶段四:Dev Mode 研发协同与前端 React Flow / XState 生产级代码交付 #
在向研发交接时,传统切图标注对规则引擎几乎无效。通过 Figma Dev Mode,我们可以直接为前端工程师呈现清晰的抽象语法树(AST)与高保真代码实现模板。
1. 决策树抽象语法树(AST)JSON 规范 #
在 Dev Mode 标注说明中附带标准 JSON 结构,让后端规则引擎与前端渲染器直接复用:
{
"id": "RULE_EVAL_001",
"name": "用户信用额度自动决策流",
"version": "2.4.0",
"rootNodeId": "node_trigger_credit",
"nodes": [
{
"id": "node_trigger_credit",
"type": "trigger",
"data": { "label": "授信额度申请进入", "event": "APPLY_CREDIT" },
"position": { "x": 250, "y": 0 }
},
{
"id": "node_cond_anti_fraud",
"type": "condition",
"data": {
"field": "antiFraudScore",
"operator": ">=",
"threshold": 80,
"branches": [
{ "condition": true, "targetNodeId": "node_cond_income" },
{ "condition": false, "targetNodeId": "node_action_reject" }
]
},
"position": { "x": 250, "y": 140 }
}
]
}
2. React Flow 生产级自定义节点代码交付 #
前端工程师在 React 技术栈下,借助官方 @xyflow/react(React Flow v12)可实现对 Figma 设计稿 100% 像素级还原:
import React, { memo } from 'react';
import { Handle, Position, NodeProps } from '@xyflow/react';
interface RuleNodeData {
title: string;
field: string;
operator: string;
threshold: string | number;
status: 'pending' | 'passed' | 'rejected';
}
export const DecisionNode = memo(({ data, isConnectable }: NodeProps<RuleNodeData>) => {
const isPassed = data.status === 'passed';
const isRejected = data.status === 'rejected';
return (
<div className={`w-[280px] rounded-xl border bg-white p-4 shadow-sm transition-all duration-200 ${
isPassed ? 'border-emerald-500 ring-2 ring-emerald-100' :
isRejected ? 'border-rose-500 ring-2 ring-rose-100' : 'border-slate-200'
}`}>
{/* 顶部单输入锚点(对齐 Figma Constraints Top-Center) */}
<Handle
type="target"
position={Position.Top}
isConnectable={isConnectable}
className="!h-3 !w-3 !rounded-full !border-2 !border-white !bg-slate-400"
/>
{/* 节点 Header 插槽 */}
<div className="flex items-center justify-between pb-3 border-b border-slate-100">
<span className="text-xs font-semibold uppercase tracking-wider text-slate-500">
{data.title}
</span>
<span className={`inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-medium ${
isPassed ? 'bg-emerald-50 text-emerald-700' :
isRejected ? 'bg-rose-50 text-rose-700' : 'bg-slate-100 text-slate-600'
}`}>
{data.status.toUpperCase()}
</span>
</div>
{/* 核心规则判断表达式 */}
<div className="mt-3 flex items-center justify-between rounded-lg bg-slate-50 p-2.5 text-sm">
<span className="font-mono text-slate-700">{data.field}</span>
<span className="font-bold text-slate-900 px-1.5">{data.operator}</span>
<span className="font-mono font-semibold text-indigo-600">{data.threshold}</span>
</div>
{/* 底部 True / False 双输出锚点(对应分支分流) */}
<div className="mt-4 flex items-center justify-between pt-2 text-xs">
<div className="relative flex items-center gap-1 text-emerald-600 font-medium">
<span>条件命中 (True)</span>
<Handle
id="true-branch"
type="source"
position={Position.Bottom}
className="!left-8 !h-3 !w-3 !rounded-full !border-2 !border-white !bg-emerald-500"
/>
</div>
<div className="relative flex items-center gap-1 text-rose-500 font-medium">
<span>条件未命中 (False)</span>
<Handle
id="false-branch"
type="source"
position={Position.Bottom}
className="!right-8 !left-auto !h-3 !w-3 !rounded-full !border-2 !border-white !bg-rose-500"
/>
</div>
</div>
</div>
);
});
DecisionNode.displayName = 'DecisionNode';
生产级决策树与规则引擎设计踩坑防御清单 #
在交付复杂业务决策流时,请对照以下工程化防御清单逐一检查,规避低级排版与架构漏洞:
[几何与对齐约束]
└─ 严禁在连线跨越画板时使用无意义的自由拖拽贝塞尔手柄
└─ 节点间距严格保持 8 的倍数网格(推荐水平间距 80px,垂直间距 96px)
└─ 输入输出 Port 锚点统一声明绝对定位坐标,杜绝文本换行引发的端口漂移
[语义与无障碍表达]
└─ 分支状态不仅依赖红绿颜色,必须配备文字标签(True/False)与语义图标
└─ 决策终态必须具备明确的兜底回落分支(Fallback / Else Default Branch)
[极端容错与性能优化]
└─ 针对超过 50 个节点的巨型决策树,必须引入 Section 区域分组与小地图导轨
└─ 检查连线层与节点卡片的图层层级(Z-Index),连线必须位于卡片底层避免遮挡文字
[研发交接完整性]
└─ Dev Mode 中必须标明每个变量与后端字段(Payload Schema)的映射关系
└─ 连线必须指明动画流动模式(如 SVG stroke-dasharray 呼吸流向效果)
站内进阶指引与关联文档 #
如需深入探索节点式画布编排、自动化状态机与团队组件系统治理,请参阅以下精选实战指南:
- 掌握节点与连线拓扑全流程架构:Figma 工作流节点与编排画布系统组件架构实战
- 探索多阶段流向与用户行为拓扑:Figma 交互式桑基图与多级用户流向可视化系统组件架构实战
- 构建漏斗转化与条件损耗模型:Figma 交互式转化漏斗图与阶段流失分析系统组件架构实战
- 团队组件变体与属性系统设计规范:组件变体与属性系统设计指南
- 深入 Dev Mode 标注与生产级代码交付:Dev Mode 官方指南与开发模式实操
- 排查复杂画布渲染卡顿与组件错位故障:Figma 常见报错与疑难故障诊断手册
- 查看全局设计令牌规范体系:Design Tokens 规范手册
核心手册与速查工具
高频手册与实用设计生产力工具直达常见问题与答疑 (FAQ)
高频疑难解析与避坑指南完全不需要。绝大多数核心功能在免费 Starter 计划中均可完整体验与实操练习,无需额外付费购买付费团队版。