v1.4.2-patch.3 - 性能提升

This commit is contained in:
LINING-PC\lining
2025-11-13 10:28:44 +08:00
parent 0db919cf50
commit ae82e29947
8 changed files with 251 additions and 1979 deletions
+24
View File
@@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.4.2-patch3] - 2025-11-13
### Added
- 支持视图上下/左右拖拽
- Support for vertical/horizontal dragging of the view
### Enhancement
- 性能优化:canvas绘制性能优化
- 性能优化:拖拽视图性能优化,拖拽期间禁止重绘canvas
- 性能优化:周视图月开始分隔线实现使用canvas替代dom
- 性能优化:使用canvas替代svg links实现
- 性能优化:路径缓存+防抖+shallowRef计算
- Performance Optimization: Canvas drawing performance optimization
- Performance Optimization: View dragging performance optimization, disabling canvas redraw during dragging
- Performance Optimization: Weekly view month start separator line implemented using canvas instead of DOM
- Performance Optimization: Using canvas instead of SVG links implementation
- Performance Optimization: Path caching + debounce + shallowRef calculation
## [1.4.2-patch1] - 2025-11-03
### Fixed
- 缺陷修复:更新父级任务后,再次更新子级任务是发生无限循环调用的问题修复
- Defect fix: Fixed the issue of infinite loop calls when updating child tasks after updating the parent task
## [1.4.2-patch2] - 2025-11-11 ## [1.4.2-patch2] - 2025-11-11
### Fixed ### Fixed
+3
View File
@@ -1778,6 +1778,7 @@ Override or extend default translations via `localeMessages` prop:
<script setup lang="ts"> <script setup lang="ts">
const customMessages = { const customMessages = {
"zh-CN": {
// Task list related // Task list related
name: 'Task Name (Custom)', name: 'Task Name (Custom)',
startDate: 'Start Date', startDate: 'Start Date',
@@ -1825,6 +1826,8 @@ const customMessages = {
overtime: 'overtime', overtime: 'overtime',
overdue: 'overdue', overdue: 'overdue',
// ... More custom translations // ... More custom translations
},
"en-US": {......}
} }
</script> </script>
``` ```
+3
View File
@@ -1769,6 +1769,7 @@ const handleLanguageChange = (lang: 'zh-CN' | 'en-US') => {
<script setup lang="ts"> <script setup lang="ts">
const customMessages = { const customMessages = {
"zh-CN": {
// 任务列表相关 // 任务列表相关
name: '任务名称(自定义)', name: '任务名称(自定义)',
startDate: '开始日期', startDate: '开始日期',
@@ -1816,6 +1817,8 @@ const customMessages = {
overtime: '超时', overtime: '超时',
overdue: '逾期', overdue: '逾期',
// ... 更多自定义翻译 // ... 更多自定义翻译
},
"en-US": {......}
} }
</script> </script>
``` ```
+20
View File
@@ -286,5 +286,25 @@
"Defect fix: Fixed the issue of invalid column width configuration in TaskList", "Defect fix: Fixed the issue of invalid column width configuration in TaskList",
"<span style=\"font-weight: bold; color: #f00;\">Special thanks to @SHENGLONG749 for their valuable use and feedback</span>" "<span style=\"font-weight: bold; color: #f00;\">Special thanks to @SHENGLONG749 for their valuable use and feedback</span>"
] ]
},
{
"version": "1.4.2-patch3",
"date": "2025-11-13",
"notes": [
"新增:支持视图上下/左右拖拽",
"性能优化:canvas绘制性能优化",
"性能优化:拖拽视图性能优化,拖拽期间禁止重绘canvas",
"性能优化:周视图月开始分隔线实现使用canvas替代dom",
"性能优化:使用canvas替代svg links实现",
"性能优化:路径缓存+防抖+shallowRef计算",
"Added: Support for vertical/horizontal dragging of the view",
"Performance Optimization: Canvas drawing performance optimization",
"Performance Optimization: View dragging performance optimization, disabling canvas redraw during dragging",
"Performance Optimization: Weekly view month start separator line implemented using canvas instead of DOM",
"Performance Optimization: Using canvas instead of SVG links implementation",
"Performance Optimization: Path caching + debounce + shallowRef calculation",
"<span style=\"font-weight: bold; color: #f00;\">特别感谢 @qiuchengw的专业贡献</span>",
"<span style=\"font-weight: bold; color: #f00;\">Special thanks to @qiuchengw for his professional contribution</span>"
]
} }
] ]
+148 -149
View File
@@ -1,3 +1,150 @@
<script setup lang="ts">
import { ref } from 'vue'
import { GanttChart } from 'jordium-gantt-vue3'
import 'jordium-gantt-vue3/dist/assets/jordium-gantt-vue3.css'
//
interface TaskListColumnConfig {
key: string;
label: string;
visible: boolean;
width?: number;
}
interface ToolbarConfig {
showAddTask?: boolean;
showAddMilestone?: boolean;
showTodayLocate?: boolean;
showExportCsv?: boolean;
showExportPdf?: boolean;
showLanguage?: boolean;
showTheme?: boolean;
showFullscreen?: boolean;
showTimeScale?: boolean;
timeScaleDimensions?: string[];
defaultTimeScale?: string;
showExpandCollapse?: boolean;
}
const tasks = ref([
{
id: 1,
name: '项目启动',
startDate: '2025-10-30',
endDate: '2025-11-5',
progress: 100,
department: '管理部',
departmentCode: 'D001',
type: 'task',
},
])
const milestones = ref([
{
id: 101,
name: '项目立项',
startDate: '2025-10-29',
type: 'milestone',
icon: 'diamond',
},
])
const customMessages = {
'zh-CN': {
department: '部门',
departmentCode: '部门编号',
},
'en-US': {
department: 'Department',
departmentCode: 'Department Code',
},
}
// const tasks = ref([])
// const milestones = ref([])
const showAddTaskDrawer = ref(false)
const showAddMilestoneDialog = ref(false)
//
const availableColumns = ref<TaskListColumnConfig[]>([
{ key: 'startDate', label: '开始日期', visible: true },
{ key: 'endDate', label: '结束日期', visible: true },
{ key: 'progress', label: '进度', visible: true },
{ key: 'department', label: '部门', visible: true, width: 120 },
{ key: 'departmentCode', label: '部门编号', visible: true },
])
// TaskList
const taskListConfig = {
defaultWidth: '50%', // 50%
minWidth: '300px', // 300px280px
maxWidth: '1200px', // 1200px1160px
columns: availableColumns.value,
}
// toolbar
const toolbarConfig: ToolbarConfig = {
showAddTask: true, //
showAddMilestone: true, //
showTodayLocate: true, //
showExportCsv: true, // CSV
showExportPdf: true, // PDF
showLanguage: true, //
showTheme: true, //
showFullscreen: true, //
showTimeScale: true, //
timeScaleDimensions: [ //
'hour', 'day', 'week', 'month', 'quarter', 'year',
],
defaultTimeScale: 'week', //
showExpandCollapse: false, // /
}
const newTask = ref({
name: '',
startDate: '',
endDate: '',
})
const addTask = () => {
tasks.value.push({
id: tasks.value.length + 1,
name: newTask.value.name,
startDate: newTask.value.startDate,
endDate: newTask.value.endDate,
progress: 0,
department: '未分配',
departmentCode: 'D000',
type: 'task',
})
newTask.value = { name: '', startDate: '', endDate: '' }
showAddTaskDrawer.value = false
}
const addMilestone = () => {
milestones.value.push({
id: milestones.value.length + 101,
name: newTask.value.name,
startDate: newTask.value.startDate,
type: 'milestone',
icon: 'diamond',
})
console.log('milestones: ', milestones.value)
newTask.value = { name: '', startDate: '', endDate: '' }
showAddMilestoneDialog.value = false
}
const onTaskDblclick = (task: any) => {
alert(`双击任务: ${task.name}`)
}
const onTaskClick = (task: any) => {
alert(`单击任务: ${task.name}`)
}
const onMilestoneDblclick = (milestone: any) => {
alert(`双击里程碑: ${milestone.name}`)
}
</script>
<template> <template>
<div> <div>
<div style="height: 600px;"> <div style="height: 600px;">
@@ -58,8 +205,8 @@
<!-- 自定义Dialog组件基于element plus --> <!-- 自定义Dialog组件基于element plus -->
<el-dialog <el-dialog
title="自定义添加里程碑组件 - Element Plus"
v-model="showAddMilestoneDialog" v-model="showAddMilestoneDialog"
title="自定义添加里程碑组件 - Element Plus"
width="400px" width="400px"
@close="newTask = { name: '', startDate: '', endDate: '' }" @close="newTask = { name: '', startDate: '', endDate: '' }"
> >
@@ -83,154 +230,6 @@
</div> </div>
</template> </template>
<script setup lang="ts">
import { ref } from 'vue';
import { GanttChart } from 'jordium-gantt-vue3'
import 'jordium-gantt-vue3/dist/assets/jordium-gantt-vue3.css'
//
interface TaskListColumnConfig {
key: string;
label: string;
visible: boolean;
width?: number;
}
interface ToolbarConfig {
showAddTask?: boolean;
showAddMilestone?: boolean;
showTodayLocate?: boolean;
showExportCsv?: boolean;
showExportPdf?: boolean;
showLanguage?: boolean;
showTheme?: boolean;
showFullscreen?: boolean;
showTimeScale?: boolean;
timeScaleDimensions?: string[];
defaultTimeScale?: string;
showExpandCollapse?: boolean;
}
const tasks = ref([
{
id: 1,
name: '项目启动',
startDate: '2025-10-30',
endDate: '2025-11-5',
progress: 100,
department: '管理部',
departmentCode: 'D001',
type: 'task',
}
])
const milestones = ref([
{
id: 101,
name: '项目立项',
startDate: '2025-10-29',
type: 'milestone',
icon: 'diamond'
}
])
const customMessages = {
'zh-CN': {
department: '部门',
departmentCode: '部门编号',
},
'en-US': {
department: 'Department',
departmentCode: 'Department Code',
}
}
// const tasks = ref([])
// const milestones = ref([])
const showAddTaskDrawer = ref(false);
const showAddMilestoneDialog = ref(false);
//
const availableColumns = ref<TaskListColumnConfig[]>([
{ key: 'startDate', label: '开始日期', visible: true },
{ key: 'endDate', label: '结束日期', visible: true },
{ key: 'progress', label: '进度', visible: true },
{ key: 'department', label: '部门', visible: true, width: 120 },
{ key: 'departmentCode', label: '部门编号', visible: true },
])
// TaskList
const taskListConfig = {
defaultWidth: '50%', // 50%
minWidth: '300px', // 300px280px
maxWidth: '1200px', // 1200px1160px
columns: availableColumns.value
}
// toolbar
const toolbarConfig: ToolbarConfig = {
showAddTask: true, //
showAddMilestone: true, //
showTodayLocate: true, //
showExportCsv: true, // CSV
showExportPdf: true, // PDF
showLanguage: true, //
showTheme: true, //
showFullscreen: true, //
showTimeScale: true, //
timeScaleDimensions: [ //
'hour', 'day', 'week', 'month', 'quarter', 'year'
],
defaultTimeScale: 'week', //
showExpandCollapse: false // /
}
const newTask = ref({
name: '',
startDate: '',
endDate: ''
});
const addTask = () => {
tasks.value.push({
id: tasks.value.length + 1,
name: newTask.value.name,
startDate: newTask.value.startDate,
endDate: newTask.value.endDate,
progress: 0,
department: '未分配',
departmentCode: 'D000',
type: 'task',
});
newTask.value = { name: '', startDate: '', endDate: '' };
showAddTaskDrawer.value = false;
};
const addMilestone = () => {
milestones.value.push({
id: milestones.value.length + 101,
name: newTask.value.name,
startDate: newTask.value.startDate,
type: 'milestone',
icon: 'diamond'
});
console.log('milestones: ', milestones.value)
newTask.value = { name: '', startDate: '', endDate: '' };
showAddMilestoneDialog.value = false;
}
const onTaskDblclick = (task: any) => {
alert(`双击任务: ${task.name}`)
}
const onTaskClick = (task: any) => {
alert(`单击任务: ${task.name}`)
}
const onMilestoneDblclick = (milestone: any) => {
alert(`双击里程碑: ${milestone.name}`)
}
</script>
<style scoped> <style scoped>
/* 抽屉遮罩层 */ /* 抽屉遮罩层 */
.drawer-overlay { .drawer-overlay {
+7 -7
View File
@@ -1,8 +1,8 @@
import { createApp } from 'vue'; import { createApp } from 'vue'
import App from './App.vue'; import App from './App.vue'
import ElementPlus from 'element-plus'; import ElementPlus from 'element-plus'
import 'element-plus/theme-chalk/index.css'; import 'element-plus/theme-chalk/index.css'
const app = createApp(App); const app = createApp(App)
app.use(ElementPlus); app.use(ElementPlus)
app.mount('#app'); app.mount('#app')
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jordium-gantt-vue3", "name": "jordium-gantt-vue3",
"version": "1.4.2-patch.2", "version": "1.4.2-patch.3",
"type": "module", "type": "module",
"main": "dist/jordium-gantt-vue3.cjs.js", "main": "dist/jordium-gantt-vue3.cjs.js",
"module": "dist/jordium-gantt-vue3.es.js", "module": "dist/jordium-gantt-vue3.es.js",
-1777
View File
File diff suppressed because it is too large Load Diff