使用Jsmind实现前端流程图功能

简介: 使用Jsmind实现前端流程图功能

需求:实现流程图功能,根据状态不同显示不同的颜色,点击有对应的点击颜色

思想:根据jsmind构建思维导图,改变节点背景颜色,获取点击节点事件当点击节点是设置节点选中背景图片。

注意:由于jsmind更新各版本api都有很大改动,所以我使用的都是官方文档注明的基于各版本都支持的api

效果:

这里的要素是根据接口返回的,具体接口数据如下:

root是根节点,chrldren是子要素,可以根据自己的需求自行改造

代码:

先引入jsmind库(我引入的最新版本0.5)

npm install jsmind@latest --save

找到刚才引入vue中的jsmind的npm包,可以看到jsmind.css,在这里可以修改我们想要的样式,但是如果在这里修改是不会更新到git版本里面去,所以我们需要在src->style文件夹内新scss文件,这样我们改动样式可以更新到git版本控制中。

79fdd460db33495a9f313abb47e510ef.png

新建一个scss文件内容如下:(自己新建了一个主题名字为034,可以自行更改)

/**
 * @license BSD
 * @copyright 2014-2023 hizzgdev@163.com
 * 
 * Project Home:
 *   https://github.com/hizzgdev/jsmind/
 */
