auto-vue-manual 0.1.21 → 0.1.22

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,487 +1,487 @@
1
- # 自用组件库
2
-
3
- ## 安装
4
-
5
- ```bash
6
- npm install auto-vue-manual
7
- ```
8
-
9
- ## 使用
10
-
11
- ```js
12
- import AutoVueManual from "auto-vue-manual";
13
- import type { InstallOptions } from 'auto-vue-manual';
14
- import 'auto-vue-manual/dist/index.css';
15
-
16
- import request from "@/global/request";
17
- import { Translate } from "@/languages/index";
18
-
19
- const options: InstallOptions = {
20
- request,
21
- translate: Translate
22
- }
23
-
24
- const app = createApp(App);
25
- app.use(AutoVueManual, options);
26
- app.mount('#app');
27
- ```
28
-
29
- ## 目录
30
-
31
- #### Table
32
- [ProTable/ProTableSummary](#protable--protablesummary)
33
- [ProTableList](#protablelist)
34
-
35
- #### Modal
36
- [BasicDialog](#basicdialog)
37
- [BasicDrawer](#basicdrawer)
38
- [FormDialog](#formdialog)
39
- [TableDialog](#tabledialog)
40
-
41
- #### Upload
42
- [UploadAvatar](#uploadavatar)
43
- [UploadImage](#uploadimage)
44
- [UploadImages](#uploadimages)
45
-
46
- ## Button
47
-
48
- ### 组件列表
49
- - OpenButton 新建按钮
50
- - RefreshButton 刷新按钮
51
- - SearchButton 搜索按钮
52
- - ResetButton 重置按钮
53
-
54
- ### 通用 Props
55
- | 属性名 | 类型 | 说明 | 默认值 |
56
- |-----------|---------|----------------|----------|
57
- | type | string | 按钮类型 | 'primary'(Open/Search),'default'(Refresh),'warning'(Reset)|
58
- | size | string | 按钮尺寸 | 'default'|
59
- | showIcon | boolean | 是否显示图标 | true |
60
- | circle | boolean | 是否圆形按钮 | true |
61
- | plain | boolean | 是否朴素按钮 | false |
62
- | disabled | boolean | 是否禁用 | false |
63
- | loading | boolean | 是否加载中 | false |
64
- | t | string | 按钮文本 | '' |
65
-
66
- ### OpenButton
67
- - 用于新建操作,蓝色圆形加号图标。
68
- - 事件:`@open` 点击触发
69
-
70
- ### RefreshButton
71
- - 用于刷新操作,圆形刷新图标。
72
- - 事件:`@refresh` 点击触发
73
- - 支持 loading 状态自定义
74
-
75
- ### SearchButton
76
- - 用于搜索操作,蓝色圆形放大镜图标。
77
- - 事件:`@search` 点击触发
78
-
79
- ### ResetButton
80
- - 用于重置操作,橙色圆形刷新图标。
81
- - 事件:`@reset` 点击触发
82
-
83
- ### 示例代码
84
- ```vue
85
- <template>
86
- <OpenButton @open="onOpen" />
87
- <RefreshButton :loading="loading" @refresh="onRefresh" />
88
- <SearchButton t="搜索" @search="onSearch" />
89
- <ResetButton t="重置" @reset="onReset" />
90
- </template>
91
- <script setup lang="ts">
92
- import { ref } from 'vue';
93
- import { OpenButton, RefreshButton, SearchButton, ResetButton } from 'auto-vue-manual';
94
- const loading = ref(false);
95
- const onOpen = () => { /* 新建逻辑 */ };
96
- const onRefresh = () => {
97
- loading.value = true;
98
- setTimeout(() => loading.value = false, 1000);
99
- };
100
- const onSearch = () => { /* 搜索逻辑 */ };
101
- const onReset = () => { /* 重置逻辑 */ };
102
- </script>
103
- ```
104
-
105
- # Document
106
-
107
- ## Table
108
-
109
- ### ProTable / ProTableSummary
110
-
111
- #### ColumnProps
112
-
113
- | 属性名 | 类型 | 说明 | 默认值 |
114
- | ------ | ---- | ---- | ------ |
115
- | **type** | `string` | 列类型, index / selection/ radio/ expand/ sort/ icon/ tag/ copy | - |
116
- | **prop** | `string` | 列数据字段名 | - |
117
- | **label** | `string` | 列标题 | - |
118
- | **width** | `number` | 列宽 | - |
119
- | **align** | `string` | 列对齐方式 | center |
120
- | **isShow** | `boolean` | 是否显示在表格当中 | true |
121
- | **search** | `{ defaultValue }` | 搜索项配置, defaultValue可以设置默认的init-param | - |
122
- | **headerRender** | `(scope: HeaderRenderScope<T>) => VNode` | 自定义表头内容渲染(tsx语法) | - |
123
- | **render** | `(scope: RenderScope<T>) => VNode string` | 自定义单元格内容渲染(tsx语法),Basic和list的scope略有不同,请注意 | - |
124
- | **props** | `{ api?: string, activeValue?: any, inactiveValue?: any, refresh?: boolean }` | type = switch 时,props 配置 (TODO 更新其他type) | - |
125
-
126
- #### Props 参数说明
127
-
128
- | 属性名 | 类型 | 说明 | 默认值 |
129
- | ------ | ---- | ---- | ------ |
130
- | **columns** | [`ColumnProps[]`](#columnprops) | 必填,列配置项 | - |
131
- | **data** | `any[]` | 静态 table data 数据,若存在则不会使用 request url 返回的 data | - |
132
- | **url** | `string` | 实际请求接口 | - |
133
- | **auto-search** | `boolean` | 是否自动执行请求 api | true |
134
- | **request-error** | `(params: any) => void` | 表格 api 请求错误监听 | - |
135
- | **data-callback** | `(data: any) => any` | 返回数据的回调函数,可以对数据进行处理 | - |
136
- | **has-pagination** | `boolean` | 是否需要分页组件 | true |
137
- | **init-param** | `any` | 初始化请求参数 | {} |
138
- | **search-param** | `any` | 搜索参数 | {} |
139
- | **border** | `boolean` | 是否带有纵向边框 | true |
140
- | **row-key** | `string` | 行数据的 Key,用来优化 Table 的渲染,当表格数据多选时,所指定的 id ) | id |
141
- | **size** | `string` | 列表大小,default/small/large | small |
142
- | **page-size** | `number` | 列表页大小 | 0 |
143
- | **row-h** | `number` | 列表行高 | 0 |
144
- | **ext-h** | `number` | 列表额外高度 | 0 |
145
- | **sum-url** | `string` | 汇总接口url,仅 ProTableSummary 有效 | |
146
- | **sum-text** | `string` | 汇总文本,仅 ProTableSummary 有效 | Total |
147
- | **sum-text-format** | `string` | 汇总文本格式,仅 ProTableSummary 有效 | * |
148
-
149
- #### Event 事件说明
150
-
151
- | 事件名 | 说明 | 参数 |
152
- | ------ | ---- | ---- |
153
- | **@row-click** | 行点击事件,已排除 status / operation 列 | `(row: any, column: any) => void` |
154
- | **@row-dblclick** | 行双击事件,已排除 status / operation 列 | `(row: any, column: any) => void` |
155
- | **@switch-change** | 开关切换事件 | `(value, scope, column) => void` |
156
-
157
- #### Expose 暴露方法说明
158
-
159
- | 方法名 | 说明 | 参数 |
160
- | ------ | ---- | ---- |
161
- | **@search** | 搜索事件 | `(searchParam?: Record<string, any>) => void` |
162
- | **@reset** | 重置事件 | `() => void` |
163
- | **@getTableList** | 获取表格数据,不更新搜索参数及分页参数 | `() => void` |
164
-
165
- #### 示例代码
166
-
167
- ```vue
168
- <template>
169
- <div>
170
- <el-button @click="search">搜索</el-button>
171
- <el-button @click="reset">重置</el-button>
172
- </div>
173
- <ProTable
174
- ref="proTableRef"
175
- :columns="columns"
176
- url="/league/search"
177
- :search-param="params"
178
- @row-dblclick="onRowDblclick"
179
- >
180
- <template #logo="{ row }">
181
- <div class="flex-center h-100">
182
- <el-image style="width: 36px; height: 36px" :src="row.logo" />
183
- </div>
184
- </template>
185
- </ProTable>
186
- </template>
187
- <script setup lang="ts">
188
- import type { ColumnProps, RenderScope, HeaderRenderScope } from "auto-vue-manual";
189
-
190
- import { reactive, ref } from "vue";
191
- import { ProTable } from "auto-vue-manual";
192
-
193
- const proTableRef = ref<InstanceType<typeof ProTable>>();
194
- const columns: ColumnProps[] = [
195
- { label: "index", type: 'index' },
196
- { prop: "code", label: "代号", width: 100, type: 'tag' },
197
- { prop: "logo", label: "标志", width: 100 },
198
- { prop: "status", label: "状态", width: 100, type: 'switch', props: { activeValue: 1, inactiveValue: 2, api: '/league/change_status', refresh: true } },
199
- { prop: "name", label: "名称", width: 0, align: "right",
200
- search: { defaultValue: "League" },
201
- headerRender: ({ column }: HeaderRenderScope<any>) => {
202
- return (<span>headerRender: {column.label}</span>)
203
- },
204
- render: ({ row }: RenderScope<any>) => {
205
- return (<span>render: { row.name }</span>)
206
- }
207
- },
208
- ];
209
- const params = reactive({
210
- keyword: "",
211
- });
212
- const search = () => {
213
- // 修改搜索参数
214
- params.keyword = "League";
215
- proTableRef.value?.search();
216
- // 直接传入参数
217
- // proTableRef.value?.search({
218
- // keyword: "League",
219
- // })
220
- };
221
- const reset = () => {
222
- proTableRef.value?.reset();
223
- };
224
- const onRowDblclick = (row: any, column: any, event: any) => {
225
- console.log("onRowDblclick", row, column, event);
226
- };
227
- </script>
228
- ```
229
-
230
- ## ProTableList
231
-
232
- #### Props 参数说明
233
- | 属性名 | 类型 | 说明 | 默认值 |
234
- | ------ | ---- | ---- | ------ |
235
- | **row-key** | `string` | 行数据的 Key,用来优化 Table 的渲染,当表格数据多选时,所指定的 id ) | id |
236
-
237
- 其余同 [ProTable](#protable--protablesummary)
238
-
239
- #### Event 事件说明
240
-
241
- | 事件名 | 说明 | 参数 |
242
- | ------ | ---- | ---- |
243
- | **@row-click** | 行点击事件,未排除 status / operation 列,需添加 e.stopPropagation() 阻止事件冒泡 | `({ row: any, column: any }) => void` |
244
- | **@row-dblclick** | 行双击事件,未排除 status / operation 列,需添加 e.stopPropagation() 阻止事件冒泡 | `({ row: any, column: any }) => void` |
245
-
246
- #### Expose 暴露方法说明
247
- 与 ProTable 相同。
248
-
249
- #### 示例代码
250
-
251
- ```vue
252
- <template>
253
- <div>
254
- <el-button @click="search">搜索</el-button>
255
- <el-button @click="reset">重置</el-button>
256
- </div>
257
- <ProTableList ref="proTableRef" row-key="key" :columns="columns" :search-param="params" url="/page/list" @row-dblclick="onRowDblclick" />
258
- </template>
259
- <script setup lang="tsx">
260
- import type { RowEventHandlerParams } from "element-plus";
261
- import type { ColumnProps, HeaderRenderScope, RenderScope } from "auto-vue-manual";
262
-
263
- import { ref, reactive } from "vue";
264
-
265
- import { Plus } from "@element-plus/icons-vue";
266
- import ProTableList from "auto-vue-manual";
267
-
268
- const proTableRef = ref<InstanceType<typeof ProTableList>>();
269
- const columns: ColumnProps[] = [
270
- { label: "index", type: 'index' },
271
- { prop: "label", label: "Label", width: 100, type: 'tag' },
272
- { prop: "key", label: "Key", width: 100, type: 'copy' },
273
- { prop: "value", label: "Value", width: 200, headerRender: (scope: HeaderRenderScope<any>) => {
274
- return (
275
- <span>HeaderRender: {scope.column.label}</span>
276
- )
277
- }},
278
- { prop: "status", label: "Status", width: 100, type: 'switch', props: { activeValue: 1, inactiveValue: 2, api: '/league/change_status', refresh: true } },
279
- { prop: "action", label: "Action", width: 60, align: "center", render: (scope: RenderScope<any>) => {
280
- return (
281
- <el-button type="primary" size="small" link icon={Plus} onClick={(e: Event) => {
282
- e.stopPropagation();
283
- console.log('onclick', e)
284
- }}>
285
- <span>render: {scope.rowData.label}</span>
286
- </el-button>
287
- )
288
- }},
289
- ];
290
- const params = reactive({
291
- keyword: "",
292
- });
293
- const search = () => {
294
- // 修改搜索参数
295
- params.keyword = "League";
296
- proTableRef.value?.search();
297
- // 直接传入参数
298
- // proTableRef.value?.search({
299
- // keyword: "League",
300
- // })
301
- };
302
- const reset = () => {
303
- proTableRef.value?.reset();
304
- };
305
- const onRowDblclick = (row: RowEventHandlerParams) => {
306
- console.log("onRowDblclick", row);
307
- };
308
- </script>
309
- ```
310
-
311
- ## Modal 弹窗/抽屉
312
-
313
- ### 统一说明
314
- - 所有弹窗类组件(BasicDialog、FormDialog、TableDialog)均基于 BasicDialog 实现,props/事件/用法风格统一。
315
- - 所有抽屉类组件均基于 BasicDrawer 实现。
316
- - 支持 v-bind 透传 Element Plus Dialog/Drawer 的所有原生属性。
317
-
318
- ### 通用 Props
319
- | 属性名 | 类型 | 说明 | 默认值 |
320
- |----------------|-----------|----------------|----------|
321
- | visible | boolean | 是否显示 | false |
322
- | showClose | boolean | 是否显示关闭按钮 | true |
323
- | title | string | 标题 | Title |
324
- | width | string | 宽度 | 520px |
325
- | top | string | 顶部距离 | 15vh |
326
- | dialogProps | object | 透传 Dialog/Drawer 属性 | {} |
327
- | appendToBody | boolean | 是否插入 body | true |
328
- | lockScroll | boolean | 是否锁定滚动 | true |
329
- | closeOnClickModal | boolean | 点击遮罩关闭 | false |
330
-
331
- ### BasicDialog
332
- - 通用弹窗基类,支持所有通用 props 和事件。
333
- - 事件:`@update:visible`、`@closed`、`@submit`
334
-
335
- ### BasicDrawer
336
- - 通用抽屉基类,支持所有通用 props 和事件。
337
- - 事件:`@update:visible`、`@closed`
338
-
339
- ### FormDialog
340
- - 基于 BasicDialog 扩展,内置底部按钮,适合表单场景。
341
- - 额外 props:`executing`(是否执行中)、`footer`(是否显示底部)、`btnSize`、`okText`、`cancelText`
342
- - 事件:`@submit`、`@closed`、`@before-close`
343
-
344
- ### TableDialog
345
- - 基于 BasicDialog 扩展,适合表格弹窗场景。
346
- - 额外 props:`requesting`(是否请求中)
347
-
348
- ### 示例代码
349
- ```vue
350
- <template>
351
- <OpenButton @open="visible = true" />
352
- <BasicDialog :visible="visible" title="标题" width="520px" @update:visible="visible = $event" @closed="onClosed">
353
- <template #default>内容区域</template>
354
- </BasicDialog>
355
- </template>
356
- <script setup lang="ts">
357
- import { ref } from 'vue';
358
- import { BasicDialog, OpenButton } from 'auto-vue-manual';
359
- const visible = ref(false);
360
- const onClosed = () => { visible.value = false; };
361
- </script>
362
- ```
363
-
364
- ### FormDialog 示例
365
- ```vue
366
- <template>
367
- <OpenButton @open="visible = true" />
368
- <FormDialog :visible="visible" title="表单弹窗" @update:visible="visible = $event" @submit="onSubmit">
369
- <template #default>
370
- <el-input v-model="form.name" placeholder="请输入名称" />
371
- </template>
372
- </FormDialog>
373
- </template>
374
- <script setup lang="ts">
375
- import { ref } from 'vue';
376
- import { FormDialog, OpenButton } from 'auto-vue-manual';
377
- const visible = ref(false);
378
- const form = ref({ name: '' });
379
- const onSubmit = () => { /* 提交逻辑 */ };
380
- </script>
381
- ```
382
-
383
- ## Upload
384
-
385
- ### UploadAvatar
386
-
387
- #### Props 参数说明
388
-
389
- | 属性名 | 类型 | 说明 | 默认值 |
390
- | ------ | ---- | ---- | ------ |
391
- | **url** | `string` | 上传地址 | - |
392
- | **avatar** | `string` | 头像地址 | - |
393
- | **text** | `string` | 上传提示 | - |
394
- | **path** | `string` | 保存路径 | - |
395
- | **preview** | `boolean` | 是否显示预览 | false |
396
- | **disabled** | `boolean` | 是否禁用 | false |
397
- | **size** | `number` | 大小(KB) | 5120 |
398
-
399
- ### UploadImage
400
-
401
- #### Props 参数说明
402
-
403
- | 属性名 | 类型 | 说明 | 默认值 |
404
- | ------ | ---- | ---- | ------ |
405
- | **image** | `string` | 图片地址 | - |
406
-
407
- 其余同 [UploadAvatar](#uploadavatar)
408
-
409
- #### 示例代码
410
-
411
- ```vue
412
- <template>
413
- <UploadAvatar ref="uploadAvatarRef" url="/upload/image" :avatar="avatar" text="上传头像" path="/avatar" preview :size="1024" />
414
- </template>
415
- <script setup lang="ts">
416
- import { ref } from "vue";
417
- import UploadAvatar from "auto-vue-manual";
418
-
419
- const uploadAvatarRef = ref<InstanceType<typeof UploadAvatar>>();
420
- const avatar = ref("");
421
- </script>
422
- ```
423
-
424
- ### UploadImages
425
-
426
- #### Props 参数说明
427
-
428
- | 属性名 | 类型 | 说明 | 默认值 |
429
- | ------ | ---- | ---- | ------ |
430
- | **images** | `FileList[]` | 图片地址 | - |
431
- | **limit** | `number` | 限制数量 | 10 |
432
-
433
- 其余同 [UploadAvatar](#uploadavatar)
434
-
435
- #### 示例代码
436
-
437
- ```vue
438
- <template>
439
- <UploadImages ref="uploadImagesRef" url="/upload/image" :images="images" text="上传图片" path="/image" preview :size="1024" />
440
- </template>
441
- <script setup lang="ts">
442
- import type { FileList } from "auto-vue-manual";
443
-
444
- import { ref } from "vue";
445
- import UploadImages from "auto-vue-manual";
446
-
447
- const uploadImagesRef = ref<InstanceType<typeof UploadImages>>();
448
- const images = ref<FileList[]>([]);
449
- </script>
450
- ```
451
-
452
- ## Tinymce 富文本编辑器
453
-
454
- ### 组件说明
455
- 基于 tinymce 封装的富文本编辑器,支持图片上传、字数统计、代码高亮等常用功能,适用于内容管理、文章编辑等场景。
456
-
457
- ### Props 参数说明
458
- | 属性名 | 类型 | 说明 | 默认值 |
459
- |----------|---------|----------------------|----------------|
460
- | url | string | 图片上传接口 | /upload/image |
461
- | content | string | 编辑器内容(v-model)| '' |
462
- | height | number | 编辑器高度 | 600 |
463
- | disabled | boolean | 是否禁用编辑 | false |
464
-
465
- ### 事件
466
- | 事件名 | 说明 | 参数 |
467
- |------------------|--------------------|--------------|
468
- | update:content | 内容变更时触发 | value: string|
469
-
470
- ### 功能特性
471
- - 支持图片粘贴/上传,自动调用 `url` 接口
472
- - 支持字数统计、代码高亮、列表、字体样式等
473
- - 支持自定义高度、禁用状态
474
- - 默认中文界面
475
-
476
- ### 示例代码
477
- ```vue
478
- <template>
479
- <Tinymce v-model:content="content" :height="400" :url="'/upload/image'" />
480
- <p>内容:{{ content }}</p>
481
- </template>
482
- <script setup lang="ts">
483
- import { ref } from 'vue';
484
- import Tinymce from 'auto-vue-manual';
485
- const content = ref('<p>初始内容</p>');
486
- </script>
487
- ```
1
+ # 自用组件库
2
+
3
+ ## 安装
4
+
5
+ ```bash
6
+ npm install auto-vue-manual
7
+ ```
8
+
9
+ ## 使用
10
+
11
+ ```js
12
+ import AutoVueManual from "auto-vue-manual";
13
+ import type { InstallOptions } from 'auto-vue-manual';
14
+ import 'auto-vue-manual/dist/index.css';
15
+
16
+ import request from "@/global/request";
17
+ import { Translate } from "@/languages/index";
18
+
19
+ const options: InstallOptions = {
20
+ request,
21
+ translate: Translate
22
+ }
23
+
24
+ const app = createApp(App);
25
+ app.use(AutoVueManual, options);
26
+ app.mount('#app');
27
+ ```
28
+
29
+ ## 目录
30
+
31
+ #### Table
32
+ [ProTable/ProTableSummary](#protable--protablesummary)
33
+ [ProTableList](#protablelist)
34
+
35
+ #### Modal
36
+ [BasicDialog](#basicdialog)
37
+ [BasicDrawer](#basicdrawer)
38
+ [FormDialog](#formdialog)
39
+ [TableDialog](#tabledialog)
40
+
41
+ #### Upload
42
+ [UploadAvatar](#uploadavatar)
43
+ [UploadImage](#uploadimage)
44
+ [UploadImages](#uploadimages)
45
+
46
+ ## Button
47
+
48
+ ### 组件列表
49
+ - OpenButton 新建按钮
50
+ - RefreshButton 刷新按钮
51
+ - SearchButton 搜索按钮
52
+ - ResetButton 重置按钮
53
+
54
+ ### 通用 Props
55
+ | 属性名 | 类型 | 说明 | 默认值 |
56
+ |-----------|---------|----------------|----------|
57
+ | type | string | 按钮类型 | 'primary'(Open/Search),'default'(Refresh),'warning'(Reset)|
58
+ | size | string | 按钮尺寸 | 'default'|
59
+ | showIcon | boolean | 是否显示图标 | true |
60
+ | circle | boolean | 是否圆形按钮 | true |
61
+ | plain | boolean | 是否朴素按钮 | false |
62
+ | disabled | boolean | 是否禁用 | false |
63
+ | loading | boolean | 是否加载中 | false |
64
+ | t | string | 按钮文本 | '' |
65
+
66
+ ### OpenButton
67
+ - 用于新建操作,蓝色圆形加号图标。
68
+ - 事件:`@open` 点击触发
69
+
70
+ ### RefreshButton
71
+ - 用于刷新操作,圆形刷新图标。
72
+ - 事件:`@refresh` 点击触发
73
+ - 支持 loading 状态自定义
74
+
75
+ ### SearchButton
76
+ - 用于搜索操作,蓝色圆形放大镜图标。
77
+ - 事件:`@search` 点击触发
78
+
79
+ ### ResetButton
80
+ - 用于重置操作,橙色圆形刷新图标。
81
+ - 事件:`@reset` 点击触发
82
+
83
+ ### 示例代码
84
+ ```vue
85
+ <template>
86
+ <OpenButton @open="onOpen" />
87
+ <RefreshButton :loading="loading" @refresh="onRefresh" />
88
+ <SearchButton t="搜索" @search="onSearch" />
89
+ <ResetButton t="重置" @reset="onReset" />
90
+ </template>
91
+ <script setup lang="ts">
92
+ import { ref } from 'vue';
93
+ import { OpenButton, RefreshButton, SearchButton, ResetButton } from 'auto-vue-manual';
94
+ const loading = ref(false);
95
+ const onOpen = () => { /* 新建逻辑 */ };
96
+ const onRefresh = () => {
97
+ loading.value = true;
98
+ setTimeout(() => loading.value = false, 1000);
99
+ };
100
+ const onSearch = () => { /* 搜索逻辑 */ };
101
+ const onReset = () => { /* 重置逻辑 */ };
102
+ </script>
103
+ ```
104
+
105
+ # Document
106
+
107
+ ## Table
108
+
109
+ ### ProTable / ProTableSummary
110
+
111
+ #### ColumnProps
112
+
113
+ | 属性名 | 类型 | 说明 | 默认值 |
114
+ | ------ | ---- | ---- | ------ |
115
+ | **type** | `string` | 列类型, index / selection/ radio/ expand/ sort/ icon/ tag/ copy | - |
116
+ | **prop** | `string` | 列数据字段名 | - |
117
+ | **label** | `string` | 列标题 | - |
118
+ | **width** | `number` | 列宽 | - |
119
+ | **align** | `string` | 列对齐方式 | center |
120
+ | **isShow** | `boolean` | 是否显示在表格当中 | true |
121
+ | **search** | `{ defaultValue }` | 搜索项配置, defaultValue可以设置默认的init-param | - |
122
+ | **headerRender** | `(scope: HeaderRenderScope<T>) => VNode` | 自定义表头内容渲染(tsx语法) | - |
123
+ | **render** | `(scope: RenderScope<T>) => VNode string` | 自定义单元格内容渲染(tsx语法),Basic和list的scope略有不同,请注意 | - |
124
+ | **props** | `{ api?: string, activeValue?: any, inactiveValue?: any, refresh?: boolean }` | type = switch 时,props 配置 (TODO 更新其他type) | - |
125
+
126
+ #### Props 参数说明
127
+
128
+ | 属性名 | 类型 | 说明 | 默认值 |
129
+ | ------ | ---- | ---- | ------ |
130
+ | **columns** | [`ColumnProps[]`](#columnprops) | 必填,列配置项 | - |
131
+ | **data** | `any[]` | 静态 table data 数据,若存在则不会使用 request url 返回的 data | - |
132
+ | **url** | `string` | 实际请求接口 | - |
133
+ | **auto-search** | `boolean` | 是否自动执行请求 api | true |
134
+ | **request-error** | `(params: any) => void` | 表格 api 请求错误监听 | - |
135
+ | **data-callback** | `(data: any) => any` | 返回数据的回调函数,可以对数据进行处理 | - |
136
+ | **has-pagination** | `boolean` | 是否需要分页组件 | true |
137
+ | **init-param** | `any` | 初始化请求参数 | {} |
138
+ | **search-param** | `any` | 搜索参数 | {} |
139
+ | **border** | `boolean` | 是否带有纵向边框 | true |
140
+ | **row-key** | `string` | 行数据的 Key,用来优化 Table 的渲染,当表格数据多选时,所指定的 id ) | id |
141
+ | **size** | `string` | 列表大小,default/small/large | small |
142
+ | **page-size** | `number` | 列表页大小 | 0 |
143
+ | **row-h** | `number` | 列表行高 | 0 |
144
+ | **ext-h** | `number` | 列表额外高度 | 0 |
145
+ | **sum-url** | `string` | 汇总接口url,仅 ProTableSummary 有效 | |
146
+ | **sum-text** | `string` | 汇总文本,仅 ProTableSummary 有效 | Total |
147
+ | **sum-text-format** | `string` | 汇总文本格式,仅 ProTableSummary 有效 | * |
148
+
149
+ #### Event 事件说明
150
+
151
+ | 事件名 | 说明 | 参数 |
152
+ | ------ | ---- | ---- |
153
+ | **@row-click** | 行点击事件,已排除 status / operation 列 | `(row: any, column: any) => void` |
154
+ | **@row-dblclick** | 行双击事件,已排除 status / operation 列 | `(row: any, column: any) => void` |
155
+ | **@switch-change** | 开关切换事件 | `(value, scope, column) => void` |
156
+
157
+ #### Expose 暴露方法说明
158
+
159
+ | 方法名 | 说明 | 参数 |
160
+ | ------ | ---- | ---- |
161
+ | **@search** | 搜索事件 | `(searchParam?: Record<string, any>) => void` |
162
+ | **@reset** | 重置事件 | `() => void` |
163
+ | **@getTableList** | 获取表格数据,不更新搜索参数及分页参数 | `() => void` |
164
+
165
+ #### 示例代码
166
+
167
+ ```vue
168
+ <template>
169
+ <div>
170
+ <el-button @click="search">搜索</el-button>
171
+ <el-button @click="reset">重置</el-button>
172
+ </div>
173
+ <ProTable
174
+ ref="proTableRef"
175
+ :columns="columns"
176
+ url="/league/search"
177
+ :search-param="params"
178
+ @row-dblclick="onRowDblclick"
179
+ >
180
+ <template #logo="{ row }">
181
+ <div class="flex-center h-100">
182
+ <el-image style="width: 36px; height: 36px" :src="row.logo" />
183
+ </div>
184
+ </template>
185
+ </ProTable>
186
+ </template>
187
+ <script setup lang="ts">
188
+ import type { ColumnProps, RenderScope, HeaderRenderScope } from "auto-vue-manual";
189
+
190
+ import { reactive, ref } from "vue";
191
+ import { ProTable } from "auto-vue-manual";
192
+
193
+ const proTableRef = ref<InstanceType<typeof ProTable>>();
194
+ const columns: ColumnProps[] = [
195
+ { label: "index", type: 'index' },
196
+ { prop: "code", label: "代号", width: 100, type: 'tag' },
197
+ { prop: "logo", label: "标志", width: 100 },
198
+ { prop: "status", label: "状态", width: 100, type: 'switch', props: { activeValue: 1, inactiveValue: 2, api: '/league/change_status', refresh: true } },
199
+ { prop: "name", label: "名称", width: 0, align: "right",
200
+ search: { defaultValue: "League" },
201
+ headerRender: ({ column }: HeaderRenderScope<any>) => {
202
+ return (<span>headerRender: {column.label}</span>)
203
+ },
204
+ render: ({ row }: RenderScope<any>) => {
205
+ return (<span>render: { row.name }</span>)
206
+ }
207
+ },
208
+ ];
209
+ const params = reactive({
210
+ keyword: "",
211
+ });
212
+ const search = () => {
213
+ // 修改搜索参数
214
+ params.keyword = "League";
215
+ proTableRef.value?.search();
216
+ // 直接传入参数
217
+ // proTableRef.value?.search({
218
+ // keyword: "League",
219
+ // })
220
+ };
221
+ const reset = () => {
222
+ proTableRef.value?.reset();
223
+ };
224
+ const onRowDblclick = (row: any, column: any, event: any) => {
225
+ console.log("onRowDblclick", row, column, event);
226
+ };
227
+ </script>
228
+ ```
229
+
230
+ ## ProTableList
231
+
232
+ #### Props 参数说明
233
+ | 属性名 | 类型 | 说明 | 默认值 |
234
+ | ------ | ---- | ---- | ------ |
235
+ | **row-key** | `string` | 行数据的 Key,用来优化 Table 的渲染,当表格数据多选时,所指定的 id ) | id |
236
+
237
+ 其余同 [ProTable](#protable--protablesummary)
238
+
239
+ #### Event 事件说明
240
+
241
+ | 事件名 | 说明 | 参数 |
242
+ | ------ | ---- | ---- |
243
+ | **@row-click** | 行点击事件,未排除 status / operation 列,需添加 e.stopPropagation() 阻止事件冒泡 | `({ row: any, column: any }) => void` |
244
+ | **@row-dblclick** | 行双击事件,未排除 status / operation 列,需添加 e.stopPropagation() 阻止事件冒泡 | `({ row: any, column: any }) => void` |
245
+
246
+ #### Expose 暴露方法说明
247
+ 与 ProTable 相同。
248
+
249
+ #### 示例代码
250
+
251
+ ```vue
252
+ <template>
253
+ <div>
254
+ <el-button @click="search">搜索</el-button>
255
+ <el-button @click="reset">重置</el-button>
256
+ </div>
257
+ <ProTableList ref="proTableRef" row-key="key" :columns="columns" :search-param="params" url="/page/list" @row-dblclick="onRowDblclick" />
258
+ </template>
259
+ <script setup lang="tsx">
260
+ import type { RowEventHandlerParams } from "element-plus";
261
+ import type { ColumnProps, HeaderRenderScope, RenderScope } from "auto-vue-manual";
262
+
263
+ import { ref, reactive } from "vue";
264
+
265
+ import { Plus } from "@element-plus/icons-vue";
266
+ import ProTableList from "auto-vue-manual";
267
+
268
+ const proTableRef = ref<InstanceType<typeof ProTableList>>();
269
+ const columns: ColumnProps[] = [
270
+ { label: "index", type: 'index' },
271
+ { prop: "label", label: "Label", width: 100, type: 'tag' },
272
+ { prop: "key", label: "Key", width: 100, type: 'copy' },
273
+ { prop: "value", label: "Value", width: 200, headerRender: (scope: HeaderRenderScope<any>) => {
274
+ return (
275
+ <span>HeaderRender: {scope.column.label}</span>
276
+ )
277
+ }},
278
+ { prop: "status", label: "Status", width: 100, type: 'switch', props: { activeValue: 1, inactiveValue: 2, api: '/league/change_status', refresh: true } },
279
+ { prop: "action", label: "Action", width: 60, align: "center", render: (scope: RenderScope<any>) => {
280
+ return (
281
+ <el-button type="primary" size="small" link icon={Plus} onClick={(e: Event) => {
282
+ e.stopPropagation();
283
+ console.log('onclick', e)
284
+ }}>
285
+ <span>render: {scope.rowData.label}</span>
286
+ </el-button>
287
+ )
288
+ }},
289
+ ];
290
+ const params = reactive({
291
+ keyword: "",
292
+ });
293
+ const search = () => {
294
+ // 修改搜索参数
295
+ params.keyword = "League";
296
+ proTableRef.value?.search();
297
+ // 直接传入参数
298
+ // proTableRef.value?.search({
299
+ // keyword: "League",
300
+ // })
301
+ };
302
+ const reset = () => {
303
+ proTableRef.value?.reset();
304
+ };
305
+ const onRowDblclick = (row: RowEventHandlerParams) => {
306
+ console.log("onRowDblclick", row);
307
+ };
308
+ </script>
309
+ ```
310
+
311
+ ## Modal 弹窗/抽屉
312
+
313
+ ### 统一说明
314
+ - 所有弹窗类组件(BasicDialog、FormDialog、TableDialog)均基于 BasicDialog 实现,props/事件/用法风格统一。
315
+ - 所有抽屉类组件均基于 BasicDrawer 实现。
316
+ - 支持 v-bind 透传 Element Plus Dialog/Drawer 的所有原生属性。
317
+
318
+ ### 通用 Props
319
+ | 属性名 | 类型 | 说明 | 默认值 |
320
+ |----------------|-----------|----------------|----------|
321
+ | visible | boolean | 是否显示 | false |
322
+ | showClose | boolean | 是否显示关闭按钮 | true |
323
+ | title | string | 标题 | Title |
324
+ | width | string | 宽度 | 520px |
325
+ | top | string | 顶部距离 | 15vh |
326
+ | dialogProps | object | 透传 Dialog/Drawer 属性 | {} |
327
+ | appendToBody | boolean | 是否插入 body | true |
328
+ | lockScroll | boolean | 是否锁定滚动 | true |
329
+ | closeOnClickModal | boolean | 点击遮罩关闭 | false |
330
+
331
+ ### BasicDialog
332
+ - 通用弹窗基类,支持所有通用 props 和事件。
333
+ - 事件:`@update:visible`、`@closed`、`@submit`
334
+
335
+ ### BasicDrawer
336
+ - 通用抽屉基类,支持所有通用 props 和事件。
337
+ - 事件:`@update:visible`、`@closed`
338
+
339
+ ### FormDialog
340
+ - 基于 BasicDialog 扩展,内置底部按钮,适合表单场景。
341
+ - 额外 props:`executing`(是否执行中)、`footer`(是否显示底部)、`btnSize`、`okText`、`cancelText`
342
+ - 事件:`@submit`、`@closed`、`@before-close`
343
+
344
+ ### TableDialog
345
+ - 基于 BasicDialog 扩展,适合表格弹窗场景。
346
+ - 额外 props:`requesting`(是否请求中)
347
+
348
+ ### 示例代码
349
+ ```vue
350
+ <template>
351
+ <OpenButton @open="visible = true" />
352
+ <BasicDialog :visible="visible" title="标题" width="520px" @update:visible="visible = $event" @closed="onClosed">
353
+ <template #default>内容区域</template>
354
+ </BasicDialog>
355
+ </template>
356
+ <script setup lang="ts">
357
+ import { ref } from 'vue';
358
+ import { BasicDialog, OpenButton } from 'auto-vue-manual';
359
+ const visible = ref(false);
360
+ const onClosed = () => { visible.value = false; };
361
+ </script>
362
+ ```
363
+
364
+ ### FormDialog 示例
365
+ ```vue
366
+ <template>
367
+ <OpenButton @open="visible = true" />
368
+ <FormDialog :visible="visible" title="表单弹窗" @update:visible="visible = $event" @submit="onSubmit">
369
+ <template #default>
370
+ <el-input v-model="form.name" placeholder="请输入名称" />
371
+ </template>
372
+ </FormDialog>
373
+ </template>
374
+ <script setup lang="ts">
375
+ import { ref } from 'vue';
376
+ import { FormDialog, OpenButton } from 'auto-vue-manual';
377
+ const visible = ref(false);
378
+ const form = ref({ name: '' });
379
+ const onSubmit = () => { /* 提交逻辑 */ };
380
+ </script>
381
+ ```
382
+
383
+ ## Upload
384
+
385
+ ### UploadAvatar
386
+
387
+ #### Props 参数说明
388
+
389
+ | 属性名 | 类型 | 说明 | 默认值 |
390
+ | ------ | ---- | ---- | ------ |
391
+ | **url** | `string` | 上传地址 | - |
392
+ | **avatar** | `string` | 头像地址 | - |
393
+ | **text** | `string` | 上传提示 | - |
394
+ | **path** | `string` | 保存路径 | - |
395
+ | **preview** | `boolean` | 是否显示预览 | false |
396
+ | **disabled** | `boolean` | 是否禁用 | false |
397
+ | **size** | `number` | 大小(KB) | 5120 |
398
+
399
+ ### UploadImage
400
+
401
+ #### Props 参数说明
402
+
403
+ | 属性名 | 类型 | 说明 | 默认值 |
404
+ | ------ | ---- | ---- | ------ |
405
+ | **image** | `string` | 图片地址 | - |
406
+
407
+ 其余同 [UploadAvatar](#uploadavatar)
408
+
409
+ #### 示例代码
410
+
411
+ ```vue
412
+ <template>
413
+ <UploadAvatar ref="uploadAvatarRef" url="/upload/image" :avatar="avatar" text="上传头像" path="/avatar" preview :size="1024" />
414
+ </template>
415
+ <script setup lang="ts">
416
+ import { ref } from "vue";
417
+ import UploadAvatar from "auto-vue-manual";
418
+
419
+ const uploadAvatarRef = ref<InstanceType<typeof UploadAvatar>>();
420
+ const avatar = ref("");
421
+ </script>
422
+ ```
423
+
424
+ ### UploadImages
425
+
426
+ #### Props 参数说明
427
+
428
+ | 属性名 | 类型 | 说明 | 默认值 |
429
+ | ------ | ---- | ---- | ------ |
430
+ | **images** | `FileList[]` | 图片地址 | - |
431
+ | **limit** | `number` | 限制数量 | 10 |
432
+
433
+ 其余同 [UploadAvatar](#uploadavatar)
434
+
435
+ #### 示例代码
436
+
437
+ ```vue
438
+ <template>
439
+ <UploadImages ref="uploadImagesRef" url="/upload/image" :images="images" text="上传图片" path="/image" preview :size="1024" />
440
+ </template>
441
+ <script setup lang="ts">
442
+ import type { FileList } from "auto-vue-manual";
443
+
444
+ import { ref } from "vue";
445
+ import UploadImages from "auto-vue-manual";
446
+
447
+ const uploadImagesRef = ref<InstanceType<typeof UploadImages>>();
448
+ const images = ref<FileList[]>([]);
449
+ </script>
450
+ ```
451
+
452
+ ## Tinymce 富文本编辑器
453
+
454
+ ### 组件说明
455
+ 基于 tinymce 封装的富文本编辑器,支持图片上传、字数统计、代码高亮等常用功能,适用于内容管理、文章编辑等场景。
456
+
457
+ ### Props 参数说明
458
+ | 属性名 | 类型 | 说明 | 默认值 |
459
+ |----------|---------|----------------------|----------------|
460
+ | url | string | 图片上传接口 | /upload/image |
461
+ | content | string | 编辑器内容(v-model)| '' |
462
+ | height | number | 编辑器高度 | 600 |
463
+ | disabled | boolean | 是否禁用编辑 | false |
464
+
465
+ ### 事件
466
+ | 事件名 | 说明 | 参数 |
467
+ |------------------|--------------------|--------------|
468
+ | update:content | 内容变更时触发 | value: string|
469
+
470
+ ### 功能特性
471
+ - 支持图片粘贴/上传,自动调用 `url` 接口
472
+ - 支持字数统计、代码高亮、列表、字体样式等
473
+ - 支持自定义高度、禁用状态
474
+ - 默认中文界面
475
+
476
+ ### 示例代码
477
+ ```vue
478
+ <template>
479
+ <Tinymce v-model:content="content" :height="400" :url="'/upload/image'" />
480
+ <p>内容:{{ content }}</p>
481
+ </template>
482
+ <script setup lang="ts">
483
+ import { ref } from 'vue';
484
+ import Tinymce from 'auto-vue-manual';
485
+ const content = ref('<p>初始内容</p>');
486
+ </script>
487
+ ```