1、下载图表插件dhtmlx-gantt

npm install dhtmlx-gantt --save 

2、html代码

<template>   <div id="gantt" ref="gantt"></div> </template>

3、js代码

<script>
import { gantt } from 'dhtmlx-gantt'
import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'

export default {
  name: 'SpeadDomeGantt',

  data() {
    return {
    }
  },

  mounted() {
    this.init()
  },

  methods: {
    // 初始化甘特图
    init() {
      //模拟数据
      let datalist = [
        //第一组 //整条数据需要带上render属性  里面多段的数据parent执行整条的id
        {
          id: 1,
          name: '小花',
          age: 18,
          render: 'split',
          text: '',
        },
        {
          id: 100,
          parent: 1,
          start_date: '2024-05-19 07:00:00',
          end_date: '2024-05-21 20:00:00',
          taskID: '111111111',
          text: '玩游戏',
          color: '#F56C6C',
        },
        {
          id: 101,
          parent: 1,
          start_date: '2024-05-19 07:00:00',
          end_date: '2024-05-21 20:00:00',
          taskID: '11111122',
          text: '事情一',
          color: '#67C23A',
        },
        {
          id: 102,
          parent: 1,
          start_date: '2024-05-22 07:20:00',
          end_date: '2024-05-22 20:00:00',
          text: '事情二',
          color: '#E6A23C',
        },
        {
          id: 103,
          parent: 1,
          start_date: '2024-05-23 07:20:00',
          end_date: '2024-05-24 20:00:00',
          text: '事情三',
          color: '#909399',
        },

        //第二组
        {
          id: 2,
          name: '小草',
          age: 16,
          render: 'split',
          text: '',
        },
        {
          id: 104,
          parent: 2,
          start_date: '2024-05-19 02:20:00',
          end_date: '2024-05-20 18:00:00',
          text: '玩游戏',
          color: '#E6A23C',
        },
        {
          id: 105,
          parent: 2,
          start_date: '2024-05-20 22:10:00',
          end_date: '2024-05-21 10:00:00',
          text: '事情四',
          color: '#909399',
        },
        {
          id: 106,
          parent: 2,
          start_date: '2024-05-21 17:20:00',
          end_date: '2024-05-22 20:00:00',
          text: '事情五',
          color: '#67C23A',
        },
        {
          id: 107,
          parent: 2,
          start_date: '2024-05-23 00:20:00',
          end_date: '2024-05-23 20:00:00',
          text: '事情六',
          color: '#F56C6C',
        },
      ]

      // 初始化甘特图并启用拖拽功能
      gantt.config.drag_move = true // 启用任务拖动
      gantt.config.drag_resize = true // 启用任务调整大小
      gantt.config.drag_progress = false // 禁用进度条拖动
      //gantt.config.readonly = true //甘蔗图只读属性
      gantt.config.links = { type: '0' } // 禁用连接线
      gantt.config.xml_date = '%Y-%m-%d %H:%i'
      gantt.config.scale_height = 100 //设置甘特图的表头高度
      //鼠标移入展示信息
      gantt.plugins({
        tooltip: true,
      })
      // 自定义展示信息
      gantt.templates.tooltip_text = function (start, end, task) {
        return `<b>任务名称:</b> ${task.text}<br/>
                <b>开始时间:</b> ${gantt.templates.tooltip_date_format(start)}<br/>
                <b>结束时间:</b> ${gantt.templates.tooltip_date_format(end)}<br/>
                <b>任务ID:</b> ${task.taskID}<br/>`
      }

      gantt.config.scale_unit = 'day' // 主单位是天
      gantt.config.date_scale = '%d %l' // 日期格式
      // 自定义子单位
      gantt.config.subscales = [
        { unit: 'month', step: 1, date: '%F %Y' }, // 显示月份和年份
        { unit: 'hour', step: 4, date: '%H' }, // 每4小时显示一次
      ]
      // 确保时间刻度从00开始
      gantt.config.min_column_width = 20 // 可根据需要调整宽度
      // 自定义第三行的时间刻度
      // 自定义日期格式以确保每一天的时间从00开始
      gantt.templates.scale_cell_class = function (date) {
        if (date.getHours() % 4 === 0) {
          return 'highlight'
        }
        return ''
      }
      // 保证时间刻度是从00开始
      // 找到最早的开始时间和最晚的结束时间
      let childTasks = datalist.filter((task) => task.start_date && task.end_date)
      let minStartDate = new Date(Math.min(...childTasks.map((task) => new Date(task.start_date))))
      let maxEndDate = new Date(Math.max(...childTasks.map((task) => new Date(task.end_date))))
      // 设置起始时间为最早开始时间的00:00
      minStartDate.setHours(0, 0, 0, 0)
      // 设置结束时间为最晚结束时间的后5日00:00
      maxEndDate.setDate(maxEndDate.getDate() + 5)
      maxEndDate.setHours(0, 0, 0, 0)

      gantt.config.start_date = minStartDate // 设置起始日期
      gantt.config.end_date = maxEndDate // 设置结束日期

      // 初始化甘特图
      gantt.init(this.$refs.gantt)

      //时间展示 2021-10-11 07:22
      gantt.templates.tooltip_date_format = gantt.date.date_to_str('%Y-%m-%d %H:%i')
      //鼠标移入展示信息
      gantt.config.round_dnd_dates = false //将任务开始时间和结束时间自动“四舍五入'
      gantt.config.root_id = 'root'
      //添加taba栏
      gantt.config.columns = [
        { name: 'name', label: '名称', align: 'center', width: 120 },
        { name: 'age', label: '年龄', align: 'center', width: 120 },
      ]
      //禁用拖拽项 拖拽类型
      gantt.attachEvent('onBeforeTaskDrag', function (id, mode, e) {
        var modes = gantt.config.drag_mode
        switch (mode) {
          case modes.move:
            break
          case modes.resize:
            break
          case modes.progress:
            break
        }
      })
      gantt.init(this.$refs.gantt)
      gantt.parse({ data: datalist })
      // 将进度条划到当前日期
      gantt.showDate(new Date())

      // 拖拽事件,可以向后台发请求
      gantt.attachEvent('onAfterTaskUpdate', function (id, item) {
        console.log(id, item)
      })
    },
  },
}
</script>

3、css代码

<style scoped>
#gantt {
  width: 100%;
  height: 400px;
}
</style>