简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

jQuery EasyUI甘特图插件实战案例详解轻松实现项目进度管理可视化

3万

主题

349

科技点

3万

积分

大区版主

木柜子打湿

积分
31898

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-18 11:50:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在项目管理中,甘特图是一种非常直观和有效的工具,用于可视化项目进度、任务分配和时间安排。jQuery EasyUI作为一个流行的前端UI框架,提供了强大的甘特图插件,可以帮助开发者快速构建功能丰富的项目进度管理系统。本文将详细介绍如何使用jQuery EasyUI甘特图插件,通过实战案例展示如何轻松实现项目进度管理的可视化。

jQuery EasyUI和甘特图的基本概念

jQuery EasyUI简介

jQuery EasyUI是一个基于jQuery的UI插件集合,为web开发提供了丰富的UI组件,包括datagrid、tree、tabs、form等。它帮助开发者轻松构建具有现代化界面的web应用程序,减少了大量的前端开发工作。

甘特图简介

甘特图(Gantt Chart)是由亨利·甘特(Henry Gantt)在20世纪初发明的项目管理工具。它通过条形图的形式展示项目的时间表,包括任务的开始时间、结束时间、持续时间以及任务之间的关系。甘特图使得项目经理和团队成员能够直观地了解项目进度、资源分配和关键路径。

jQuery EasyUI甘特图插件

jQuery EasyUI甘特图插件是EasyUI框架中的一个组件,专门用于创建交互式的甘特图。它支持任务的增加、修改、删除,任务之间的依赖关系设置,以及各种自定义选项,如颜色、样式、工具提示等。

环境准备和插件引入

必要条件

在使用jQuery EasyUI甘特图插件之前,需要准备以下环境:

1. jQuery库(1.11.x或更高版本)
2. jQuery EasyUI库(1.5.x或更高版本)
3. 甘特图插件(gantt.js)

引入必要的文件

可以通过CDN引入这些文件,也可以下载到本地使用。以下是使用CDN引入的示例代码:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI甘特图示例</title>
  6.     <!-- 引入jQuery -->
  7.     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  8.     <!-- 引入jQuery EasyUI核心文件 -->
  9.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  10.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  11.     <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  12.     <script src="https://www.jeasyui.com/easyui/locale/easyui-lang-zh_CN.js"></script>
  13.     <!-- 引入甘特图插件 -->
  14.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/plugins/gantt.css">
  15.     <script src="https://www.jeasyui.com/easyui/plugins/jquery.gantt.js"></script>
  16.     <style>
  17.         /* 自定义样式 */
  18.         .gantt-container {
  19.             width: 100%;
  20.             height: 500px;
  21.             margin: 20px 0;
  22.         }
  23.     </style>
  24. </head>
  25. <body>
  26.     <!-- 甘特图容器 -->
  27.     <div id="gantt" class="gantt-container"></div>
  28. </body>
  29. </html>
复制代码

基础甘特图的创建

创建简单的甘特图

下面是一个创建基础甘特图的示例代码:
  1. $(function(){
  2.     $('#gantt').gantt({
  3.         dataSource: [
  4.             {
  5.                 id: 1,          // 任务ID
  6.                 name: '需求分析', // 任务名称
  7.                 start: new Date(2023, 0, 1),  // 开始日期
  8.                 end: new Date(2023, 0, 5),    // 结束日期
  9.                 progress: 100   // 完成进度(百分比)
  10.             },
  11.             {
  12.                 id: 2,
  13.                 name: '系统设计',
  14.                 start: new Date(2023, 0, 6),
  15.                 end: new Date(2023, 0, 15),
  16.                 progress: 80
  17.             },
  18.             {
  19.                 id: 3,
  20.                 name: '编码实现',
  21.                 start: new Date(2023, 0, 16),
  22.                 end: new Date(2023, 1, 10),
  23.                 progress: 50
  24.             },
  25.             {
  26.                 id: 4,
  27.                 name: '系统测试',
  28.                 start: new Date(2023, 1, 11),
  29.                 end: new Date(2023, 1, 25),
  30.                 progress: 20
  31.             },
  32.             {
  33.                 id: 5,
  34.                 name: '部署上线',
  35.                 start: new Date(2023, 1, 26),
  36.                 end: new Date(2023, 2, 5),
  37.                 progress: 0
  38.             }
  39.         ],
  40.         // 设置导航选项
  41.         navigate: 'scroll',
  42.         // 设置刻度单位
  43.         scale: 'days',
  44.         // 设置最大和最小日期
  45.         minScale: 'days',
  46.         maxScale: 'months',
  47.         // 设置任务点击事件
  48.         onItemClick: function(data) {
  49.             alert('任务: ' + data.name);
  50.         }
  51.     });
  52. });
