自定义流程图
功能
- 新增节点,新增可新增条件节点和流程节点
- 删除节点
- 修改节点,点击查看后弹出抽屉进行节点属性的编辑
- 多选,按住shift键合并生成控制节点
- 反选,流程节点可反选,菜单中选择反选目标节点
- 保存位置,拖拽后保存位置
- 缩放和画布拖拽
- 实现流程节点的颜色配置(失败/成功/正常/开始/结束)
- 流程图中是否可以点击mask关闭抽屉
- 流程图界面的mask颜色配置
- 流程图界面的宽高配置
- 抽屉的宽度配置
- 返回了节点选择改变的事件
- 返回了更新节点数据的方法
- 返回了切换抽屉状态的方法
- 返回了获取当前流程图数据的方法
- 新增删除反选按钮是否展示的配置
- 新增菜单中条件节点的配置
- 新增菜单中选项文案的配置
- 删除节点的方法
- 所有前置节点的方法
安装
推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用
npm i jkstack-flow-chart
引入
根据需要可以选择再文件中引入,或者全局引入
1.文件引入,在使用得vue文件中引入
<script>
import FlowChart from 'jkstack-flow-chart' // 引入组件
import 'jkstack-flow-chart/dist/flow-chart.css' // 引入组件样式
export default {
components: {
FlowChart
}
}
</script>
2.全局引入,在main.js中全局引入
import FlowChart from 'jkstack-flow-chart' // 引入组件
import 'jkstack-flow-chart/dist/flow-chart.css' // 引入组件样式
Vue.use(FlowChart)
快速上手
<template>
<div id="app">
<FlowChart
ref="flowChart"
:data="data"
:height="height"
:width="width"
:closeSideBarClickMask="false"
:maskColor="maskColor"
:statusColor ="statusColor"
addFlowNodeText="流程节点"
addSwitchNodeText="条件节点"
:showDelBtn="true"
:showAddBtn="true"
:showBackBtn="false"
:shoViewBtn="false"
:addShowSwitchNode="false"
@node-selected="nodeSelecSted"
@node-add="nodeAdd"
@node-delete="nodeDel"
>
<!-- 插槽 -->
<template v-slot:sideBar>
<div class="rightMsg">
<div v-if="selectedNodes.type === 'flowNode'">
<div class="title">流程节点</div>
<input type="text" v-model="selectedNodes.label" placeholder="请输入标题">
<input type="text" v-model="selectedNodes.propertyOne" placeholder="节点属性">
<input type="text" v-model="selectedNodes.propertyTwo" placeholder="节点属性">
<input type="text" v-model="selectedNodes.propertyThree" placeholder="节点属性">
<input type="text" v-model="type" placeholder="各个项目中所存储的参数(类型)">
<input type="text" v-model="tell" placeholder="各个项目中所存储的参数(方式)">
<input type="text" v-model="people" placeholder="各个项目中所存储的参数(对象)">
<Button @click="saveNodeData">保存节点数据</Button>
<Button @click="closeSidebar">取消</Button>
</div>
<div v-if="selectedNodes.type === 'switchNode'">
<div class="title">条件节点</div>
<input type="text" v-model="type" placeholder="各个项目中所存储的参数(类型)">
<input type="text" v-model="tell" placeholder="各个项目中所存储的参数(方式)">
<input type="text" v-model="people" placeholder="各个项目中所存储的参数(对象)">
<Button @click="saveNodeData">保存节点数据</Button>
<Button @click="closeSidebar">取消</Button>
</div>
<div v-if="selectedNodes.type === 'controlNode'">
<div class="title">控制节点</div>
<input type="text" v-model="type" placeholder="各个项目中所存储的参数(类型)">
<input type="text" v-model="tell" placeholder="各个项目中所存储的参数(方式)">
<input type="text" v-model="people" placeholder="各个项目中所存储的参数(对象)">
<Button @click="saveNodeData">保存节点数据</Button>
<Button @click="closeSidebar">取消</Button>
</div>
</div>
</template>
</FlowChart>
<button @click="getData">保存流程图数据</button>
</div>
</template>
<script>
import FlowChart from './components/FlowChart.vue' // 引入组件
// import FlowChart from 'jkstack-flow-chart' // 引入组件
// import 'jkstack-flow-chart/dist/flow-chart.css' // 引入组件
export default {
name: 'App',
components: {
FlowChart
},
data () {
return {
selectedNodes: {},
statusColor: { // 状态颜色得配置
success: { color: '#67C23A' }, // 成功
error: { color: '#F56C6C' }, // 失败
normal: { color: '#409EFF' }, // 正常
start: { color: '#909399' }, // 开始
end: { color: '#909399' } // 结束
},
width: 1500, // 宽度
height: 600, // 高度
maskColor: 'rgba(255, 255, 255, 0.7)', // mask颜色
data: {}, // 流程图数据
type: '', // 各个项目中所需存储得字段
tell: '', // 各个项目中所需存储得字段
people: '' // 各个项目中所需存储得字段
}
},
methods: {
// 选择节点事件
nodeSelecSted (node) {
this.selectedNodes = node // 拿到当前点击得节点数据
},
// 新增节点事件
nodeAdd (node) {
console.log('新增', node)
this.selectedNodes = node
},
// 删除节点事件
nodeDel (node) {
console.log('删除', node)
},
// 保存节点数据
saveNodeData () {
if (this.selectedNodes) {
this.selectedNodes.task = { // *各个项目需求中所存储得内容请放进task对象
type: this.type,
tell: this.tell,
people: this.people
}
this.$refs.flowChart.updateItem(this.selectedNodes) // 更新图表节点方法调用,传入更改后得节点信息
this.$refs.flowChart.toggleSidebar() // 调用更改抽屉状态的方法
}
},
// 更改抽屉关闭/打开状态
closeSidebar () {
this.$refs.flowChart.toggleSidebar()
},
// 获取流程图数据保存
getData () {
console.log(this.$refs.flowChart.getData()) // 获取流程图中数据调用getData()方法
}
}
}
</script>
<style lang="scss" scoped>
#app{
width: 1500px;
border:1px solid #fff;
border-radius: 5px;
margin: 20px auto;
}
.rightMsg{
padding: 20px;
box-sizing: border-box;
}
.title{
font-size: 15px;
margin-bottom: 10px;
color: #666;
}
input{
width: 100%;
border: 1px solid #efefef;
line-height: 35px;
padding: 0 10px;
box-sizing: border-box;
border-radius: 8px;
font-size: 14px;
outline: none;
}
textarea{
width: 100%;
border: 1px solid #efefef;
line-height: 35px;
padding: 10px;
box-sizing: border-box;
border-radius: 8px;
font-family: '微软雅黑';
font-size: 14px;
outline: none;
}
button{
width: 120px;
height: 45px;
line-height: 45px;
text-align: center;
background: #3388FF;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
margin: 10px 20px;
}
</style>
API
FlowChart Attributes
参数 |
说明 |
类型 |
默认值 |
width |
指定画布宽度,单位为 'px' |
number |
1200 |
height |
指定画布高度,单位为 'px' |
number |
600 |
sliderWidth |
指定抽屉宽度,单位为 'px' |
number |
400 |
data |
显示的图表数据 配置项 |
object |
{nodes: [], edges: []} |
closeSideBarClickMask |
是否可以通过点击 mask 关闭抽屉 |
boolean |
true |
maskColor |
mask遮罩层的颜色 |
string |
rgba(0,0,0,0.3) |
statusColor |
节点状态颜色 (success/error/normal/start/end) |
object |
默认值 |
showBackBtn |
是否展示反选按钮 |
boolean |
true |
showAddBtn |
是否展示新增按钮 |
boolean |
true |
showDelBtn |
是否展示删除按钮 |
boolean |
true |
showViewBtn |
是否展示查看按钮 |
boolean |
true |
addFlowNodeText |
新增菜单中新增流程节点得文案 |
string |
新建流程节点 |
addShowSwitchNode |
新增菜单中是否展示‘新增条件节点’ |
boolean |
true |
addSwitchNodeText |
新增菜单中新增条件节点得文案 |
string |
新建条件节点 |
节点状态颜色默认值
statusColor: {
success: { color: '#67C23A' },
error: { color: '#F56C6C' },
normal: { color: '#409EFF' },
start: { color: '#909399' },
end: { color: '#909399' }
}
FlowChart Events
事件名 |
说明 |
参数 |
node-selected |
当用户手动点击当前节点查看按钮触发的事件 |
node |
node-add |
当用户手动点击新增节点和合并控制节点时触发的事件 |
node |
node-delete |
当用户手动删除节点时触发的事件 |
- |
FlowChart Methods
方法名 |
说明 |
参数 |
deleteItem |
用于删除关联的节点 |
nodeId |
updateItem |
用于更新节点数据 |
node |
getAllPreNodeList |
用于返回所有前置节点 |
nodeId |
fitView |
canvas适应视口 |
padding: [top, right, bottom, left] |
toggleSidebar |
用于切换抽屉的状态 |
- |
getData |
用于用户获取当前数据 |
- |
FlowChart Slot
slot name |
说明 |
sideBar |
抽屉的内容,如果需要编辑当前节点,需要自定义 dom ,并且提交数据的时候调用 updateItem 方法更新节点信息| |
data
- 数据格式如下,分为nodes(节点)和edges(关系),
data: {
nodes: [
{
id: 'start',
type: 'flowNode',
label: '开始',
state: 'start',
x: 100,
y: 100,
propertyOne: '节点属性',
propertyTwo: '节点属性',
propertyThree: '节点属性',
task: {}
},
{
id: 'xxx1',
type: 'switchNode',
label: '第一个节点',
state: 'normal',
x: 480,
y: 100,
propertyOne: '节点属性',
propertyTwo: '节点属性',
propertyThree: '节点属性',
task: {}
},
{
id: 'xxx2',
type: 'controlNode',
label: '第二个节点',
state: 'normal',
x: 480,
y: 140,
propertyOne: '节点属性',
propertyTwo: '节点属性',
propertyThree: '节点属性',
task: {}
}
],
edges: [
{
source: "start",
target: "xxx1",
type: "customEdge"
},
{
source: "xxx1",
target: "xxx2",
type: "customBackEdge"
}
]
}
节点(nodes)
属性 |
说明 |
备注 |
id |
节点得唯一标识 |
不可更改 |
type |
节点类型(流程节点:flowNode/条件节点:switchNode/控制节点:controlNode) |
不可更改 |
label |
节点标题 |
- |
state |
节点状态(成功:success/异常:error/正常:normal/开始:start/结束:end) |
- |
x |
相对canvas得X坐标 |
不可更改 |
y |
相对canvas得y坐标 |
不可更改 |
propertyOne/propertyTwo/propertyThree |
节点属性 |
- |
task |
根据需求所需绑定该节点得属性,请添加进task,避免组件与业务混淆 |
- |
anchorPoints |
节点入口/数组 |
不可更改 |
style |
节点样式/对象 |
不可更改 |
边(edges)
属性 |
说明 |
备注 |
source |
源ID |
不可更改 |
target |
目标ID |
不可更改 |
targetAnchor |
源坐标索引值 |
不可更改 |
sourceAnchor |
目标坐标索引值 |
不可更改 |
type |
类型(自定义边:customEdge/自定义反选边:customBackEdge) |
不可更改 |
style |
边样式 |
不可更改 |
startPoint |
源出口坐标 |
不可更改 |
endPoint |
目标入口坐标 |
不可更改 |