/* important section */
.jsmind-inner {
    position: relative;
    overflow: auto;
    width: 100%;
    height: 100%;
    outline: none;
}
/*box-shadow:0 0 2px #000;*/
.jsmind-inner {
    moz-user-select: -moz-none;
    -moz-user-select: none;
    -o-user-select: none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
.jsmind-inner canvas {
    position: absolute;
}
/* z-index:1 */
svg.jsmind {
    position: absolute;
    z-index: 1;
}
canvas.jsmind {
    position: absolute;
    z-index: 1;
}
/* z-index:2 */
jmnodes {
    position: absolute;
    z-index: 2;
    background-color: rgba(0, 0, 0, 0);
    width: 100% !important;
    right: 40px;
}
/*background color is necessary*/
jmnode {
    position: absolute;
    cursor: default;
    max-width: 400px;
    box-shadow: 0;
}
/* 自定义自己的主题 */
jmnodes.theme-034 jmnode {
    width: 200px;
    height: 62px;
    text-align: left;
    color: #192C44;
    background-repeat: no-repeat;
    background-size: cover;
    padding: 7px 20px;
    font-size: 13px;
    border-radius: 4px;
}
/* 节点样式 */
jmnodes.theme-034 jmnode:hover {}
/* 鼠标悬停的节点样式 */
jmnodes.theme-034 jmnode.selected {
    color: #192C44;
    background-color: transparent;
}
jmnodes.theme-034 .topicbody {
    pointer-events: none;
    .title {
        font-size: 12px;
    }
    .body {
        display: flex;
        align-items: center;
        margin-top: 6px;
        .left {
            width: 7px;
            height: 7px;
            border-radius: 50%;
            margin-right: 10px;
        }
        .right {
            font-size: 12px;
        }
    }
}
jmnodes.theme-034 .acitve {
    pointer-events: none;
    .title {
        font-size: 12px;
        color: white;
    }
    .body {
        display: flex;
        align-items: center;
        margin-top: 6px;
        color: white !important;
        .left {
            width: 7px;
            height: 7px;
            background-color: #fff !important;
            border-radius: 50%;
            margin-right: 10px;
        }
        .right {
            font-size: 12px;
            color: white !important;
        }
    }
}
/* 选中的节点样式 */
jmnodes.theme-034 jmnode.root {
    width: 180px;
    height: 55px;
    text-align: center;
    padding: 10px;
    font-size: 16px;
}
jmnodes.theme-034 jmnode.root.selected {
    color: #192C44;
}
/* 根节点样式 */
jmnodes.theme-034 jmexpander {}
/* 展开/关闭节点的控制点样式 */
jmnodes.theme-034 jmexpander:hover {}

vue文件代码如下:

<template>
  <div class="jsmind">
    <el-card>
      <div class="content" id="jsmind_container"></div>
    </el-card>
  </div>
</template>
<script>
import JSMind from "jsmind";
import "@/style/jsmind.scss";
import { nest034getJsmind } from "@/api/datapretreatment";
export default {
  components: {},
  data() {
    return {
      mindData: "", //jsmind相关配置
      jm: "", //jsmind对象
      curcodeInfo: null, //当前选中节点信息
    };
  },
  created() {},
  mounted() {
    this.handleMind();
  },
  watch: {
    curcodeInfo: {
      handler() {},
    },
  },
  computed: {},
  methods: {
    // 初始化jsmind-----主题需要去jsmind的style里面去修改自定义主题样式
    initjsmind() {
      // 初始化配置
      var options = {
        container: "jsmind_container",
        theme: "034",
        editable: false,
        view: {
          engine: "canvas", // 思维导图各节点之间线条的绘制引擎
          hmargin: 10, // 思维导图距容器外框的最小水平距离
          vmargin: 20, // 思维导图距容器外框的最小垂直距离
          line_width: 2, // 思维导图线条的粗细
          line_color: "#C6DDFFFF", // 思维导图线条的颜色
        },
        layout: {
          hspace: 80, // 节点之间的水平间距
          vspace: 10, // 节点之间的垂直间距
          pspace: 10, // 节点与连接线之间的水平间距(用于容纳节点收缩/展开控制器)
        },
      };
      this.jm = new JSMind(options);
      const mind = {
        /* 元数据,定义思维导图的名称、作者、版本等信息 */
        meta: {
          name: "流程图",
          author: "dingguowei",
          version: "0.2",
        },
        /* 数据格式声明 */
        format: "node_tree",
        /* 数据内容 */
        data: this.mindData,
      };
      this.jm.show(mind);
      var that = this;
      // 增加监听点击节点事件,获取当前选中的节点
      this.jm.add_event_listener(function (type, node) {
        if (that.jm.get_selected_node() !== null) {
          // 设置curcodeInfo属性,监听节点是否为根节点,根节点不会改变curcodeInfo也就不会查询右侧日志,只有子节点会改变topic
          if (that.jm.get_selected_node().isroot === false) {
            // 恢复上一个节点的状态
            if (that.curcodeInfo !== null) {
              that.curcodeInfo.topic.className = "topicbody";
            }
            // 不为根节点
            that.curcodeInfo = that.jm.get_selected_node();
            // 更新节点背景颜色
            that.curcodeInfo.topic.className = "acitve";
            that.jm.update_node(that.curcodeInfo.id);
            that.refresh(that.curcodeInfo);
          }
        }
      });
    },
    // 配置mind信息
    async handleMind() {
      var that = this;
      await nest034getJsmind().then((res) => {
        let mindData = {
          id: res.data.root.name,
          topic: res.data.root.name,
          "background-image": that.getbgcimg(res.data.root.status),
          children: [],
        };
        res.data.root.children.map((item) => {
          mindData.children.push({
            id: item.name,
            topic: this.gethtml(item),
            "background-image": that.getbgcimg(item.status),
            activeimg: that.getbgcimg(item.status, true),
            noacitveimg: that.getbgcimg(item.status),
          });
        });
        that.mindData = mindData;
        that.initjsmind();
      });
      //  获取节点 ID
      var node_id = this.jm.get_node("温度").id;
      // 选中节点
      this.jm.select_node(node_id);
    },
    // 获取背景图片
    getbgcimg(val, acitve) {
      let url = "";
      if (acitve) {
        switch (val) {
          case "processing":
            url = "./img/jsmind/curprocessing.png";
            break;
          case "error":
            url = "./img/jsmind/curerror.png";
            break;
          case "finse":
            url = "./img/jsmind/curfinse.png";
            break;
          case "notstart":
            url = "./img/jsmind/curnotstart.png";
            break;
          default:
            url = "./img/jsmind/curfinse.png";
            break;
        }
        return url;
      } else {
        switch (val) {
          case "processing":
            url = "./img/jsmind/processing.png";
            break;
          case "error":
            url = "./img/jsmind/error.png";
            break;
          case "finse":
            url = "./img/jsmind/finse.png";
            break;
          case "notstart":
            url = "./img/jsmind/notstart.png";
            break;
          default:
            url = "./img/jsmind/finse.png";
            break;
        }
        return url;
      }
    },
    // 生成html
    gethtml(val) {
      let divObj = document.createElement("div");
      divObj.className = "topicbody";
      // 要素名称
      let title = document.createElement("div");
      title.className = "title";
      title.innerHTML = val.name;
      divObj.appendChild(title);
      // 要素状态
      let body = document.createElement("div");
      body.className = "body";
      let left = document.createElement("div");
      left.className = "left";
      left.style.backgroundColor = {
        processing: "#015DF3FF",
        finse: "#00C553FF",
        notstart: "#C7C7C7FF",
        error: "#F98100FF",
      }[val.status];
      body.appendChild(left);
      let right = document.createElement("div");
      right.className = "right";
      right.innerHTML = {
        processing: "进行中",
        finse: "已完成",
        notstart: "未开始",
        error: "异常报警",
      }[val.status];
      right.style.color = {
        processing: "#015DF3FF",
        finse: "#00C553FF",
        notstart: "#C7C7C7FF",
        error: "#F98100FF",
      }[val.status];
      body.appendChild(right);
      divObj.appendChild(body);
      return divObj;
    },
    // 更新视图
    refresh(node) {
      this.mindData.children.map((item) => {
        if (item.id === node.id) {
          item["background-image"] = item["activeimg"];
        } else {
          item["background-image"] = item["noacitveimg"];
        }
      });
      const mind = {
        /* 元数据,定义思维导图的名称、作者、版本等信息 */
        meta: {
          name: "流程图",
          author: "dingguowei",
          version: "0.2",
        },
        /* 数据格式声明 */
        format: "node_tree",
        /* 数据内容 */
        data: this.mindData,
      };
      this.jm.show(mind);
    },
  },
};
</script>
<style lang="scss" scoped>
.jsmind {
  width: 100%;
  //   height: 460px;
  .content {
    height: 420px;
    width: 100%;
  }
}
</style>


相关文章
|
9月前
|
前端开发 数据可视化 JavaScript
前端图形学实战: 100行代码实现几何画板的撤销重做等功能(vue3 + vite版)
前端图形学实战: 100行代码实现几何画板的撤销重做等功能(vue3 + vite版)
127 0
|
7月前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制
循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制
|
3月前
|
JSON 前端开发 搜索推荐
惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
131 4
|
4月前
|
前端开发 JavaScript
前端中的“+”连接符,居然有鲜为人知的强大功能!
【10月更文挑战第9天】前端中的“+”连接符,居然有鲜为人知的强大功能!
67 0
前端中的“+”连接符,居然有鲜为人知的强大功能!
|
5月前
|
前端开发 API
(WEB前端编辑DWG)在线CAD如何实现图形识别功能
mxcad 提供的图形识别功能可帮助用户快速识别和提取 CAD 图纸中的各种图形,如直线、多段线、弧线、圆及图块,显著提升设计效率。此功能不仅适用于图形分类,还能进行数量统计和快速定位,减少手动操作。用户可通过 API 进行二次开发,自定义识别逻辑。具体步骤包括打开在线示例、选择识别功能、设置识别参数并开始识别。更多开发文档请关注公众号:梦想云图网页 CAD。
|
4月前
|
Web App开发 存储 前端开发
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
237 0
|
4月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
540 0
|
5月前
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
120 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
4月前
|
前端开发 JavaScript Shell
深入解析前端构建利器:webpack核心概念与基本功能全览
深入解析前端构建利器:webpack核心概念与基本功能全览—
54 0
|
5月前
|
前端开发 开发者
在前端开发中,webpack 作为一个强大的模块打包工具,为我们提供了丰富的功能和扩展性
【9月更文挑战第1天】在前端开发中,Webpack 作为强大的模块打包工具,提供了丰富的功能和扩展性。本文重点介绍 DefinePlugin 插件,详细探讨其原理、功能及实际应用。DefinePlugin 可在编译过程中动态定义全局变量,适用于环境变量配置、动态加载资源、接口地址配置等场景,有助于提升代码质量和开发效率。通过具体配置示例和注意事项,帮助开发者更好地利用此插件优化项目。
104 13

热门文章

最新文章

  • 1
    【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    详解智能编码在前端研发的创新应用
  • 6
    巧用通义灵码,提升前端研发效率
  • 7
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 8
    智能编码在前端研发的创新应用
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    24
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    43
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    巧用通义灵码,提升前端研发效率
    84
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    137
  • 6
    详解智能编码在前端研发的创新应用
    92
  • 7
    智能编码在前端研发的创新应用
    75
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    35
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    111
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    73