【前端vue进阶实战】:从零打造一个流程图、拓扑图项目【Nuxt.js + Element + Vuex】 (一)

本系列教程是用Vue.js + Nuxt.js + Element + Vuex + 开源js绘图库,打造一个属于自己的在线绘图软件,最终效果:topology.le5le.com 。如果你觉得好,欢迎给文章和开源库点赞,让我们更有动力去做好!

本系列教程源码地址:Github

一、创建项目框架

1. 使用Nuxt.js向导创建项目

yarn create nuxt-app topology-vue
// 注意在后面提示中,上移下移,按空格选中 Element
复制代码

选择Element后,在plugins文件夹下会自带添加Element的插件配置

完成后,在nuxt.config.js中配置head相关信息,主要有两个阿里字体文件: 左侧工具栏字体文件: //at.alicdn.com/t/font_1113798_0532l8oa6jqp.css

右侧属性字体图标: //at.alicdn.com/t/font_1331132_5lvbai88wkb.css

head: {
    title: ‘乐吾乐 Topology - 开源免费绘图工具‘,
    meta: [
      { charset: ‘utf-8‘ },
      { name: ‘viewport‘, content: ‘width=device-width, initial-scale=1‘ },
      {
        hid: ‘description‘,
        name: ‘description‘,
        content:
          ‘一个基于typescript + canvas的好用开源绘图工具和绘图引擎。易集成到自己的前端项目、还可以方便自定义图形库,支持微服务架构图、流程图、时序图、活动图、类图等‘
      }
    ],
    link: [
      { rel: ‘icon‘, type: ‘image/x-icon‘, href: ‘/favicon.ico‘ },
      {
        rel: ‘stylesheet‘,
        href: ‘//at.alicdn.com/t/font_1113798_0532l8oa6jqp.css‘
      },
      {
        rel: ‘stylesheet‘,
        href: ‘//at.alicdn.com/t/font_1331132_5lvbai88wkb.css‘
      }
    ]
  },
复制代码

2. 添加SCSS支持

2.1 安装scss的依赖包

yarn add node-sass sass-loader  -D
复制代码

2.2 给style标签加上lang="scss"标记

<style lang="scss">
.page {
  width: 100%;
  height: 100%;
}
</style>
复制代码

3. 添加一个全局公用css

3.1 在asstes/css文件夹下新建一个base.scss公用全局样式文件

3.2 导入 在layouts/default.vue的script脚本中导入:

import ‘~/assets/css/base.scss‘
复制代码

二、网页布局

1. 顶部导航栏

修改layouts/default.vue为导航栏 + body两部分

其中: 为Nuxt.js框架中对应页面路由的视图部分。

2. 修改首页为左中右三栏

修改pages/index.vue为左中右三栏布局

三、创建画布

1. 下载topology依赖包

yarn add  topology-core topology-class-diagram topology-activity-diagram topology-flow-diagram topology-sequence-diagram -D
复制代码

其中,topology-core为核心库引擎,其他的为图形库。具体参考:开发文档

2. 注册图形库

我们单独写个pages/canvas.server.js服务,用来提供topology相关服务

这里主要提供注册和左侧工具栏数据。

3. 加载图形库

3.1 准备canvas相关数据

data() {
    return {
		  // 左侧工具栏
      tools: Tools,
			// 图形库
      canvas: {},
			// 图形库选项:https://www.yuque.com/alsmile/topology/canvas#hOupV
      canvasOptions: {
        rotateCursor: ‘/img/rotate.cur‘
      },
			// 右侧属性栏数据
      props: {
        node: null,
        line: null,
        multi: false
      }
    }
  }
复制代码

3.2 注册图形库

created() {
    canvasRegister()
}
复制代码

3.3 在父节点已经渲染后,new创建画布

mounted() {
    this.canvasOptions.on = this.onMessage
    this.canvas = new Topology(‘topology-canvas‘, this.canvasOptions)
}
复制代码

其中,onMessage 表示接受画布的消息回调函数

3.4 左侧工具栏支持鼠标拖放

<a
            v-for="(btn, i) in item.children"
            :key="i"
            :title="btn.name"
            :draggable="btn.data"
            @dragstart="onDrag($event, btn)"
          >
            <i :class="`iconfont ${btn.icon}`"></i>
          </a>
复制代码
methods: {
    onDrag(event, node) {
      event.dataTransfer.setData(‘Text‘, JSON.stringify(node.data))
    }
  }
复制代码

只需要给拖放数据设置节点格式的字符串即可(画布自带支持拖放接收处理),节点数据格式文档:www.yuque.com/alsmile/top…