复制代码

甘特图数据结构

在jQuery EasyUI甘特图中,每个任务对象通常包含以下属性:

• id: 任务的唯一标识符
• name: 任务名称
• start: 任务开始日期(Date对象)
• end: 任务结束日期(Date对象)
• progress: 任务完成进度(0-100的数值)
• color: 任务条的颜色(可选)
• customClass: 自定义CSS类(可选)
• dependencies: 依赖任务ID数组(可选)

甘特图的配置和自定义

基本配置选项

jQuery EasyUI甘特图插件提供了丰富的配置选项,可以根据需求进行自定义:
  1. $('#gantt').gantt({
  2.     // 数据源
  3.     dataSource: tasks,
  4.    
  5.     // 导航方式:'scroll' 或 'buttons'
  6.     navigate: 'buttons',
  7.    
  8.     // 时间刻度:'days', 'weeks', 'months'
  9.     scale: 'weeks',
  10.    
  11.     // 最大和最小刻度
  12.     minScale: 'days',
  13.     maxScale: 'months',
  14.    
  15.     // 是否显示周末
  16.     weekends: true,
  17.    
  18.     // 是否显示当前日期线
  19.     showToday: true,
  20.    
  21.     // 是否显示网格
  22.     grid: true,
  23.    
  24.     // 任务条高度
  25.     rowHeight: 30,
  26.    
  27.     // 任务点击事件
  28.     onItemClick: function(data) {
  29.         console.log('点击任务:', data);
  30.     },
  31.    
  32.     // 任务双击事件
  33.     onDblClick: function(data) {
  34.         console.log('双击任务:', data);
  35.     },
  36.    
  37.     // 任务右键点击事件
  38.     onRightClick: function(data, event) {
  39.         console.log('右键点击任务:', data);
  40.         event.preventDefault();
  41.     },
  42.    
  43.     // 渲染事件
  44.     onRender: function() {
  45.         console.log('甘特图渲染完成');
  46.     }
  47. });
复制代码

自定义任务样式

可以通过自定义CSS来改变甘特图的样式:
  1. /* 自定义任务条样式 */
  2. .gantt .bar {
  3.     border-radius: 3px;
  4.     height: 18px;
  5. }
  6. /* 自定义已完成部分样式 */
  7. .gantt .bar .progress {
  8.     border-radius: 3px 0 0 3px;
  9.     height: 100%;
  10. }
  11. /* 自定义任务依赖线样式 */
  12. .gantt .line {
  13.     stroke-width: 1px;
  14. }
  15. /* 自定义周末样式 */
  16. .gantt .weekend {
  17.     background-color: #f5f5f5;
  18. }
  19. /* 自定义今日线样式 */
  20. .gantt .today {
  21.     background-color: #ff0000;
  22. }
复制代码

使用自定义类和颜色

可以为不同的任务设置不同的颜色和自定义类:
  1. $('#gantt').gantt({
  2.     dataSource: [
  3.         {
  4.             id: 1,
  5.             name: '需求分析',
  6.             start: new Date(2023, 0, 1),
  7.             end: new Date(2023, 0, 5),
  8.             progress: 100,
  9.             color: '#00ff00',  // 自定义颜色
  10.             customClass: 'milestone'  // 自定义CSS类
  11.         },
  12.         {
  13.             id: 2,
  14.             name: '系统设计',
  15.             start: new Date(2023, 0, 6),
  16.             end: new Date(2023, 0, 15),
  17.             progress: 80,
  18.             color: '#0066cc'
  19.         },
  20.         {
  21.             id: 3,
  22.             name: '编码实现',
  23.             start: new Date(2023, 0, 16),
  24.             end: new Date(2023, 1, 10),
  25.             progress: 50,
  26.             color: '#ff9900'
  27.         }
  28.     ]
  29. });
复制代码

实战案例:项目进度管理系统

案例概述

我们将创建一个简单的项目进度管理系统,包括以下功能:

1. 显示项目甘特图
2. 添加、编辑和删除任务
3. 设置任务依赖关系
4. 更新任务进度
5. 导出甘特图为图片

HTML结构

