vue3使用Echarts图表生成项目进度甘特图

先看效果

代码展示

<template>
  <h1>项目进度甘特图</h1>
  <div id="app">
    <!-- Echarts 图表 -->
    <div ref="progressChart" class="progressChart"></div>
  </div>
</template>

<script setup>
import { onMounted, ref } from 'vue';
import * as echarts from 'echarts';
import axios from '@/utils/axios-config';
const progressChart = ref(null); // Ref for Echarts initialization


onMounted(async () => {
  
  const projectId = localStorage.getItem('projectId');
  
  try {
    
    const response = await axios.get(`/project-node/get/${projectId}`);
    const projectData = response.data;

    // Initialize Echarts chart after fetching data
    const chart = echarts.init(progressChart.value);

    const option = {
      tooltip: {
        trigger: 'axis',
        formatter(params) {
          if (params[1].data && params[0].data) {
            return `<div>开始时间:${params[1].data}</div>` + `<div>结束时间:${params[0].data}</div>`;
          } else {
            return '';
          }
        },
        axisPointer: {
          type: 'shadow'
        }
      },
      grid: {
        containLabel: true,
        show: false,
        right: 80,
        left: 40,
        bottom: 40,
        top: 20,
        backgroundColor: '#fff'
      },
      legend: {
        data: ['持续时间'],
        align: 'auto',
        top: 'bottom'
      },
      xAxis: {
        type: 'time',
        position: 'top',
        axisTick: {
          show: false
        },
        axisLine: {
          show: false
        },
        splitLine: {
          show: true
        }
      },
      yAxis: {
        inverse: true,
        axisTick: {
          show: false
        },
        axisLine: {
          show: false
        },
        data: ['策划评审', '立项评审', '详细方案评审', '测试验证', '样机评审', '样机定版', '小批量评审', '批量评审', '结项 ']
      },
      //color: ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'purple','#007acc','green'], // 自定义调色盘的颜色
      series: [
        {
          name: '持续时间',
          type: 'bar',
          stack: 'duration',
          itemStyle: {
            color: '#007acc',
            borderColor: '#fff',
            borderWidth: 1
          },
          zlevel: -1,
          data: [
            projectData.mastermindFinish,
            projectData.projectFinish,
            projectData.schemeFinish,
            projectData.testFinish,
            projectData.prototypeFinish,
            projectData.orderingFinish,
            projectData.smallbatchFinish,
            projectData.batchFinish,
            projectData.junctionFinish
          ]
        },
        {
          name: '持续时间',
          type: 'bar',
          stack: 'duration',
          itemStyle: {
            color: '#fff'
          },
          zlevel: -1,
          z: 9,
          data: [
            projectData.mastermindPlan,
            projectData.projectPlan,
            projectData.schemePlan,
            projectData.testPlan,
            projectData.prototypePlan,
            projectData.orderingPlan,
            projectData.smallbatchPlan,
            projectData.batchPlan,
            projectData.junctionPlan
          ]
        }
        
      ]
    };

    chart.setOption(option);

    // Resize chart on window resize
    window.addEventListener('resize', () => {
      chart.resize();
    });

  } catch (error) {
    console.error('Error fetching project data:', error);
  }
});
</script>

<style scoped>
#app {
  display: flex;
  justify-content: center;
  align-items: center;
}
.progressChart {
  width: 80%;
  height: 500px;
  border: 1px solid #aaa;
}
</style>
相关推荐
活宝小娜3 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点3 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow3 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
刚刚好ā4 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
会发光的猪。6 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客6 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
周全全7 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
ZwaterZ7 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue
码农六六7 小时前
vue3封装Element Plus table表格组件
javascript·vue.js·elementui
徐同保7 小时前
el-table 多选改成单选
javascript·vue.js·elementui