3.5 右侧属性栏

  • 3.5.1 自定义属性栏组件 在components下创建CanvasProps.vue
<template>
  <div>
	  <!-- 选中为空 -->
    <div v-if="!props.node && !props.line && !props.multi">
      <div class="title">欢迎使用le5le-topology!</div>
      <div class="group">
        <a class="star" href="https://github.com/le5le-com/topology" target="_blank">喜欢,点击这里打个star吧</a>
        <a href="https://www.yuque.com/alsmile/topology" target="_blank">使用教程</a>
        <br />
        <a
          href="http://topology.le5le.com/assets/img/topology_wechat.jpg?t=1"
          target="_blank"
        >微信交流群(大群)</a>
        <br />
        <a href="http://topology.le5le.com/assets/img/topology_wechat2.jpg" target="_blank">微信交流群2</a>
        <br />
        <a href="https://www.yuque.com/alsmile/topology/faq#EVbCgt" target="_blank">联系我们</a>
      </div>
      <div class="title">[Todo] 未来规划</div>
      <ul class="group">
        <li>Github issues</li>
        <li>React demo</li>
        <li>Vue3 demo</li>
        <li>系列教程</li>
      </ul>
      <div class="bottom">
        <div class="title">小提示</div>
        <ul class="group">
          <li>方向键:控制节点移动5个像素</li>
          <li>Ctrl + 方向键:控制节点移动1个像素</li>
          <li>Ctrl + 鼠标移动:移动整个画布</li>
          <li>Ctrl + 鼠标滚轮:缩放</li>
          <li>添加或选中节点,右侧属性支持上传各种图片哦</li>
        </ul>
      </div>
    </div>
		<!-- 选中节点 -->
    <div v-if="props.node">
      <div class="title">位置和大小</div>
      <div class="items">
        <div class="flex grid">
          <div>X(px)</div>
          <div class="ml5">Y(px)</div>
        </div>
        <div class="flex grid">
          <div>
            <el-input-number
              v-model="props.node.rect.x"
              controls-position="right"
              @change="onChange"
            ></el-input-number>
          </div>
          <div class="ml5">
            <el-input-number
              v-model="props.node.rect.y"
              controls-position="right"
              @change="onChange"
            ></el-input-number>
          </div>
        </div>
      </div>
      <div class="items">
        <div class="flex grid">
          <div>宽(px)</div>
          <div class="ml5">高(px)</div>
        </div>
        <div class="flex grid">
          <div>
            <el-input-number
              v-model="props.node.rect.width"
              controls-position="right"
              @change="onChange"
            ></el-input-number>
          </div>
          <div class="ml5">
            <el-input-number
              v-model="props.node.rect.height"
              controls-position="right"
              @change="onChange"
            ></el-input-number>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script >
export default {
  data() {
    return {}
  },
  props: {
    props: {
      type: Object,
      require: true
    }
  },
  methods: {
    onChange(value) {
      this.$emit(‘change‘, this.props.node)
    }
  }
}
</script>
复制代码

其中,props.node、line、multi分别表示是否选中节点、连线、多个对象。 这里我们暂时没有用到vuex(后面教程介绍),直接使用原生的双向绑定更简单。用$emit通知父组件属性改变事件。

相关属性值,参数API文档:www.yuque.com/alsmile/top…

  • 3.5.2 引用右侧属性组件
<div class="props">
      <CanvasProps :props.sync="props" @change="onUpdateProps"></CanvasProps>
</div>
复制代码

同样,我们利用.sync关键字使用双向绑定,并接收chang事件,反馈给画布组件:

onUpdateProps(node) {
      // 如果是node属性改变,需要传入node,重新计算node相关属性值
      // 如果是line属性改变,无需传参
      this.canvas.updateProps(node)
}
复制代码

其他

自此,一个简单的绘图项目就完成了,后续功能完善待续。

但,但,但...右侧属性栏,希望大家根据开发文档去参与完善,展示自己舞台的机会到了,可加入贡献者名单哦!不清楚的,欢迎联系管理员:(微信)alsmile123,或加群:

如何贡献

通过GitHub的pr方式: 0. 阅读开发文档,了解相关属性。

  1. fork仓库到自己名下
  2. 本地修改并提交到自己的git仓库
  3. 在自己的fork仓库找到 “Pull request” 按钮,提交

开源项目不易,欢迎大家一起参与,给【文章、GitHub开源库】点星点赞,或资助服务器:

原文地址:https://www.cnblogs.com/Alsmile/p/11909996.html

时间: 2024-10-21 03:12:35