首先,创建基本的HTML结构:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>项目进度管理系统</title>
  6.     <!-- 引入必要的CSS和JS文件 -->
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  8.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  9.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/plugins/gantt.css">
  10.     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  11.     <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  12.     <script src="https://www.jeasyui.com/easyui/locale/easyui-lang-zh_CN.js"></script>
  13.     <script src="https://www.jeasyui.com/easyui/plugins/jquery.gantt.js"></script>
  14.     <style>
  15.         .gantt-container {
  16.             width: 100%;
  17.             height: 500px;
  18.             margin: 20px 0;
  19.         }
  20.         .toolbar {
  21.             margin: 10px 0;
  22.         }
  23.         .dialog-button {
  24.             text-align: center;
  25.         }
  26.     </style>
  27. </head>
  28. <body>
  29.     <div class="easyui-layout" style="width:100%;height:100%;">
  30.         <div data-options="region:'north',border:false" style="height:60px;padding:10px;">
  31.             <h2 style="float:left;">项目进度管理系统</h2>
  32.             <div class="toolbar" style="float:right;">
  33.                 <a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="showAddTaskDialog()">添加任务</a>
  34.                 <a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="showEditTaskDialog()">编辑任务</a>
  35.                 <a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="deleteTask()">删除任务</a>
  36.                 <a href="#" class="easyui-linkbutton" iconCls="icon-save" onclick="exportGantt()">导出图片</a>
  37.             </div>
  38.         </div>
  39.         <div data-options="region:'center',border:false">
  40.             <div id="gantt" class="gantt-container"></div>
  41.         </div>
  42.     </div>
  43.     <!-- 添加/编辑任务对话框 -->
  44.     <div id="taskDialog" class="easyui-dialog" style="width:400px;height:300px;padding:10px 20px"
  45.             closed="true" buttons="#dlg-buttons" data-options="modal:true,title:'任务信息'">
  46.         <form id="taskForm" method="post">
  47.             <input type="hidden" name="id" id="taskId">
  48.             <div class="fitem">
  49.                 <label>任务名称:</label>
  50.                 <input name="name" class="easyui-textbox" required="true">
  51.             </div>
  52.             <div class="fitem">
  53.                 <label>开始日期:</label>
  54.                 <input name="start" class="easyui-datebox" required="true">
  55.             </div>
  56.             <div class="fitem">
  57.                 <label>结束日期:</label>
  58.                 <input name="end" class="easyui-datebox" required="true">
  59.             </div>
  60.             <div class="fitem">
  61.                 <label>进度(%):</label>
  62.                 <input name="progress" class="easyui-numberspinner" min="0" max="100" required="true">
  63.             </div>
  64.             <div class="fitem">
  65.                 <label>依赖任务:</label>
  66.                 <input name="dependencies" class="easyui-combobox"
  67.                     data-options="valueField:'id',textField:'name',multiple:true">
  68.             </div>
  69.         </form>
  70.     </div>
  71.    
  72.     <div id="dlg-buttons">
  73.         <a href="#" class="easyui-linkbutton c6" iconCls="icon-ok" onclick="saveTask()">保存</a>
  74.         <a href="#" class="easyui-linkbutton" iconCls="icon-cancel" onclick="$('#taskDialog').dialog('close')">取消</a>
  75.     </div>
  76.     <script>
  77.         // 初始化甘特图数据
  78.         var tasks = [
  79.             {
  80.                 id: 1,
  81.                 name: '需求分析',
  82.                 start: new Date(2023, 0, 1),
  83.                 end: new Date(2023, 0, 5),
  84.                 progress: 100
  85.             },
  86.             {
  87.                 id: 2,
  88.                 name: '系统设计',
  89.                 start: new Date(2023, 0, 6),
  90.                 end: new Date(2023, 0, 15),
  91.                 progress: 80
  92.             },
  93.             {
  94.                 id: 3,
  95.                 name: '数据库设计',
  96.                 start: new Date(2023, 0, 6),
  97.                 end: new Date(2023, 0, 10),
  98.                 progress: 100,
  99.                 dependencies: [1]
  100.             },
  101.             {
  102.                 id: 4,
  103.                 name: '前端开发',
  104.                 start: new Date(2023, 0, 16),
  105.                 end: new Date(2023, 1, 5),
  106.                 progress: 60,
  107.                 dependencies: [2]
  108.             },
  109.             {
  110.                 id: 5,
  111.                 name: '后端开发',
  112.                 start: new Date(2023, 0, 16),
  113.                 end: new Date(2023, 1, 10),
  114.                 progress: 50,
  115.                 dependencies: [2, 3]
  116.             },
  117.             {
  118.                 id: 6,
  119.                 name: '系统测试',
  120.                 start: new Date(2023, 1, 11),
  121.                 end: new Date(2023, 1, 25),
  122.                 progress: 20,
  123.                 dependencies: [4, 5]
  124.             },
  125.             {
  126.                 id: 7,
  127.                 name: '部署上线',
  128.                 start: new Date(2023, 1, 26),
  129.                 end: new Date(2023, 2, 5),
  130.                 progress: 0,
  131.                 dependencies: [6]
  132.             }
  133.         ];
  134.         // 当前选中的任务
  135.         var selectedTask = null;
  136.         $(function(){
  137.             // 初始化甘特图
  138.             $('#gantt').gantt({
  139.                 dataSource: tasks,
  140.                 navigate: 'buttons',
  141.                 scale: 'days',
  142.                 maxScale: 'months',
  143.                 minScale: 'days',
  144.                 weekends: true,
  145.                 showToday: true,
  146.                 grid: true,
  147.                 rowHeight: 30,
  148.                 onItemClick: function(data) {
  149.                     selectedTask = data;
  150.                 },
  151.                 onDblClick: function(data) {
  152.                     selectedTask = data;
  153.                     showEditTaskDialog();
  154.                 }
  155.             });
  156.             
  157.             // 初始化依赖任务下拉框
  158.             updateDependenciesCombo();
  159.         });
  160.         // 显示添加任务对话框
  161.         function showAddTaskDialog() {
  162.             $('#taskForm').form('clear');
  163.             $('#taskId').val('');
  164.             $('#taskDialog').dialog('open');
  165.         }
  166.         // 显示编辑任务对话框
  167.         function showEditTaskDialog() {
  168.             if (!selectedTask) {
  169.                 $.messager.alert('提示', '请先选择一个任务', 'warning');
  170.                 return;
  171.             }
  172.             
  173.             $('#taskForm').form('load', {
  174.                 id: selectedTask.id,
  175.                 name: selectedTask.name,
  176.                 start: formatDate(selectedTask.start),
  177.                 end: formatDate(selectedTask.end),
  178.                 progress: selectedTask.progress,
  179.                 dependencies: selectedTask.dependencies || []
  180.             });
  181.             $('#taskDialog').dialog('open');
  182.         }
  183.         // 保存任务
  184.         function saveTask() {
  185.             $('#taskForm').form('submit', {
  186.                 onSubmit: function() {
  187.                     return $(this).form('validate');
  188.                 },
  189.                 success: function(data) {
  190.                     var formData = $('#taskForm').form('getData');
  191.                     
  192.                     // 转换日期格式
  193.                     formData.start = new Date(formData.start);
  194.                     formData.end = new Date(formData.end);
  195.                     
  196.                     // 更新或添加任务
  197.                     if (formData.id) {
  198.                         // 更新现有任务
  199.                         for (var i = 0; i < tasks.length; i++) {
  200.                             if (tasks[i].id == formData.id) {
  201.                                 tasks[i] = formData;
  202.                                 break;
  203.                             }
  204.                         }
  205.                     } else {
  206.                         // 添加新任务
  207.                         formData.id = tasks.length > 0 ? Math.max.apply(Math, tasks.map(function(t) { return t.id; })) + 1 : 1;
  208.                         tasks.push(formData);
  209.                     }
  210.                     
  211.                     // 刷新甘特图
  212.                     $('#gantt').gantt('refresh', tasks);
  213.                     
  214.                     // 更新依赖任务下拉框
  215.                     updateDependenciesCombo();
  216.                     
  217.                     // 关闭对话框
  218.                     $('#taskDialog').dialog('close');
  219.                     
  220.                     $.messager.show({
  221.                         title: '成功',
  222.                         msg: '任务保存成功',
  223.                         timeout: 2000,
  224.                         showType: 'slide'
  225.                     });
  226.                 }
  227.             });
  228.         }
  229.         // 删除任务
  230.         function deleteTask() {
  231.             if (!selectedTask) {
  232.                 $.messager.alert('提示', '请先选择一个任务', 'warning');
  233.                 return;
  234.             }
  235.             
  236.             $.messager.confirm('确认', '确定要删除这个任务吗?', function(r) {
  237.                 if (r) {
  238.                     // 删除任务
  239.                     for (var i = 0; i < tasks.length; i++) {
  240.                         if (tasks[i].id == selectedTask.id) {
  241.                             tasks.splice(i, 1);
  242.                             break;
  243.                         }
  244.                     }
  245.                     
  246.                     // 删除其他任务对此任务的依赖
  247.                     for (var i = 0; i < tasks.length; i++) {
  248.                         if (tasks[i].dependencies) {
  249.                             var index = tasks[i].dependencies.indexOf(selectedTask.id);
  250.                             if (index != -1) {
  251.                                 tasks[i].dependencies.splice(index, 1);
  252.                             }
  253.                         }
  254.                     }
  255.                     
  256.                     // 刷新甘特图
  257.                     $('#gantt').gantt('refresh', tasks);
  258.                     
  259.                     // 更新依赖任务下拉框
  260.                     updateDependenciesCombo();
  261.                     
  262.                     selectedTask = null;
  263.                     
  264.                     $.messager.show({
  265.                         title: '成功',
  266.                         msg: '任务删除成功',
  267.                         timeout: 2000,
  268.                         showType: 'slide'
  269.                     });
  270.                 }
  271.             });
  272.         }
  273.         // 导出甘特图为图片
  274.         function exportGantt() {
  275.             // 这里使用html2canvas库将甘特图导出为图片
  276.             // 需要先引入html2canvas库
  277.             $.messager.alert('提示', '导出功能需要引入html2canvas库', 'info');
  278.         }
  279.         // 更新依赖任务下拉框
  280.         function updateDependenciesCombo() {
  281.             var dependenciesCombo = $('input[name="dependencies"]').combobox({
  282.                 data: tasks.map(function(task) {
  283.                     return {
  284.                         id: task.id,
  285.                         name: task.name
  286.                     };
  287.                 })
  288.             });
  289.         }
  290.         // 格式化日期
  291.         function formatDate(date) {
  292.             var year = date.getFullYear();
  293.             var month = date.getMonth() + 1;
  294.             var day = date.getDate();
  295.             return year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day);
  296.         }
  297.     </script>
  298. </body>
  299. </html>
