当前位置:   article > 正文

vue中利用dhtmlx-gantt实现甘特图_vue2甘特图数据结构怎么自定义字段

vue2甘特图数据结构怎么自定义字段

亲测有效!!!!!!!!!!!!!!话不多直接上代码!!!!!!!!!!

成品展示

使用说明

1.引入依赖(注意版本号

npm install dhtmlx-gantt@6.3.7

2.引入组件

  1. <template>
  2. <div>
  3. <div ref="gantt" style="height:500px;" />
  4. </div>
  5. </template>

3.引入dhtmlx-gantt

  1. import gantt from 'dhtmlx-gantt'
  2. import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'

4.甘特图数据配置

注意: 数据格式类似于树形组件,子级需要父级的id

  • 父级时间是根据子级start_date以及duration自动计算
  • progress:完成度的最大值为1
  • open:是否展开文件
  • parent:父级id
  • start_date:开始时间(日月年)
  • text:左边数据展示文件名称(可以自定义添加展示字段,在后面列配置项可以配置)
  1. tasks: {
  2. data: [
  3. // {
  4. // id: 11,
  5. // text: 'Project #1',
  6. // // type: gantt.config.types.project,
  7. // progress: 0.5,//完成度
  8. // open: true,//默认打开
  9. // number: '20240227',//显示字段
  10. // },
  11. // {
  12. // toolTipsTxt: '任务#101-001',
  13. // id: 12,//任务id
  14. // text: '任务#1',//任务名称
  15. // start_date: '03-04-2022',//开始时间 日月年
  16. // duration: '5',//任务时常
  17. // parent: '11',//父级id
  18. // progress: 1,//完成度
  19. // open: true,//默认打开
  20. // },
  21. // {
  22. // id: 13,
  23. // text: '任务#2',
  24. // start_date: '03-04-2022',
  25. // // type: gantt.config.types.project,
  26. // parent: '11',
  27. // progress: 0.255,
  28. // open: true,
  29. // },
  30. // {
  31. // id: 14,
  32. // text: '任务#3',
  33. // start_date: '01-04-2022',
  34. // duration: '6',
  35. // parent: '11',
  36. // progress: 0.8,
  37. // open: true,
  38. // },
  39. // {
  40. // id: 15,
  41. // text: '任务#4',
  42. // // type: gantt.config.types.project,
  43. // parent: '11',
  44. // progress: 0.2,
  45. // open: true,
  46. // },
  47. // {
  48. // id: 16,
  49. // text: 'Final milestone',
  50. // start_date: '15-04-2022',
  51. // // type: gantt.config.types.milestone,
  52. // parent: '11',
  53. // progress: 0,
  54. // open: true,
  55. // },
  56. // {
  57. // id: 17,
  58. // text: '任务#2.1',
  59. // start_date: '03-04-2022',
  60. // duration: '2',
  61. // parent: '13',
  62. // progress: 1,
  63. // open: true,
  64. // },
  65. // {
  66. // id: 18,
  67. // text: '任务#2.2',
  68. // start_date: '06-04-2022',
  69. // duration: '3',
  70. // parent: '13',
  71. // progress: 0.8,
  72. // open: true,
  73. // },
  74. // {
  75. // id: 19,
  76. // text: '任务#2.3',
  77. // start_date: '10-04-2022',
  78. // duration: '4',
  79. // parent: '13',
  80. // progress: 0.2,
  81. // open: true,
  82. // },
  83. // {
  84. // id: 20,
  85. // text: '任务#2.4',
  86. // start_date: '10-04-2022',
  87. // duration: '4',
  88. // parent: '13',
  89. // progress: 0,
  90. // open: true,
  91. // },
  92. // {
  93. // id: 21,
  94. // text: '任务#4.1',
  95. // start_date: '03-04-2022',
  96. // duration: '4',
  97. // parent: '15',
  98. // progress: 0.5,
  99. // open: true,
  100. // },
  101. // {
  102. // id: 22,
  103. // text: '任务#4.2',
  104. // start_date: '03-04-2022',
  105. // duration: '4',
  106. // parent: '15',
  107. // progress: 0.1,
  108. // open: true,
  109. // },
  110. // {
  111. // id: 23,
  112. // text: 'Mediate milestone',
  113. // start_date: '14-04-2022',
  114. // // type: gantt.config.types.milestone,
  115. // parent: '15',
  116. // progress: 0,
  117. // open: true,
  118. // },
  119. ],

5.tasks 中link连线配置

  1. tasks: {
  2. // #字段解释
  3. // 格式 id:数据id
  4. // source:开始链接的项目id ----为tasks.data中数据的id
  5. // target:要链接项目的id ----为tasks.data中数据的id
  6. // type: 0--进行-开始 `尾部链接头部`
  7. // 1--开始-开始 `头部链接头部`
  8. // 2--进行-进行 `尾部链接尾部`
  9. // 3--开始-进行 `头部链接尾部`
  10. // 任务之间连接
  11. links: [
  12. { id: '10', source: '11', target: '12', type: '1' },
  13. { id: '11', source: '11', target: '13', type: '1' },
  14. { id: '12', source: '11', target: '14', type: '1' },
  15. { id: '13', source: '11', target: '15', type: '1' },
  16. { id: '14', source: '23', target: '16', type: '0' },
  17. { id: '15', source: '13', target: '17', type: '1' },
  18. { id: '16', source: '17', target: '18', type: '0' },
  19. { id: '17', source: '18', target: '19', type: '0' },
  20. { id: '18', source: '19', target: '20', type: '0' },
  21. { id: '19', source: '15', target: '21', type: '2' },
  22. { id: '20', source: '15', target: '22', type: '2' },
  23. { id: '21', source: '15', target: '23', type: '0' },
  24. ],
  25. },

6.初始化配置

注意:其中值得一提的就是更新数据,需要清空旧数

弹窗汉化

  1. gantt.locale.labels = {
  2. dhx_cal_today_button: "今天",
  3. day_tab: "日",
  4. week_tab: "周",
  5. month_tab: "月",
  6. new_event: "新建日程",
  7. icon_save: "保存",
  8. icon_cancel: "关闭",
  9. icon_details: "详细",
  10. icon_edit: "编辑",
  11. icon_delete: "删除",
  12. confirm_closing: "请确认是否撤销修改!", //Your changes will be lost, are your sure?
  13. confirm_deleting: "是否删除计划?",
  14. section_description: "描述:",
  15. section_time: "时间范围:",
  16. section_type: "类型:",
  17. section_text: "计划名称:",
  18. section_test: "测试:",
  19. section_projectClass: "项目类型:",
  20. taskProjectType_0: "项目任务",
  21. taskProjectType_1: "普通任务",
  22. section_head: "负责人:",
  23. section_priority: '优先级:',
  24. taskProgress: '任务状态',
  25. taskProgress_0: "未开始",
  26. taskProgress_1: "进行中",
  27. taskProgress_2: "已完成",
  28. taskProgress_3: "已延期",
  29. taskProgress_4: "搁置中",
  30. section_template: 'Details',
  31. /* grid columns */
  32. column_text: "计划名称",
  33. column_start_date: "开始时间",
  34. column_duration: "持续时间",
  35. column_add: "",
  36. column_priority: "难度",
  37. /* link confirmation */
  38. link: "关联",
  39. confirm_link_deleting: "将被删除",
  40. message_ok: '确定',
  41. message_cancel: '取消',
  42. link_start: " (开始)",
  43. link_end: " (结束)",
  44. type_task: "任务",
  45. type_project: "项目",
  46. type_milestone: "里程碑",
  47. minutes: "分钟",
  48. hours: "小时",
  49. days: "天",
  50. weeks: "周",
  51. months: "月",
  52. years: "年"
  53. }

gantt.clearAll(); // 清空旧数据
  1. // 初始化
  2. init() {
  3. // 格式化日期
  4. gantt.locale.date = {
  5. month_full: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  6. month_short: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  7. day_full: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
  8. day_short: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
  9. }
  10. console.log(gantt);
  11. //自适应甘特图的尺寸大小, 使得在不出现滚动条的情况下, 显示全部任务
  12. gantt.config.autosize = true
  13. //只读模式
  14. gantt.config.readonly = false
  15. //是否显示左侧树表格
  16. gantt.config.show_grid = true
  17. // //表格列设置
  18. gantt.config.columns = [
  19. { name: 'text', label: '阶段名字', tree: true, width: '150', align: 'center', },
  20. // { name: 'number', label: '工单号', tree: false, width: '120', align: 'center', },
  21. {
  22. name: 'duration',
  23. label: '工时',
  24. align: 'center',
  25. template: function (obj) {
  26. return obj.duration + '天'
  27. },
  28. },
  29. /*{name:"start_date", label:"开始时间", align: "center" },
  30. {name:"end_date", label:"结束时间", align: "center" },*/
  31. ]
  32. // 自动延长时间刻度
  33. gantt.config.fit_tasks = true
  34. // 允许拖放
  35. gantt.config.drag_project = true
  36. // 定义时间格式
  37. gantt.config.scales = [
  38. { unit: 'month', step: 1, date: ' %Y,%F' },
  39. { unit: 'day', step: 1, date: ' %D ,%j' },
  40. ]
  41. // //当task的长度改变时,自动调整图表坐标轴区间用于适配task的长度
  42. gantt.config.fit_tasks = true
  43. // 添加弹窗属性
  44. gantt.config.lightbox.sections = [
  45. {
  46. name: 'description',
  47. height: 70,
  48. map_to: 'text',
  49. type: 'textarea',
  50. focus: true,
  51. },
  52. { name: 'type', type: 'typeselect', map_to: 'type' },
  53. { name: 'time', type: 'duration', map_to: 'auto' },
  54. ];
  55. console.log(this.tasks.data, '检查任务数据'); // 检查任务数据
  56. // 初始化
  57. gantt.init(this.$refs.gantt)
  58. /* *******重点******* */
  59. gantt.clearAll(); // 清空旧数据
  60. /* ****************** */
  61. // 数据解析
  62. gantt.parse(this.tasks)
  63. },

7.更新数据

  1. loadData(arg) {
  2. if (!this.url.list) {
  3. this.$message.error("请设置url.list属性!")
  4. return
  5. }
  6. //加载数据 若传入参数1则加载第一页的内容
  7. let params = {
  8. planId: this.planId,
  9. }
  10. this.loading = true;
  11. this.tasks.data = []
  12. getAction(this.url.list, params).then((res) => {
  13. if (res.success) {
  14. console.log(res, '甘特图数据');
  15. res.result.forEach(obj => {
  16. obj.open = false
  17. })
  18. this.tasks.data = res.result
  19. this.init()
  20. }
  21. if (res.code === 510) {
  22. this.$message.warning(res.message)
  23. }
  24. this.loading = false;
  25. })
  26. },

更多配置

更多配置

完整代码

  1. <template>
  2. <div>
  3. <div ref="gantt" style="height:500px;" />
  4. </div>
  5. </template>
  6. <script>
  7. import gantt from 'dhtmlx-gantt'
  8. import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'
  9. import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  10. import { getAction, putAction } from '@/api/manage'
  11. export default {
  12. props: {
  13. planId: {
  14. type: String,
  15. required: true,
  16. }
  17. },
  18. // mixins: [JeecgListMixin],
  19. data() {
  20. return {
  21. // 甘特图配置
  22. tasks: {
  23. data: [
  24. // {
  25. // id: 11,
  26. // text: 'Project #1',
  27. // // type: gantt.config.types.project,
  28. // progress: 0.5,//完成度
  29. // open: true,//默认打开
  30. // number: '20240227',//显示字段
  31. // },
  32. // {
  33. // toolTipsTxt: '任务#101-001',
  34. // id: 12,//任务id
  35. // text: '任务#1',//任务名称
  36. // start_date: '03-04-2022',//开始时间 日月年
  37. // duration: '5',//任务时常
  38. // parent: '11',//父级id
  39. // progress: 1,//完成度
  40. // open: true,//默认打开
  41. // },
  42. // {
  43. // id: 13,
  44. // text: '任务#2',
  45. // start_date: '03-04-2022',
  46. // // type: gantt.config.types.project,
  47. // parent: '11',
  48. // progress: 0.255,
  49. // open: true,
  50. // },
  51. // {
  52. // id: 14,
  53. // text: '任务#3',
  54. // start_date: '01-04-2022',
  55. // duration: '6',
  56. // parent: '11',
  57. // progress: 0.8,
  58. // open: true,
  59. // },
  60. // {
  61. // id: 15,
  62. // text: '任务#4',
  63. // // type: gantt.config.types.project,
  64. // parent: '11',
  65. // progress: 0.2,
  66. // open: true,
  67. // },
  68. // {
  69. // id: 16,
  70. // text: 'Final milestone',
  71. // start_date: '15-04-2022',
  72. // // type: gantt.config.types.milestone,
  73. // parent: '11',
  74. // progress: 0,
  75. // open: true,
  76. // },
  77. // {
  78. // id: 17,
  79. // text: '任务#2.1',
  80. // start_date: '03-04-2022',
  81. // duration: '2',
  82. // parent: '13',
  83. // progress: 1,
  84. // open: true,
  85. // },
  86. // {
  87. // id: 18,
  88. // text: '任务#2.2',
  89. // start_date: '06-04-2022',
  90. // duration: '3',
  91. // parent: '13',
  92. // progress: 0.8,
  93. // open: true,
  94. // },
  95. // {
  96. // id: 19,
  97. // text: '任务#2.3',
  98. // start_date: '10-04-2022',
  99. // duration: '4',
  100. // parent: '13',
  101. // progress: 0.2,
  102. // open: true,
  103. // },
  104. // {
  105. // id: 20,
  106. // text: '任务#2.4',
  107. // start_date: '10-04-2022',
  108. // duration: '4',
  109. // parent: '13',
  110. // progress: 0,
  111. // open: true,
  112. // },
  113. // {
  114. // id: 21,
  115. // text: '任务#4.1',
  116. // start_date: '03-04-2022',
  117. // duration: '4',
  118. // parent: '15',
  119. // progress: 0.5,
  120. // open: true,
  121. // },
  122. // {
  123. // id: 22,
  124. // text: '任务#4.2',
  125. // start_date: '03-04-2022',
  126. // duration: '4',
  127. // parent: '15',
  128. // progress: 0.1,
  129. // open: true,
  130. // },
  131. // {
  132. // id: 23,
  133. // text: 'Mediate milestone',
  134. // start_date: '14-04-2022',
  135. // // type: gantt.config.types.milestone,
  136. // parent: '15',
  137. // progress: 0,
  138. // open: true,
  139. // },
  140. ],
  141. // #字段解释
  142. // 格式 id:数据id
  143. // source:开始链接的项目id ----为tasks.data中数据的id
  144. // target:要链接项目的id ----为tasks.data中数据的id
  145. // type: 0--进行-开始 `尾部链接头部`
  146. // 1--开始-开始 `头部链接头部`
  147. // 2--进行-进行 `尾部链接尾部`
  148. // 3--开始-进行 `头部链接尾部`
  149. // 任务之间连接
  150. links: [
  151. { id: '10', source: '11', target: '12', type: '1' },
  152. { id: '11', source: '11', target: '13', type: '1' },
  153. { id: '12', source: '11', target: '14', type: '1' },
  154. { id: '13', source: '11', target: '15', type: '1' },
  155. { id: '14', source: '23', target: '16', type: '0' },
  156. { id: '15', source: '13', target: '17', type: '1' },
  157. { id: '16', source: '17', target: '18', type: '0' },
  158. { id: '17', source: '18', target: '19', type: '0' },
  159. { id: '18', source: '19', target: '20', type: '0' },
  160. { id: '19', source: '15', target: '21', type: '2' },
  161. { id: '20', source: '15', target: '22', type: '2' },
  162. { id: '21', source: '15', target: '23', type: '0' },
  163. ],
  164. },
  165. url: {
  166. list: "/projectManage/projectPlan/queryProjectPlanGTT",
  167. // delete: "/projectManage/projectModule/delete",
  168. // deleteBatch: "/projectManage/projectModule/deleteBatch",
  169. // exportXlsUrl: "/projectManage/projectModule/exportXls",
  170. // importExcelUrl: "/projectManage/projectModule/importExcel",
  171. // budgetExportXlsUrl: "/projectManage/projectModule/budgetExportXls",
  172. // budgetImportUrl: "/projectManage/projectModule/budgetImportExcel",
  173. },
  174. }
  175. },
  176. watch: {
  177. },
  178. created() {
  179. console.log(this.planId, '参数');
  180. },
  181. mounted() {
  182. this.loadData();
  183. },
  184. methods: {
  185. // 初始化
  186. init() {
  187. // 格式化日期
  188. gantt.locale.date = {
  189. month_full: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  190. month_short: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  191. day_full: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
  192. day_short: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
  193. }
  194. gantt.locale.labels = {
  195. dhx_cal_today_button: "今天",
  196. day_tab: "日",
  197. week_tab: "周",
  198. month_tab: "月",
  199. new_event: "新建日程",
  200. icon_save: "保存",
  201. icon_cancel: "关闭",
  202. icon_details: "详细",
  203. icon_edit: "编辑",
  204. icon_delete: "删除",
  205. confirm_closing: "请确认是否撤销修改!", //Your changes will be lost, are your sure?
  206. confirm_deleting: "是否删除计划?",
  207. section_description: "描述:",
  208. section_time: "时间范围:",
  209. section_type: "类型:",
  210. section_text: "计划名称:",
  211. section_test: "测试:",
  212. section_projectClass: "项目类型:",
  213. taskProjectType_0: "项目任务",
  214. taskProjectType_1: "普通任务",
  215. section_head: "负责人:",
  216. section_priority: '优先级:',
  217. taskProgress: '任务状态',
  218. taskProgress_0: "未开始",
  219. taskProgress_1: "进行中",
  220. taskProgress_2: "已完成",
  221. taskProgress_3: "已延期",
  222. taskProgress_4: "搁置中",
  223. section_template: 'Details',
  224. /* grid columns */
  225. column_text: "计划名称",
  226. column_start_date: "开始时间",
  227. column_duration: "持续时间",
  228. column_add: "",
  229. column_priority: "难度",
  230. /* link confirmation */
  231. link: "关联",
  232. confirm_link_deleting: "将被删除",
  233. message_ok: '确定',
  234. message_cancel: '取消',
  235. link_start: " (开始)",
  236. link_end: " (结束)",
  237. type_task: "任务",
  238. type_project: "项目",
  239. type_milestone: "里程碑",
  240. minutes: "分钟",
  241. hours: "小时",
  242. days: "天",
  243. weeks: "周",
  244. months: "月",
  245. years: "年"
  246. }
  247. console.log(gantt);
  248. //自适应甘特图的尺寸大小, 使得在不出现滚动条的情况下, 显示全部任务
  249. gantt.config.autosize = true
  250. //只读模式
  251. gantt.config.readonly = false
  252. //是否显示左侧树表格
  253. gantt.config.show_grid = true
  254. // //表格列设置
  255. gantt.config.columns = [
  256. { name: 'text', label: '阶段名字', tree: true, width: '150', align: 'center', },
  257. // { name: 'number', label: '工单号', tree: false, width: '120', align: 'center', },
  258. {
  259. name: 'duration',
  260. label: '工时',
  261. align: 'center',
  262. template: function (obj) {
  263. return obj.duration + '天'
  264. },
  265. },
  266. /*{name:"start_date", label:"开始时间", align: "center" },
  267. {name:"end_date", label:"结束时间", align: "center" },*/
  268. ]
  269. // 自动延长时间刻度
  270. gantt.config.fit_tasks = true
  271. // 允许拖放
  272. gantt.config.drag_project = true
  273. // 定义时间格式
  274. gantt.config.scales = [
  275. { unit: 'month', step: 1, date: ' %Y,%F' },
  276. { unit: 'day', step: 1, date: ' %D ,%j' },
  277. ]
  278. // //当task的长度改变时,自动调整图表坐标轴区间用于适配task的长度
  279. gantt.config.fit_tasks = true
  280. // 添加弹窗属性
  281. gantt.config.lightbox.sections = [
  282. {
  283. name: 'description',
  284. height: 70,
  285. map_to: 'text',
  286. type: 'textarea',
  287. focus: true,
  288. },
  289. { name: 'type', type: 'typeselect', map_to: 'type' },
  290. { name: 'time', type: 'duration', map_to: 'auto' },
  291. ];
  292. console.log(this.tasks.data, '检查任务数据'); // 检查任务数据
  293. // 初始化
  294. gantt.init(this.$refs.gantt)
  295. /* *******重点******* */
  296. gantt.clearAll(); // 清空旧数据
  297. /* ****************** */
  298. // 数据解析
  299. gantt.parse(this.tasks)
  300. },
  301. loadData(arg) {
  302. if (!this.url.list) {
  303. this.$message.error("请设置url.list属性!")
  304. return
  305. }
  306. //加载数据 若传入参数1则加载第一页的内容
  307. let params = {
  308. planId: this.planId,
  309. }
  310. this.loading = true;
  311. this.tasks.data = []
  312. getAction(this.url.list, params).then((res) => {
  313. if (res.success) {
  314. console.log(res, '甘特图数据');
  315. res.result.forEach(obj => {
  316. obj.open = false
  317. })
  318. this.tasks.data = res.result
  319. this.init()
  320. }
  321. if (res.code === 510) {
  322. this.$message.warning(res.message)
  323. }
  324. this.loading = false;
  325. })
  326. },
  327. },
  328. }
  329. </script>
  330. <style lang="less" scoped>
  331. .firstLevelTask {
  332. border: none;
  333. .gantt_task_content {
  334. // font-weight: bold;
  335. font-size: 13px;
  336. }
  337. }
  338. .secondLevelTask {
  339. border: none;
  340. }
  341. .thirdLevelTask {
  342. border: 2px solid #da645d;
  343. color: #da645d;
  344. background: #da645d;
  345. }
  346. .milestone-default {
  347. border: none;
  348. background: rgba(0, 0, 0, 0.45);
  349. }
  350. .milestone-unfinished {
  351. border: none;
  352. background: #5692f0;
  353. }
  354. .milestone-finished {
  355. border: none;
  356. background: #84bd54;
  357. }
  358. .milestone-canceled {
  359. border: none;
  360. background: #da645d;
  361. }
  362. html,
  363. body {
  364. margin: 0px;
  365. padding: 0px;
  366. height: 100%;
  367. overflow: hidden;
  368. }
  369. .container {
  370. height: 900px;
  371. .left-container {
  372. height: 100%;
  373. }
  374. }
  375. .left-container {
  376. height: 600px;
  377. }
  378. .gantt_scale_line {
  379. border-top: 0;
  380. }
  381. .weekend {
  382. //background:#f4f7f4!important;
  383. color: #000000 !important;
  384. }
  385. .gantt_selected .weekend {
  386. background: #f7eb91 !important;
  387. }
  388. .gantt_task_content {
  389. text-align: left;
  390. padding-left: 10px;
  391. }
  392. //上面任务条样式
  393. .gantt_task_scale {
  394. height: 45px !important;
  395. }
  396. .gantt_task .gantt_task_scale .gantt_scale_cell {
  397. line-height: 30px !important;
  398. height: 28px !important;
  399. }
  400. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/499534
推荐阅读
相关标签
  

闽ICP备14008679号