使用EChars实现较为复杂的甘特图,包含多任务组合,完整到mock好数据的代码

最近接到一个将多人任务进度做成甘特图的需求,本以为用echars很容易就实现了,没想到啊,断断续续搞的头大,大概就是使用EChars官网的实栗不足以打到需求目标,所以开始了我为期一周的修修补补,终于是完成了,写一下总结:

包含了缩放、横轴分组显示一行展示多条内容、以及数据之间的对比效果

首先效果图上个: 数据mock有点少,可自行添加,项目中数据量大,我添加了分页,可按需添加
在这里插入图片描述
点击效果:在这里插入图片描述
点击对比效果:
在这里插入图片描述
右边的点击效果这次需求赶还没有添加,后续更新。。。上代码啦

加粗!! 完整到带mock数据的代码~~

index.vue

<style scoped lang="scss" src="./_.scss" />
<style lang="scss" src="./index.scss" />
<template lang="pug" src="./_.pug" />
<script src="./_.js" />

_.js

/**
 * 工序多人模式甘特图
 * 甘特图官网:https://echarts.apache.org/zh/option.html#title
 */

import echarts from 'echarts';
import moment from 'moment';
import * as R from 'ramda';

import {
    MOCKData, employeesMOCK } from './constant';

// 注意echarts版本,高版本不支持透明度rgba,以下代码版本为3.8.5
export default {
   
  name: 'instructGanttCopy',

  data() {
   
    return {
   
      targetDate: moment().format('YYYY-MM-DD'),
      ganttChart: null,
      chartData: [],
      employeeIds: {
   },
      employeeIdsTable: [],
    };
  },

  computed: {
   
  },

  mounted() {
   
    window.addEventListener(
      'resize',
      window._.debounce(() => {
   
        this.resizeCharts();
      }, 200),
    );
    this.searchResult();
    // this.initChart();
  },

  methods: {
   

    searchResult() {
   
      this.chartData = (R.map(item => ({
   
        ...item,
        factStartTime: moment(item.factStartTime).format('YYYY-MM-DD') === '1971-01-01' ? '--' : item.factStartTime,
        factEndTime: moment(item.factEndTime).format('YYYY-MM-DD') === '1971-01-01' ? '--' : item.factEndTime,
      }), MOCKData)) || [];
      const setEmp = (!R.isEmpty(MOCKData) && [...new Set(MOCKData.map(x => x.employeeId))]) || [];
      const emp = (setEmp && !R.isEmpty(setEmp) && setEmp.map((item, index) => {
   
        const noPeopleEquipments = R.map(x => !R.isEmpty(x) && `${
     x.equipments},`, R.filter(employee => !R.isEmpty(employee) && employee.employeeId === 'no_people', MOCKData));
        return {
   
          [item]: {
   
            ...employeesMOCK[index],
            employeeOrEquipments: item === 'no_people' ? ((!R.isEmpty(noPeopleEquipments) && [...new Set(noPeopleEquipments)]) || '') : item,
          },
        };
      })) || {
   };
      this.employeeIds = emp && !R.isEmpty(emp) && R.reduce((cur, per) => Object.assign(cur, per), {
   }, emp);
      this.employeeIdsTable = Object.values(this.employeeIds);
      this.initChart()
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 Mock.js 生成包含随机数据的响应对象,你需要在前端的 JavaScript 代码中引入 Mock.js 库并定义模板。然后,你可以在需要随机数据的地方使用这个模板生成数据。 首先,你需要在 HTML 文件中引入 Mock.js 库。你可以从 Mock.js 官方网站下载库文件,或者使用一些在线 CDN。例如,你可以在 `<head>` 标签中添加以下代码来引入 Mock.js: ```html <script src="https://cdn.jsdelivr.net/npm/mockjs@1.1.0/dist/mock.js"></script> ``` 然后,在你的 JavaScript 代码中,使用 Mock.js 定义模板并生成随机数据。下面是一个示例: ```javascript // 使用 Mock.js 定义模板 const template = { 'name': '@cname', // 随机生成中文名字 'age|18-60': 0, // 随机生成18到60之间的整数 'email': '@email', // 随机生成邮箱 'avatar': '@image("200x200")' // 随机生成200x200的图片链接 }; // 使用模板生成随机数据 const data = Mock.mock(template); console.log(data); ``` 你可以将上述代码放在你的 JavaScript 文件中的适当位置,例如在页面加载完成后的 `DOMContentLoaded` 事件处理程序中。 注意,Mock.js 是一个前端库,它通过拦截 AJAX 请求来模拟后端接口返回的数据。通常情况下,你需要在前端开发环境中运行你的代码,例如在本地的开发服务器上。这样,当你发送 AJAX 请求时,Mock.js 就可以拦截请求并返回随机数据。 如果你使用的是 Vue.js、React 或 Angular 等前端框架,你可以在相应的组件中引入 Mock.js,并在开发环境中使用它来模拟数据。具体的用法可能会因框架而异,请参考相应框架的文档或示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值