复制代码

功能实现详解

在页面加载完成后,我们初始化甘特图并设置一些基本配置:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     navigate: 'buttons',
  4.     scale: 'days',
  5.     maxScale: 'months',
  6.     minScale: 'days',
  7.     weekends: true,
  8.     showToday: true,
  9.     grid: true,
  10.     rowHeight: 30,
  11.     onItemClick: function(data) {
  12.         selectedTask = data;
  13.     },
  14.     onDblClick: function(data) {
  15.         selectedTask = data;
  16.         showEditTaskDialog();
  17.     }
  18. });
复制代码

这里我们设置了数据源、导航方式、时间刻度等基本配置,并定义了任务点击和双击事件的处理函数。

添加任务的功能通过一个对话框实现:
  1. function showAddTaskDialog() {
  2.     $('#taskForm').form('clear');
  3.     $('#taskId').val('');
  4.     $('#taskDialog').dialog('open');
  5. }
复制代码

这个函数会清空表单,然后打开任务对话框,用户可以输入新任务的信息。

编辑任务的功能也通过对话框实现,但会先加载选中任务的信息:
  1. function showEditTaskDialog() {
  2.     if (!selectedTask) {
  3.         $.messager.alert('提示', '请先选择一个任务', 'warning');
  4.         return;
  5.     }
  6.    
  7.     $('#taskForm').form('load', {
  8.         id: selectedTask.id,
  9.         name: selectedTask.name,
  10.         start: formatDate(selectedTask.start),
  11.         end: formatDate(selectedTask.end),
  12.         progress: selectedTask.progress,
  13.         dependencies: selectedTask.dependencies || []
  14.     });
  15.     $('#taskDialog').dialog('open');
  16. }
