宏天低代码:可视化流程设计器的前端实现

0 阅读4分钟

宏天低代码:可视化流程设计器的前端实现

可视化流程设计器作为低代码平台的核心交互组件,其前端实现直接决定用户操作体验与开发效率。宏天低代码聚焦流程设计的便捷性与流畅度,基于 Canvas 技术 + jsPlumb 库构建高性能可视化引擎,整合拖拽交互、快捷键、Undo/Redo 等核心功能,打造符合企业级需求的流程设计工具。本文将从四大核心维度,拆解宏天低代码可视化流程设计器的前端实现细节,助力开发者快速掌握流程设计器的前端交互技巧。

一、Canvas 绘图引擎:流程可视化的核心基石

Canvas 是宏天低代码流程设计器实现可视化渲染的核心载体,负责流程节点、面板等基础元素的绘制与更新,而节点间的连线则基于jsPlumb库实现(兼容 Canvas 渲染模式),二者结合是保障设计器流畅运行的关键。不同于纯 DOM 渲染,Canvas+jsPlumb 的组合既保留了像素级绘制的高效性,又解决了手动实现连线的复杂度,尤其适合复杂流程的批量节点展示。

宏天低代码采用 Canvas 2D 上下文进行节点绘制,定义统一的节点数据模型(区分开始节点、结束节点、条件节点等),通过ctx.fillRectctx.fillText等方法绘制节点样式与文本,同时整合jsPlumb完成连线的自动渲染、拖拽调整;并优化重绘逻辑,仅在节点位置 / 样式变化时局部重绘,避免全量渲染导致的卡顿。核心初始化代码如下:

// Canvas初始化核心代码
const canvas = document.getElementById('flow-canvas');
const ctx = canvas.getContext('2d');
// 设置画布自适应
canvas.width = container.clientWidth;
canvas.height = container.clientHeight;

// jsPlumb初始化(绑定Canvas容器,启用Canvas渲染模式)
const jsPlumbInstance = jsPlumb.getInstance({
  container: canvas, // 绑定到Canvas容器
  paintStyle: { stroke: '#666', strokeWidth: 2 }, // 连线样式
  connector: ['Bezier', { curviness: 50 }], // 贝塞尔曲线连线
  anchor: 'AutoDefault' // 自动锚点适配
});

// 节点绘制入口
function renderNode(node) {
  ctx.save();
  ctx.fillStyle = node.color;
  ctx.fillRect(node.x, node.y, node.width, node.height);
  // 节点文本绘制
  ctx.fillStyle = '#fff';
  ctx.fillText(node.label, node.x + 10, node.y + 20);
  ctx.restore();
  
  // 为节点注册jsPlumb可连线端点
  jsPlumbInstance.addEndpoint(`node-${node.id}`, {
    anchor: 'Right', // 右侧端点(出)
    position: 'right',
    isSource: true
  }, {
    anchor: 'Left', // 左侧端点(入)
    position: 'left',
    isTarget: true
  });
}

二、拖拽交互设计:提升操作便捷性的核心

拖拽交互是可视化流程设计器最核心的前端交互方式,宏天低代码基于jsPlumb内置的拖拽能力,结合自定义逻辑,兼顾操作流畅度与精准度,实现节点拖拽、连线拖拽、吸附对齐等功能,降低用户操作成本。

jsPlumb原生支持节点拖拽(draggable),只需为节点开启拖拽配置,即可实现自由移动,同时我们扩展了磁吸效果:监听jsPlumbdrag事件,在节点移动时计算与其他节点 / 网格线的距离,当小于阈值时自动对齐,确保流程布局整齐。对于连线拖拽,jsPlumb已封装好 “点击端点拖拽生成连线” 的逻辑,只需监听connection事件完成节点关联校验,即可实现流程逻辑的快速搭建,让前端交互更贴合用户操作习惯。核心拖拽配置代码:

// 开启节点拖拽(基于jsPlumb)
jsPlumbInstance.draggable(`node-${node.id}`, {
  containment: canvas, // 限制在Canvas内拖拽
  grid: [20, 20], // 网格吸附(可选)
  onDrag: (event) => {
    // 自定义磁吸逻辑:检测节点与周边元素的距离
    const targetNode = checkMagnet(event.target);
    if (targetNode) {
      jsPlumbInstance.setPosition(event.target, targetNode.x, targetNode.y);
    }
  }
});

// 监听连线创建事件,完成流程逻辑关联
jsPlumbInstance.on('connection', (conn) => {
  const sourceId = conn.sourceId.replace('node-', '');
  const targetId = conn.targetId.replace('node-', '');
  // 保存连线关系到流程数据模型
  flowData.connections.push({ source: sourceId, target: targetId });
});

三、快捷键系统:高效操作的辅助支撑

为提升专业用户的操作效率,宏天低代码流程设计器内置完善的快捷键系统,覆盖节点复制、删除、移动、连线等常用操作,适配 Windows 与 Mac 系统的快捷键差异,避免浏览器默认快捷键冲突。

通过监听keydown事件,判断按键组合实现对应功能,例如 Ctrl+C(复制节点)、Ctrl+V(粘贴节点)、Delete(删除节点 / 连线)、Ctrl+Z(撤销)、Ctrl+Y(重做)等;针对jsPlumb创建的连线,Delete 键可触发jsPlumbInstance.deleteConnection(conn)删除选中连线,同时提供快捷键提示面板,帮助用户快速熟悉操作,进一步优化前端交互体验,让流程设计更高效。

四、Undo/Redo 实现:保障操作安全的关键

流程设计过程中,用户误操作难以避免,Undo/Redo 功能是保障操作安全的核心,宏天低代码采用命令模式实现该功能,结合jsPlumb的 API 特性,确保每一步操作(包括节点增删、连线创建 / 删除)都可追溯、可回退。

将每一次操作封装为命令对象,例如 “创建连线” 命令包含execute(调用jsPlumbInstance.connect)、undo(调用jsPlumbInstance.deleteConnection)方法;“移动节点” 命令包含操作前后的坐标信息。通过两个栈分别存储历史操作与已撤销操作,执行新操作时推入历史栈并清空撤销栈,撤销时弹出历史栈元素并执行undo方法,重做时则弹出撤销栈元素并执行execute方法,兼顾性能与准确性,让用户可放心操作。核心命令示例:

// 连线创建命令
class CreateConnectionCommand {
  constructor(jsPlumbInstance, sourceId, targetId) {
    this.jsPlumb = jsPlumbInstance;
    this.sourceId = sourceId;
    this.targetId = targetId;
    this.connection = null;
  }
  
  // 执行创建连线
  execute() {
    this.connection = this.jsPlumb.connect({
      source: `node-${this.sourceId}`,
      target: `node-${this.targetId}`
    });
  }
  
  // 撤销:删除连线
  undo() {
    if (this.connection) {
      this.jsPlumb.deleteConnection(this.connection);
    }
  }
}

综上,宏天低代码可视化流程设计器的前端实现,以 Canvas 绘图引擎 + jsPlumb 库为基础,通过流畅的拖拽交互、便捷的快捷键系统与可靠的 Undo/Redo 功能,构建出高效、易用的流程设计工具。后续还将持续优化 Canvas 渲染性能与 jsPlumb 的连线交互细节(如连线样式定制、跨画布连线),进一步提升用户体验,助力企业快速搭建符合需求的业务流程。