kd-lane-container 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,417 +1,571 @@
1
- # KdLaneChartContainer 组件使用文档
2
-
3
- ## 1. 组件概述
4
-
5
- KdLaneChartContainer 是一个基于 Vue 开发的泳道图容器组件,用于展示和管理泳道模板、线条配置等。
6
-
7
- ### 1.1 设计思路
8
- - **逻辑分离**:将模板、泳道、参数的设置逻辑和绘制逻辑完全剥离,提高组件的可维护性和扩展性
9
- - **接口兼容**:提供了不依赖接口但是兼容接口实现的模板配置逻辑,既支持本地静态数据直接使用,也支持对接后端接口
10
- - **使用场景**:
11
- - 适合静态数据展示场景,无需后端接口即可运行
12
- - 适合合作单位使用,提供灵活的数据接入方式
13
- - **技术栈无关**:不限制绘制区技术栈,绘制逻辑完全由外部实现,只需要监听组件事件即可动态调整绘制内容
14
-
15
- ## 2. 组件功能
16
-
17
- ## 2. 组件功能
18
-
19
- - 加载和展示泳道模板
20
- - 支持自定义泳道头部
21
- - 提供上下文菜单操作
22
- - 支持自定义菜单扩展
23
- - 实时曲线配置功能
24
- - 模板和线条的增删改查操作
25
-
26
- ## 3. 组件引入
27
-
28
- ### 3.1 安装与注册
29
- ```javascript
30
- // 安装依赖
31
- // npm install kd-lane-container --save
32
-
33
- // 引入组件
34
- import KdLaneChartContainer from "kd-lane-container";
35
- import Vue from "vue";
36
-
37
- // 注册组件
38
- Vue.use(KdLaneChartContainer);
39
- ```
40
-
41
- ### 3.2 在组件中使用
42
- ```javascript
43
- export default {
44
- // 组件已全局注册,无需再局部注册
45
- // components: {},
46
- // ...
47
- };
48
- ```
49
-
50
- ## 4. 组件使用
51
-
52
- ### 4.1 基本使用
53
-
54
- ```vue
55
- <KdLaneChartContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
56
- <!-- 自定义插槽内容 -->
57
- </KdLaneChartContainer>
58
- ```
59
-
60
- ### 4.1 场景与版本控制
61
-
62
- #### 4.1.1 场景唯一标识规则
63
- - **caseId (场景ID)**:用于唯一标识不同的应用场景或业务模块。
64
- - 必须确保在同一应用中唯一,否则会导致数据混淆。
65
- - 建议使用业务模块名称或唯一的UUID。
66
- - 所有数据操作都将与该场景ID绑定,确保数据隔离。
67
-
68
- #### 4.1.2 版本号管理
69
- - **versionCode (版本号)**:用于管理不同版本的初始配置。
70
- - 当业务需求发生重大变更时,可以通过升级版本号来重置数据。
71
- - 版本号升级后,系统会自动清理旧版本数据并重新初始化。
72
- - 版本号必须为整数,建议从1开始递增。
73
-
74
- #### 4.1.3 数据初始化策略
75
- - 首次初始化:系统会将传入的`dataSource`保存为当前版本的初始配置。
76
- - 版本冲突:当检测到版本号变更时,系统会自动重置数据并使用新版本的配置。
77
- - 异常恢复:如果初始化过程中出现错误,系统会自动执行重置操作。
78
-
79
- ### 4.2 配置参数
80
-
81
- #### 4.2.1 本地数据源 (Local)
82
-
83
- ```javascript
84
- config: {
85
- type: "local", // 数据源类型,可选值: "local" | "custom"
86
- caseId: "demo", // 案例ID
87
- versionCode: 2, // 版本号
88
- dataSource: { // 数据源
89
- // 支持两种数据结构:
90
-
91
- // 1. 扁平结构 (推荐用于数据量大的场景)
92
- templates: [], // 模板数据
93
- lanes: [], // 泳道数据
94
- lines: [], // 线条数据
95
- params: [] // 参数数据
96
-
97
- // 2. 树形结构 (直观易读,不用关心数据ID,组件会自己补全和维护)
98
- // templates: [{
99
- // lanes: [{
100
- // lines: []
101
- // }]
102
- // }],
103
- // params: []
104
- }
105
- }
106
- ```
107
-
108
- #### 4.2.2 自定义数据源 (Custom)
109
-
110
- 当需要从服务器或自定义数据源获取和管理数据时,使用 `custom` 类型。需要实现以下CRUD方法:
111
-
112
- ```javascript
113
- config: {
114
- type: "custom", // 数据源类型,可选值: "local" | "custom"
115
- caseId: "demo", // 案例ID
116
- versionCode: 2, // 版本号
117
-
118
- // 自定义数据源必须实现的方法
119
- getUserTemplates() { /* 加载所有模板、泳道和线条数据 */ },
120
- upsertTemplate(data) { /* 新增或更新模板 */ },
121
- delTemplate(data) { /* 删除模板 */ },
122
- upsertLane(data) { /* 新增或更新泳道 */ },
123
- delLane(data) { /* 删除泳道 */ },
124
- upsertLine(data) { /* 新增或更新线条 */ },
125
- delLine(data) { /* 删除线条 */ },
126
-
127
- // 可选方法:恢复默认设置
128
- restoreSetting() { /* 恢复默认设置 */ }
129
- }
130
- ```
131
-
132
- 各方法参数和返回值说明:
133
-
134
- 1. `getUserTemplates()`
135
- - 返回值:`Promise<Object>` - 包含所有模板、泳道和线条数据的配置对象
136
- - 示例:
137
- ```json
138
- {
139
- "caseVersion": { "caseId": "case123", "versionCode": "v1.0" },
140
- "templates": [/* 模板数组 */],
141
- "params": []
142
- }
143
- ```
144
-
145
- 2. `upsertTemplate(data)`
146
- - 参数:`data` - 模板数据
147
- - 返回值:`Promise<Object>` - 插入或更新后的完整模板对象
148
-
149
- 3. `delTemplate(data)`
150
- - 参数:`data` - 模板数据(需包含`templateId`)
151
- - 返回值:`Promise<void>` - 操作成功或失败的Promise
152
-
153
- 4. `upsertLane(data)`
154
- - 参数:`data` - 泳道数据
155
- - 返回值:`Promise<Object>` - 插入或更新后的完整泳道对象
156
-
157
- 5. `delLane(lane)`
158
- - 参数:`lane` - 泳道数据(需包含`laneId`和`lines`数组)
159
- - 返回值:`Promise<void>` - 操作成功或失败的Promise
160
-
161
- 6. `upsertLine(data)`
162
- - 参数:`data` - 线条数据
163
- - 返回值:`Promise<Object>` - 插入或更新后的完整线条对象
164
-
165
- 7. `delLine(data)`
166
- - 参数:`data` - 线条数据(需包含`lineId`和`laneId`)
167
- - 返回值:`Promise<void>` - 操作成功或失败的Promise
168
-
169
- 8. `restoreSetting()` (可选)
170
- - 返回值:`Promise<void>` - 恢复默认设置的Promise
171
-
172
- ### 4.3 自定义菜单
173
-
174
- customMenuList用于在上下文菜单中添加自定义操作选项。当用户在泳道头部或线条上右键点击时,这些自定义选项会出现在上下文菜单中。
175
-
176
- #### 4.3.1 菜单结构
177
- ```javascript
178
- customMenuList: [
179
- {
180
- name: "单屏时长", // 菜单项显示名称
181
- key: "timeRange" // 菜单项唯一标识
182
- },
183
- {
184
- name: "导出数据",
185
- key: "exportData"
186
- }
187
- ];
188
- ```
189
-
190
- #### 4.3.2 点击事件
191
- 当用户点击自定义菜单项时,会触发 `onCustomMenuClicked` 事件,并传递以下参数:
192
- - `event`: 事件对象,包含 `option` 和 `item` 属性
193
- - `option`: 被点击的菜单项配置
194
- - `item`: 右键点击时的目标对象(可能是泳道或线条)
195
-
196
- #### 4.3.3 使用示例
197
- ```html
198
- <kd-lane-chart-container
199
- :customMenuList=\"[{ name: '单屏时长', key: 'timeRange' }]\"
200
- @onCustomMenuClicked=\"handleCustomMenuClick\">
201
- </kd-lane-chart-container>
202
- ```
203
-
204
- ```javascript
205
- handleCustomMenuClick(event) {
206
- const { option, item } = event;
207
- console.log('自定义菜单项被点击:', option.name);
208
- console.log('点击的目标对象:', item);
209
-
210
- if (option.key === 'timeRange') {
211
- // 处理单屏时长操作
212
- }
213
- }
214
- ```
215
-
216
- ## 5. 组件 API
217
-
218
- ### 5.1 Props
219
-
220
- | 属性名 | 类型 | 默认值 | 说明 |
221
- | ---------------- | ------ | ------ | ---------------- |
222
- | config | Object | 必填 | 组件配置对象 |
223
- | headerPadding | Number | 4 | 泳道头部内边距 |
224
- | headerItemHeight | Number | 20 | 头部线条项高度 |
225
- | itemGap | Number | 2 | 线条项之间的间距 |
226
- | customMenuList | Array | [] | 自定义菜单列表 |
227
-
228
- ### 5.2 事件
229
-
230
- | 事件名 | 参数 | 说明 |
231
- | ------------------- | -------- | ------------------ |
232
- | onCustomMenuClicked | event | 自定义菜单点击事件 |
233
- | line-change | line | 线条变化事件 |
234
- | template-change | template | 模板变化事件 |
235
-
236
- ### 5.3 方法
237
-
238
- 组件内部提供的方法主要用于模板和线条的管理:
239
-
240
- - upsertTemplate(data) - 新增或更新模板
241
- - 参数:`data` - 模板数据
242
- - 返回值:`Promise<Object>` - 插入或更新后的**完整**模板对象
243
-
244
- - delTemplate(data) - 删除模板
245
- - 参数:`data` - 模板数据(需包含`templateId`)
246
- - 返回值:`Promise<void>` - 操作成功或失败的Promise
247
-
248
- - upsertLane(data) - 新增或更新泳道
249
- - 参数:`data` - 泳道数据
250
- - 返回值:`Promise<Object>` - 插入或更新后的**完整**泳道对象
251
-
252
- - delLane(lane) - 删除泳道
253
- - 参数:`lane` - 泳道数据(需包含`laneId`和`lines`数组)
254
- - 返回值:`Promise<void>` - 操作成功或失败的Promise
255
-
256
- - upsertLine(data) - 新增或更新线条
257
- - 参数:`data` - 线条数据
258
- - 返回值:`Promise<Object>` - 插入或更新后的**完整线**条对象
259
-
260
- - delLine(data) - 删除线条
261
- - 参数:`data` - 线条数据(需包含`lineId`和`laneId`)
262
- - 返回值:`Promise<void>` - 操作成功或失败的Promise
263
-
264
- - restoreSetting() - 恢复默认设置
265
- - 功能:将当前场景的数据重置为初始配置状态
266
- - 实现逻辑:使用构造函数传入的初始dataSource重新初始化数据
267
- - 返回值:`Promise<void>` - 恢复默认设置的Promise
268
-
269
- ## 6. 自定义插槽
270
-
271
- 组件支持根据泳道 ID 动态生成的插槽,用于自定义泳道头部:
272
-
273
- ```vue
274
- <KdLaneChartContainer ...>
275
- <!-- 动态slot名称 -->
276
- <template v-if="slotName">
277
- <div :slot="slotName" class="demo-slot">
278
- {{ slotName }}
279
- </div>
280
- </template>
281
-
282
- <!-- 带参数的插槽 -->
283
- <template v-if="slotName2" :slot="slotName2" slot-scope="slotData">
284
- <div class="demo-slot">{{ typeof slotData }}</div>
285
- </template>
286
- </KdLaneChartContainer>
287
- ```
288
-
289
- 插槽名称格式为 `lane${laneId}`,例如:`lane1556bdbfd0f24c11948b14999947c556`。
290
-
291
- ### 6.2 draw-slot 画布插槽
292
-
293
- 组件提供 `draw-slot` 插槽用于自定义绘制内容,该插槽占据泳道下方的整个绘制区域:
294
-
295
- ```vue
296
- <KdLaneChartContainer ...>
297
- <template slot="draw-slot">
298
- <div style="height: 100%; width: 100%; padding: 10px">
299
- <!-- 自定义绘制内容 -->
300
- </div>
301
- </template>
302
- </KdLaneChartContainer>
303
- ```
304
-
305
- ### 6.3 插槽布局与尺寸注意事项
306
-
307
- 1. **布局方式**:
308
- - 自定义插槽与泳道区域采用 flex 布局
309
- - 自定义插槽会占据剩余位置后,与其他泳道进行平分
310
- - 确保自定义插槽内容的宽度和高度设置正确,以保证与泳道对齐
311
-
312
- 2. **尺寸单位**:
313
- - 组件内的自定义插槽使用 style 绑定形式
314
- - 宽度和高度单位必须使用 px,以确保精确对齐
315
- - 避免使用其他单位(如 %、rem、em 等),否则可能导致布局错位
316
-
317
- 3. **样式处理**:
318
- - 不要使用全局样式处理插件对自定义插槽的尺寸单位进行转换
319
- - 直接使用 px 单位编写插槽内容的尺寸样式
320
- - 确保插槽内容的 box-sizing 为 border-box,以避免 padding 和 border 影响实际尺寸
321
-
322
- ```vue
323
- <!-- 推荐的插槽内容样式 -->
324
- <template slot="draw-slot">
325
- <div style="height: 100%; width: 100%; box-sizing: border-box; padding: 10px">
326
- <!-- 自定义绘制内容 -->
327
- </div>
328
- </template>
329
- ```
330
-
331
- ## 7. 样式定制
332
-
333
- 可以通过 CSS 变量或直接覆盖样式来自定义组件外观:
334
-
335
- ```css
336
- .kd-lane-chart-container {
337
- --kd-lane-container-border-color: white;
338
- --kd-lane-container-context-background-color: darkgray;
339
- --kd-lane-container-context-hover-color: darkgray;
340
- --kd-lane-container-header-item-color: white;
341
- --app-background-color: gray;
342
- }
343
- ```
344
-
345
- ## 8. 使用示例
346
-
347
- ```vue
348
- <template>
349
- <div id="app">
350
- <KdLaneChartContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
351
- <template v-if="slotName">
352
- <div :slot="slotName" class="demo-slot">
353
- {{ slotName }}
354
- </div>
355
- </template>
356
- </KdLaneChartContainer>
357
- </div>
358
- </template>
359
-
360
- <script>
361
- import KdLaneChartContainer from "./components/kd-lane/chart-container.vue";
362
- import { data } from "./mock/mockData.js";
363
-
364
- export default {
365
- name: "App",
366
- components: {
367
- KdLaneChartContainer,
368
- },
369
- data() {
370
- return {
371
- config: {
372
- type: "local",
373
- caseId: "demo",
374
- versionCode: 2,
375
- dataSource: { templates: data.templates, lanes: data.lanes, lines: data.lines, params: data.params },
376
- },
377
- slotName: "",
378
- customMenuList: [{ name: "单屏时长", key: "timeRange" }],
379
- };
380
- },
381
- mounted() {
382
- setTimeout(() => {
383
- this.slotName = "lane1556bdbfd0f24c11948b14999947c556";
384
- }, 2000);
385
- },
386
- methods: {
387
- onCustomMenuClicked(event) {
388
- console.log(event);
389
- },
390
- },
391
- };
392
- </script>
393
-
394
- <style>
395
- #app {
396
- font-family: Avenir, Helvetica, Arial, sans-serif;
397
- -webkit-font-smoothing: antialiased;
398
- -moz-osx-font-smoothing: grayscale;
399
- text-align: center;
400
- color: #2c3e50;
401
- height: 100vh;
402
- position: relative;
403
- padding: 10px;
404
-
405
- .container {
406
- margin-left: 100px;
407
- margin-top: 50px;
408
- height: 600px;
409
- width: 800px;
410
- }
411
-
412
- .demo-slot {
413
- width: 80px;
414
- }
415
- }
416
- </style>
417
- ```
1
+ # KdLaneChartContainer 组件使用文档
2
+
3
+ ## 1. 组件概述
4
+
5
+ KdLaneChartContainer 是一个基于 Vue 开发的泳道图容器组件,用于展示和管理泳道模板、线条配置等。
6
+
7
+ ### 1.1 设计思路
8
+
9
+ - **逻辑分离**:将模板、泳道、参数的设置逻辑和绘制逻辑完全剥离,提高组件的可维护性和扩展性
10
+ - **接口兼容**:提供了不依赖接口但是兼容接口实现的模板配置逻辑,既支持本地静态数据直接使用,也支持对接后端接口
11
+ - **使用场景**:
12
+ - 适合静态数据展示场景,无需后端接口即可运行
13
+ - 适合合作单位使用,提供灵活的数据接入方式
14
+ - **技术栈无关**:不限制绘制区技术栈,绘制逻辑完全由外部实现,只需要监听组件事件即可动态调整绘制内容
15
+
16
+ ## 2. 组件功能
17
+
18
+ - 加载和展示泳道模板
19
+ - 支持自定义泳道头部
20
+ - 提供上下文菜单操作
21
+ - 支持自定义菜单扩展
22
+ - 实时曲线配置功能
23
+ - 模板和线条的增删改查操作
24
+
25
+ ## 3. 组件引入
26
+
27
+ ### 3.1 安装与注册
28
+
29
+ ```javascript
30
+ // 安装依赖
31
+ // npm install kd-lane-container --save
32
+
33
+ // 引入组件
34
+ import KdLaneChartContainer from "kd-lane-container";
35
+ import Vue from "vue";
36
+
37
+ // 注册组件
38
+ Vue.use(KdLaneChartContainer);
39
+ ```
40
+
41
+ ### 3.2 在组件中使用
42
+
43
+ ```javascript
44
+ export default {
45
+ // 组件已全局注册,无需再局部注册
46
+ // components: {},
47
+ // ...
48
+ };
49
+ ```
50
+
51
+ ## 4. 组件使用
52
+
53
+ ### 4.1 基本使用
54
+
55
+ ```vue
56
+ <KdLaneChartContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
57
+ <!-- 自定义插槽内容 -->
58
+ </KdLaneChartContainer>
59
+ ```
60
+
61
+ ### 4.2 场景与版本控制
62
+
63
+ #### 4.1.1 场景唯一标识规则
64
+
65
+ - **caseId (场景 ID)**:用于唯一标识不同的应用场景或业务模块。
66
+ - 必须确保在同一应用中唯一,否则会导致数据混淆。
67
+ - 建议使用业务模块名称或唯一的 UUID。
68
+ - 所有数据操作都将与该场景 ID 绑定,确保数据隔离。
69
+
70
+ #### 4.1.2 版本号管理
71
+
72
+ - **versionCode (版本号)**:用于管理不同版本的初始配置。
73
+ - 当业务需求发生重大变更时,可以通过升级版本号来重置数据。
74
+ - 版本号升级后,系统会自动清理旧版本数据并重新初始化。
75
+ - 版本号必须为整数,建议从 1 开始递增。
76
+
77
+ #### 4.1.3 数据初始化策略
78
+
79
+ - 首次初始化:系统会将传入的`dataSource`保存为当前版本的初始配置。
80
+ - 版本冲突:当检测到版本号变更时,系统会自动重置数据并使用新版本的配置。
81
+ - 异常恢复:如果初始化过程中出现错误,系统会自动执行重置操作。
82
+
83
+ ### 4.2 配置参数
84
+
85
+ #### 4.2.1 数据源类型选择说明
86
+
87
+ KdLaneChartContainer 支持两种数据源类型:
88
+
89
+ - **local**:无后台配置接口,仅需前端单方面维护配置时使用
90
+ - **custom**:需要本组件 + 后台实时曲线配置接口组合使用时使用
91
+
92
+ #### 4.2.2 本地数据源 (Local)
93
+
94
+ ```javascript
95
+ config: {
96
+ type: "local", // 数据源类型,可选值: "local" | "custom"
97
+ caseId: "demo", // 案例ID
98
+ versionCode: 2, // 版本号
99
+ dataSource: { // 数据源
100
+ // 支持两种数据结构:
101
+
102
+ // 1. 扁平结构 (推荐用于数据量大的场景)
103
+ templates: [], // 模板数据
104
+ lanes: [], // 泳道数据
105
+ lines: [], // 线条数据
106
+ params: [] // 参数数据
107
+
108
+ // 2. 树形结构 (直观易读,不用关心数据ID,组件会自己补全和维护)
109
+ // templates: [{
110
+ // lanes: [{
111
+ // lines: []
112
+ // }]
113
+ // }],
114
+ // params: []
115
+ }
116
+ }
117
+ ```
118
+
119
+ **local 模式下 datasource 参数说明:**
120
+
121
+ - **templates**:只需提供 `templateName` 属性
122
+ - **lane**:不需要提供任何属性
123
+ - **line**:需要提供以下属性:`paramId`, `min`, `lineSort`, `max`, `lineSize`, `lineColor`, `lineType`, `isUsed`
124
+ 可选属性:`themeConfig` - 线条级别主题颜色配置,支持为不同主题设置不同的线条颜色
125
+ 示例:`{ paramId: "51", min: 0.001, lineSort: 1, max: 100, lineSize: "2", lineColor: "#E5360B", lineType: "solid", isUsed: "1", themeConfig: { white: { lineColor: "blue" }, dark: { lineColor: "black" }, gray: { lineColor: "yellow" } } }`
126
+ - **params**:需要提供以下属性:`paramId`, `paramName`, `paramUnit`
127
+ 示例:`{ paramId: "12", paramName: "钻头位置", paramUnit: "m" }`
128
+
129
+ **完整 local 模式示例配置:**
130
+
131
+ ```javascript
132
+ config: {
133
+ type: "local",
134
+ caseId: "demo",
135
+ versionCode: 2,
136
+ dataSource: {
137
+ // 嵌套结构示例
138
+ templates: [
139
+ {
140
+ templateName: "测试",
141
+ lanes: [
142
+ {
143
+ lines: [
144
+ { paramId: "51", min: 0.001, lineSort: 1, max: 100, lineSize: "2", lineColor: "#E5360B", lineType: "solid", isUsed: "1", themeConfig: { white: { lineColor: "blue" }, dark: { lineColor: "black" }, gray: { lineColor: "yellow" } } },
145
+ { paramId: "52", min: 0, lineSort: 2, max: 50, lineSize: "1", lineColor: "#1890FF", lineType: "dashed", isUsed: "1" }
146
+ ]
147
+ }
148
+ ]
149
+ }
150
+ ],
151
+ params: [
152
+ { paramId: "51", paramName: "钻头位置", paramUnit: "m" },
153
+ { paramId: "52", paramName: "钻压", paramUnit: "kN" }
154
+ ]
155
+ }
156
+ }
157
+ ```
158
+
159
+ #### 4.2.3 自定义数据源 (Custom)
160
+
161
+ ```javascript
162
+ config: {
163
+ type: "custom", // 数据源类型,可选值: "local" | "custom"
164
+ caseId: "demo", // 案例ID
165
+ versionCode: 2, // 版本号
166
+
167
+ // 自定义数据源必须实现的7个方法,需按照要求的返回格式设置
168
+ getUserTemplates() { /* 加载所有模板、泳道和线条数据 */ },
169
+ upsertTemplate(data) { /* 新增或更新模板 */ },
170
+ delTemplate(data) { /* 删除模板 */ },
171
+ upsertLane(data) { /* 新增或更新泳道 */ },
172
+ delLane(data) { /* 删除泳道 */ },
173
+ upsertLine(data) { /* 新增或更新线条 */ },
174
+ delLine(data) { /* 删除线条 */ },
175
+
176
+ // 可选方法:恢复默认设置 【**在local模式下,可以通过this.$refs[xxx].restoreSetting()方法恢复默认设置**】
177
+ restoreSetting() { /* 恢复默认设置 */ }
178
+ }
179
+ ```
180
+
181
+ 各方法参数和返回值说明:
182
+
183
+ 1. `getUserTemplates()`
184
+
185
+ - 返回值:`Promise<Object>` - 包含所有模板、泳道和线条数据的配置对象
186
+ - 示例:
187
+ ```json
188
+ {
189
+ "caseVersion": { "caseId": "case123", "versionCode": "v1.0" },
190
+ "templates": [
191
+ /* 模板数组 */
192
+ ],
193
+ "params": []
194
+ }
195
+ ```
196
+
197
+ 2. `upsertTemplate(data)`
198
+
199
+ - 参数:`data` - 模板数据
200
+ - 返回值:`Promise<Object>` - 插入或更新后的完整模板对象
201
+
202
+ 3. `delTemplate(data)`
203
+
204
+ - 参数:`data` - 模板数据(需包含`templateId`)
205
+ - 返回值:`Promise<void>` - 操作成功或失败的 Promise
206
+
207
+ 4. `upsertLane(data)`
208
+
209
+ - 参数:`data` - 泳道数据
210
+ - 返回值:`Promise<Object>` - 插入或更新后的完整泳道对象
211
+
212
+ 5. `delLane(lane)`
213
+
214
+ - 参数:`lane` - 泳道数据(需包含`laneId`和`lines`数组)
215
+ - 返回值:`Promise<void>` - 操作成功或失败的 Promise
216
+
217
+ 6. `upsertLine(data)`
218
+
219
+ - 参数:`data` - 线条数据
220
+ - 返回值:`Promise<Object>` - 插入或更新后的完整线条对象
221
+
222
+ 7. `delLine(data)`
223
+
224
+ - 参数:`data` - 线条数据(需包含`lineId`和`laneId`)
225
+ - 返回值:`Promise<void>` - 操作成功或失败的 Promise
226
+
227
+ 8. `restoreSetting()` (可选)
228
+ - 返回值:`Promise<void>` - 恢复默认设置的 Promise
229
+
230
+ ### 4.3 自定义菜单
231
+
232
+ customMenuList 用于在上下文菜单中添加自定义操作选项。当用户在泳道头部或线条上右键点击时,这些自定义选项会出现在上下文菜单中。
233
+
234
+ #### 4.3.1 菜单结构
235
+
236
+ ```javascript
237
+ customMenuList: [
238
+ {
239
+ name: "单屏时长", // 菜单项显示名称
240
+ key: "timeRange", // 菜单项唯一标识
241
+ },
242
+ {
243
+ name: "导出数据",
244
+ key: "exportData",
245
+ },
246
+ ];
247
+ ```
248
+
249
+ #### 4.3.2 点击事件
250
+
251
+ 当用户点击自定义菜单项时,会触发 `onCustomMenuClicked` 事件,并传递以下参数:
252
+
253
+ - `event`: 事件对象,包含 `option` 和 `item` 属性
254
+ - `option`: 被点击的菜单项配置
255
+ - `item`: 右键点击时的目标对象(可能是泳道或线条)
256
+
257
+ #### 4.3.3 使用示例
258
+
259
+ ```html
260
+ <kd-lane-chart-container
261
+ :customMenuList=\"[{ name: '单屏时长', key: 'timeRange' }]\"
262
+ @onCustomMenuClicked=\"handleCustomMenuClick\">
263
+ </kd-lane-chart-container>
264
+ ```
265
+
266
+ ```javascript
267
+ handleCustomMenuClick(event) {
268
+ const { option, item } = event;
269
+ console.log('自定义菜单项被点击:', option.name);
270
+ console.log('点击的目标对象:', item);
271
+
272
+ if (option.key === 'timeRange') {
273
+ // 处理单屏时长操作
274
+ }
275
+ }
276
+ ```
277
+
278
+ ## 5. 组件 API
279
+
280
+ ### 5.1 Props
281
+
282
+ | 属性名 | 类型 | 默认值 | 说明 |
283
+ | ---------------- | ------ | ------- | ------------------ |
284
+ | config | Object | 必填 | 组件配置对象 |
285
+ | headerPadding | Number | 4 | 泳道头部内边距 |
286
+ | headerItemHeight | Number | 20 | 头部线条项高度 |
287
+ | itemGap | Number | 2 | 线条项之间的间距 |
288
+ | customMenuList | Array | [] | 自定义菜单列表 |
289
+ | themeName | String | "white" | 当前使用的主题名称 |
290
+
291
+ ### 5.2 事件
292
+
293
+ | 事件名 | 参数 | 说明 |
294
+ | ------------------- | -------- | ------------------ |
295
+ | onCustomMenuClicked | event | 自定义菜单点击事件 |
296
+ | line-change | line | 线条变化事件 |
297
+ | template-change | template | 模板变化事件 |
298
+
299
+ ### 5.3 方法
300
+
301
+ **注:以下方法仅在使用 `custom` 模式时需要了解和实现,local 模式下不需要考虑。**
302
+
303
+ 组件内部提供的方法主要用于模板和线条的管理:
304
+
305
+ - upsertTemplate(data) - 新增或更新模板
306
+
307
+ - 参数:`data` - 模板数据
308
+ - 返回值:`Promise<Object>` - 插入或更新后的**完整**模板对象
309
+
310
+ - delTemplate(data) - 删除模板
311
+
312
+ - 参数:`data` - 模板数据(需包含`templateId`)
313
+ - 返回值:`Promise<void>` - 操作成功或失败的 Promise
314
+
315
+ - upsertLane(data) - 新增或更新泳道
316
+
317
+ - 参数:`data` - 泳道数据
318
+ - 返回值:`Promise<Object>` - 插入或更新后的**完整**泳道对象
319
+
320
+ - delLane(lane) - 删除泳道
321
+
322
+ - 参数:`lane` - 泳道数据(需包含`laneId`和`lines`数组)
323
+ - 返回值:`Promise<void>` - 操作成功或失败的 Promise
324
+
325
+ - upsertLine(data) - 新增或更新线条
326
+
327
+ - 参数:`data` - 线条数据
328
+ - 返回值:`Promise<Object>` - 插入或更新后的**完整线**条对象
329
+
330
+ - delLine(data) - 删除线条
331
+
332
+ - 参数:`data` - 线条数据(需包含`lineId`和`laneId`)
333
+ - 返回值:`Promise<void>` - 操作成功或失败的 Promise
334
+
335
+ - restoreSetting() - 恢复默认设置
336
+ - 功能:将当前场景的数据重置为初始配置状态
337
+ - 实现逻辑:使用构造函数传入的初始 dataSource 重新初始化数据
338
+ - 返回值:`Promise<void>` - 恢复默认设置的 Promise
339
+
340
+ ## 6. 自定义插槽
341
+
342
+ 组件支持根据泳道 ID 动态生成的插槽,用于自定义泳道头部:
343
+
344
+ ```vue
345
+ <KdLaneChartContainer ...>
346
+ <!-- 动态slot名称 -->
347
+ <template v-if="slotName">
348
+ <div :slot="slotName" class="demo-slot">
349
+ {{ slotName }}
350
+ </div>
351
+ </template>
352
+
353
+ <!-- 带参数的插槽 -->
354
+ <template v-if="slotName2" :slot="slotName2" slot-scope="slotData">
355
+ <div class="demo-slot">{{ typeof slotData }}</div>
356
+ </template>
357
+ </KdLaneChartContainer>
358
+ ```
359
+
360
+ 插槽名称格式为 `lane${laneId}`,例如:`lane1556bdbfd0f24c11948b14999947c556`。
361
+
362
+ ### 6.2 draw-slot 画布插槽
363
+
364
+ 组件提供 `draw-slot` 插槽用于自定义绘制内容,该插槽占据泳道下方的整个绘制区域:
365
+
366
+ ```vue
367
+ <KdLaneChartContainer ...>
368
+ <template slot="draw-slot">
369
+ <div style="height: 100%; width: 100%; padding: 10px">
370
+ <!-- 自定义绘制内容 -->
371
+ </div>
372
+ </template>
373
+ </KdLaneChartContainer>
374
+ ```
375
+
376
+ ### 6.3 插槽布局与尺寸注意事项
377
+
378
+ 1. **布局方式**:
379
+
380
+ - 自定义插槽与泳道区域采用 flex 布局
381
+ - 自定义插槽会占据剩余位置后,与其他泳道进行平分
382
+ - 确保自定义插槽内容的宽度和高度设置正确,以保证与泳道对齐
383
+
384
+ 2. **尺寸单位**:
385
+
386
+ - 组件内的自定义插槽使用 style 绑定形式
387
+ - 宽度和高度单位必须使用 px,以确保精确对齐
388
+ - 避免使用其他单位(如 %、rem、em 等),否则可能导致布局错位
389
+
390
+ 3. **样式处理**:
391
+ - 不要使用全局样式处理插件对自定义插槽的尺寸单位进行转换
392
+ - 直接使用 px 单位编写插槽内容的尺寸样式
393
+ - 确保插槽内容的 box-sizing 为 border-box,以避免 padding 和 border 影响实际尺寸
394
+
395
+ ```vue
396
+ <!-- 推荐的插槽内容样式 -->
397
+ <template slot="draw-slot">
398
+ <div style="height: 100%; width: 100%; box-sizing: border-box; padding: 10px">
399
+ <!-- 自定义绘制内容 -->
400
+ </div>
401
+ </template>
402
+ ```
403
+
404
+ ## 7. 主题颜色设置
405
+
406
+ ### 7.1 组件主题属性
407
+
408
+ 组件支持通过 `themeName` 属性设置当前主题,可选值包括 `white`、`dark` 和 `gray`。
409
+
410
+ ```vue
411
+ <KdLaneChartContainer
412
+ :themeName="themeName"
413
+ ...
414
+ >
415
+ ```
416
+
417
+ ### 7.2 线条级别主题配置
418
+
419
+ 每个线条对象可以通过 `themeConfig` 属性配置不同主题下的颜色,格式为:
420
+
421
+ ```javascript
422
+ themeConfig: {
423
+ [themeName]: { lineColor: "颜色值" },
424
+ ...
425
+ }
426
+ ```
427
+
428
+ 示例:
429
+
430
+ ```javascript
431
+ lines: [
432
+ {
433
+ paramId: "51",
434
+ lineColor: "#E5360B", // 默认颜色
435
+ themeConfig: {
436
+ white: { lineColor: "blue" }, // 白色主题颜色
437
+ dark: { lineColor: "black" }, // 暗黑主题颜色
438
+ gray: { lineColor: "yellow" }, // 灰色主题颜色
439
+ },
440
+ },
441
+ ];
442
+ ```
443
+
444
+ 当组件的 `themeName` 变化时,线条会自动应用对应主题的颜色。如果未配置 `themeConfig`,则使用默认的 `lineColor`。
445
+
446
+ ### 7.3 主题切换示例
447
+
448
+ ````vue
449
+ <template>
450
+ <div id="app">
451
+ <KdLaneChartContainer class="container" :config="config" :themeName="themeName" ...>
452
+ <!-- 插槽内容 -->
453
+ </KdLaneChartContainer>
454
+ <div style="display: flex">
455
+ <button @click="changeCheme('white')">white</button>
456
+ <button @click="changeCheme('dark')">dark</button>
457
+ <button @click="changeCheme('gray')">gray</button>
458
+ </div>
459
+ </div>
460
+ </template>
461
+
462
+ <script>
463
+ export default {
464
+ data() {
465
+ return {
466
+ themeName: "white", // 默认主题
467
+ // ...其他配置
468
+ };
469
+ },
470
+ methods: {
471
+ changeCheme(themeName) {
472
+ this.themeName = themeName;
473
+ // 可选:给body设置data-theme属性,用于全局样式切换
474
+ document.body.setAttribute("data-theme", themeName);
475
+ },
476
+ },
477
+ };
478
+ </script>
479
+
480
+ ## 8. 样式定制 可以通过 CSS 变量或直接覆盖样式来自定义组件外观: ```css .kd-lane-chart-container { --kd-lane-container-border-color: white;
481
+ --kd-lane-container-context-background-color: darkgray; --kd-lane-container-context-hover-color: darkgray;
482
+ --kd-lane-container-header-item-color: white; --app-background-color: gray; }
483
+ ````
484
+
485
+ ## 8. 使用示例
486
+
487
+ ```vue
488
+ <template>
489
+ <div id="app">
490
+ <KdLaneChartContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
491
+ <!-- 动态slot名称,这里全部使用的是旧语法 -->
492
+ <template v-if="slotName">
493
+ <div :slot="slotName" class="demo-slot">
494
+ {{ slotName }}
495
+ </div>
496
+ </template>
497
+ <template v-if="slotName2" :slot="slotName2" slot-scope="slotData">
498
+ <div class="demo-slot">{{ typeof slotData }}</div>
499
+ </template>
500
+ </KdLaneChartContainer>
501
+ </div>
502
+ </template>
503
+
504
+ <script>
505
+ import Vue from "vue";
506
+ import KdLaneChartContainer from "kd-lane-container";
507
+ Vue.use(KdLaneChartContainer);
508
+ import { data } from "./mock/mockData.js";
509
+ export default {
510
+ name: "App",
511
+ components: {},
512
+ data() {
513
+ return {
514
+ config: {
515
+ type: "local",
516
+ caseId: "demo",
517
+ versionCode: 2,
518
+ // for with server
519
+ dataSource: { templates: data.templates, lanes: data.lanes, lines: data.lines, params: data.params },
520
+ },
521
+ slotName: "",
522
+ slotName2: "",
523
+ customMenuList: [{ name: "单屏时长", key: "timeRange" }],
524
+ };
525
+ },
526
+ mounted() {
527
+ setTimeout(() => {
528
+ this.slotName = "lane1556bdbfd0f24c11948b14999947c556";
529
+ }, 2000);
530
+ },
531
+ methods: {
532
+ onCustomMenuClicked(event) {
533
+ console.log(event);
534
+ },
535
+ },
536
+ };
537
+ </script>
538
+
539
+ <style>
540
+ #app {
541
+ font-family: Avenir, Helvetica, Arial, sans-serif;
542
+ -webkit-font-smoothing: antialiased;
543
+ -moz-osx-font-smoothing: grayscale;
544
+ text-align: center;
545
+ color: #2c3e50;
546
+ height: 100vh;
547
+ position: relative;
548
+ padding: 10px;
549
+
550
+ .container {
551
+ margin-left: 100px;
552
+ margin-top: 50px;
553
+ height: 600px;
554
+ width: 800px;
555
+ }
556
+
557
+ .demo-slot {
558
+ width: 80px;
559
+ }
560
+ }
561
+
562
+ /* 全局设置 box-sizing 为 border-box */
563
+ *,
564
+ *::before,
565
+ *::after {
566
+ box-sizing: border-box;
567
+ margin: 0;
568
+ padding: 0;
569
+ }
570
+ </style>
571
+ ```