npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

jkstack-flow-chart

v1.1.14

Published

Custom FLow Chart Plugin

Downloads

26

Readme

自定义流程图

功能

  • 新增节点,新增可新增条件节点和流程节点
  • 删除节点
  • 修改节点,点击查看后弹出抽屉进行节点属性的编辑
  • 多选,按住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 | 目标入口坐标 | 不可更改 |