【前端vue进阶实战】:从零打造一个流程图、拓扑图项目【Nuxt.js + Element + Vuex】 (一)的相关文章

使用Vue脚手架(vue-cli)从零搭建一个vue项目

注:在搭建项目之前,请先安装一些全局的工具(如:node,vue-cli等) node安装:去node官网(https://nodejs.org/en/)下载并安装node即可,安装node以后就可以正常使用npm命令 全局安装vue-cli工具:npm install vue-cli -g 开始创建项目: 找一个合适的位置,打开命令窗口,使用vue初始化基于webpack的新项目 vue init webpack vue-demo //注意名称太长的话它会有错误提示,就像VueDemo 我们可

2017.7.1 慕课网-Java从零打造企业级电商项目实战:项目初始化

1.项目初始化 1.1 新建maven项目 (1)new project -> maven -> maven-archetype-webapp project name:mmall project location:E:\lyh\file\workspace\mmall_learning\mmall (2)新增main/java,src/test,src/test/java,并且分别标记为source root,test source root(选中文件,右键mark directory as

Java从零打造企业级电商项目实战-服务端

第1章 课程介绍(导学,项目演示,课程安排,架构演进)本章详细介绍Java服务端课程的内容,项目演示(http://www.happymmall.com),然后还介绍下课程安排,最后会讲解一下高大上的架构是如何一步一步从一台服务器演变到高性能.高并发.高可用架构的过程并讲解在这过程中大型架构演进思想以及代码演进细节....第2章 开发环境安装与配置讲解.实操(linux,windows)本章将手把手领大家在windows和linux环境下安装jdk.tomcat.maven.vsftpd.ngi

2017.7.1 慕课网-Java从零打造企业级电商项目实战:用户模块设计与开发

2. 用户模块设计与开发 2.1 要实现的功能 2.2 mmall_user表 2.3 用户模块接口设计 (1)门户-用户接口 http://git.oschina.net/imooccode/happymmallwiki/wikis/%E9%97%A8%E6%88%B7_%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3 (2)后台-用户接口 http://git.oschina.net/imooccode/happymmallwiki/wikis/%E5%90%8E%E

如何打造一个&quot;逼格&quot;的web前端项目

最近利用空余的时间(坐公交车看教程视频),重新了解了前后端分离,前端工程化等概念学习,思考如何打造一个"逼格"的web前端项目. 前端理论篇 前端代码规范:制定前端开发代码规范文档. PS:重中之中,为了下一步实现前端工程化. 编码风格有很多.团队代码规范一定要统一.便于维护web项目.     接口文档规范:制定RESTful架构接口规范文档. PS:果断使用用apiDoc构建API文档.美观好看,易于维护. 还用Word或者Excel写文档,太low了. 前后端分离:简单理解为前端

web前端入门到实战:制作一个百度首页

一. 我们制作一个百度首页作为练习,可直接复制该代码保存后缀名为.html来查看 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>d93_baidu_home_exercise</title> <style> .header{ height: 250px; /*background-color

Vue全家桶实战 从零独立开发企业级电商系统

Vue全家桶实战 从零独立开发企业级电商系统(免费升级Vue3.0)现阶段,电商系统随处可见,具有很大市场潜力:同时因为商城系统复杂,涉及到丰富的知识点,如果能进行电商系统的开发,其它各类型的前端系统也能掌握.本课程以Vue全家桶作为主要的技术体系,模拟小米商城,带大家从0开始开发网页和交互功能.你能进行完整的项目架构.体会页面开发的全流程.学习丰富的技术栈和各类组件知识,还能了解Git.动画.开发调试等方面的知识.同时项目本身具有很强的实用性,稍作修改,便能"为我所用".相信此课程能

[后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多说,直接进入主题. 二.整体架构设计介绍 首先看下整个项目的架构设计图: 从上图可以看出整个项目的一个整体结构,接下来,我来详细介绍了项目的整体架构: 采用Asp.net Web API来实现REST 服务.这样的实现方式,已达到后端服务的公用.分别部署和更好地扩展.Web层依赖应用服务接口,并且使

Vue.js前端MVVM框架实战篇

相信大家对vue.js这个前端框架有了一定的了解.想必也想把Vue急切的运用在项目中,看看它的魅力到底有多大?别急,今天我会满足大家的想法. 我们一起来看看“Webpack+Vue”的开发模式相比以往老项目(Gulp+jQuery)的开发模式的魅力在哪里. 一.配置开发环境 1.先安装Node和Webpack 2.建立一个文件夹为:Vue-project,然后初始化生成package.json.运行以下指令: npm init 初始化完成后,添加项目开发所依赖的包 "dependencies&q