npm create vite@latest markdown-to-mindmap -- --template vue
npm install
npm run dev
2025年8月14日小于 1 分钟
npm create vite@latest markdown-to-mindmap -- --template vue
npm install
npm run dev
npm create vite@latest flow-control-demo -- --template vue
npm install
npm run dev
npm create vite@latest match-condition-demo -- --template vue
cd match-condition-demo
npm install
npm run dev
基于 LogicFlow 实现一个类似 dify 的流程编辑器,关键是把核心能力聚焦好,做到可用且易扩展。
下面是我认为最重要的几个能力和特性,以及背后的原因:
原因:可视化流程编辑的基础,用户需要从左侧面板快速拖拽节点放到画布。
具体点:
npm create vite@latest logic-flow-demo -- --template vue
cd logic-flow-demo
npm install
npm run dev
可以拖拽节点到 LogicFlow 画布上,完成拖拽新增节点的核心交互。
FlowEditor.vue
,实现完整左右布局{% raw %}
{{ node.label }}
import { ref, onMounted, onBeforeUnmount } from 'vue'
import LogicFlow from '@logicflow/core'
import '@logicflow/core/dist/index.css'
const lfContainer = ref(null)
let lf = null
const draggedNode = ref(null) // 拖拽中节点数据
// 定义可拖拽节点列表
const nodeList = [
{ type: 'rect', label: '矩形节点' },
{ type: 'circle', label: '圆形节点' },
// 可以继续扩展节点类型
]
onMounted(() => {
lf = new LogicFlow({
container: lfContainer.value,
width: 800,
height: 600,
})
lf.render()
})
onBeforeUnmount(() => {
lf && lf.destroy()
lf = null
})
function onDragStart(node) {
draggedNode.value = node
}
function onDrop(event) {
event.preventDefault()
if (!draggedNode.value) return
// 计算画布内放置点坐标
// LogicFlow 容器左上角相对页面的偏移
const rect = lfContainer.value.getBoundingClientRect()
// 画布坐标 = 鼠标坐标 - 容器左上角坐标
const x = event.clientX - rect.left
const y = event.clientY - rect.top
lf.addNode({
id: `node_${Date.now()}`, // 唯一ID
type: draggedNode.value.type,
x,
y,
text: draggedNode.value.label,
})
draggedNode.value = null
}
.flow-editor {
display: flex;
gap: 16px;
padding: 12px;
}
/* 左侧节点面板 */
.node-panel {
width: 160px;
border: 1px solid #ccc;
padding: 8px;
background: #f9f9f9;
user-select: none;
}
.node-item {
padding: 8px;
margin-bottom: 8px;
border: 1px solid #aaa;
border-radius: 4px;
cursor: grab;
background: white;
text-align: center;
}
.node-item:active {
cursor: grabbing;
}
/* 画布 */
.flow-canvas {
flex: 1;
border: 1px solid #ddd;
height: 600px;
background: #fff;
}
{% endraw %}
好!我们进入第三步:实现节点选中,并在右侧显示该节点的属性面板,支持动态编辑节点参数。
FlowEditor.vue
代码,完成左右中右三栏布局好!我们进入第4步:支持连线和连线属性编辑
好嘞!进入第4步,支持连线(Edge)以及连线属性编辑。
LogicFlow 默认支持连线创建和编辑,无需额外配置。