复制代码

这个函数会检查是否有选中的任务,如果没有则提示用户,如果有则加载任务信息到表单中,然后打开对话框。

保存任务的功能会处理添加和编辑两种情况:
  1. function saveTask() {
  2.     $('#taskForm').form('submit', {
  3.         onSubmit: function() {
  4.             return $(this).form('validate');
  5.         },
  6.         success: function(data) {
  7.             var formData = $('#taskForm').form('getData');
  8.             
  9.             // 转换日期格式
  10.             formData.start = new Date(formData.start);
  11.             formData.end = new Date(formData.end);
  12.             
  13.             // 更新或添加任务
  14.             if (formData.id) {
  15.                 // 更新现有任务
  16.                 for (var i = 0; i < tasks.length; i++) {
  17.                     if (tasks[i].id == formData.id) {
  18.                         tasks[i] = formData;
  19.                         break;
  20.                     }
  21.                 }
  22.             } else {
  23.                 // 添加新任务
  24.                 formData.id = tasks.length > 0 ? Math.max.apply(Math, tasks.map(function(t) { return t.id; })) + 1 : 1;
  25.                 tasks.push(formData);
  26.             }
  27.             
  28.             // 刷新甘特图
  29.             $('#gantt').gantt('refresh', tasks);
  30.             
  31.             // 更新依赖任务下拉框
  32.             updateDependenciesCombo();
  33.             
  34.             // 关闭对话框
  35.             $('#taskDialog').dialog('close');
  36.             
  37.             $.messager.show({
  38.                 title: '成功',
  39.                 msg: '任务保存成功',
  40.                 timeout: 2000,
  41.                 showType: 'slide'
  42.             });
  43.         }
  44.     });
  45. }
