@data_wise/hyper-markdown 1.5.0 → 1.5.2

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,816 +1,816 @@
1
- # @data_wise/hyper-markdown
2
-
3
- 一个功能强大的 Vue 3 Markdown 编辑器,支持 ECharts、Mermaid、KaTeX 和数据集等丰富功能。
4
-
5
- ## 安装
6
-
7
- ```bash
8
- npm install @data_wise/hyper-markdown
9
- ```
10
-
11
- ## CSS 导入
12
-
13
- 组件已经内置了所有必要的样式文件,您只需要在项目中导入一次CSS即可使用所有功能:
14
-
15
- ### 在 Vue 项目中导入
16
-
17
- ```javascript
18
- import '@data_wise/hyper-markdown/dist/hyper-markdown.css'
19
- ```
20
-
21
- ### 完整使用示例
22
-
23
- ```vue
24
- <template>
25
- <div id="app">
26
- <MarkdownEditor
27
- :content="markdownContent"
28
- :editable="true"
29
- />
30
- </div>
31
- </template>
32
-
33
- <script>
34
- import MarkdownEditor from '@data_wise/hyper-markdown'
35
- import '@data_wise/hyper-markdown/dist/hyper-markdown.css' // 导入CSS
36
-
37
- export default {
38
- name: 'App',
39
- components: {
40
- MarkdownEditor
41
- },
42
- data() {
43
- return {
44
- markdownContent: '# 欢迎使用 Hyper Markdown'
45
- }
46
- }
47
- }
48
- </script>
49
- ```
50
-
51
- ### 包含的样式
52
-
53
- 导入的CSS文件包含以下所有必要的样式:
54
-
55
- - **GitHub Markdown 样式** - 标准的Markdown渲染样式
56
- - **KaTeX 数学公式样式** - 数学公式渲染支持
57
- - **ECharts 图表样式** - 图表组件样式
58
- - **Mermaid 流程图样式** - 流程图渲染样式
59
- - **数据集表格样式** - 数据表格展示样式
60
- - **自定义容器样式** - 警告、提示等容器样式
61
- - **栅格布局样式** - 响应式布局支持
62
-
63
- ### 注意事项
64
-
65
- - 只需要导入一次CSS文件,所有组件功能即可正常工作
66
- - CSS文件已经过优化,所有样式都打包到单个文件中
67
- - 无需额外配置或导入其他CSS文件
68
-
69
- ## 快速开始
70
-
71
- ### 组件属性
72
-
73
- | 属性 | 类型 | 默认值 | 说明 |
74
- |------|------|--------|------|
75
- | `content` | String | `''` | Markdown 内容(支持 v-model) |
76
- | `editable` | Boolean | `false` | 是否启用编辑模式 |
77
- | `defaultShowEditor` | Boolean | `true` | 编辑器初始显示状态(仅在 editable 为 true 时有效) |
78
- | `datasource` | Object | - | 数据源配置对象(可选) |
79
-
80
- ### 组件事件
81
-
82
- | 事件名 | 参数 | 说明 |
83
- |--------|------|------|
84
- | `update:content` | `(content: string)` | 内容更新时触发 |
85
- | `errors` | `(errors: Array)` | 渲染错误时触发,返回错误数组 |
86
-
87
- #### 错误对象格式
88
-
89
- ```javascript
90
- {
91
- line: 10, // 错误所在行号
92
- type: 'ECharts', // 错误类型:ECharts, Dataset, Mermaid, Container
93
- message: '配置错误', // 错误描述
94
- code: '```echarts...', // 相关代码片段
95
- severity: 'error' // 错误级别
96
- }
97
- ```
98
-
99
- #### 错误收集说明
100
-
101
- 组件会自动收集以下类型的渲染错误:
102
-
103
- - **ECharts 错误**:图表配置错误、数据格式错误等
104
- - **Mermaid 错误**:流程图语法错误
105
- - **Dataset 错误**:数据集格式错误、数据源查询失败等
106
- - **Container 错误**:容器配置错误(如 cell 宽度超出范围)
107
-
108
- 错误会在渲染完成后自动收集,并通过 `@errors` 事件传递给外部。你可以:
109
-
110
- 1. **监听事件**:`@errors="handleErrors"` 实时获取错误
111
- 2. **主动获取**:`this.$refs.editor.getErrors()` 获取当前错误列表
112
-
113
- ### 基础用法
114
-
115
- ```vue
116
- <template>
117
- <div id="app">
118
- <MarkdownEditor
119
- :content="markdownContent"
120
- :editable="true"
121
- @errors="handleErrors"
122
- />
123
- </div>
124
- </template>
125
-
126
- <script>
127
- import MarkdownEditor from '@data_wise/hyper-markdown'
128
-
129
- export default {
130
- name: 'App',
131
- components: {
132
- MarkdownEditor
133
- },
134
- data() {
135
- return {
136
- markdownContent: '# 欢迎使用 Hyper Markdown'
137
- }
138
- },
139
- methods: {
140
- handleErrors(errors) {
141
- // 处理渲染错误
142
- if (errors.length > 0) {
143
- console.log('发现渲染错误:', errors)
144
- errors.forEach(error => {
145
- console.error(`第 ${error.line} 行 [${error.type}]: ${error.message}`)
146
- })
147
- }
148
- }
149
- }
150
- }
151
- </script>
152
- ```
153
-
154
- ### 控制编辑器显示状态
155
-
156
- ```vue
157
- <template>
158
- <div id="app">
159
- <!-- 默认隐藏编辑器,只显示预览 -->
160
- <MarkdownEditor
161
- :content="markdownContent"
162
- :editable="true"
163
- :default-show-editor="false"
164
- />
165
- </div>
166
- </template>
167
-
168
- <script>
169
- import MarkdownEditor from '@data_wise/hyper-markdown'
170
-
171
- export default {
172
- name: 'App',
173
- components: {
174
- MarkdownEditor
175
- },
176
- data() {
177
- return {
178
- markdownContent: '# 欢迎使用 Hyper Markdown'
179
- }
180
- }
181
- }
182
- </script>
183
- ```
184
-
185
- ### 使用数据源功能
186
-
187
- 要使用数据源查询功能,需要注入 `datasource` 属性:
188
-
189
- ```vue
190
- <template>
191
- <div id="app">
192
- <MarkdownEditor
193
- v-model:content="markdownContent"
194
- :editable="true"
195
- :datasource="datasource"
196
- />
197
- </div>
198
- </template>
199
-
200
- <script>
201
- import MarkdownEditor from '@data_wise/hyper-markdown'
202
- import { datasource } from './utils/dataSource' // 导入数据源函数
203
-
204
- export default {
205
- name: 'App',
206
- components: {
207
- MarkdownEditor
208
- },
209
- data() {
210
- return {
211
- markdownContent: '# 欢迎使用 Hyper Markdown',
212
- datasource: datasource // 注入数据源函数
213
- }
214
- }
215
- }
216
- </script>
217
- ```
218
-
219
- ## 数据源配置
220
-
221
- ### 数据源函数接口
222
-
223
- `datasource` 对象必须包含以下函数:
224
-
225
- ```javascript
226
- {
227
- // 获取数据源数据
228
- getDataSource(sourceId, sql, options) => Promise<Object>
229
-
230
- // 获取数据源列表
231
- getDataSourceList() => Array
232
-
233
- // 清除数据缓存
234
- clearDataSourceCache(sourceId) => void
235
-
236
- // 测试数据源连接
237
- testDataSourceConnection(sourceId) => Promise<boolean>
238
- }
239
- ```
240
-
241
- ### 内置数据源
242
-
243
- 项目内置了以下模拟数据源:
244
-
245
- - **sales_db** - 销售数据库(MySQL)
246
- - **user_db** - 用户数据库(PostgreSQL)
247
- - **finance_db** - 财务数据库(Oracle)
248
-
249
- ### 自定义数据源
250
-
251
- 您可以创建自定义数据源函数:
252
-
253
- ```javascript
254
- // 自定义数据源函数示例
255
- const customDatasource = {
256
- async getDataSource(sourceId, sql, options = {}) {
257
- // 实现数据获取逻辑
258
- return {
259
- source: [], // 数据数组
260
- dimensions: [], // 维度字段
261
- metadata: {
262
- sourceId: sourceId,
263
- sql: sql,
264
- count: 0,
265
- timestamp: new Date().toISOString()
266
- }
267
- }
268
- },
269
-
270
- getDataSourceList() {
271
- return [
272
- {
273
- id: 'my_db',
274
- name: '我的数据库',
275
- type: 'mysql',
276
- description: '自定义数据源'
277
- }
278
- ]
279
- },
280
-
281
- clearDataSourceCache(sourceId = null) {
282
- // 清除缓存逻辑
283
- },
284
-
285
- async testDataSourceConnection(sourceId) {
286
- return true
287
- }
288
- }
289
- ```
290
-
291
- ## 特有插件语法
292
-
293
- ### 1. ECharts 图表
294
-
295
- 使用 `echarts` 代码块渲染图表:
296
-
297
- ````markdown
298
- ```echarts
299
- {
300
- "title": {
301
- "text": "销售数据"
302
- },
303
- "xAxis": {
304
- "type": "category",
305
- "data": ["一月", "二月", "三月"]
306
- },
307
- "yAxis": {
308
- "type": "value"
309
- },
310
- "series": [{
311
- "data": [120, 200, 150],
312
- "type": "bar"
313
- }]
314
- }
315
- ```
316
- ````
317
-
318
- ### 2. Mermaid 流程图
319
-
320
- 使用 `mermaid` 代码块渲染流程图:
321
-
322
- ````markdown
323
- ```mermaid
324
- graph TD
325
- A[开始] --> B{条件判断}
326
- B -->|是| C[执行操作]
327
- B -->|否| D[结束]
328
- C --> D
329
- ```
330
- ````
331
-
332
- ### 3. 数据集功能
333
-
334
- 使用 `dataset` 代码块定义数据集:
335
-
336
- ````markdown
337
- ```dataset datasetId: sales_data
338
- {
339
- dimensions: ["产品", "2020", "2021", "2022"],
340
- source: [
341
- {产品: "产品A", 2020: 100, 2021: 120, 2022: 150},
342
- {产品: "产品B", 2020: 80, 2021: 90, 2022: 110},
343
- {产品: "产品C", 2020: 60, 2021: 70, 2022: 85}
344
- ]
345
- }
346
- ```
347
-
348
- 然后在 ECharts 中使用数据集:
349
-
350
- ```echarts
351
- {
352
- dataset: dataset['sales_data'],
353
- title: { text: "产品销售趋势" },
354
- xAxis: { type: "category" },
355
- yAxis: { type: "value" },
356
- series: [{
357
- type: "bar",
358
- encode: { x: "产品", y: "2020" }
359
- }]
360
- }
361
- ```
362
- ````
363
-
364
- #### ⚠️ 使用 dataset + encode 时的注意事项
365
-
366
- 使用 `dataset` + `encode` 时,formatter 必须用**函数形式**,字符串模板会显示 `[object Object]`:
367
-
368
- ````markdown
369
- ```echarts
370
- {
371
- dataset: dataset['sales_data'],
372
- series: [{
373
- type: "pie",
374
- encode: { itemName: "产品", value: "销量" },
375
- label: {
376
- // ❌ 错误:formatter: "{b}: {c}次 ({d}%)"
377
- // ✅ 正确:使用函数
378
- formatter: function(params) {
379
- return params.data['产品'] + ': ' + params.data['销量'] + '次 (' + params.percent + '%)';
380
- }
381
- }
382
- }]
383
- }
384
- ```
385
- ````
386
-
387
- ### 4. D3.js 可视化
388
-
389
- 支持使用 D3.js 创建自定义可视化图表,提供两种使用方式:
390
-
391
- #### 方式一:JSON 配置(快速创建)
392
-
393
- 使用预定义的图表类型快速创建可视化:
394
-
395
- ````markdown
396
- ```d3
397
- {
398
- "type": "bar",
399
- "data": [30, 86, 168, 281, 303, 365],
400
- "width": 600,
401
- "height": 400,
402
- "color": "#5470c6"
403
- }
404
- ```
405
- ````
406
-
407
- **支持的图表类型:**
408
- - `bar` - 柱状图
409
- - `line` - 折线图
410
- - `pie` - 饼图
411
- - `scatter` - 散点图
412
-
413
- **配置选项:**
414
- - `type` - 图表类型(必需)
415
- - `data` - 数据数组或 dataset 引用(必需)
416
- - `width` - 图表宽度(默认 600)
417
- - `height` - 图表高度(默认 400)
418
- - `color` - 颜色
419
- - `xField` / `yField` - 数据字段映射
420
- - `nameField` / `valueField` - 饼图字段映射
421
-
422
- #### 方式二:自定义 D3 代码(完全控制)
423
-
424
- 编写完整的 D3.js 代码实现自定义可视化:
425
-
426
- ````markdown
427
- ```d3
428
- // 创建 SVG
429
- const svg = d3.select(container)
430
- .append('svg')
431
- .attr('width', 600)
432
- .attr('height', 400);
433
-
434
- // 绘制圆圈
435
- const data = [10, 20, 30, 40, 50];
436
- svg.selectAll('circle')
437
- .data(data)
438
- .enter()
439
- .append('circle')
440
- .attr('cx', (d, i) => 50 + i * 100)
441
- .attr('cy', 200)
442
- .attr('r', d => d)
443
- .attr('fill', '#5470c6');
444
- ```
445
- ````
446
-
447
- **可用变量:**
448
- - `container` - DOM 容器元素
449
- - `d3` - D3.js 库对象
450
- - `dataset` - 数据集对象(访问已定义的数据集)
451
- - `theme` - 当前主题('light' 或 'dark')
452
-
453
- #### 与 Dataset 集成
454
-
455
- D3 图表可以直接使用 dataset 中定义的数据:
456
-
457
- ````markdown
458
- ```dataset datasetId: sales_data
459
- {
460
- dimensions: ["产品", "销量"],
461
- source: [
462
- { 产品: "手机", 销量: 520 },
463
- { 产品: "电脑", 销量: 380 },
464
- { 产品: "平板", 销量: 290 }
465
- ]
466
- }
467
- ```
468
-
469
- **JSON 配置方式:**
470
- ```d3
471
- {
472
- "type": "bar",
473
- "data": "dataset['sales_data']",
474
- "xField": "产品",
475
- "yField": "销量",
476
- "width": 600,
477
- "height": 400
478
- }
479
- ```
480
-
481
- **自定义代码方式:**
482
- ```d3
483
- // 获取数据集
484
- const data = dataset['sales_data'].source;
485
-
486
- // 使用 D3 绘制
487
- const svg = d3.select(container)
488
- .append('svg')
489
- .attr('width', 600)
490
- .attr('height', 400);
491
-
492
- // ... 更多 D3 代码
493
- ```
494
- ````
495
-
496
- #### 主题适配
497
-
498
- D3 图表会自动适配明暗主题,可以在代码中使用 `theme` 变量:
499
-
500
- ````markdown
501
- ```d3
502
- const textColor = theme === 'dark' ? '#e0e0e0' : '#000';
503
-
504
- svg.append('text')
505
- .attr('fill', textColor)
506
- .text('标题');
507
- ```
508
- ````
509
-
510
- ### 5. SQL 数据源查询
511
-
512
- 支持从数据源查询数据,需要先注入 `datasource` 属性:
513
-
514
- #### 查询语法格式
515
-
516
- 支持两种格式的数据源查询:
517
-
518
- **格式一:使用 datasourceId 指定数据源**
519
-
520
- ````markdown
521
- ```dataset datasetId: sql_query_1 datasourceId: sales_db
522
- SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
523
- ```
524
- ````
525
-
526
- **格式二:使用默认数据源(sales_db)**
527
-
528
- ````markdown
529
- ```dataset datasetId: sql_query_1
530
- SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
531
- ```
532
- ````
533
-
534
- #### 使用查询结果
535
-
536
- 查询结果会自动转换为标准数据集格式,可以在 ECharts 中使用:
537
-
538
- ```echarts
539
- {
540
- dataset: dataset['sql_query_1'],
541
- title: { text: "产品销售趋势" },
542
- xAxis: { type: "category" },
543
- yAxis: { type: "value" },
544
- series: [{
545
- type: "bar",
546
- encode: { x: "产品", y: "销售额" }
547
- }]
548
- }
549
- ```
550
-
551
- #### 示例:完整的数据源查询
552
-
553
- ````markdown
554
- ```dataset datasetId: user_analysis datasourceId: user_db
555
- SELECT 地区, 用户数, 活跃度 FROM user_data WHERE 用户数 > 1000 AND 活跃度 > 0.7
556
- ```
557
-
558
- ```echarts
559
- {
560
- dataset: dataset['user_analysis'],
561
- title: { text: "用户分布分析" },
562
- xAxis: { type: "category" },
563
- yAxis: { type: "value" },
564
- series: [{
565
- type: "bar",
566
- encode: { x: "地区", y: "用户数" }
567
- }]
568
- }
569
- ```
570
- ````
571
-
572
- ### 5. SQL 数据源查询
573
-
574
- 支持从数据源查询数据,需要先注入 `datasource` 属性:
575
-
576
- #### 查询语法格式
577
-
578
- 支持两种格式的数据源查询:
579
-
580
- **格式一:使用 datasourceId 指定数据源**
581
-
582
- ````markdown
583
- ```dataset datasetId: sql_query_1 datasourceId: sales_db
584
- SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
585
- ```
586
- ````
587
-
588
- **格式二:使用默认数据源(sales_db)**
589
-
590
- ````markdown
591
- ```dataset datasetId: sql_query_1
592
- SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
593
- ```
594
- ````
595
-
596
- #### 使用查询结果
597
-
598
- 查询结果会自动转换为标准数据集格式,可以在 ECharts 或 D3 中使用:
599
-
600
- ```echarts
601
- {
602
- dataset: dataset['sql_query_1'],
603
- title: { text: "产品销售趋势" },
604
- xAxis: { type: "category" },
605
- yAxis: { type: "value" },
606
- series: [{
607
- type: "bar",
608
- encode: { x: "产品", y: "销售额" }
609
- }]
610
- }
611
- ```
612
-
613
- #### 示例:完整的数据源查询
614
-
615
- ````markdown
616
- ```dataset datasetId: user_analysis datasourceId: user_db
617
- SELECT 地区, 用户数, 活跃度 FROM user_data WHERE 用户数 > 1000 AND 活跃度 > 0.7
618
- ```
619
-
620
- ```echarts
621
- {
622
- dataset: dataset['user_analysis'],
623
- title: { text: "用户分布分析" },
624
- xAxis: { type: "category" },
625
- yAxis: { type: "value" },
626
- series: [{
627
- type: "bar",
628
- encode: { x: "地区", y: "用户数" }
629
- }]
630
- }
631
- ```
632
- ````
633
-
634
- ### 6. 栅格布局
635
-
636
- 使用 `cell` 容器创建响应式布局:
637
-
638
- ````markdown
639
- ::: cell 6
640
- ### 大单元格 (6格宽)
641
- 这是一个较大的单元格,宽度占6格
642
-
643
- 可以包含任何 Markdown 语法:
644
- - 列表项
645
- - 图片
646
- - 代码等
647
- :::
648
-
649
- ::: cell 3
650
- ### 中等单元格 (3格宽)
651
- 中等大小的单元格
652
-
653
- ```javascript
654
- console.log('支持代码块');
655
- ```
656
- :::
657
- ````
658
-
659
- ### 7. 自定义容器
660
-
661
- 支持多种自定义容器:
662
-
663
- ````markdown
664
- ::: info
665
- 这是一个信息提示
666
- :::
667
-
668
- ::: warning
669
- 这是一个警告信息
670
- :::
671
-
672
- ::: danger
673
- 这是一个危险提示
674
- :::
675
-
676
- ::: success
677
- 这是一个成功提示
678
- :::
679
- ````
680
-
681
-
682
-
683
- ## 数据源使用注意事项
684
-
685
- ### 错误处理
686
-
687
- 当数据源查询失败时,会显示错误信息:
688
-
689
- - **数据源未注入**:"数据源获取函数未注入,请确保已设置datasource属性"
690
- - **数据源不存在**:"数据源不存在: {sourceId}"
691
- - **SQL语法错误**:"SQL查询语句不能为空" 或 "数据源查询格式不正确"
692
-
693
- ### 缓存机制
694
-
695
- 数据源查询结果会自动缓存,避免重复查询:
696
-
697
- - 相同查询条件会返回缓存结果
698
- - 可以通过 `clearDataSourceCache()` 清除缓存
699
- - 使用 `{forceRefresh: true}` 选项强制刷新
700
-
701
- ### 性能优化
702
-
703
- - 数据源查询支持异步处理
704
- - 支持延迟加载选项 `{delay: 500}`
705
- - 内置数据源使用模拟数据,无网络请求
706
-
707
- ## 特性
708
-
709
- - ✅ Vue 3 支持
710
- - ✅ ECharts 图表渲染
711
- - ✅ D3.js 可视化支持(新功能)
712
- - ✅ Mermaid 流程图支持
713
- - ✅ KaTeX 数学公式
714
- - ✅ 数据集表格展示
715
- - ✅ 可编辑区域
716
- - ✅ 自定义容器
717
- - ✅ 响应式设计
718
- - ✅ TypeScript 支持
719
- - ✅ 数据源查询功能
720
- - ✅ SQL 语法支持
721
- - ✅ 数据缓存机制
722
- - ✅ **Word 文档导出**
723
- - ✅ **Dashboard 看板模式**
724
-
725
- ## Word 导出功能
726
-
727
- 支持将 Markdown 内容导出为 Word 文档(.docx 格式):
728
-
729
- ```vue
730
- <template>
731
- <div>
732
- <button @click="exportToWord">导出 Word</button>
733
- <MarkdownEditor ref="editor" v-model:content="content" :editable="true" />
734
- </div>
735
- </template>
736
-
737
- <script>
738
- export default {
739
- methods: {
740
- async exportToWord() {
741
- const result = await this.$refs.editor.exportToWord('我的文档.docx')
742
- if (result.success) {
743
- console.log('导出成功!')
744
- }
745
- }
746
- }
747
- }
748
- </script>
749
- ```
750
-
751
- **支持导出:**
752
- - 标题、段落、列表、表格
753
- - 粗体、斜体、代码块
754
- - **ECharts 图表**(自动转为图片)
755
- - **Mermaid 流程图**(自动转为图片)
756
-
757
- **详细文档:** 查看 [EXPORT.md](./docs/EXPORT.md)
758
-
759
- ## Dashboard 看板模式
760
-
761
- 支持将数据集集中管理的看板模式,通过添加 `<!-- dashboard -->` 注释激活:
762
-
763
- ```markdown
764
- <!-- dashboard -->
765
-
766
- # 销售数据看板
767
-
768
- \`\`\`dataset datasetId: sales_data
769
- {
770
- dimensions: ["月份", "销售额"],
771
- source: [
772
- { 月份: "1月", 销售额: 12500 },
773
- { 月份: "2月", 销售额: 13800 }
774
- ]
775
- }
776
- \`\`\`
777
-
778
- \`\`\`echarts
779
- {
780
- dataset: dataset['sales_data'],
781
- xAxis: { type: "category" },
782
- yAxis: { type: "value" },
783
- series: [{ type: "line", encode: { x: "月份", y: "销售额" } }]
784
- }
785
- \`\`\`
786
- ```
787
-
788
- **Dashboard 模式特性:**
789
- - 左侧抽屉显示所有数据集
790
- - 数据集不在正文中显示
791
- - 支持搜索、刷新、导出
792
- - 数据预览功能
793
-
794
- **详细文档:** 查看 [DASHBOARD.md](./docs/DASHBOARD.md)
795
-
796
- ## 特性
797
-
798
- - ✅ Vue 3 支持
799
- - ✅ ECharts 图表渲染
800
- - ✅ D3.js 可视化支持
801
- - ✅ Mermaid 流程图支持
802
- - ✅ KaTeX 数学公式
803
- - ✅ 数据集表格展示
804
- - ✅ 可编辑区域
805
- - ✅ 自定义容器
806
- - ✅ 响应式设计
807
- - ✅ TypeScript 支持
808
- - ✅ 数据源查询功能
809
- - ✅ SQL 语法支持
810
- - ✅ 数据缓存机制
811
- - ✅ Word 文档导出
812
- - ✅ Dashboard 看板模式
813
-
814
- ## 许可证
815
-
1
+ # @data_wise/hyper-markdown
2
+
3
+ 一个功能强大的 Vue 3 Markdown 编辑器,支持 ECharts、Mermaid、KaTeX 和数据集等丰富功能。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @data_wise/hyper-markdown
9
+ ```
10
+
11
+ ## CSS 导入
12
+
13
+ 组件已经内置了所有必要的样式文件,您只需要在项目中导入一次CSS即可使用所有功能:
14
+
15
+ ### 在 Vue 项目中导入
16
+
17
+ ```javascript
18
+ import '@data_wise/hyper-markdown/dist/hyper-markdown.css'
19
+ ```
20
+
21
+ ### 完整使用示例
22
+
23
+ ```vue
24
+ <template>
25
+ <div id="app">
26
+ <MarkdownEditor
27
+ :content="markdownContent"
28
+ :editable="true"
29
+ />
30
+ </div>
31
+ </template>
32
+
33
+ <script>
34
+ import MarkdownEditor from '@data_wise/hyper-markdown'
35
+ import '@data_wise/hyper-markdown/dist/hyper-markdown.css' // 导入CSS
36
+
37
+ export default {
38
+ name: 'App',
39
+ components: {
40
+ MarkdownEditor
41
+ },
42
+ data() {
43
+ return {
44
+ markdownContent: '# 欢迎使用 Hyper Markdown'
45
+ }
46
+ }
47
+ }
48
+ </script>
49
+ ```
50
+
51
+ ### 包含的样式
52
+
53
+ 导入的CSS文件包含以下所有必要的样式:
54
+
55
+ - **GitHub Markdown 样式** - 标准的Markdown渲染样式
56
+ - **KaTeX 数学公式样式** - 数学公式渲染支持
57
+ - **ECharts 图表样式** - 图表组件样式
58
+ - **Mermaid 流程图样式** - 流程图渲染样式
59
+ - **数据集表格样式** - 数据表格展示样式
60
+ - **自定义容器样式** - 警告、提示等容器样式
61
+ - **栅格布局样式** - 响应式布局支持
62
+
63
+ ### 注意事项
64
+
65
+ - 只需要导入一次CSS文件,所有组件功能即可正常工作
66
+ - CSS文件已经过优化,所有样式都打包到单个文件中
67
+ - 无需额外配置或导入其他CSS文件
68
+
69
+ ## 快速开始
70
+
71
+ ### 组件属性
72
+
73
+ | 属性 | 类型 | 默认值 | 说明 |
74
+ |------|------|--------|------|
75
+ | `content` | String | `''` | Markdown 内容(支持 v-model) |
76
+ | `editable` | Boolean | `false` | 是否启用编辑模式 |
77
+ | `defaultShowEditor` | Boolean | `true` | 编辑器初始显示状态(仅在 editable 为 true 时有效) |
78
+ | `datasource` | Object | - | 数据源配置对象(可选) |
79
+
80
+ ### 组件事件
81
+
82
+ | 事件名 | 参数 | 说明 |
83
+ |--------|------|------|
84
+ | `update:content` | `(content: string)` | 内容更新时触发 |
85
+ | `errors` | `(errors: Array)` | 渲染错误时触发,返回错误数组 |
86
+
87
+ #### 错误对象格式
88
+
89
+ ```javascript
90
+ {
91
+ line: 10, // 错误所在行号
92
+ type: 'ECharts', // 错误类型:ECharts, Dataset, Mermaid, Container
93
+ message: '配置错误', // 错误描述
94
+ code: '```echarts...', // 相关代码片段
95
+ severity: 'error' // 错误级别
96
+ }
97
+ ```
98
+
99
+ #### 错误收集说明
100
+
101
+ 组件会自动收集以下类型的渲染错误:
102
+
103
+ - **ECharts 错误**:图表配置错误、数据格式错误等
104
+ - **Mermaid 错误**:流程图语法错误
105
+ - **Dataset 错误**:数据集格式错误、数据源查询失败等
106
+ - **Container 错误**:容器配置错误(如 cell 宽度超出范围)
107
+
108
+ 错误会在渲染完成后自动收集,并通过 `@errors` 事件传递给外部。你可以:
109
+
110
+ 1. **监听事件**:`@errors="handleErrors"` 实时获取错误
111
+ 2. **主动获取**:`this.$refs.editor.getErrors()` 获取当前错误列表
112
+
113
+ ### 基础用法
114
+
115
+ ```vue
116
+ <template>
117
+ <div id="app">
118
+ <MarkdownEditor
119
+ :content="markdownContent"
120
+ :editable="true"
121
+ @errors="handleErrors"
122
+ />
123
+ </div>
124
+ </template>
125
+
126
+ <script>
127
+ import MarkdownEditor from '@data_wise/hyper-markdown'
128
+
129
+ export default {
130
+ name: 'App',
131
+ components: {
132
+ MarkdownEditor
133
+ },
134
+ data() {
135
+ return {
136
+ markdownContent: '# 欢迎使用 Hyper Markdown'
137
+ }
138
+ },
139
+ methods: {
140
+ handleErrors(errors) {
141
+ // 处理渲染错误
142
+ if (errors.length > 0) {
143
+ console.log('发现渲染错误:', errors)
144
+ errors.forEach(error => {
145
+ console.error(`第 ${error.line} 行 [${error.type}]: ${error.message}`)
146
+ })
147
+ }
148
+ }
149
+ }
150
+ }
151
+ </script>
152
+ ```
153
+
154
+ ### 控制编辑器显示状态
155
+
156
+ ```vue
157
+ <template>
158
+ <div id="app">
159
+ <!-- 默认隐藏编辑器,只显示预览 -->
160
+ <MarkdownEditor
161
+ :content="markdownContent"
162
+ :editable="true"
163
+ :default-show-editor="false"
164
+ />
165
+ </div>
166
+ </template>
167
+
168
+ <script>
169
+ import MarkdownEditor from '@data_wise/hyper-markdown'
170
+
171
+ export default {
172
+ name: 'App',
173
+ components: {
174
+ MarkdownEditor
175
+ },
176
+ data() {
177
+ return {
178
+ markdownContent: '# 欢迎使用 Hyper Markdown'
179
+ }
180
+ }
181
+ }
182
+ </script>
183
+ ```
184
+
185
+ ### 使用数据源功能
186
+
187
+ 要使用数据源查询功能,需要注入 `datasource` 属性:
188
+
189
+ ```vue
190
+ <template>
191
+ <div id="app">
192
+ <MarkdownEditor
193
+ v-model:content="markdownContent"
194
+ :editable="true"
195
+ :datasource="datasource"
196
+ />
197
+ </div>
198
+ </template>
199
+
200
+ <script>
201
+ import MarkdownEditor from '@data_wise/hyper-markdown'
202
+ import { datasource } from './utils/dataSource' // 导入数据源函数
203
+
204
+ export default {
205
+ name: 'App',
206
+ components: {
207
+ MarkdownEditor
208
+ },
209
+ data() {
210
+ return {
211
+ markdownContent: '# 欢迎使用 Hyper Markdown',
212
+ datasource: datasource // 注入数据源函数
213
+ }
214
+ }
215
+ }
216
+ </script>
217
+ ```
218
+
219
+ ## 数据源配置
220
+
221
+ ### 数据源函数接口
222
+
223
+ `datasource` 对象必须包含以下函数:
224
+
225
+ ```javascript
226
+ {
227
+ // 获取数据源数据
228
+ getDataSource(sourceId, sql, options) => Promise<Object>
229
+
230
+ // 获取数据源列表
231
+ getDataSourceList() => Array
232
+
233
+ // 清除数据缓存
234
+ clearDataSourceCache(sourceId) => void
235
+
236
+ // 测试数据源连接
237
+ testDataSourceConnection(sourceId) => Promise<boolean>
238
+ }
239
+ ```
240
+
241
+ ### 内置数据源
242
+
243
+ 项目内置了以下模拟数据源:
244
+
245
+ - **sales_db** - 销售数据库(MySQL)
246
+ - **user_db** - 用户数据库(PostgreSQL)
247
+ - **finance_db** - 财务数据库(Oracle)
248
+
249
+ ### 自定义数据源
250
+
251
+ 您可以创建自定义数据源函数:
252
+
253
+ ```javascript
254
+ // 自定义数据源函数示例
255
+ const customDatasource = {
256
+ async getDataSource(sourceId, sql, options = {}) {
257
+ // 实现数据获取逻辑
258
+ return {
259
+ source: [], // 数据数组
260
+ dimensions: [], // 维度字段
261
+ metadata: {
262
+ sourceId: sourceId,
263
+ sql: sql,
264
+ count: 0,
265
+ timestamp: new Date().toISOString()
266
+ }
267
+ }
268
+ },
269
+
270
+ getDataSourceList() {
271
+ return [
272
+ {
273
+ id: 'my_db',
274
+ name: '我的数据库',
275
+ type: 'mysql',
276
+ description: '自定义数据源'
277
+ }
278
+ ]
279
+ },
280
+
281
+ clearDataSourceCache(sourceId = null) {
282
+ // 清除缓存逻辑
283
+ },
284
+
285
+ async testDataSourceConnection(sourceId) {
286
+ return true
287
+ }
288
+ }
289
+ ```
290
+
291
+ ## 特有插件语法
292
+
293
+ ### 1. ECharts 图表
294
+
295
+ 使用 `echarts` 代码块渲染图表:
296
+
297
+ ````markdown
298
+ ```echarts
299
+ {
300
+ "title": {
301
+ "text": "销售数据"
302
+ },
303
+ "xAxis": {
304
+ "type": "category",
305
+ "data": ["一月", "二月", "三月"]
306
+ },
307
+ "yAxis": {
308
+ "type": "value"
309
+ },
310
+ "series": [{
311
+ "data": [120, 200, 150],
312
+ "type": "bar"
313
+ }]
314
+ }
315
+ ```
316
+ ````
317
+
318
+ ### 2. Mermaid 流程图
319
+
320
+ 使用 `mermaid` 代码块渲染流程图:
321
+
322
+ ````markdown
323
+ ```mermaid
324
+ graph TD
325
+ A[开始] --> B{条件判断}
326
+ B -->|是| C[执行操作]
327
+ B -->|否| D[结束]
328
+ C --> D
329
+ ```
330
+ ````
331
+
332
+ ### 3. 数据集功能
333
+
334
+ 使用 `dataset` 代码块定义数据集:
335
+
336
+ ````markdown
337
+ ```dataset datasetId: sales_data
338
+ {
339
+ dimensions: ["产品", "2020", "2021", "2022"],
340
+ source: [
341
+ {产品: "产品A", 2020: 100, 2021: 120, 2022: 150},
342
+ {产品: "产品B", 2020: 80, 2021: 90, 2022: 110},
343
+ {产品: "产品C", 2020: 60, 2021: 70, 2022: 85}
344
+ ]
345
+ }
346
+ ```
347
+
348
+ 然后在 ECharts 中使用数据集:
349
+
350
+ ```echarts
351
+ {
352
+ dataset: dataset['sales_data'],
353
+ title: { text: "产品销售趋势" },
354
+ xAxis: { type: "category" },
355
+ yAxis: { type: "value" },
356
+ series: [{
357
+ type: "bar",
358
+ encode: { x: "产品", y: "2020" }
359
+ }]
360
+ }
361
+ ```
362
+ ````
363
+
364
+ #### ⚠️ 使用 dataset + encode 时的注意事项
365
+
366
+ 使用 `dataset` + `encode` 时,formatter 必须用**函数形式**,字符串模板会显示 `[object Object]`:
367
+
368
+ ````markdown
369
+ ```echarts
370
+ {
371
+ dataset: dataset['sales_data'],
372
+ series: [{
373
+ type: "pie",
374
+ encode: { itemName: "产品", value: "销量" },
375
+ label: {
376
+ // ❌ 错误:formatter: "{b}: {c}次 ({d}%)"
377
+ // ✅ 正确:使用函数
378
+ formatter: function(params) {
379
+ return params.data['产品'] + ': ' + params.data['销量'] + '次 (' + params.percent + '%)';
380
+ }
381
+ }
382
+ }]
383
+ }
384
+ ```
385
+ ````
386
+
387
+ ### 4. D3.js 可视化
388
+
389
+ 支持使用 D3.js 创建自定义可视化图表,提供两种使用方式:
390
+
391
+ #### 方式一:JSON 配置(快速创建)
392
+
393
+ 使用预定义的图表类型快速创建可视化:
394
+
395
+ ````markdown
396
+ ```d3
397
+ {
398
+ "type": "bar",
399
+ "data": [30, 86, 168, 281, 303, 365],
400
+ "width": 600,
401
+ "height": 400,
402
+ "color": "#5470c6"
403
+ }
404
+ ```
405
+ ````
406
+
407
+ **支持的图表类型:**
408
+ - `bar` - 柱状图
409
+ - `line` - 折线图
410
+ - `pie` - 饼图
411
+ - `scatter` - 散点图
412
+
413
+ **配置选项:**
414
+ - `type` - 图表类型(必需)
415
+ - `data` - 数据数组或 dataset 引用(必需)
416
+ - `width` - 图表宽度(默认 600)
417
+ - `height` - 图表高度(默认 400)
418
+ - `color` - 颜色
419
+ - `xField` / `yField` - 数据字段映射
420
+ - `nameField` / `valueField` - 饼图字段映射
421
+
422
+ #### 方式二:自定义 D3 代码(完全控制)
423
+
424
+ 编写完整的 D3.js 代码实现自定义可视化:
425
+
426
+ ````markdown
427
+ ```d3
428
+ // 创建 SVG
429
+ const svg = d3.select(container)
430
+ .append('svg')
431
+ .attr('width', 600)
432
+ .attr('height', 400);
433
+
434
+ // 绘制圆圈
435
+ const data = [10, 20, 30, 40, 50];
436
+ svg.selectAll('circle')
437
+ .data(data)
438
+ .enter()
439
+ .append('circle')
440
+ .attr('cx', (d, i) => 50 + i * 100)
441
+ .attr('cy', 200)
442
+ .attr('r', d => d)
443
+ .attr('fill', '#5470c6');
444
+ ```
445
+ ````
446
+
447
+ **可用变量:**
448
+ - `container` - DOM 容器元素
449
+ - `d3` - D3.js 库对象
450
+ - `dataset` - 数据集对象(访问已定义的数据集)
451
+ - `theme` - 当前主题('light' 或 'dark')
452
+
453
+ #### 与 Dataset 集成
454
+
455
+ D3 图表可以直接使用 dataset 中定义的数据:
456
+
457
+ ````markdown
458
+ ```dataset datasetId: sales_data
459
+ {
460
+ dimensions: ["产品", "销量"],
461
+ source: [
462
+ { 产品: "手机", 销量: 520 },
463
+ { 产品: "电脑", 销量: 380 },
464
+ { 产品: "平板", 销量: 290 }
465
+ ]
466
+ }
467
+ ```
468
+
469
+ **JSON 配置方式:**
470
+ ```d3
471
+ {
472
+ "type": "bar",
473
+ "data": "dataset['sales_data']",
474
+ "xField": "产品",
475
+ "yField": "销量",
476
+ "width": 600,
477
+ "height": 400
478
+ }
479
+ ```
480
+
481
+ **自定义代码方式:**
482
+ ```d3
483
+ // 获取数据集
484
+ const data = dataset['sales_data'].source;
485
+
486
+ // 使用 D3 绘制
487
+ const svg = d3.select(container)
488
+ .append('svg')
489
+ .attr('width', 600)
490
+ .attr('height', 400);
491
+
492
+ // ... 更多 D3 代码
493
+ ```
494
+ ````
495
+
496
+ #### 主题适配
497
+
498
+ D3 图表会自动适配明暗主题,可以在代码中使用 `theme` 变量:
499
+
500
+ ````markdown
501
+ ```d3
502
+ const textColor = theme === 'dark' ? '#e0e0e0' : '#000';
503
+
504
+ svg.append('text')
505
+ .attr('fill', textColor)
506
+ .text('标题');
507
+ ```
508
+ ````
509
+
510
+ ### 5. SQL 数据源查询
511
+
512
+ 支持从数据源查询数据,需要先注入 `datasource` 属性:
513
+
514
+ #### 查询语法格式
515
+
516
+ 支持两种格式的数据源查询:
517
+
518
+ **格式一:使用 datasourceId 指定数据源**
519
+
520
+ ````markdown
521
+ ```dataset datasetId: sql_query_1 datasourceId: sales_db
522
+ SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
523
+ ```
524
+ ````
525
+
526
+ **格式二:使用默认数据源(sales_db)**
527
+
528
+ ````markdown
529
+ ```dataset datasetId: sql_query_1
530
+ SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
531
+ ```
532
+ ````
533
+
534
+ #### 使用查询结果
535
+
536
+ 查询结果会自动转换为标准数据集格式,可以在 ECharts 中使用:
537
+
538
+ ```echarts
539
+ {
540
+ dataset: dataset['sql_query_1'],
541
+ title: { text: "产品销售趋势" },
542
+ xAxis: { type: "category" },
543
+ yAxis: { type: "value" },
544
+ series: [{
545
+ type: "bar",
546
+ encode: { x: "产品", y: "销售额" }
547
+ }]
548
+ }
549
+ ```
550
+
551
+ #### 示例:完整的数据源查询
552
+
553
+ ````markdown
554
+ ```dataset datasetId: user_analysis datasourceId: user_db
555
+ SELECT 地区, 用户数, 活跃度 FROM user_data WHERE 用户数 > 1000 AND 活跃度 > 0.7
556
+ ```
557
+
558
+ ```echarts
559
+ {
560
+ dataset: dataset['user_analysis'],
561
+ title: { text: "用户分布分析" },
562
+ xAxis: { type: "category" },
563
+ yAxis: { type: "value" },
564
+ series: [{
565
+ type: "bar",
566
+ encode: { x: "地区", y: "用户数" }
567
+ }]
568
+ }
569
+ ```
570
+ ````
571
+
572
+ ### 5. SQL 数据源查询
573
+
574
+ 支持从数据源查询数据,需要先注入 `datasource` 属性:
575
+
576
+ #### 查询语法格式
577
+
578
+ 支持两种格式的数据源查询:
579
+
580
+ **格式一:使用 datasourceId 指定数据源**
581
+
582
+ ````markdown
583
+ ```dataset datasetId: sql_query_1 datasourceId: sales_db
584
+ SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
585
+ ```
586
+ ````
587
+
588
+ **格式二:使用默认数据源(sales_db)**
589
+
590
+ ````markdown
591
+ ```dataset datasetId: sql_query_1
592
+ SELECT 产品, 年份, 销售额 FROM sales_data WHERE 销售额 > 100
593
+ ```
594
+ ````
595
+
596
+ #### 使用查询结果
597
+
598
+ 查询结果会自动转换为标准数据集格式,可以在 ECharts 或 D3 中使用:
599
+
600
+ ```echarts
601
+ {
602
+ dataset: dataset['sql_query_1'],
603
+ title: { text: "产品销售趋势" },
604
+ xAxis: { type: "category" },
605
+ yAxis: { type: "value" },
606
+ series: [{
607
+ type: "bar",
608
+ encode: { x: "产品", y: "销售额" }
609
+ }]
610
+ }
611
+ ```
612
+
613
+ #### 示例:完整的数据源查询
614
+
615
+ ````markdown
616
+ ```dataset datasetId: user_analysis datasourceId: user_db
617
+ SELECT 地区, 用户数, 活跃度 FROM user_data WHERE 用户数 > 1000 AND 活跃度 > 0.7
618
+ ```
619
+
620
+ ```echarts
621
+ {
622
+ dataset: dataset['user_analysis'],
623
+ title: { text: "用户分布分析" },
624
+ xAxis: { type: "category" },
625
+ yAxis: { type: "value" },
626
+ series: [{
627
+ type: "bar",
628
+ encode: { x: "地区", y: "用户数" }
629
+ }]
630
+ }
631
+ ```
632
+ ````
633
+
634
+ ### 6. 栅格布局
635
+
636
+ 使用 `cell` 容器创建响应式布局:
637
+
638
+ ````markdown
639
+ ::: cell 6
640
+ ### 大单元格 (6格宽)
641
+ 这是一个较大的单元格,宽度占6格
642
+
643
+ 可以包含任何 Markdown 语法:
644
+ - 列表项
645
+ - 图片
646
+ - 代码等
647
+ :::
648
+
649
+ ::: cell 3
650
+ ### 中等单元格 (3格宽)
651
+ 中等大小的单元格
652
+
653
+ ```javascript
654
+ console.log('支持代码块');
655
+ ```
656
+ :::
657
+ ````
658
+
659
+ ### 7. 自定义容器
660
+
661
+ 支持多种自定义容器:
662
+
663
+ ````markdown
664
+ ::: info
665
+ 这是一个信息提示
666
+ :::
667
+
668
+ ::: warning
669
+ 这是一个警告信息
670
+ :::
671
+
672
+ ::: danger
673
+ 这是一个危险提示
674
+ :::
675
+
676
+ ::: success
677
+ 这是一个成功提示
678
+ :::
679
+ ````
680
+
681
+
682
+
683
+ ## 数据源使用注意事项
684
+
685
+ ### 错误处理
686
+
687
+ 当数据源查询失败时,会显示错误信息:
688
+
689
+ - **数据源未注入**:"数据源获取函数未注入,请确保已设置datasource属性"
690
+ - **数据源不存在**:"数据源不存在: {sourceId}"
691
+ - **SQL语法错误**:"SQL查询语句不能为空" 或 "数据源查询格式不正确"
692
+
693
+ ### 缓存机制
694
+
695
+ 数据源查询结果会自动缓存,避免重复查询:
696
+
697
+ - 相同查询条件会返回缓存结果
698
+ - 可以通过 `clearDataSourceCache()` 清除缓存
699
+ - 使用 `{forceRefresh: true}` 选项强制刷新
700
+
701
+ ### 性能优化
702
+
703
+ - 数据源查询支持异步处理
704
+ - 支持延迟加载选项 `{delay: 500}`
705
+ - 内置数据源使用模拟数据,无网络请求
706
+
707
+ ## 特性
708
+
709
+ - ✅ Vue 3 支持
710
+ - ✅ ECharts 图表渲染
711
+ - ✅ D3.js 可视化支持(新功能)
712
+ - ✅ Mermaid 流程图支持
713
+ - ✅ KaTeX 数学公式
714
+ - ✅ 数据集表格展示
715
+ - ✅ 可编辑区域
716
+ - ✅ 自定义容器
717
+ - ✅ 响应式设计
718
+ - ✅ TypeScript 支持
719
+ - ✅ 数据源查询功能
720
+ - ✅ SQL 语法支持
721
+ - ✅ 数据缓存机制
722
+ - ✅ **Word 文档导出**
723
+ - ✅ **Dashboard 看板模式**
724
+
725
+ ## Word 导出功能
726
+
727
+ 支持将 Markdown 内容导出为 Word 文档(.docx 格式):
728
+
729
+ ```vue
730
+ <template>
731
+ <div>
732
+ <button @click="exportToWord">导出 Word</button>
733
+ <MarkdownEditor ref="editor" v-model:content="content" :editable="true" />
734
+ </div>
735
+ </template>
736
+
737
+ <script>
738
+ export default {
739
+ methods: {
740
+ async exportToWord() {
741
+ const result = await this.$refs.editor.exportToWord('我的文档.docx')
742
+ if (result.success) {
743
+ console.log('导出成功!')
744
+ }
745
+ }
746
+ }
747
+ }
748
+ </script>
749
+ ```
750
+
751
+ **支持导出:**
752
+ - 标题、段落、列表、表格
753
+ - 粗体、斜体、代码块
754
+ - **ECharts 图表**(自动转为图片)
755
+ - **Mermaid 流程图**(自动转为图片)
756
+
757
+ **详细文档:** 查看 [EXPORT.md](./docs/EXPORT.md)
758
+
759
+ ## Dashboard 看板模式
760
+
761
+ 支持将数据集集中管理的看板模式,通过添加 `<!-- dashboard -->` 注释激活:
762
+
763
+ ```markdown
764
+ <!-- dashboard -->
765
+
766
+ # 销售数据看板
767
+
768
+ \`\`\`dataset datasetId: sales_data
769
+ {
770
+ dimensions: ["月份", "销售额"],
771
+ source: [
772
+ { 月份: "1月", 销售额: 12500 },
773
+ { 月份: "2月", 销售额: 13800 }
774
+ ]
775
+ }
776
+ \`\`\`
777
+
778
+ \`\`\`echarts
779
+ {
780
+ dataset: dataset['sales_data'],
781
+ xAxis: { type: "category" },
782
+ yAxis: { type: "value" },
783
+ series: [{ type: "line", encode: { x: "月份", y: "销售额" } }]
784
+ }
785
+ \`\`\`
786
+ ```
787
+
788
+ **Dashboard 模式特性:**
789
+ - 左侧抽屉显示所有数据集
790
+ - 数据集不在正文中显示
791
+ - 支持搜索、刷新、导出
792
+ - 数据预览功能
793
+
794
+ **详细文档:** 查看 [DASHBOARD.md](./docs/DASHBOARD.md)
795
+
796
+ ## 特性
797
+
798
+ - ✅ Vue 3 支持
799
+ - ✅ ECharts 图表渲染
800
+ - ✅ D3.js 可视化支持
801
+ - ✅ Mermaid 流程图支持
802
+ - ✅ KaTeX 数学公式
803
+ - ✅ 数据集表格展示
804
+ - ✅ 可编辑区域
805
+ - ✅ 自定义容器
806
+ - ✅ 响应式设计
807
+ - ✅ TypeScript 支持
808
+ - ✅ 数据源查询功能
809
+ - ✅ SQL 语法支持
810
+ - ✅ 数据缓存机制
811
+ - ✅ Word 文档导出
812
+ - ✅ Dashboard 看板模式
813
+
814
+ ## 许可证
815
+
816
816
  MIT License