@zkwq/business 0.2.2 → 0.2.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.
Files changed (46) hide show
  1. package/README.md +2129 -0
  2. package/dist/css/AggsItemH.css +3 -2
  3. package/dist/css/AggsItemH.min.css +1 -1
  4. package/dist/css/AggsItemV.css +1 -0
  5. package/dist/css/Annex.css +1 -0
  6. package/dist/css/AppDialog.css +1 -0
  7. package/dist/css/AppNumberBoard.css +1 -0
  8. package/dist/css/AppTip.css +1 -0
  9. package/dist/css/Author.css +1 -0
  10. package/dist/css/AuthorX.css +4 -3
  11. package/dist/css/AuthorX.min.css +1 -1
  12. package/dist/css/Avatar.css +2 -1
  13. package/dist/css/Avatar.min.css +1 -1
  14. package/dist/css/AvatarGroup.css +1 -0
  15. package/dist/css/BounceLoading.css +1 -0
  16. package/dist/css/CaptchaDialog.css +3 -0
  17. package/dist/css/CaptchaDialog.min.css +1 -0
  18. package/dist/css/CaptchaFormItem.css +123 -0
  19. package/dist/css/CaptchaFormItem.min.css +1 -0
  20. package/dist/css/CircleTranslateButton.css +1 -0
  21. package/dist/css/Cover.css +1 -0
  22. package/dist/css/DatePickerX.css +1 -0
  23. package/dist/css/HoverCard.css +9 -6
  24. package/dist/css/HoverCard.min.css +1 -1
  25. package/dist/css/Institution.css +1 -0
  26. package/dist/css/InstitutionAvatar.css +1 -0
  27. package/dist/css/InstitutionProfile.css +1 -0
  28. package/dist/css/InstitutionX.css +1 -0
  29. package/dist/css/ReadableItem.css +8 -3
  30. package/dist/css/ReadableItem.min.css +1 -1
  31. package/dist/css/UserProfile.css +1 -0
  32. package/dist/css/XCard.css +1 -0
  33. package/dist/css/XHeader.css +1 -0
  34. package/dist/css/XTab.css +1 -0
  35. package/dist/css/index.css +4745 -1924
  36. package/dist/css/index.min.css +1 -1
  37. package/dist/index.css +1 -1
  38. package/dist/index.js +6919 -7187
  39. package/dist/index.min.css +1 -1
  40. package/dist/index.min.js +6 -6
  41. package/dist/index.umd.cjs +10 -28
  42. package/dist/index.umd.min.cjs +7 -7
  43. package/package.json +3 -3
  44. package/vite.config.js +7 -1
  45. package/vite.config.js.timestamp-1735266230435.mjs +0 -76
  46. package/vite.config.js.timestamp-1758276345740.mjs +0 -76