复制代码

这个函数会先验证表单,然后根据表单数据更新现有任务或添加新任务,最后刷新甘特图并显示成功消息。

删除任务的功能会先确认用户操作,然后删除任务及其依赖关系:
  1. function deleteTask() {
  2.     if (!selectedTask) {
  3.         $.messager.alert('提示', '请先选择一个任务', 'warning');
  4.         return;
  5.     }
  6.    
  7.     $.messager.confirm('确认', '确定要删除这个任务吗?', function(r) {
  8.         if (r) {
  9.             // 删除任务
  10.             for (var i = 0; i < tasks.length; i++) {
  11.                 if (tasks[i].id == selectedTask.id) {
  12.                     tasks.splice(i, 1);
  13.                     break;
  14.                 }
  15.             }
  16.             
  17.             // 删除其他任务对此任务的依赖
  18.             for (var i = 0; i < tasks.length; i++) {
  19.                 if (tasks[i].dependencies) {
  20.                     var index = tasks[i].dependencies.indexOf(selectedTask.id);
  21.                     if (index != -1) {
  22.                         tasks[i].dependencies.splice(index, 1);
  23.                     }
  24.                 }
  25.             }
  26.             
  27.             // 刷新甘特图
  28.             $('#gantt').gantt('refresh', tasks);
  29.             
  30.             // 更新依赖任务下拉框
  31.             updateDependenciesCombo();
  32.             
  33.             selectedTask = null;
  34.             
  35.             $.messager.show({
  36.                 title: '成功',
  37.                 msg: '任务删除成功',
  38.                 timeout: 2000,
  39.                 showType: 'slide'
  40.             });
  41.         }
  42.     });
  43. }
复制代码

这个函数会检查是否有选中的任务,然后确认用户是否真的要删除任务。如果确认,会删除任务以及其他任务对此任务的依赖关系,最后刷新甘特图并显示成功消息。

导出功能可以使用html2canvas库实现:
  1. function exportGantt() {
  2.     // 这里使用html2canvas库将甘特图导出为图片
  3.     // 需要先引入html2canvas库
  4.     $.messager.alert('提示', '导出功能需要引入html2canvas库', 'info');
  5. }
复制代码

这个功能需要引入html2canvas库,然后使用该库将甘特图转换为图片并下载。

高级功能和技巧

动态加载数据

在实际应用中,甘特图数据通常是从服务器动态加载的。下面是一个使用AJAX加载数据的示例:
  1. function loadGanttData(projectId) {
  2.     $.ajax({
  3.         url: '/api/projects/' + projectId + '/tasks',
  4.         type: 'GET',
  5.         dataType: 'json',
  6.         success: function(data) {
  7.             // 转换日期字符串为Date对象
  8.             data.forEach(function(task) {
  9.                 task.start = new Date(task.start);
  10.                 task.end = new Date(task.end);
  11.             });
  12.             
  13.             // 刷新甘特图
  14.             $('#gantt').gantt('refresh', data);
  15.             
  16.             // 更新依赖任务下拉框
  17.             updateDependenciesCombo();
  18.         },
  19.         error: function(xhr, status, error) {
  20.             $.messager.alert('错误', '加载数据失败: ' + error, 'error');
  21.         }
  22.     });
  23. }
复制代码

任务拖拽调整

jQuery EasyUI甘特图插件支持拖拽调整任务的开始和结束时间:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     // 启用拖拽
  4.     draggable: true,
  5.     // 拖拽开始事件
  6.     onDragStart: function(data, event) {
  7.         console.log('开始拖拽任务:', data.name);
  8.     },
  9.     // 拖拽结束事件
  10.     onDragEnd: function(data, event) {
  11.         console.log('结束拖拽任务:', data.name);
  12.         console.log('新的开始时间:', data.start);
  13.         console.log('新的结束时间:', data.end);
  14.         
  15.         // 这里可以添加保存到服务器的代码
  16.         saveTaskToServer(data);
  17.     }
  18. });
  19. function saveTaskToServer(task) {
  20.     $.ajax({
  21.         url: '/api/tasks/' + task.id,
  22.         type: 'PUT',
  23.         contentType: 'application/json',
  24.         data: JSON.stringify(task),
  25.         success: function(response) {
  26.             $.messager.show({
  27.                 title: '成功',
  28.                 msg: '任务更新成功',
  29.                 timeout: 2000,
  30.                 showType: 'slide'
  31.             });
  32.         },
  33.         error: function(xhr, status, error) {
  34.             $.messager.alert('错误', '更新任务失败: ' + error, 'error');
  35.             // 刷新甘特图以恢复原始数据
  36.             $('#gantt').gantt('refresh', tasks);
  37.         }
  38.     });
  39. }
复制代码

自定义工具提示

可以自定义任务的工具提示,显示更多信息:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     // 自定义工具提示
  4.     tooltip: function(task) {
  5.         return '<div class="gantt-tooltip">' +
  6.                '<h4>' + task.name + '</h4>' +
  7.                '<p>开始: ' + formatDate(task.start) + '</p>' +
  8.                '<p>结束: ' + formatDate(task.end) + '</p>' +
  9.                '<p>进度: ' + task.progress + '%</p>' +
  10.                '<p>负责人: ' + (task.assignee || '未分配') + '</p>' +
  11.                '</div>';
  12.     }
  13. });
复制代码

自定义渲染任务

可以自定义任务的渲染方式,添加更多信息:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     // 自定义任务渲染
  4.     renderItem: function(task) {
  5.         var $item = $('<div class="gantt-item"></div>');
  6.         var $bar = $('<div class="bar"></div>');
  7.         var $progress = $('<div class="progress"></div>');
  8.         
  9.         // 设置任务条样式
  10.         $bar.css({
  11.             'background-color': task.color || '#0066cc',
  12.             'width': task.progress + '%'
  13.         });
  14.         
  15.         // 添加任务名称
  16.         $bar.append('<span class="name">' + task.name + '</span>');
  17.         
  18.         // 添加进度条
  19.         $bar.append($progress);
  20.         
  21.         // 添加任务条到项目
  22.         $item.append($bar);
  23.         
  24.         return $item;
  25.     }
  26. });
复制代码

缩放和平移

可以添加缩放和平移功能,以便更好地查看大型项目:
  1. $(function(){
  2.     var gantt = $('#gantt').gantt({
  3.         dataSource: tasks,
  4.         // 启用缩放
  5.         zoom: true,
  6.         // 缩放事件
  7.         onZoom: function(scale) {
  8.             console.log('当前缩放级别:', scale);
  9.         }
  10.     });
  11.    
  12.     // 添加缩放按钮
  13.     $('.zoom-in').click(function(){
  14.         gantt.gantt('zoomIn');
  15.     });
  16.    
  17.     $('.zoom-out').click(function(){
  18.         gantt.gantt('zoomOut');
  19.     });
  20.    
  21.     // 添加平移按钮
  22.     $('.pan-left').click(function(){
  23.         gantt.gantt('pan', 'left');
  24.     });
  25.    
  26.     $('.pan-right').click(function(){
  27.         gantt.gantt('pan', 'right');
  28.     });
  29. });
复制代码

常见问题和解决方案

问题1:甘特图不显示

原因:可能是没有正确引入必要的CSS和JS文件,或者容器元素没有设置高度。

解决方案:

1. 确保正确引入了所有必要的文件:
  1. <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  2. <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  3. <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/plugins/gantt.css">
  4. <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  5. <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  6. <script src="https://www.jeasyui.com/easyui/plugins/jquery.gantt.js"></script>
复制代码

1. 确保容器元素设置了高度:
  1. .gantt-container {
  2.     width: 100%;
  3.     height: 500px; /* 必须设置高度 */
  4. }