package/README.md ADDED
@@ -0,0 +1,2129 @@
1
+ # Business 组件库
2
+
3
+ ## 目录
4
+
5
+ - [简介](#简介)
6
+ - [安装](#安装)
7
+ - [使用方式](#使用方式)
8
+ - [完整引入](#完整引入)
9
+ - [按需引入](#按需引入)
10
+ - [基础UI组件](#基础ui组件)
11
+ - [示例](#示例)
12
+ - [普通组件](#普通组件)
13
+ - [AggsItemH(水平聚合项组件)](#aggsh)
14
+ - [AggsItemV(垂直聚合项组件)](#aggsv)
15
+ - [ReadableItem(可读项组件)](#readableitem)
16
+ - [BounceLoading(弹跳加载动画组件)](#bounceloading)
17
+ - [AppDialog(应用对话框组件)](#appdialog)
18
+ - [SmoothNumber(平滑数字变化组件)](#smoothnumber)
19
+ - [Avatar(头像组件)](#avatar)
20
+ - [Ripple(水波纹指令)](#ripple)
21
+ - [CircleTranslateButton(圆形翻译按钮组件)](#circletranslatebutton)
22
+ - [Annex(附件组件)](#annex)
23
+ - [XCard(卡片组件)](#xcard)
24
+ - [XHeader(头部组件)](#xheader)
25
+ - [XTab(标签页组件)](#xtab)
26
+ - [Cover(封面组件)](#cover)
27
+ - [WangEditor(富文本编辑器组件)](#wangeditor)
28
+ - [AppNumberBoard(数字面板组件)](#appnumberboard)
29
+ - [UserProfile(用户资料组件)](#userprofile)
30
+ - [InstitutionAvatar(机构头像组件)](#institutionavatar)
31
+ - [InstitutionProfile(机构资料组件)](#institutionprofile)
32
+ - [InstitutionX(机构扩展组件)](#institutionx)
33
+ - [Institution(机构组件)](#institution)
34
+ - [AuthorX(作者扩展组件)](#authorx)
35
+ - [Author(作者组件)](#author)
36
+ - [AuthorOrIns(作者或机构组件)](#authororins)
37
+ - [AppTip(应用提示组件)](#apptip)
38
+ - [DatePickerX(日期选择器扩展组件)](#datepickerx)
39
+ - [Keywords(关键词组件)](#keywords)
40
+ - [ImageViewer(图片查看器组件)](#imageviewer)
41
+ - [HoverCard(悬停卡片组件)](#hovercard)
42
+ - [FollowButton(关注按钮组件)](#followbutton)
43
+ - [AvatarGroup(头像组组件)](#avatargroup)
44
+ - [工具函数](#工具函数)
45
+ - [加密与哈希函数](#加密与哈希函数)
46
+ - [ID与字符串生成函数](#id与字符串生成函数)
47
+ - [数据验证与处理函数](#数据验证与处理函数)
48
+ - [数据转换函数](#数据转换函数)
49
+ - [URL与参数处理函数](#url与参数处理函数)
50
+ - [数据存储函数](#数据存储函数)
51
+ - [其他工具函数](#其他工具函数)
52
+ - [Base64Util(Base64编码解码工具)](#base64util)
53
+ - [http(HTTP请求工具)](#http)
54
+ - [CONSTANT(常量集合)](#constant)
55
+ - [ScrollTool(滚动工具)](#scrolltool)
56
+ - [Quote(引用工具)](#quote)
57
+ - [Bus(事件总线)](#bus)
58
+ - [HighLight(高亮工具)](#highlight)
59
+ - [服务模块](#服务模块)
60
+ - [日志服务](#日志服务)
61
+ - [资源导出服务](#资源导出服务)
62
+ - [用户服务](#用户服务)
63
+ - [文件服务](#文件服务)
64
+ - [数据统计服务](#数据统计服务)
65
+ - [关注服务](#关注服务)
66
+ - [搜索服务](#搜索服务)
67
+ - [指令](#指令)
68
+ - [v-ripple](#v-ripple)
69
+ - [样式](#样式)
70
+ - [贡献](#贡献)
71
+ - [许可证](#许可证)
72
+
73
+ ## 简介
74
+
75
+ Business 是一个基于 Vue.js 的企业级组件库,提供了丰富的 UI 组件、工具函数和服务模块,帮助快速构建企业级应用。
76
+
77
+ ## 安装
78
+
79
+ ```bash
80
+ npm install @zkwq-x/business
81
+ ```
82
+
83
+ ## 使用方式
84
+
85
+ ### 完整引入
86
+
87
+ ```javascript
88
+ import Vue from 'vue';
89
+ import Business from '@zkwq-x/business';
90
+ import '@zkwq-x/business/style/index.scss';
91
+
92
+ Vue.use(Business);
93
+ ```
94
+
95
+ ### 按需引入
96
+
97
+ ```javascript
98
+ import { ComponentName } from '@zkwq-x/business';
99
+ import '@zkwq-x/business/style/index.scss';
100
+
101
+ export default {
102
+ components: {
103
+ ComponentName
104
+ }
105
+ }
106
+ ```
107
+
108
+ ## 基础UI组件
109
+
110
+ 基础UI组件使用方法与 Element-UI 完全一致,只需将 `el-` 前缀替换为 `base-` 前缀即可。
111
+
112
+ ### 示例
113
+
114
+ ```vue
115
+ <!-- Element-UI 用法 -->
116
+ <el-button type="primary">按钮</el-button>
117
+ <el-input v-model="input" placeholder="请输入内容"></el-input>
118
+ <el-table :data="tableData">
119
+ <el-table-column prop="date" label="日期"></el-table-column>
120
+ </el-table>
121
+
122
+ <!-- Business 组件库用法 -->
123
+ <base-button type="primary">按钮</base-button>
124
+ <base-input v-model="input" placeholder="请输入内容"></base-input>
125
+ <base-table :data="tableData">
126
+ <base-table-column prop="date" label="日期"></base-table-column>
127
+ </base-table>
128
+ ```
129
+
130
+ ## 普通组件
131
+
132
+ ### AggsItemH
133
+
134
+ 水平聚合项组件,用于展示水平排列的聚合数据。
135
+
136
+ #### Props
137
+
138
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
139
+ |------|------|------|--------|--------|
140
+ | title | 聚合项标题 | String | - | - |
141
+ | datas | 聚合数据数组 | Array | - | - |
142
+ | single | 是否单选模式 | Boolean | - | false |
143
+ | notAll | 是否不显示"全部"选项 | Boolean | - | false |
144
+ | checkList | 已选中的项列表 | Array | - | [] |
145
+
146
+ #### Events
147
+
148
+ | 事件名 | 说明 | 回调参数 |
149
+ |--------|------|----------|
150
+ | change | 选中项发生变化时触发 | 选中的项的key数组 |
151
+
152
+ #### 示例
153
+
154
+ ```vue
155
+ <template>
156
+ <aggs-item-h
157
+ title="分类"
158
+ :datas="categories"
159
+ :check-list.sync="selectedCategories"
160
+ @change="handleCategoryChange"
161
+ />
162
+ </template>
163
+
164
+ <script>
165
+ export default {
166
+ data() {
167
+ return {
168
+ categories: [
169
+ { key: 'tech', name: '技术', value: 100 },
170
+ { key: 'design', name: '设计', value: 80 },
171
+ { key: 'product', name: '产品', value: 60 }
172
+ ],
173
+ selectedCategories: []
174
+ }
175
+ },
176
+ methods: {
177
+ handleCategoryChange(selectedKeys) {
178
+ console.log('选中的分类:', selectedKeys);
179
+ }
180
+ }
181
+ }
182
+ </script>
183
+ ```
184
+
185
+ ### AggsItemV
186
+
187
+ 垂直聚合项组件,用于展示垂直排列的聚合数据。
188
+
189
+ #### Props
190
+
191
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
192
+ |------|------|------|--------|--------|
193
+ | title | 聚合项标题 | String | - | - |
194
+ | datas | 聚合数据数组 | Array | - | - |
195
+ | single | 是否单选模式 | Boolean | - | false |
196
+ | notAll | 是否不显示"全部"选项 | Boolean | - | false |
197
+ | checkList | 已选中的项列表 | Array | - | [] |
198
+
199
+ #### Events
200
+
201
+ | 事件名 | 说明 | 回调参数 |
202
+ |--------|------|----------|
203
+ | change | 选中项发生变化时触发 | 选中的项的key数组 |
204
+
205
+ #### 示例
206
+
207
+ ```vue
208
+ <template>
209
+ <aggs-item-v
210
+ title="标签"
211
+ :datas="tags"
212
+ :check-list.sync="selectedTags"
213
+ @change="handleTagChange"
214
+ />
215
+ </template>
216
+
217
+ <script>
218
+ export default {
219
+ data() {
220
+ return {
221
+ tags: [
222
+ { key: 'vue', name: 'Vue', value: 100 },
223
+ { key: 'react', name: 'React', value: 80 },
224
+ { key: 'angular', name: 'Angular', value: 60 }
225
+ ],
226
+ selectedTags: []
227
+ }
228
+ },
229
+ methods: {
230
+ handleTagChange(selectedKeys) {
231
+ console.log('选中的标签:', selectedKeys);
232
+ }
233
+ }
234
+ }
235
+ </script>
236
+ ```
237
+
238
+ ### ReadableItem
239
+
240
+ 可读项组件,用于展示格式化的可读内容,包括作者信息、摘要、关键词等。
241
+
242
+ #### Props
243
+
244
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
245
+ |------|------|------|--------|--------|
246
+ | readable | 可读内容对象,包含标题、作者、摘要等信息 | Object | - | - |
247
+ | showCPC | 是否显示CPC(分类号)信息 | Boolean | true/false | true |
248
+ | authorHover | 是否启用作者悬停效果 | Boolean | true/false | true |
249
+ | openSearch | 是否开启搜索功能 | Boolean | true/false | false |
250
+ | notShowCover | 是否不显示封面图 | Boolean | true/false | false |
251
+
252
+ #### Events
253
+
254
+ | 事件名 | 说明 | 参数 |
255
+ |--------|------|------|
256
+ | skip | 跳转事件,当用户点击跳转链接时触发 | type - 跳转类型, scholar - 学者对象 |
257
+ | follow | 关注事件,当用户点击关注按钮时触发 | scholar - 被关注的学者对象 |
258
+ | disfollow | 取消关注事件,当用户点击取消关注按钮时触发 | scholar - 被取消关注的学者对象 |
259
+
260
+ #### 方法
261
+
262
+ | 方法名 | 说明 | 参数 |
263
+ |--------|------|------|
264
+ | handleSkip | 处理跳转事件 | type - 跳转类型, scholar - 学者对象 |
265
+ | handleFollow | 处理关注事件 | scholar - 学者对象 |
266
+ | handleDisfollow | 处理取消关注事件 | scholar - 学者对象 |
267
+ | handleMore | 展开完整摘要 | - |
268
+ | handLess | 收起摘要 | - |
269
+ | showAllAuthor | 显示所有作者 | - |
270
+
271
+ #### 示例
272
+
273
+ ```vue
274
+ <template>
275
+ <readable-item
276
+ :readable="readableData"
277
+ :showCPC="true"
278
+ :authorHover="true"
279
+ :openSearch="false"
280
+ :notShowCover="false"
281
+ @skip="handleSkipEvent"
282
+ @follow="handleFollowEvent"
283
+ @disfollow="handleDisfollowEvent"
284
+ />
285
+ </template>
286
+
287
+ <script>
288
+ export default {
289
+ data() {
290
+ return {
291
+ readableData: {
292
+ title: "论文标题",
293
+ authors: [
294
+ { name: "作者1", id: "1" },
295
+ { name: "作者2", id: "2" }
296
+ ],
297
+ abstract: "论文摘要内容...",
298
+ keywords: ["关键词1", "关键词2"],
299
+ doi: "10.1000/182",
300
+ publish_time: "2023-01-01",
301
+ source: "期刊名称",
302
+ cpc: ["G06F 16/9535"]
303
+ }
304
+ }
305
+ },
306
+ methods: {
307
+ handleSkipEvent(type, scholar) {
308
+ console.log('跳转事件:', type, scholar);
309
+ },
310
+ handleFollowEvent(scholar) {
311
+ console.log('关注学者:', scholar);
312
+ },
313
+ handleDisfollowEvent(scholar) {
314
+ console.log('取消关注学者:', scholar);
315
+ }
316
+ }
317
+ }
318
+ </script>
319
+ ```
320
+
321
+ ### BounceLoading
322
+
323
+ 弹跳加载动画组件。
324
+
325
+ #### 示例
326
+
327
+ ```vue
328
+ <template>
329
+ <bounce-loading />
330
+ </template>
331
+ ```
332
+
333
+ ### AppDialog
334
+
335
+ 应用对话框组件。
336
+
337
+ #### Props
338
+
339
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
340
+ |------|------|------|--------|--------|
341
+ | originTitle | 标题是否靠左显示 | Boolean | - | false |
342
+ | dialogTitle | 对话框标题 | String | - | - |
343
+ | dialogSubtitle | 对话框副标题 | String | - | - |
344
+ | staticDialog | 是否静态对话框(不可点击遮罩关闭) | Boolean | - | false |
345
+ | width | 对话框宽度 | String | - | '536px' |
346
+ | top | 对话框距离顶部的距离 | String | - | '15vh' |
347
+ | appendToBody | 是否将对话框插入至 body 元素上 | Boolean | - | true |
348
+ | autoHide | 点击关闭按钮时是否自动隐藏 | Boolean | - | true |
349
+ | hideCloseButton | 是否隐藏关闭按钮 | Boolean | - | false |
350
+ | fullPage | 是否全屏显示 | Boolean | - | false |
351
+ | customClass | 自定义类名 | String | - | - |
352
+ | dialogClass | 对话框自定义类名 | String | - | - |
353
+ | modalClass | 遮罩自定义类名 | String | - | - |
354
+ | destroyOnClose | 关闭时销毁对话框中的元素 | Boolean | - | false |
355
+
356
+ #### Events
357
+
358
+ | 事件名 | 说明 | 回调参数 |
359
+ |--------|------|----------|
360
+ | hide | 点击关闭按钮时触发 | - |
361
+ | on-scroll | 滚动时触发 | (moveY: number) |
362
+
363
+ #### Methods
364
+
365
+ | 方法名 | 说明 | 参数 |
366
+ |--------|------|------|
367
+ | show | 显示对话框 | - |
368
+ | hide | 隐藏对话框 | - |
369
+ | scrollTop | 滚动到顶部 | - |
370
+ | scrollBottom | 滚动到底部 | - |
371
+
372
+ #### 示例
373
+
374
+ ```vue
375
+ <template>
376
+ <div>
377
+ <base-button @click="showDialog = true">显示对话框</base-button>
378
+ <app-dialog
379
+ v-model="showDialog"
380
+ dialog-title="提示"
381
+ dialog-subtitle="这是一个对话框副标题"
382
+ @hide="handleHide"
383
+ >
384
+ <p>这是对话框内容</p>
385
+ <base-button @click="hideDialog">关闭</base-button>
386
+ </app-dialog>
387
+ </div>
388
+ </template>
389
+
390
+ <script>
391
+ export default {
392
+ data() {
393
+ return {
394
+ showDialog: false
395
+ }
396
+ },
397
+ methods: {
398
+ hideDialog() {
399
+ this.showDialog = false;
400
+ },
401
+ handleHide() {
402
+ console.log('对话框关闭');
403
+ }
404
+ }
405
+ }
406
+ </script>
407
+ ```
408
+
409
+ ### SmoothNumber
410
+
411
+ 平滑数字变化组件。
412
+
413
+ #### Props
414
+
415
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
416
+ |------|------|------|--------|--------|
417
+ | value | 目标数值 | Number | - | - |
418
+ | duration | 动画持续时间(毫秒) | Number | - | 1000 |
419
+
420
+ #### 示例
421
+
422
+ ```vue
423
+ <template>
424
+ <smooth-number :value="number" :duration="1000" />
425
+ <base-button @click="number += 100">增加100</base-button>
426
+ </template>
427
+
428
+ <script>
429
+ export default {
430
+ data() {
431
+ return {
432
+ number: 1000
433
+ }
434
+ }
435
+ }
436
+ </script>
437
+ ```
438
+
439
+ ### Avatar
440
+
441
+ 头像组件。
442
+
443
+ #### Props
444
+
445
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
446
+ |------|------|------|--------|--------|
447
+ | url | 头像图片URL | String | - | - |
448
+ | size | 头像大小(像素) | Number | - | 0 |
449
+ | round | 是否圆形头像 | Boolean | - | false |
450
+ | pointer | 是否显示指针样式 | Boolean | - | true |
451
+
452
+ #### 示例
453
+
454
+ ```vue
455
+ <template>
456
+ <div>
457
+ <avatar :src="avatarUrl" :size="40" />
458
+ <avatar :src="avatarUrl" :size="60" :round="true" />
459
+ <avatar :size="80" />
460
+ </div>
461
+ </template>
462
+
463
+ <script>
464
+ export default {
465
+ data() {
466
+ return {
467
+ avatarUrl: 'https://example.com/avatar.jpg'
468
+ }
469
+ }
470
+ }
471
+ </script>
472
+ ```
473
+
474
+ ### Ripple
475
+
476
+ 水波纹指令。
477
+
478
+ #### 示例
479
+
480
+ ```vue
481
+ <template>
482
+ <button v-ipple>点击我</button>
483
+ </template>
484
+ ```
485
+
486
+ ### CircleTranslateButton
487
+
488
+ 圆形翻译按钮组件。
489
+
490
+ #### Props
491
+
492
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
493
+ |------|------|------|--------|--------|
494
+ | text | 要翻译的文本 | String | - | - |
495
+
496
+ #### Events
497
+
498
+ | 事件名 | 说明 | 回调参数 |
499
+ |--------|------|----------|
500
+ | translate | 点击翻译按钮时触发 | (text: string) |
501
+
502
+ #### 示例
503
+
504
+ ```vue
505
+ <template>
506
+ <circle-translate-button text="Hello World" @translate="handleTranslate" />
507
+ </template>
508
+
509
+ <script>
510
+ export default {
511
+ methods: {
512
+ handleTranslate(text) {
513
+ console.log('翻译文本:', text);
514
+ }
515
+ }
516
+ }
517
+ </script>
518
+ ```
519
+
520
+ ### Annex
521
+
522
+ 附件组件。
523
+
524
+ #### Props
525
+
526
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
527
+ |------|------|------|--------|--------|
528
+ | files | 文件列表 | Array | - | - |
529
+
530
+ #### Events
531
+
532
+ | 事件名 | 说明 | 回调参数 |
533
+ |--------|------|----------|
534
+ | remove | 移除文件时触发 | (file: object) |
535
+
536
+ #### 示例
537
+
538
+ ```vue
539
+ <template>
540
+ <annex :files="fileList" @remove="handleRemove" />
541
+ </template>
542
+
543
+ <script>
544
+ export default {
545
+ data() {
546
+ return {
547
+ fileList: [
548
+ { name: 'document.pdf', url: 'https://example.com/document.pdf' }
549
+ ]
550
+ }
551
+ },
552
+ methods: {
553
+ handleRemove(file) {
554
+ console.log('移除文件:', file);
555
+ }
556
+ }
557
+ }
558
+ </script>
559
+ ```
560
+
561
+ ### XCard
562
+
563
+ 卡片组件。
564
+
565
+ #### Props
566
+
567
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
568
+ |------|------|------|--------|--------|
569
+ | title | 卡片标题 | String | - | - |
570
+ | shadow | 阴影显示时机 | String/Boolean | never/always/hover/false | false |
571
+ | border | 是否显示边框 | Boolean | - | false |
572
+ | headerStyle | 头部样式 | Object | - | - |
573
+ | coverStyle | 封面样式 | Object | - | - |
574
+ | contentStyle | 内容样式 | Object | - | - |
575
+ | footerStyle | 底部样式 | Object | - | - |
576
+ | actionStyle | 操作区样式 | Object | - | - |
577
+
578
+ #### Slots
579
+
580
+ | 插槽名 | 说明 |
581
+ |--------|------|
582
+ | header | 卡片头部内容 |
583
+ | extra | 卡片头部右侧操作区 |
584
+ | cover | 卡片封面内容 |
585
+ | default | 卡片主体内容 |
586
+ | footer | 卡片底部内容 |
587
+ | action | 卡片操作区内容 |
588
+
589
+ #### 示例
590
+
591
+ ```vue
592
+ <template>
593
+ <x-card title="卡片标题" :shadow="true" :border="true">
594
+ <template v-slot:extra>
595
+ <base-button size="mini">更多</base-button>
596
+ </template>
597
+ <p>这是卡片内容</p>
598
+ <template v-slot:footer>
599
+ <base-button>确定</base-button>
600
+ <base-button type="text">取消</base-button>
601
+ </template>
602
+ </x-card>
603
+ </template>
604
+ ```
605
+
606
+ ### XHeader
607
+
608
+ 头部组件。
609
+
610
+ #### Props
611
+
612
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
613
+ |------|------|------|--------|--------|
614
+ | back | 是否显示返回按钮 | Boolean | - | false |
615
+ | backText | 返回按钮文本 | String | - | '返回' |
616
+ | backIcon | 返回按钮图标 | String | - | 'back' |
617
+ | backHome | 返回按钮点击回调 | Function | - | - |
618
+
619
+ #### Slots
620
+
621
+ | 插槽名 | 说明 |
622
+ |--------|------|
623
+ | back | 自定义返回按钮内容 |
624
+ | default | 头部右侧内容 |
625
+
626
+ #### 示例
627
+
628
+ ```vue
629
+ <template>
630
+ <x-header :back="true" back-home="handleBackHome">
631
+ <base-button>操作</base-button>
632
+ </x-header>
633
+ </template>
634
+
635
+ <script>
636
+ export default {
637
+ methods: {
638
+ handleBackHome() {
639
+ this.$router.push('/');
640
+ }
641
+ }
642
+ }
643
+ </script>
644
+ ```
645
+
646
+ ### XTab
647
+
648
+ 标签页组件。
649
+
650
+ #### Props
651
+
652
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
653
+ |------|------|------|--------|--------|
654
+ | data | 标签页数据 | Array | - | [{name:'菜单1',value:'菜单1'},{name:'菜单2',value:'菜单2'}] |
655
+ | actived | 当前激活的标签页 | String/Number | - | - |
656
+ | vertical | 是否垂直显示 | Boolean | - | false |
657
+
658
+ #### Events
659
+
660
+ | 事件名 | 说明 | 回调参数 |
661
+ |--------|------|----------|
662
+ | change | 切换标签页时触发 | (value: string/number) |
663
+
664
+ #### Slots
665
+
666
+ | 插槽名 | 说明 | 作用域参数 |
667
+ |--------|------|------------|
668
+ | default | 标签页内容 | item: 标签页数据对象 |
669
+
670
+ #### 示例
671
+
672
+ ```vue
673
+ <template>
674
+ <div>
675
+ <x-tab v-model="activeTab" :data="tabs" @change="handleTabChange">
676
+ <template v-slot:default="{ item }">
677
+ {{ item.name }}
678
+ </template>
679
+ </x-tab>
680
+ <div v-if="activeTab === 'tab1'">
681
+ <p>标签页1内容</p>
682
+ </div>
683
+ <div v-if="activeTab === 'tab2'">
684
+ <p>标签页2内容</p>
685
+ </div>
686
+ </div>
687
+ </template>
688
+
689
+ <script>
690
+ export default {
691
+ data() {
692
+ return {
693
+ activeTab: 'tab1',
694
+ tabs: [
695
+ { name: '标签1', value: 'tab1' },
696
+ { name: '标签2', value: 'tab2' }
697
+ ]
698
+ }
699
+ },
700
+ methods: {
701
+ handleTabChange(value) {
702
+ console.log('切换到标签:', value);
703
+ }
704
+ }
705
+ }
706
+ </script>
707
+ ```
708
+
709
+ ### Cover
710
+
711
+ 封面组件。
712
+
713
+ #### Props
714
+
715
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
716
+ |------|------|------|--------|--------|
717
+ | src | 封面图片URL | String | - | - |
718
+ | title | 封面标题 | String | - | - |
719
+
720
+ #### 示例
721
+
722
+ ```vue
723
+ <template>
724
+ <cover :src="coverUrl" :title="title" />
725
+ </template>
726
+
727
+ <script>
728
+ export default {
729
+ data() {
730
+ return {
731
+ coverUrl: 'https://example.com/cover.jpg',
732
+ title: '封面标题'
733
+ }
734
+ }
735
+ }
736
+ </script>
737
+ ```
738
+
739
+ ### WangEditor
740
+
741
+ 富文本编辑器组件。
742
+
743
+ #### Props
744
+
745
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
746
+ |------|------|------|--------|--------|
747
+ | userId | 用户ID(必需) | String | - | - |
748
+ | value | 编辑器内容 | String | - | '' |
749
+ | placeholder | 占位符文本 | String | - | '' |
750
+ | plugins | 插件列表 | Array | - | [] |
751
+
752
+ #### Events
753
+
754
+ | 事件名 | 说明 | 回调参数 |
755
+ |--------|------|----------|
756
+ | update:value | 内容变化时触发 | (value: string) |
757
+
758
+ #### 示例
759
+
760
+ ```vue
761
+ <template>
762
+ <wang-editor
763
+ v-model="content"
764
+ :user-id="userId"
765
+ placeholder="请输入内容"
766
+ />
767
+ </template>
768
+
769
+ <script>
770
+ export default {
771
+ data() {
772
+ return {
773
+ content: '<p>初始内容</p>',
774
+ userId: 'user123'
775
+ }
776
+ }
777
+ }
778
+ </script>
779
+ ```
780
+
781
+ ### AppNumberBoard
782
+
783
+ 数字面板组件。
784
+
785
+ #### Props
786
+
787
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
788
+ |------|------|------|--------|--------|
789
+ | numbers | 数字数据数组 | Array | - | - |
790
+
791
+ #### 示例
792
+
793
+ ```vue
794
+ <template>
795
+ <app-number-board :numbers="numbers" />
796
+ </template>
797
+
798
+ <script>
799
+ export default {
800
+ data() {
801
+ return {
802
+ numbers: [
803
+ { label: '访问量', value: 1234 },
804
+ { label: '用户数', value: 567 }
805
+ ]
806
+ }
807
+ }
808
+ }
809
+ </script>
810
+ ```
811
+
812
+ ### UserProfile
813
+
814
+ 用户资料组件。
815
+
816
+ #### Props
817
+
818
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
819
+ |------|------|------|--------|--------|
820
+ | profile | 用户资料对象 | Object | - | - |
821
+ | avatarSize | 头像大小 | Number | - | 60 |
822
+ | avatarRound | 是否圆形头像 | Boolean | - | false |
823
+ | themeLight | 是否使用浅色主题 | Boolean | - | false |
824
+ | disableTitle | 是否禁用职称显示 | Boolean | - | false |
825
+ | disableInstitution | 是否禁用机构显示 | Boolean | - | false |
826
+ | disableEmail | 是否禁用邮箱显示 | Boolean | - | false |
827
+
828
+ #### 示例
829
+
830
+ ```vue
831
+ <template>
832
+ <user-profile
833
+ :user-info="userInfo"
834
+ :avatar-size="80"
835
+ :avatar-round="true"
836
+ />
837
+ </template>
838
+
839
+ <script>
840
+ export default {
841
+ data() {
842
+ return {
843
+ userInfo: {
844
+ name: '张三',
845
+ avatar: 'https://example.com/avatar.jpg',
846
+ email: 'zhangsan@example.com',
847
+ professional_title: ['高级工程师'],
848
+ position: ['前端开发'],
849
+ affiliation: ['示例公司']
850
+ }
851
+ }
852
+ }
853
+ }
854
+ </script>
855
+ ```
856
+
857
+ ### InstitutionAvatar
858
+
859
+ 机构头像组件。
860
+
861
+ #### Props
862
+
863
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
864
+ |------|------|------|--------|--------|
865
+ | src | 头像图片URL | String | - | - |
866
+ | name | 机构名称 | String | - | - |
867
+
868
+ #### 示例
869
+
870
+ ```vue
871
+ <template>
872
+ <institution-avatar :src="logoUrl" :name="institutionName" />
873
+ </template>
874
+
875
+ <script>
876
+ export default {
877
+ data() {
878
+ return {
879
+ logoUrl: 'https://example.com/logo.jpg',
880
+ institutionName: '示例机构'
881
+ }
882
+ }
883
+ }
884
+ </script>
885
+ ```
886
+
887
+ ### InstitutionProfile
888
+
889
+ 机构资料组件。
890
+
891
+ #### Props
892
+
893
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
894
+ |------|------|------|--------|--------|
895
+ | institution | 机构资料对象 | Object | - | - |
896
+
897
+ #### 示例
898
+
899
+ ```vue
900
+ <template>
901
+ <institution-profile :institution="institutionInfo" />
902
+ </template>
903
+
904
+ <script>
905
+ export default {
906
+ data() {
907
+ return {
908
+ institutionInfo: {
909
+ name: '示例机构',
910
+ logo: 'https://example.com/logo.jpg',
911
+ description: '这是一个示例机构'
912
+ }
913
+ }
914
+ }
915
+ }
916
+ </script>
917
+ ```
918
+
919
+ ### InstitutionX
920
+
921
+ 机构扩展组件。
922
+
923
+ #### Props
924
+
925
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
926
+ |------|------|------|--------|--------|
927
+ | institution | 机构数据对象 | Object | - | - |
928
+
929
+ #### 示例
930
+
931
+ ```vue
932
+ <template>
933
+ <institution-x :institution="institutionInfo" />
934
+ </template>
935
+
936
+ <script>
937
+ export default {
938
+ data() {
939
+ return {
940
+ institutionInfo: {
941
+ name: '示例机构',
942
+ logo: 'https://example.com/logo.jpg'
943
+ }
944
+ }
945
+ }
946
+ }
947
+ </script>
948
+ ```
949
+
950
+ ### Institution
951
+
952
+ 机构组件。
953
+
954
+ #### Props
955
+
956
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
957
+ |------|------|------|--------|--------|
958
+ | data | 机构数据对象 | Object | - | - |
959
+
960
+ #### 示例
961
+
962
+ ```vue
963
+ <template>
964
+ <institution :data="institutionData" />
965
+ </template>
966
+
967
+ <script>
968
+ export default {
969
+ data() {
970
+ return {
971
+ institutionData: {
972
+ name: '示例机构',
973
+ description: '机构描述'
974
+ }
975
+ }
976
+ }
977
+ }
978
+ </script>
979
+ ```
980
+
981
+ ### AuthorX
982
+
983
+ 作者扩展组件。
984
+
985
+ #### Props
986
+
987
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
988
+ |------|------|------|--------|--------|
989
+ | author | 作者数据对象 | Object | - | - |
990
+
991
+ #### 示例
992
+
993
+ ```vue
994
+ <template>
995
+ <author-x :author="authorInfo" />
996
+ </template>
997
+
998
+ <script>
999
+ export default {
1000
+ data() {
1001
+ return {
1002
+ authorInfo: {
1003
+ name: '张三',
1004
+ avatar: 'https://example.com/avatar.jpg'
1005
+ }
1006
+ }
1007
+ }
1008
+ }
1009
+ </script>
1010
+ ```
1011
+
1012
+ ### Author
1013
+
1014
+ 作者组件。
1015
+
1016
+ #### Props
1017
+
1018
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1019
+ |------|------|------|--------|--------|
1020
+ | data | 作者数据对象 | Object | - | - |
1021
+
1022
+ #### 示例
1023
+
1024
+ ```vue
1025
+ <template>
1026
+ <author :data="authorData" />
1027
+ </template>
1028
+
1029
+ <script>
1030
+ export default {
1031
+ data() {
1032
+ return {
1033
+ authorData: {
1034
+ name: '张三',
1035
+ description: '作者描述'
1036
+ }
1037
+ }
1038
+ }
1039
+ }
1040
+ </script>
1041
+ ```
1042
+
1043
+ ### AuthorOrIns
1044
+
1045
+ 作者或机构组件。
1046
+
1047
+ #### Props
1048
+
1049
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1050
+ |------|------|------|--------|--------|
1051
+ | data | 数据对象 | Object | - | - |
1052
+
1053
+ #### 示例
1054
+
1055
+ ```vue
1056
+ <template>
1057
+ <author-or-ins :data="data" />
1058
+ </template>
1059
+
1060
+ <script>
1061
+ export default {
1062
+ data() {
1063
+ return {
1064
+ data: {
1065
+ type: 'author', // 或 'institution'
1066
+ name: '张三',
1067
+ avatar: 'https://example.com/avatar.jpg'
1068
+ }
1069
+ }
1070
+ }
1071
+ }
1072
+ </script>
1073
+ ```
1074
+
1075
+ ### AppTip
1076
+
1077
+ 应用提示组件。
1078
+
1079
+ #### Props
1080
+
1081
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1082
+ |------|------|------|--------|--------|
1083
+ | type | 提示类型 | String | info/success/warning/error | info |
1084
+ | closable | 是否可关闭 | Boolean | - | true |
1085
+
1086
+ #### 示例
1087
+
1088
+ ```vue
1089
+ <template>
1090
+ <app-tip type="info" :closable="true">
1091
+ 这是一个提示信息
1092
+ </app-tip>
1093
+ </template>
1094
+ ```
1095
+
1096
+ ### DatePickerX
1097
+
1098
+ 日期选择器扩展组件。
1099
+
1100
+ #### Props
1101
+
1102
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1103
+ |------|------|------|--------|--------|
1104
+ | value | 选中日期 | Date | - | - |
1105
+
1106
+ #### Events
1107
+
1108
+ | 事件名 | 说明 | 回调参数 |
1109
+ |--------|------|----------|
1110
+ | input | 选中日期变化时触发 | (date: Date) |
1111
+
1112
+ #### 示例
1113
+
1114
+ ```vue
1115
+ <template>
1116
+ <date-picker-x v-model="date" />
1117
+ </template>
1118
+
1119
+ <script>
1120
+ export default {
1121
+ data() {
1122
+ return {
1123
+ date: new Date()
1124
+ }
1125
+ }
1126
+ }
1127
+ </script>
1128
+ ```
1129
+
1130
+ ### Keywords
1131
+
1132
+ 关键词组件。
1133
+
1134
+ #### Props
1135
+
1136
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1137
+ |------|------|------|--------|--------|
1138
+ | words | 关键词数组 | Array | - | - |
1139
+
1140
+ #### Events
1141
+
1142
+ | 事件名 | 说明 | 回调参数 |
1143
+ |--------|------|----------|
1144
+ | click | 点击关键词时触发 | (keyword: string) |
1145
+
1146
+ #### 示例
1147
+
1148
+ ```vue
1149
+ <template>
1150
+ <keywords :words="keywords" @click="handleKeywordClick" />
1151
+ </template>
1152
+
1153
+ <script>
1154
+ export default {
1155
+ data() {
1156
+ return {
1157
+ keywords: ['Vue', 'React', 'Angular']
1158
+ }
1159
+ },
1160
+ methods: {
1161
+ handleKeywordClick(keyword) {
1162
+ console.log('点击关键词:', keyword);
1163
+ }
1164
+ }
1165
+ }
1166
+ </script>
1167
+ ```
1168
+
1169
+ ### ImageViewer
1170
+
1171
+ 图片查看器组件。
1172
+
1173
+ #### Props
1174
+
1175
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1176
+ |------|------|------|--------|--------|
1177
+ | url | 图片URL | String | - | - |
1178
+ | visible | 是否显示查看器 | Boolean | - | false |
1179
+
1180
+ #### Events
1181
+
1182
+ | 事件名 | 说明 | 回调参数 |
1183
+ |--------|------|----------|
1184
+ | close | 关闭查看器时触发 | - |
1185
+
1186
+ #### 示例
1187
+
1188
+ ```vue
1189
+ <template>
1190
+ <div>
1191
+ <base-button @click="showViewer">查看图片</base-button>
1192
+ <image-viewer
1193
+ :url="imageUrl"
1194
+ :visible="visible"
1195
+ @close="handleClose"
1196
+ />
1197
+ </div>
1198
+ </template>
1199
+
1200
+ <script>
1201
+ export default {
1202
+ data() {
1203
+ return {
1204
+ imageUrl: 'https://example.com/image.jpg',
1205
+ visible: false
1206
+ }
1207
+ },
1208
+ methods: {
1209
+ showViewer() {
1210
+ this.visible = true;
1211
+ },
1212
+ handleClose() {
1213
+ this.visible = false;
1214
+ }
1215
+ }
1216
+ }
1217
+ </script>
1218
+ ```
1219
+
1220
+ ### HoverCard
1221
+
1222
+ 悬停卡片组件。
1223
+
1224
+ #### Slots
1225
+
1226
+ | 插槽名 | 说明 |
1227
+ |--------|------|
1228
+ | trigger | 触发悬停的内容 |
1229
+ | content | 悬停显示的内容 |
1230
+
1231
+ #### 示例
1232
+
1233
+ ```vue
1234
+ <template>
1235
+ <hover-card>
1236
+ <template v-slot:trigger>
1237
+ <button>悬停查看</button>
1238
+ </template>
1239
+ <template v-slot:content>
1240
+ <p>这是悬停显示的内容</p>
1241
+ </template>
1242
+ </hover-card>
1243
+ </template>
1244
+ ```
1245
+
1246
+ ### FollowButton
1247
+
1248
+ 关注按钮组件。
1249
+
1250
+ #### Props
1251
+
1252
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1253
+ |------|------|------|--------|--------|
1254
+ | following | 是否已关注 | Boolean | - | false |
1255
+
1256
+ #### Events
1257
+
1258
+ | 事件名 | 说明 | 回调参数 |
1259
+ |--------|------|----------|
1260
+ | toggle | 切换关注状态时触发 | (following: boolean) |
1261
+
1262
+ #### 示例
1263
+
1264
+ ```vue
1265
+ <template>
1266
+ <follow-button :following="isFollowing" @toggle="handleToggle" />
1267
+ </template>
1268
+
1269
+ <script>
1270
+ export default {
1271
+ data() {
1272
+ return {
1273
+ isFollowing: false
1274
+ }
1275
+ },
1276
+ methods: {
1277
+ handleToggle(following) {
1278
+ this.isFollowing = following;
1279
+ console.log('关注状态:', following);
1280
+ }
1281
+ }
1282
+ }
1283
+ </script>
1284
+ ```
1285
+
1286
+ ### AvatarGroup
1287
+
1288
+ 头像组组件。
1289
+
1290
+ #### Props
1291
+
1292
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1293
+ |------|------|------|--------|--------|
1294
+ | avatars | 头像数据数组 | Array | - | - |
1295
+ | max | 最大显示数量 | Number | - | - |
1296
+
1297
+ #### 示例
1298
+
1299
+ ```vue
1300
+ <template>
1301
+ <avatar-group :avatars="avatars" :max="3" />
1302
+ </template>
1303
+
1304
+ <script>
1305
+ export default {
1306
+ data() {
1307
+ return {
1308
+ avatars: [
1309
+ { src: 'https://example.com/avatar1.jpg', name: '用户1' },
1310
+ { src: 'https://example.com/avatar2.jpg', name: '用户2' },
1311
+ { src: 'https://example.com/avatar3.jpg', name: '用户3' },
1312
+ { src: 'https://example.com/avatar4.jpg', name: '用户4' }
1313
+ ]
1314
+ }
1315
+ }
1316
+ }
1317
+ </script>
1318
+ ```
1319
+
1320
+ ## 工具函数
1321
+
1322
+ ### 加密与哈希函数
1323
+
1324
+ #### MD5(message)
1325
+ - **功能**: 计算字符串的MD5哈希值
1326
+ - **参数**:
1327
+ - `message` (String): 要计算哈希值的字符串
1328
+ - **返回值**: String - 十六进制格式的MD5哈希值
1329
+ - **示例**:
1330
+ ```javascript
1331
+ import { BaseUtil } from '@zkwq-x/business'
1332
+
1333
+ const hash = BaseUtil.MD5('hello world')
1334
+ console.log(hash) // 输出: 5eb63bbbe01eeed093cb22bb8f5acdc3
1335
+ ```
1336
+
1337
+ #### encryptAES(data, key)
1338
+ - **功能**: 使用AES算法加密数据
1339
+ - **参数**:
1340
+ - `data` (String): 要加密的数据
1341
+ - `key` (String): 加密密钥
1342
+ - **返回值**: String - 加密后的字符串
1343
+ - **示例**:
1344
+ ```javascript
1345
+ import { BaseUtil } from '@zkwq-x/business'
1346
+
1347
+ const encrypted = BaseUtil.encryptAES('sensitive data', 'secret-key')
1348
+ ```
1349
+
1350
+ #### decryptAES(encrypted, key)
1351
+ - **功能**: 使用AES算法解密数据
1352
+ - **参数**:
1353
+ - `encrypted` (String): 加密的数据
1354
+ - `key` (String): 解密密钥
1355
+ - **返回值**: String - 解密后的原始数据
1356
+ - **示例**:
1357
+ ```javascript
1358
+ import { BaseUtil } from '@zkwq-x/business'
1359
+
1360
+ const decrypted = BaseUtil.decryptAES(encryptedData, 'secret-key')
1361
+ ```
1362
+
1363
+ ### ID与字符串生成函数
1364
+
1365
+ #### generateId()
1366
+ - **功能**: 生成一个随机ID
1367
+ - **参数**: 无
1368
+ - **返回值**: Number - 0-9999之间的随机整数
1369
+ - **示例**:
1370
+ ```javascript
1371
+ import { BaseUtil } from '@zkwq-x/business'
1372
+
1373
+ const id = BaseUtil.generateId()
1374
+ console.log(id) // 输出: 1234 (示例)
1375
+ ```
1376
+
1377
+ #### randomString(length)
1378
+ - **功能**: 生成指定长度的随机字符串
1379
+ - **参数**:
1380
+ - `length` (Number): 字符串长度
1381
+ - **返回值**: String - 包含数字和小写字母的随机字符串
1382
+ - **示例**:
1383
+ ```javascript
1384
+ import { BaseUtil } from '@zkwq-x/business'
1385
+
1386
+ const str = BaseUtil.randomString(8)
1387
+ console.log(str) // 输出: "a1b2c3d4" (示例)
1388
+ ```
1389
+
1390
+ #### generateUUID()
1391
+ - **功能**: 生成UUID字符串
1392
+ - **参数**: 无
1393
+ - **返回值**: String - UUID格式的字符串
1394
+ - **示例**:
1395
+ ```javascript
1396
+ import { BaseUtil } from '@zkwq-x/business'
1397
+
1398
+ const uuid = BaseUtil.generateUUID()
1399
+ console.log(uuid) // 输出: "f47ac10b-58cc-4372-a567-0e02b2c3d479" (示例)
1400
+ ```
1401
+
1402
+ ### 数据验证与处理函数
1403
+
1404
+ #### isEmpty(val)
1405
+ - **功能**: 检查值是否为空(null、undefined、空字符串、空数组、空对象)
1406
+ - **参数**:
1407
+ - `val` (Any): 要检查的值
1408
+ - **返回值**: Boolean - 如果值为空返回true,否则返回false
1409
+ - **示例**:
1410
+ ```javascript
1411
+ import { BaseUtil } from '@zkwq-x/business'
1412
+
1413
+ console.log(BaseUtil.isEmpty(null)) // true
1414
+ console.log(BaseUtil.isEmpty('')) // true
1415
+ console.log(BaseUtil.isEmpty([])) // true
1416
+ console.log(BaseUtil.isEmpty({})) // true
1417
+ console.log(BaseUtil.isEmpty('hello')) // false
1418
+ ```
1419
+
1420
+ #### isArrayEmpty(val)
1421
+ - **功能**: 检查数组是否为空或未定义
1422
+ - **参数**:
1423
+ - `val` (Array): 要检查的数组
1424
+ - **返回值**: Boolean - 如果数组为空或未定义返回true,否则返回false
1425
+ - **示例**:
1426
+ ```javascript
1427
+ import { BaseUtil } from '@zkwq-x/business'
1428
+
1429
+ console.log(BaseUtil.isArrayEmpty([])) // true
1430
+ console.log(BaseUtil.isArrayEmpty([1, 2, 3])) // false
1431
+ console.log(BaseUtil.isArrayEmpty(undefined)) // true
1432
+ ```
1433
+
1434
+ #### isObjectEmpty(val)
1435
+ - **功能**: 检查对象是否为空或未定义
1436
+ - **参数**:
1437
+ - `val` (Object): 要检查的对象
1438
+ - **返回值**: Boolean - 如果对象为空或未定义返回true,否则返回false
1439
+ - **示例**:
1440
+ ```javascript
1441
+ import { BaseUtil } from '@zkwq-x/business'
1442
+
1443
+ console.log(BaseUtil.isObjectEmpty({})) // true
1444
+ console.log(BaseUtil.isObjectEmpty({a: 1})) // false
1445
+ console.log(BaseUtil.isObjectEmpty(undefined)) // true
1446
+ ```
1447
+
1448
+ #### isFunction(val)
1449
+ - **功能**: 检查值是否为函数
1450
+ - **参数**:
1451
+ - `val` (Any): 要检查的值
1452
+ - **返回值**: Boolean - 如果值是函数返回true,否则返回false
1453
+ - **示例**:
1454
+ ```javascript
1455
+ import { BaseUtil } from '@zkwq-x/business'
1456
+
1457
+ console.log(BaseUtil.isFunction(() => {})) // true
1458
+ console.log(BaseUtil.isFunction(function() {})) // true
1459
+ console.log(BaseUtil.isFunction('hello')) // false
1460
+ ```
1461
+
1462
+ ### 数据转换函数
1463
+
1464
+ #### formatFileSize(bytes)
1465
+ - **功能**: 格式化文件大小为人类可读的格式
1466
+ - **参数**:
1467
+ - `bytes` (Number): 文件大小(字节)
1468
+ - **返回值**: String - 格式化后的文件大小(如 "1.5 MB")
1469
+ - **示例**:
1470
+ ```javascript
1471
+ import { BaseUtil } from '@zkwq-x/business'
1472
+
1473
+ console.log(BaseUtil.formatFileSize(1024)) // "1 KB"
1474
+ console.log(BaseUtil.formatFileSize(1048576)) // "1 MB"
1475
+ console.log(BaseUtil.formatFileSize(1073741824)) // "1 GB"
1476
+ ```
1477
+
1478
+ #### formatDate(date, format)
1479
+ - **功能**: 格式化日期
1480
+ - **参数**:
1481
+ - `date` (Date|String|Number): 日期对象、时间戳或日期字符串
1482
+ - `format` (String): 日期格式,默认为 "YYYY-MM-DD"
1483
+ - **返回值**: String - 格式化后的日期字符串
1484
+ - **示例**:
1485
+ ```javascript
1486
+ import { BaseUtil } from '@zkwq-x/business'
1487
+
1488
+ console.log(BaseUtil.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')) // "2023-12-22 14:30:00" (示例)
1489
+ console.log(BaseUtil.formatDate(1671694200000, 'YYYY/MM/DD')) // "2022/12/22" (示例)
1490
+ ```
1491
+
1492
+ #### formatNumber(num, digits)
1493
+ - **功能**: 格式化数字,添加千位分隔符
1494
+ - **参数**:
1495
+ - `num` (Number): 要格式化的数字
1496
+ - `digits` (Number): 保留的小数位数,默认为2
1497
+ - **返回值**: String - 格式化后的数字字符串
1498
+ - **示例**:
1499
+ ```javascript
1500
+ import { BaseUtil } from '@zkwq-x/business'
1501
+
1502
+ console.log(BaseUtil.formatNumber(1234567.891)) // "1,234,567.89"
1503
+ console.log(BaseUtil.formatNumber(1234567.891, 0)) // "1,234,568"
1504
+ ```
1505
+
1506
+ ### URL与参数处理函数
1507
+
1508
+ #### getQueryString(name)
1509
+ - **功能**: 获取URL查询字符串参数值
1510
+ - **参数**:
1511
+ - `name` (String): 参数名
1512
+ - **返回值**: String - 参数值,如果不存在则返回null
1513
+ - **示例**:
1514
+ ```javascript
1515
+ import { BaseUtil } from '@zkwq-x/business'
1516
+
1517
+ // 假设当前URL为: https://example.com?id=123&name=test
1518
+ console.log(BaseUtil.getQueryString('id')) // "123"
1519
+ console.log(BaseUtil.getQueryString('name')) // "test"
1520
+ console.log(BaseUtil.getQueryString('nonexistent')) // null
1521
+ ```
1522
+
1523
+ #### setQueryString(url, params)
1524
+ - **功能**: 设置URL查询字符串参数
1525
+ - **参数**:
1526
+ - `url` (String): 原始URL
1527
+ - `params` (Object): 要设置的参数对象
1528
+ - **返回值**: String - 设置参数后的URL
1529
+ - **示例**:
1530
+ ```javascript
1531
+ import { BaseUtil } from '@zkwq-x/business'
1532
+
1533
+ const newUrl = BaseUtil.setQueryString('https://example.com', { id: 123, name: 'test' })
1534
+ console.log(newUrl) // "https://example.com?id=123&name=test"
1535
+ ```
1536
+
1537
+ ### 数据存储函数
1538
+
1539
+ #### setLocalStorage(key, value)
1540
+ - **功能**: 设置本地存储数据
1541
+ - **参数**:
1542
+ - `key` (String): 存储键名
1543
+ - `value` (Any): 要存储的值(会自动序列化为JSON)
1544
+ - **返回值**: 无
1545
+ - **示例**:
1546
+ ```javascript
1547
+ import { BaseUtil } from '@zkwq-x/business'
1548
+
1549
+ BaseUtil.setLocalStorage('user', { id: 1, name: 'John' })
1550
+ ```
1551
+
1552
+ #### getLocalStorage(key)
1553
+ - **功能**: 获取本地存储数据
1554
+ - **参数**:
1555
+ - `key` (String): 存储键名
1556
+ - **返回值**: Any - 存储的值(会自动反序列化JSON),如果不存在则返回null
1557
+ - **示例**:
1558
+ ```javascript
1559
+ import { BaseUtil } from '@zkwq-x/business'
1560
+
1561
+ const user = BaseUtil.getLocalStorage('user')
1562
+ console.log(user) // { id: 1, name: 'John' } (示例)
1563
+ ```
1564
+
1565
+ #### removeLocalStorage(key)
1566
+ - **功能**: 删除本地存储数据
1567
+ - **参数**:
1568
+ - `key` (String): 存储键名
1569
+ - **返回值**: 无
1570
+ - **示例**:
1571
+ ```javascript
1572
+ import { BaseUtil } from '@zkwq-x/business'
1573
+
1574
+ BaseUtil.removeLocalStorage('user')
1575
+ ```
1576
+
1577
+ ### 其他工具函数
1578
+
1579
+ #### debounce(func, wait)
1580
+ - **功能**: 创建防抖函数
1581
+ - **参数**:
1582
+ - `func` (Function): 要防抖的函数
1583
+ - `wait` (Number): 等待时间(毫秒)
1584
+ - **返回值**: Function - 防抖后的函数
1585
+ - **示例**:
1586
+ ```javascript
1587
+ import { BaseUtil } from '@zkwq-x/business'
1588
+
1589
+ const debouncedSearch = BaseUtil.debounce((query) => {
1590
+ console.log('搜索:', query)
1591
+ }, 300)
1592
+
1593
+ debouncedSearch('test') // 只在停止输入300ms后执行
1594
+ ```
1595
+
1596
+ #### throttle(func, wait)
1597
+ - **功能**: 创建节流函数
1598
+ - **参数**:
1599
+ - `func` (Function): 要节流的函数
1600
+ - `wait` (Number): 等待时间(毫秒)
1601
+ - **返回值**: Function - 节流后的函数
1602
+ - **示例**:
1603
+ ```javascript
1604
+ import { BaseUtil } from '@zkwq-x/business'
1605
+
1606
+ const throttledScroll = BaseUtil.throttle(() => {
1607
+ console.log('滚动事件')
1608
+ }, 100)
1609
+
1610
+ window.addEventListener('scroll', throttledScroll)
1611
+ ```
1612
+
1613
+ #### deepClone(obj)
1614
+ - **功能**: 深度克隆对象
1615
+ - **参数**:
1616
+ - `obj` (Any): 要克隆的对象
1617
+ - **返回值**: Any - 克隆后的对象
1618
+ - **示例**:
1619
+ ```javascript
1620
+ import { BaseUtil } from '@zkwq-x/business'
1621
+
1622
+ const original = { a: 1, b: { c: 2 } }
1623
+ const cloned = BaseUtil.deepClone(original)
1624
+
1625
+ cloned.b.c = 3
1626
+ console.log(original.b.c) // 2 (原对象未受影响)
1627
+ console.log(cloned.b.c) // 3
1628
+ ```
1629
+
1630
+ ### Base64Util
1631
+
1632
+ Base64 编码解码工具。
1633
+
1634
+ #### 方法
1635
+
1636
+ | 方法名 | 说明 | 参数 | 返回值 |
1637
+ |--------|------|------|--------|
1638
+ | encode | Base64编码 | (str: string) | string |
1639
+ | decode | Base64解码 | (str: string) | string |
1640
+
1641
+ #### 示例
1642
+
1643
+ ```javascript
1644
+ import { Base64Util } from '@zkwq-x/business';
1645
+
1646
+ // 编码
1647
+ const encoded = Base64Util.encode('hello world');
1648
+
1649
+ // 解码
1650
+ const decoded = Base64Util.decode(encoded);
1651
+ ```
1652
+
1653
+ ### http
1654
+
1655
+ HTTP 请求工具。
1656
+
1657
+ #### 方法
1658
+
1659
+ | 方法名 | 说明 | 参数 | 返回值 |
1660
+ |--------|------|------|--------|
1661
+ | get | GET请求 | (url: string, config?: object) | Promise |
1662
+ | post | POST请求 | (url: string, data?: any, config?: object) | Promise |
1663
+ | put | PUT请求 | (url: string, data?: any, config?: object) | Promise |
1664
+ | delete | DELETE请求 | (url: string, config?: object) | Promise |
1665
+
1666
+ #### 示例
1667
+
1668
+ ```javascript
1669
+ import { http } from '@zkwq-x/business';
1670
+
1671
+ // GET 请求
1672
+ http.get('/api/data').then(response => {
1673
+ console.log(response.data);
1674
+ });
1675
+
1676
+ // POST 请求
1677
+ http.post('/api/data', { name: 'test' }).then(response => {
1678
+ console.log(response.data);
1679
+ });
1680
+ ```
1681
+
1682
+ ### CONSTANT
1683
+
1684
+ 常量集合。
1685
+
1686
+ #### 属性
1687
+
1688
+ | 属性名 | 说明 | 类型 |
1689
+ |--------|------|------|
1690
+ | API_BASE_URL | API基础URL | string |
1691
+ | STATUS_CODE | 状态码常量 | object |
1692
+
1693
+ #### 示例
1694
+
1695
+ ```javascript
1696
+ import { CONSTANT } from '@zkwq-x/business';
1697
+
1698
+ // 使用常量
1699
+ console.log(CONSTANT.API_BASE_URL);
1700
+ console.log(CONSTANT.STATUS_CODE.SUCCESS);
1701
+ ```
1702
+
1703
+ ### ScrollTool
1704
+
1705
+ 滚动工具。
1706
+
1707
+ #### 方法
1708
+
1709
+ | 方法名 | 说明 | 参数 |
1710
+ |--------|------|------|
1711
+ | scrollToTop | 滚动到顶部 | - |
1712
+ | scrollToElement | 滚动到指定元素 | (selector: string) |
1713
+ | scrollBottom | 滚动到底部 | - |
1714
+
1715
+ #### 示例
1716
+
1717
+ ```javascript
1718
+ import { ScrollTool } from '@zkwq-x/business';
1719
+
1720
+ // 滚动到顶部
1721
+ ScrollTool.scrollToTop();
1722
+
1723
+ // 滚动到指定元素
1724
+ ScrollTool.scrollToElement('#target');
1725
+ ```
1726
+
1727
+ ### Quote
1728
+
1729
+ 引用工具。
1730
+
1731
+ #### 方法
1732
+
1733
+ | 方法名 | 说明 | 参数 | 返回值 |
1734
+ |--------|------|------|--------|
1735
+ | format | 格式化引用 | (text: string) | string |
1736
+
1737
+ #### 示例
1738
+
1739
+ ```javascript
1740
+ import { Quote } from '@zkwq-x/business';
1741
+
1742
+ // 格式化引用
1743
+ const formattedQuote = Quote.format('这是一段引用文本');
1744
+ ```
1745
+
1746
+ ### Bus
1747
+
1748
+ 事件总线。
1749
+
1750
+ #### 方法
1751
+
1752
+ | 方法名 | 说明 | 参数 |
1753
+ |--------|------|------|
1754
+ | on | 监听事件 | (type: string, callBack: Function) |
1755
+ | trigger | 触发事件 | (type: string, options: any) |
1756
+ | remove | 移除事件监听 | (type: string, callBack: Function) |
1757
+
1758
+ #### 示例
1759
+
1760
+ ```javascript
1761
+ import { Bus } from '@zkwq-x/business';
1762
+
1763
+ // 监听事件
1764
+ Bus.on('custom-event', (data) => {
1765
+ console.log('接收到事件:', data)
1766
+ })
1767
+
1768
+ // 触发事件
1769
+ Bus.trigger('custom-event', { message: 'Hello World' })
1770
+
1771
+ // 移除事件监听
1772
+ const handler = (data) => console.log(data)
1773
+ Bus.on('another-event', handler)
1774
+ Bus.remove('another-event', handler)
1775
+ ```
1776
+
1777
+ ### HighLight
1778
+
1779
+ 高亮工具。
1780
+
1781
+ #### 方法
1782
+
1783
+ | 方法名 | 说明 | 参数 | 返回值 |
1784
+ |--------|------|------|--------|
1785
+ | highlight | 高亮文本 | (text: string, keyword: string) | string |
1786
+
1787
+ #### 示例
1788
+
1789
+ ```javascript
1790
+ import { HighLight } from '@zkwq-x/business';
1791
+
1792
+ // 高亮文本
1793
+ const highlightedText = HighLight.highlight('原始文本', '关键词');
1794
+ ```
1795
+
1796
+ ## 服务模块
1797
+
1798
+ ### 日志服务
1799
+
1800
+ #### SaveLog(params, application, user, module)
1801
+ - **功能**: 保存用户操作日志
1802
+ - **参数**:
1803
+ - `params` (Object): 日志参数对象
1804
+ - `application` (String): 应用名称
1805
+ - `user` (Object): 用户对象
1806
+ - `module` (String): 模块名称,默认为'后台管理'
1807
+ - **返回值**: Promise - 请求Promise对象
1808
+ - **示例**:
1809
+ ```javascript
1810
+ import { Service } from '@zkwq-x/business'
1811
+
1812
+ Service.SaveLog(
1813
+ { action: 'login', ip: '192.168.1.1' },
1814
+ '管理系统',
1815
+ { id: 1, name: 'admin' },
1816
+ '用户管理'
1817
+ ).then(() => {
1818
+ console.log('日志保存成功')
1819
+ })
1820
+ ```
1821
+
1822
+ ### 资源导出服务
1823
+
1824
+ #### ExportResource(params)
1825
+ - **功能**: 导出资源文件
1826
+ - **参数**:
1827
+ - `params` (Object): 导出参数对象
1828
+ - **返回值**: Promise<Blob> - 返回文件数据的Promise
1829
+ - **示例**:
1830
+ ```javascript
1831
+ import { Service } from '@zkwq-x/business'
1832
+
1833
+ Service.ExportResource({ type: 'excel', ids: [1, 2, 3] }).then(blob => {
1834
+ // 创建下载链接
1835
+ const url = window.URL.createObjectURL(blob)
1836
+ const link = document.createElement('a')
1837
+ link.href = url
1838
+ link.download = 'export.xlsx'
1839
+ link.click()
1840
+ })
1841
+ ```
1842
+
1843
+ #### ExportResourceTxt(params)
1844
+ - **功能**: 导出资源为文本文件
1845
+ - **参数**:
1846
+ - `params` (Object): 导出参数对象
1847
+ - **返回值**: Promise<Blob> - 返回文本文件数据的Promise
1848
+ - **示例**:
1849
+ ```javascript
1850
+ import { Service } from '@zkwq-x/business'
1851
+
1852
+ Service.ExportResourceTxt({ format: 'txt', content: '导出内容' }).then(blob => {
1853
+ const url = window.URL.createObjectURL(blob)
1854
+ const link = document.createElement('a')
1855
+ link.href = url
1856
+ link.download = 'export.txt'
1857
+ link.click()
1858
+ })
1859
+ ```
1860
+
1861
+ ### 用户服务
1862
+
1863
+ #### GetUserV2(uid, user_id, app_id)
1864
+ - **功能**: 获取用户信息(V2版本)
1865
+ - **参数**:
1866
+ - `uid` (String): 用户ID
1867
+ - `user_id` (String): 当前用户ID
1868
+ - `app_id` (String): 应用ID
1869
+ - **返回值**: Promise - 包含用户信息的Promise
1870
+ - **示例**:
1871
+ ```javascript
1872
+ import { Service } from '@zkwq-x/business'
1873
+
1874
+ Service.GetUserV2('user123', 'current_user456', 'app789').then(user => {
1875
+ console.log('用户信息:', user)
1876
+ }).catch(error => {
1877
+ console.error('获取用户信息失败:', error)
1878
+ })
1879
+ ```
1880
+
1881
+ #### GetUser(uid)
1882
+ - **功能**: 获取用户信息
1883
+ - **参数**:
1884
+ - `uid` (String): 用户ID
1885
+ - **返回值**: Promise - 包含用户信息的Promise
1886
+ - **示例**:
1887
+ ```javascript
1888
+ import { Service } from '@zkwq-x/business'
1889
+
1890
+ Service.GetUser('user123').then(user => {
1891
+ console.log('用户信息:', user)
1892
+ })
1893
+ ```
1894
+
1895
+ #### GetUsers(uids)
1896
+ - **功能**: 批量获取用户信息
1897
+ - **参数**:
1898
+ - `uids` (Array): 用户ID数组
1899
+ - **返回值**: Promise - 包含用户信息数组的Promise
1900
+ - **示例**:
1901
+ ```javascript
1902
+ import { Service } from '@zkwq-x/business'
1903
+
1904
+ Service.GetUsers(['user1', 'user2', 'user3']).then(users => {
1905
+ console.log('用户列表:', users)
1906
+ })
1907
+ ```
1908
+
1909
+ #### UpdateUser(uid, data)
1910
+ - **功能**: 更新用户信息
1911
+ - **参数**:
1912
+ - `uid` (String): 用户ID
1913
+ - `data` (Object): 要更新的用户数据
1914
+ - **返回值**: Promise - 更新结果的Promise
1915
+ - **示例**:
1916
+ ```javascript
1917
+ import { Service } from '@zkwq-x/business'
1918
+
1919
+ Service.UpdateUser('user123', { name: '新名称', email: 'new@example.com' }).then(result => {
1920
+ console.log('用户信息更新成功:', result)
1921
+ })
1922
+ ```
1923
+
1924
+ ### 文件服务
1925
+
1926
+ #### UploadFile(file, options)
1927
+ - **功能**: 上传文件
1928
+ - **参数**:
1929
+ - `file` (File): 要上传的文件对象
1930
+ - `options` (Object): 上传选项,包含类型、路径等
1931
+ - **返回值**: Promise - 包含上传结果和文件信息的Promise
1932
+ - **示例**:
1933
+ ```javascript
1934
+ import { Service } from '@zkwq-x/business'
1935
+
1936
+ const fileInput = document.getElementById('file-input')
1937
+ const file = fileInput.files[0]
1938
+
1939
+ Service.UploadFile(file, { type: 'avatar', folder: 'user' }).then(result => {
1940
+ console.log('文件上传成功:', result.url)
1941
+ })
1942
+ ```
1943
+
1944
+ #### GetFileUrl(fileId)
1945
+ - **功能**: 获取文件访问URL
1946
+ - **参数**:
1947
+ - `fileId` (String): 文件ID
1948
+ - **返回值**: Promise - 包含文件URL的Promise
1949
+ - **示例**:
1950
+ ```javascript
1951
+ import { Service } from '@zkwq-x/business'
1952
+
1953
+ Service.GetFileUrl('file123').then(url => {
1954
+ console.log('文件URL:', url)
1955
+ })
1956
+ ```
1957
+
1958
+ #### DeleteFile(fileId)
1959
+ - **功能**: 删除文件
1960
+ - **参数**:
1961
+ - `fileId` (String): 文件ID
1962
+ - **返回值**: Promise - 删除结果的Promise
1963
+ - **示例**:
1964
+ ```javascript
1965
+ import { Service } from '@zkwq-x/business'
1966
+
1967
+ Service.DeleteFile('file123').then(() => {
1968
+ console.log('文件删除成功')
1969
+ })
1970
+ ```
1971
+
1972
+ ### 数据统计服务
1973
+
1974
+ #### GetStatistics(params)
1975
+ - **功能**: 获取统计数据
1976
+ - **参数**:
1977
+ - `params` (Object): 统计参数,包含时间范围、类型等
1978
+ - **返回值**: Promise - 包含统计数据的Promise
1979
+ - **示例**:
1980
+ ```javascript
1981
+ import { Service } from '@zkwq-x/business'
1982
+
1983
+ Service.GetStatistics({
1984
+ startDate: '2023-01-01',
1985
+ endDate: '2023-12-31',
1986
+ type: 'user_activity'
1987
+ }).then(data => {
1988
+ console.log('统计数据:', data)
1989
+ })
1990
+ ```
1991
+
1992
+ #### GetReport(params)
1993
+ - **功能**: 获取报告数据
1994
+ - **参数**:
1995
+ - `params` (Object): 报告参数,包含报告类型、筛选条件等
1996
+ - **返回值**: Promise - 包含报告数据的Promise
1997
+ - **示例**:
1998
+ ```javascript
1999
+ import { Service } from '@zkwq-x/business'
2000
+
2001
+ Service.GetReport({
2002
+ type: 'monthly',
2003
+ month: '2023-12',
2004
+ format: 'json'
2005
+ }).then(report => {
2006
+ console.log('报告数据:', report)
2007
+ })
2008
+ ```
2009
+
2010
+ ### 关注服务
2011
+
2012
+ #### FollowUser(userId, targetUserId)
2013
+ - **功能**: 关注用户
2014
+ - **参数**:
2015
+ - `userId` (String): 当前用户ID
2016
+ - `targetUserId` (String): 要关注的用户ID
2017
+ - **返回值**: Promise - 关注结果的Promise
2018
+ - **示例**:
2019
+ ```javascript
2020
+ import { Service } from '@zkwq-x/business'
2021
+
2022
+ Service.FollowUser('current_user', 'target_user').then(() => {
2023
+ console.log('关注成功')
2024
+ })
2025
+ ```
2026
+
2027
+ #### UnfollowUser(userId, targetUserId)
2028
+ - **功能**: 取消关注用户
2029
+ - **参数**:
2030
+ - `userId` (String): 当前用户ID
2031
+ - `targetUserId` (String): 要取消关注的用户ID
2032
+ - **返回值**: Promise - 取消关注结果的Promise
2033
+ - **示例**:
2034
+ ```javascript
2035
+ import { Service } from '@zkwq-x/business'
2036
+
2037
+ Service.UnfollowUser('current_user', 'target_user').then(() => {
2038
+ console.log('取消关注成功')
2039
+ })
2040
+ ```
2041
+
2042
+ #### GetFollowers(userId)
2043
+ - **功能**: 获取用户粉丝列表
2044
+ - **参数**:
2045
+ - `userId` (String): 用户ID
2046
+ - **返回值**: Promise - 包含粉丝列表的Promise
2047
+ - **示例**:
2048
+ ```javascript
2049
+ import { Service } from '@zkwq-x/business'
2050
+
2051
+ Service.GetFollowers('user123').then(followers => {
2052
+ console.log('粉丝列表:', followers)
2053
+ })
2054
+ ```
2055
+
2056
+ #### GetFollowing(userId)
2057
+ - **功能**: 获取用户关注列表
2058
+ - **参数**:
2059
+ - `userId` (String): 用户ID
2060
+ - **返回值**: Promise - 包含关注列表的Promise
2061
+ - **示例**:
2062
+ ```javascript
2063
+ import { Service } from '@zkwq-x/business'
2064
+
2065
+ Service.GetFollowing('user123').then(following => {
2066
+ console.log('关注列表:', following)
2067
+ })
2068
+ ```
2069
+
2070
+ ### 搜索服务
2071
+
2072
+ #### Search(query, options)
2073
+ - **功能**: 执行搜索
2074
+ - **参数**:
2075
+ - `query` (String): 搜索关键词
2076
+ - `options` (Object): 搜索选项,包含类型、分页等
2077
+ - **返回值**: Promise - 包含搜索结果的Promise
2078
+ - **示例**:
2079
+ ```javascript
2080
+ import { Service } from '@zkwq-x/business'
2081
+
2082
+ Service.Search('Vue.js', { type: 'articles', page: 1, pageSize: 10 }).then(results => {
2083
+ console.log('搜索结果:', results)
2084
+ })
2085
+ ```
2086
+
2087
+ #### GetSearchSuggestions(query)
2088
+ - **功能**: 获取搜索建议
2089
+ - **参数**:
2090
+ - `query` (String): 搜索关键词
2091
+ - **返回值**: Promise - 包含搜索建议列表的Promise
2092
+ - **示例**:
2093
+ ```javascript
2094
+ import { Service } from '@zkwq-x/business'
2095
+
2096
+ Service.GetSearchSuggestions('Vue').then(suggestions => {
2097
+ console.log('搜索建议:', suggestions)
2098
+ })
2099
+ ```
2100
+
2101
+ ## 指令
2102
+
2103
+ ### v-ripple
2104
+
2105
+ 水波纹指令,为元素添加点击水波纹效果。
2106
+
2107
+ #### 示例
2108
+
2109
+ ```vue
2110
+ <template>
2111
+ <button v-ipple>点击我有水波纹效果</button>
2112
+ </template>
2113
+ ```
2114
+
2115
+ ## 样式
2116
+
2117
+ 组件库提供了完整的样式文件,引入方式:
2118
+
2119
+ ```javascript
2120
+ import '@zkwq-x/business/style/index.scss';
2121
+ ```
2122
+
2123
+ ## 贡献
2124
+
2125
+ 欢迎提交 Issue 和 Pull Request 来完善组件库。
2126
+
2127
+ ## 许可证
2128
+
2129
+ [MIT License](LICENSE)