复制代码

问题2:任务条不显示或显示不正确

原因:可能是数据格式不正确,特别是日期格式。

解决方案:

1. 确保日期是Date对象:
  1. // 错误的方式
  2. {
  3.     id: 1,
  4.     name: '任务1',
  5.     start: '2023-01-01',  // 字符串,不正确
  6.     end: '2023-01-05',    // 字符串,不正确
  7.     progress: 50
  8. }
  9. // 正确的方式
  10. {
  11.     id: 1,
  12.     name: '任务1',
  13.     start: new Date(2023, 0, 1),  // Date对象,正确
  14.     end: new Date(2023, 0, 5),    // Date对象,正确
  15.     progress: 50
  16. }
复制代码

1. 如果从服务器获取数据,确保将日期字符串转换为Date对象:
  1. $.ajax({
  2.     url: '/api/tasks',
  3.     type: 'GET',
  4.     success: function(data) {
  5.         // 转换日期字符串为Date对象
  6.         data.forEach(function(task) {
  7.             task.start = new Date(task.start);
  8.             task.end = new Date(task.end);
  9.         });
  10.         
  11.         // 刷新甘特图
  12.         $('#gantt').gantt('refresh', data);
  13.     }
  14. });
复制代码

问题3:任务依赖关系不显示

原因:可能是依赖关系设置不正确,或者没有启用依赖关系显示。

解决方案:

1. 确保任务对象中包含dependencies属性:
  1. {
  2.     id: 2,
  3.     name: '任务2',
  4.     start: new Date(2023, 0, 6),
  5.     end: new Date(2023, 0, 10),
  6.     progress: 30,
  7.     dependencies: [1]  // 依赖于ID为1的任务
  8. }
复制代码

1. 确保启用了依赖关系显示:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     // 启用依赖关系显示
  4.     showDependencies: true
  5. });
复制代码

问题4:拖拽功能不工作

原因:可能是没有启用拖拽功能,或者与其他插件冲突。

解决方案:

1. 确保启用了拖拽功能:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     // 启用拖拽
  4.     draggable: true
  5. });
复制代码

1. 检查是否有其他插件与拖拽功能冲突,尝试禁用其他插件。

问题5:性能问题,甘特图加载缓慢

原因:可能是数据量太大,或者渲染方式不当。

解决方案:

1. 使用分页或虚拟滚动:
  1. $('#gantt').gantt({
  2.     dataSource: tasks,
  3.     // 启用虚拟滚动
  4.     virtualScroll: true,
  5.     // 设置每页显示的任务数
  6.     pageSize: 50
  7. });
复制代码

1. 优化数据结构,避免不必要的数据:
  1. // 只包含必要的数据
  2. var optimizedTasks = tasks.map(function(task) {
  3.     return {
  4.         id: task.id,
  5.         name: task.name,
  6.         start: task.start,
  7.         end: task.end,
  8.         progress: task.progress,
  9.         dependencies: task.dependencies
  10.     };
  11. });
  12. $('#gantt').gantt({
  13.     dataSource: optimizedTasks
  14. });
复制代码

1. 使用服务器端处理,只加载当前视图所需的数据:
  1. $('#gantt').gantt({
  2.     // 使用URL作为数据源
  3.     url: '/api/tasks',
  4.     // 设置视图变化时的回调
  5.     onViewChange: function(start, end) {
  6.         // 重新加载数据
  7.         $(this).gantt('loadData', {
  8.             start: start,
  9.             end: end
  10.         });
  11.     }
  12. });
复制代码

总结

jQuery EasyUI甘特图插件是一个功能强大且易于使用的工具,可以帮助开发者快速实现项目进度管理的可视化。通过本文的介绍和实战案例,我们了解了如何创建基础甘特图、配置和自定义甘特图、实现项目进度管理系统,以及解决常见问题。

使用jQuery EasyUI甘特图插件,可以轻松实现以下功能:

1. 显示项目任务和时间线
2. 添加、编辑和删除任务
3. 设置任务依赖关系
4. 更新任务进度
5. 拖拽调整任务时间
6. 自定义任务样式和工具提示
7. 导出甘特图为图片

通过合理使用这些功能,可以构建一个功能完善的项目进度管理系统,帮助项目经理和团队成员更好地跟踪和管理项目进度。

希望本文对您使用jQuery EasyUI甘特图插件有所帮助。如果您有任何问题或建议,欢迎留言讨论。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.