@zkwq/business 0.2.23 → 0.2.24

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
@@ -41,11 +41,18 @@
41
41
  - [HoverCard(悬停卡片组件)](#hovercard)
42
42
  - [FollowButton(关注按钮组件)](#followbutton)
43
43
  - [AvatarGroup(头像组组件)](#avatargroup)
44
+ - [CaptchaDialog(机器人验证对话框组件)](#captchadialog)
45
+ - [CaptchaFormItem(验证码表单项组件)](#captchaformitem)
46
+ - [MultipleSpan(多值文本组件)](#multiplespan)
44
47
  - [工具函数](#工具函数)
45
48
  - [加密与哈希函数](#加密与哈希函数)
46
49
  - [ID与字符串生成函数](#id与字符串生成函数)
47
50
  - [数据验证与处理函数](#数据验证与处理函数)
51
+ - [表单验证函数](#表单验证函数)
48
52
  - [数据转换函数](#数据转换函数)
53
+ - [数组工具函数](#数组工具函数)
54
+ - [文件与下载函数](#文件与下载函数)
55
+ - [浏览器环境检测函数](#浏览器环境检测函数)
49
56
  - [URL与参数处理函数](#url与参数处理函数)
50
57
  - [数据存储函数](#数据存储函数)
51
58
  - [其他工具函数](#其他工具函数)
@@ -53,8 +60,9 @@
53
60
  - [http(HTTP请求工具)](#http)
54
61
  - [CONSTANT(常量集合)](#constant)
55
62
  - [ScrollTool(滚动工具)](#scrolltool)
56
- - [Quote(引用工具)](#quote)
63
+ - [ExportUtil(导出工具)](#exportutil)
57
64
  - [Bus(事件总线)](#bus)
65
+ - [CheckRobot(机器人验证工具)](#checkrobot)
58
66
  - [HighLight(高亮工具)](#highlight)
59
67
  - [服务模块](#服务模块)
60
68
  - [日志服务](#日志服务)
@@ -454,8 +462,8 @@ export default {
454
462
  ```vue
455
463
  <template>
456
464
  <div>
457
- <avatar :src="avatarUrl" :size="40" />
458
- <avatar :src="avatarUrl" :size="60" :round="true" />
465
+ <avatar :url="avatarUrl" :size="40" />
466
+ <avatar :url="avatarUrl" :size="60" :round="true" />
459
467
  <avatar :size="80" />
460
468
  </div>
461
469
  </template>
@@ -479,7 +487,7 @@ export default {
479
487
 
480
488
  ```vue
481
489
  <template>
482
- <button v-ipple>点击我</button>
490
+ <button v-ripple>点击我</button>
483
491
  </template>
484
492
  ```
485
493
 
@@ -627,7 +635,7 @@ export default {
627
635
 
628
636
  ```vue
629
637
  <template>
630
- <x-header :back="true" back-home="handleBackHome">
638
+ <x-header :back="true" :back-home="handleBackHome">
631
639
  <base-button>操作</base-button>
632
640
  </x-header>
633
641
  </template>
@@ -829,9 +837,9 @@ export default {
829
837
 
830
838
  ```vue
831
839
  <template>
832
- <user-profile
833
- :user-info="userInfo"
834
- :avatar-size="80"
840
+ <user-profile
841
+ :profile="userInfo"
842
+ :avatar-size="80"
835
843
  :avatar-round="true"
836
844
  />
837
845
  </template>
@@ -1317,6 +1325,130 @@ export default {
1317
1325
  </script>
1318
1326
  ```
1319
1327
 
1328
+ ### CaptchaDialog
1329
+
1330
+ 机器人验证对话框组件,通过图形算式验证用户非机器人身份,验证成功后触发事件或刷新页面。通常配合 `CheckRobot.createCaptchaDialog()` 使用。
1331
+
1332
+ #### Events
1333
+
1334
+ | 事件名 | 说明 | 回调参数 |
1335
+ |--------|------|----------|
1336
+ | on-success | 验证通过时触发 | - |
1337
+
1338
+ #### Methods
1339
+
1340
+ | 方法名 | 说明 | 参数 |
1341
+ |--------|------|------|
1342
+ | show | 显示验证对话框 | - |
1343
+ | hide | 隐藏验证对话框并重置表单 | - |
1344
+
1345
+ #### 示例
1346
+
1347
+ ```javascript
1348
+ // 推荐:通过 CheckRobot 工具函数触发
1349
+ import { CheckRobot } from '@zkwq-x/business'
1350
+ CheckRobot.createCaptchaDialog()
1351
+ ```
1352
+
1353
+ ```vue
1354
+ <!-- 手动使用组件 -->
1355
+ <template>
1356
+ <captcha-dialog ref="captchaDialog" @on-success="handleSuccess" />
1357
+ </template>
1358
+
1359
+ <script>
1360
+ export default {
1361
+ methods: {
1362
+ showCaptcha() {
1363
+ this.$refs.captchaDialog.show()
1364
+ },
1365
+ handleSuccess() {
1366
+ console.log('验证通过')
1367
+ }
1368
+ }
1369
+ }
1370
+ </script>
1371
+ ```
1372
+
1373
+ ### CaptchaFormItem
1374
+
1375
+ 验证码表单项组件,封装了图形验证码输入框与验证码图片(点击可刷新),用于嵌入表单中使用。
1376
+
1377
+ #### Props
1378
+
1379
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1380
+ |------|------|------|--------|--------|
1381
+ | prop | 表单验证字段名 | String | - | - |
1382
+ | captcha | 验证码值(v-model) | String | - | - |
1383
+ | captchaKey | 验证码 Key(用于获取图形验证码) | String | - | - |
1384
+ | showLabel | 是否显示 label | Boolean | - | false |
1385
+
1386
+ #### Events
1387
+
1388
+ | 事件名 | 说明 | 回调参数 |
1389
+ |--------|------|----------|
1390
+ | input | 输入值变化时触发 | (value: string) |
1391
+
1392
+ #### Methods
1393
+
1394
+ | 方法名 | 说明 | 参数 |
1395
+ |--------|------|------|
1396
+ | handleRefreshCaptcha | 刷新验证码图片 | - |
1397
+
1398
+ #### 示例
1399
+
1400
+ ```vue
1401
+ <template>
1402
+ <base-form :model="form" :rules="rules" ref="form">
1403
+ <captcha-form-item
1404
+ prop="captcha"
1405
+ v-model.trim="form.captcha"
1406
+ :captcha-key="clientId"
1407
+ />
1408
+ </base-form>
1409
+ </template>
1410
+
1411
+ <script>
1412
+ export default {
1413
+ data() {
1414
+ return {
1415
+ clientId: 'your-client-id',
1416
+ form: { captcha: null }
1417
+ }
1418
+ }
1419
+ }
1420
+ </script>
1421
+ ```
1422
+
1423
+ ### MultipleSpan
1424
+
1425
+ 多值文本组件,将字符串数组以逗号分隔渲染为行内 `<span>` 列表,支持分隔符间距控制。
1426
+
1427
+ #### Props
1428
+
1429
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
1430
+ |------|------|------|--------|--------|
1431
+ | data | 文本数组 | Array | - | - |
1432
+ | gutter | 分隔符间距大小 | String | medium/large | 'medium' |
1433
+
1434
+ #### 示例
1435
+
1436
+ ```vue
1437
+ <template>
1438
+ <multiple-span :data="authors" gutter="large" />
1439
+ </template>
1440
+
1441
+ <script>
1442
+ export default {
1443
+ data() {
1444
+ return {
1445
+ authors: ['张三', '李四', '王五']
1446
+ }
1447
+ }
1448
+ }
1449
+ </script>
1450
+ ```
1451
+
1320
1452
  ## 工具函数
1321
1453
 
1322
1454
  ### 加密与哈希函数
@@ -1334,30 +1466,60 @@ const hash = BaseUtil.MD5('hello world')
1334
1466
  console.log(hash) // 输出: 5eb63bbbe01eeed093cb22bb8f5acdc3
1335
1467
  ```
1336
1468
 
1337
- #### encryptAES(data, key)
1469
+ #### AESEncode(message[, aesKeyStr, aesIvStr])
1338
1470
  - **功能**: 使用AES算法加密数据
1339
- - **参数**:
1340
- - `data` (String): 要加密的数据
1341
- - `key` (String): 加密密钥
1471
+ - **参数**:
1472
+ - `message` (String): 要加密的数据
1473
+ - `aesKeyStr` (String): 加密密钥,默认使用内置 AES_KEY
1474
+ - `aesIvStr` (String): 加密向量,默认使用内置 AES_IV
1342
1475
  - **返回值**: String - 加密后的字符串
1343
1476
  - **示例**:
1344
1477
  ```javascript
1345
1478
  import { BaseUtil } from '@zkwq-x/business'
1346
1479
 
1347
- const encrypted = BaseUtil.encryptAES('sensitive data', 'secret-key')
1480
+ const encrypted = BaseUtil.AESEncode('sensitive data')
1348
1481
  ```
1349
1482
 
1350
- #### decryptAES(encrypted, key)
1483
+ #### AESDecode(message[, aesKeyStr, aesIvStr])
1351
1484
  - **功能**: 使用AES算法解密数据
1352
- - **参数**:
1353
- - `encrypted` (String): 加密的数据
1354
- - `key` (String): 解密密钥
1485
+ - **参数**:
1486
+ - `message` (String): 加密的数据
1487
+ - `aesKeyStr` (String): 解密密钥,默认使用内置 AES_KEY
1488
+ - `aesIvStr` (String): 解密向量,默认使用内置 AES_IV
1489
+ - **返回值**: String - 解密后的原始数据
1490
+ - **示例**:
1491
+ ```javascript
1492
+ import { BaseUtil } from '@zkwq-x/business'
1493
+
1494
+ const decrypted = BaseUtil.AESDecode(encryptedData)
1495
+ ```
1496
+
1497
+ #### AESEncodeBase64(message[, aesKeyStr, aesIvStr])
1498
+ - **功能**: 使用AES算法加密数据,返回 Base64 格式密文
1499
+ - **参数**:
1500
+ - `message` (String): 要加密的数据
1501
+ - `aesKeyStr` (String): 加密密钥,默认使用内置 AES_KEY
1502
+ - `aesIvStr` (String): 加密向量,默认使用内置 AES_IV
1503
+ - **返回值**: String - Base64 格式的加密字符串
1504
+ - **示例**:
1505
+ ```javascript
1506
+ import { BaseUtil } from '@zkwq-x/business'
1507
+
1508
+ const encrypted = BaseUtil.AESEncodeBase64('sensitive data')
1509
+ ```
1510
+
1511
+ #### AESDecodeBase64(message[, aesKeyStr, aesIvStr])
1512
+ - **功能**: 解密 AESEncodeBase64 产生的 Base64 格式密文
1513
+ - **参数**:
1514
+ - `message` (String): Base64 格式的加密数据
1515
+ - `aesKeyStr` (String): 解密密钥,默认使用内置 AES_KEY
1516
+ - `aesIvStr` (String): 解密向量,默认使用内置 AES_IV
1355
1517
  - **返回值**: String - 解密后的原始数据
1356
1518
  - **示例**:
1357
1519
  ```javascript
1358
1520
  import { BaseUtil } from '@zkwq-x/business'
1359
1521
 
1360
- const decrypted = BaseUtil.decryptAES(encryptedData, 'secret-key')
1522
+ const decrypted = BaseUtil.AESDecodeBase64(encryptedBase64Data)
1361
1523
  ```
1362
1524
 
1363
1525
  ### ID与字符串生成函数
@@ -1387,7 +1549,7 @@ const str = BaseUtil.randomString(8)
1387
1549
  console.log(str) // 输出: "a1b2c3d4" (示例)
1388
1550
  ```
1389
1551
 
1390
- #### generateUUID()
1552
+ #### guid()
1391
1553
  - **功能**: 生成UUID字符串
1392
1554
  - **参数**: 无
1393
1555
  - **返回值**: String - UUID格式的字符串
@@ -1395,12 +1557,102 @@ console.log(str) // 输出: "a1b2c3d4" (示例)
1395
1557
  ```javascript
1396
1558
  import { BaseUtil } from '@zkwq-x/business'
1397
1559
 
1398
- const uuid = BaseUtil.generateUUID()
1560
+ const uuid = BaseUtil.guid()
1399
1561
  console.log(uuid) // 输出: "f47ac10b-58cc-4372-a567-0e02b2c3d479" (示例)
1400
1562
  ```
1401
1563
 
1402
1564
  ### 数据验证与处理函数
1403
1565
 
1566
+ #### isString(obj)
1567
+ - **功能**: 检查值是否为字符串类型
1568
+ - **参数**:
1569
+ - `obj` (Any): 要检查的值
1570
+ - **返回值**: Boolean
1571
+ - **示例**:
1572
+ ```javascript
1573
+ import { BaseUtil } from '@zkwq-x/business'
1574
+
1575
+ console.log(BaseUtil.isString('hello')) // true
1576
+ console.log(BaseUtil.isString(123)) // false
1577
+ ```
1578
+
1579
+ #### isObject(obj)
1580
+ - **功能**: 检查值是否为普通对象类型
1581
+ - **参数**:
1582
+ - `obj` (Any): 要检查的值
1583
+ - **返回值**: Boolean
1584
+ - **示例**:
1585
+ ```javascript
1586
+ import { BaseUtil } from '@zkwq-x/business'
1587
+
1588
+ console.log(BaseUtil.isObject({})) // true
1589
+ console.log(BaseUtil.isObject([])) // false
1590
+ ```
1591
+
1592
+ #### isUndefined(val)
1593
+ - **功能**: 检查值是否为 undefined
1594
+ - **参数**:
1595
+ - `val` (Any): 要检查的值
1596
+ - **返回值**: Boolean
1597
+
1598
+ #### isDefined(val)
1599
+ - **功能**: 检查值是否已定义(非 undefined 且非 null)
1600
+ - **参数**:
1601
+ - `val` (Any): 要检查的值
1602
+ - **返回值**: Boolean
1603
+
1604
+ #### looseEqual(a, b)
1605
+ - **功能**: 宽松比较两个值是否相等(对象使用 JSON 序列化比较)
1606
+ - **参数**:
1607
+ - `a` (Any): 第一个值
1608
+ - `b` (Any): 第二个值
1609
+ - **返回值**: Boolean
1610
+
1611
+ #### arrayEquals(arrayA, arrayB)
1612
+ - **功能**: 比较两个数组是否相等(逐元素宽松比较)
1613
+ - **参数**:
1614
+ - `arrayA` (Array): 第一个数组
1615
+ - `arrayB` (Array): 第二个数组
1616
+ - **返回值**: Boolean
1617
+
1618
+ #### isEqual(value1, value2)
1619
+ - **功能**: 比较两个值是否相等,支持数组和普通值
1620
+ - **参数**:
1621
+ - `value1` (Any): 第一个值
1622
+ - `value2` (Any): 第二个值
1623
+ - **返回值**: Boolean
1624
+
1625
+ #### isSupportWebp()
1626
+ - **功能**: 检测当前浏览器是否支持 WebP 图片格式
1627
+ - **参数**: 无
1628
+ - **返回值**: Boolean
1629
+ - **示例**:
1630
+ ```javascript
1631
+ import { BaseUtil } from '@zkwq-x/business'
1632
+
1633
+ if (BaseUtil.isSupportWebp()) {
1634
+ // 使用 WebP 图片
1635
+ }
1636
+ ```
1637
+
1638
+ #### HasChinese(str)
1639
+ - **功能**: 检查字符串是否包含中文字符
1640
+ - **参数**:
1641
+ - `str` (String): 要检查的字符串
1642
+ - **返回值**: Boolean
1643
+
1644
+ #### HasWhiteSpace(str)
1645
+ - **功能**: 检查字符串是否包含空格
1646
+ - **参数**:
1647
+ - `str` (String): 要检查的字符串
1648
+ - **返回值**: Boolean
1649
+
1650
+ #### IsNumber(val)
1651
+ - **功能**: 检查值是否为数字类型
1652
+ - **参数**:
1653
+ - `val` (Any): 要检查的值
1654
+ - **返回值**: Boolean
1655
+
1404
1656
  #### isEmpty(val)
1405
1657
  - **功能**: 检查值是否为空(null、undefined、空字符串、空数组、空对象)
1406
1658
  - **参数**:
@@ -1431,200 +1683,410 @@ console.log(BaseUtil.isArrayEmpty([1, 2, 3])) // false
1431
1683
  console.log(BaseUtil.isArrayEmpty(undefined)) // true
1432
1684
  ```
1433
1685
 
1434
- #### isObjectEmpty(val)
1435
- - **功能**: 检查对象是否为空或未定义
1436
- - **参数**:
1437
- - `val` (Object): 要检查的对象
1438
- - **返回值**: Boolean - 如果对象为空或未定义返回true,否则返回false
1686
+ #### isFunction(functionToCheck)
1687
+ - **功能**: 检查值是否为函数
1688
+ - **参数**:
1689
+ - `functionToCheck` (Any): 要检查的值
1690
+ - **返回值**: Boolean - 如果值是函数返回true,否则返回false
1439
1691
  - **示例**:
1440
1692
  ```javascript
1441
1693
  import { BaseUtil } from '@zkwq-x/business'
1442
1694
 
1443
- console.log(BaseUtil.isObjectEmpty({})) // true
1444
- console.log(BaseUtil.isObjectEmpty({a: 1})) // false
1445
- console.log(BaseUtil.isObjectEmpty(undefined)) // true
1695
+ console.log(BaseUtil.isFunction(() => {})) // true
1696
+ console.log(BaseUtil.isFunction(function() {})) // true
1697
+ console.log(BaseUtil.isFunction('hello')) // false
1446
1698
  ```
1447
1699
 
1448
- #### isFunction(val)
1449
- - **功能**: 检查值是否为函数
1450
- - **参数**:
1451
- - `val` (Any): 要检查的值
1452
- - **返回值**: Boolean - 如果值是函数返回true,否则返回false
1700
+ ### 表单验证函数
1701
+
1702
+ > 以下验证函数符合 Element-UI / base-form 的 validator 规范,可直接用于表单 rules 配置。
1703
+
1704
+ #### ValidateMobile(rule, value, callback)
1705
+ - **功能**: 验证手机号格式
1453
1706
  - **示例**:
1454
1707
  ```javascript
1455
1708
  import { BaseUtil } from '@zkwq-x/business'
1456
1709
 
1457
- console.log(BaseUtil.isFunction(() => {})) // true
1458
- console.log(BaseUtil.isFunction(function() {})) // true
1459
- console.log(BaseUtil.isFunction('hello')) // false
1710
+ rules: {
1711
+ phone: [{ validator: BaseUtil.ValidateMobile, trigger: 'blur' }]
1712
+ }
1460
1713
  ```
1461
1714
 
1715
+ #### ValidateMobileCode(rule, value, callback)
1716
+ - **功能**: 验证短信验证码(6位纯数字)
1717
+
1718
+ #### ValidateCaptcha(rule, value, callback)
1719
+ - **功能**: 验证图形验证码(纯数字)
1720
+
1721
+ #### ValidateEmail(rule, value, callback)
1722
+ - **功能**: 验证邮箱格式
1723
+
1724
+ #### ValidateEmailCode(rule, value, callback)
1725
+ - **功能**: 验证邮箱验证码(6位纯数字)
1726
+
1462
1727
  ### 数据转换函数
1463
1728
 
1464
- #### formatFileSize(bytes)
1465
- - **功能**: 格式化文件大小为人类可读的格式
1466
- - **参数**:
1467
- - `bytes` (Number): 文件大小(字节)
1468
- - **返回值**: String - 格式化后的文件大小(如 "1.5 MB")
1729
+ #### formatNumber(val)
1730
+ - **功能**: 格式化数字,添加千位分隔符
1731
+ - **参数**:
1732
+ - `val` (Number): 要格式化的数字
1733
+ - **返回值**: String - 格式化后的数字字符串(如 "5,416,252")
1469
1734
  - **示例**:
1470
1735
  ```javascript
1471
1736
  import { BaseUtil } from '@zkwq-x/business'
1472
1737
 
1473
- console.log(BaseUtil.formatFileSize(1024)) // "1 KB"
1474
- console.log(BaseUtil.formatFileSize(1048576)) // "1 MB"
1475
- console.log(BaseUtil.formatFileSize(1073741824)) // "1 GB"
1738
+ console.log(BaseUtil.formatNumber(5416252)) // "5,416,252"
1476
1739
  ```
1477
1740
 
1478
- #### formatDate(date, format)
1479
- - **功能**: 格式化日期
1480
- - **参数**:
1481
- - `date` (Date|String|Number): 日期对象、时间戳或日期字符串
1482
- - `format` (String): 日期格式,默认为 "YYYY-MM-DD"
1483
- - **返回值**: String - 格式化后的日期字符串
1741
+ #### formatKNumber(val)
1742
+ - **功能**: 格式化数字为 K 单位(千)
1743
+ - **参数**:
1744
+ - `val` (Number): 要格式化的数字
1745
+ - **返回值**: String|Number - 小于1000返回原值,否则返回如 "6.2K" 格式的字符串
1484
1746
  - **示例**:
1485
1747
  ```javascript
1486
1748
  import { BaseUtil } from '@zkwq-x/business'
1487
1749
 
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" (示例)
1750
+ console.log(BaseUtil.formatKNumber(6252)) // "6.3K"
1751
+ console.log(BaseUtil.formatKNumber(500)) // 500
1490
1752
  ```
1491
1753
 
1492
- #### formatNumber(num, digits)
1493
- - **功能**: 格式化数字,添加千位分隔符
1494
- - **参数**:
1495
- - `num` (Number): 要格式化的数字
1496
- - `digits` (Number): 保留的小数位数,默认为2
1497
- - **返回值**: String - 格式化后的数字字符串
1754
+ #### scaleNumber(val, scale)
1755
+ - **功能**: 对数字进行固定小数位数格式化
1756
+ - **参数**:
1757
+ - `val` (Number): 要格式化的数字
1758
+ - `scale` (Number): 保留的小数位数
1759
+ - **返回值**: String - 固定小数位的数字字符串
1760
+ - **示例**:
1761
+ ```javascript
1762
+ import { BaseUtil } from '@zkwq-x/business'
1763
+
1764
+ console.log(BaseUtil.scaleNumber(3.14159, 2)) // "3.14"
1765
+ ```
1766
+
1767
+ #### ConvertArrayToString(array[, splitSign])
1768
+ - **功能**: 将数组转换为分隔符连接的字符串,自动过滤 null 值
1769
+ - **参数**:
1770
+ - `array` (Array): 要转换的数组
1771
+ - `splitSign` (String): 分隔符,默认 `','`
1772
+ - **返回值**: String - 转换后的字符串,数组为空时返回 `''`
1773
+ - **示例**:
1774
+ ```javascript
1775
+ import { BaseUtil } from '@zkwq-x/business'
1776
+
1777
+ console.log(BaseUtil.ConvertArrayToString(['张三', '李四', '王五'])) // "张三,李四,王五"
1778
+ console.log(BaseUtil.ConvertArrayToString(['a', 'b'], ' | ')) // "a | b"
1779
+ ```
1780
+
1781
+ #### ConvertStringToArray(str[, splitSign])
1782
+ - **功能**: 将分隔符连接的字符串转换为数组
1783
+ - **参数**:
1784
+ - `str` (String): 要转换的字符串
1785
+ - `splitSign` (String): 分隔符,默认 `','`
1786
+ - **返回值**: Array - 转换后的数组,str 为空时返回 `[]`
1787
+ - **示例**:
1788
+ ```javascript
1789
+ import { BaseUtil } from '@zkwq-x/business'
1790
+
1791
+ console.log(BaseUtil.ConvertStringToArray('张三,李四,王五')) // ['张三', '李四', '王五']
1792
+ ```
1793
+
1794
+ #### clearHighlight(str)
1795
+ - **功能**: 清除字符串中的高亮 HTML 标签(`<span class="Highlight">`)
1796
+ - **参数**:
1797
+ - `str` (String): 包含高亮标签的字符串
1798
+ - **返回值**: String - 清除标签后的纯文本
1498
1799
  - **示例**:
1499
1800
  ```javascript
1500
1801
  import { BaseUtil } from '@zkwq-x/business'
1501
1802
 
1502
- console.log(BaseUtil.formatNumber(1234567.891)) // "1,234,567.89"
1503
- console.log(BaseUtil.formatNumber(1234567.891, 0)) // "1,234,568"
1803
+ const raw = '这是<span class="Highlight">高亮</span>内容'
1804
+ console.log(BaseUtil.clearHighlight(raw)) // "这是高亮内容"
1805
+ ```
1806
+
1807
+ #### ClearHtml(text)
1808
+ - **功能**: 清除字符串中所有 HTML 标签
1809
+ - **参数**:
1810
+ - `text` (String): 含 HTML 标签的字符串
1811
+ - **返回值**: String - 纯文本字符串
1812
+
1813
+ ### 数组工具函数
1814
+
1815
+ #### ArraySwapItems(arr, src, dest)
1816
+ - **功能**: 交换数组中两个元素的位置
1817
+ - **参数**:
1818
+ - `arr` (Array): 目标数组
1819
+ - `src` (Number): 源元素索引
1820
+ - `dest` (Number): 目标元素索引
1821
+ - **返回值**: Array - 操作后的数组
1822
+
1823
+ #### ArrayValueEquals(a, b)
1824
+ - **功能**: 严格比较两个数组的值是否完全相同(引用相等或逐元素 `===`)
1825
+ - **参数**:
1826
+ - `a` (Array): 第一个数组
1827
+ - `b` (Array): 第二个数组
1828
+ - **返回值**: Boolean
1829
+
1830
+ #### ArrayUpItem(arr, index)
1831
+ - **功能**: 将数组中指定位置的元素上移一位
1832
+ - **参数**:
1833
+ - `arr` (Array): 目标数组
1834
+ - `index` (Number): 元素索引,已是第一位则不操作
1835
+
1836
+ #### ArrayDownItem(arr, index)
1837
+ - **功能**: 将数组中指定位置的元素下移一位
1838
+ - **参数**:
1839
+ - `arr` (Array): 目标数组
1840
+ - `index` (Number): 元素索引,已是最后一位则不操作
1841
+
1842
+ ### 文件与下载函数
1843
+
1844
+ #### DownloadFile(base64File, fileName)
1845
+ - **功能**: 将 Base64 编码的文件数据下载到本地
1846
+ - **参数**:
1847
+ - `base64File` (String): Base64 格式的文件数据
1848
+ - `fileName` (String): 下载文件名
1849
+ - **示例**:
1850
+ ```javascript
1851
+ import { BaseUtil } from '@zkwq-x/business'
1852
+
1853
+ BaseUtil.DownloadFile(base64Data, 'report.pdf')
1504
1854
  ```
1505
1855
 
1856
+ #### DownloadUrl(url, fileName)
1857
+ - **功能**: 通过 URL 下载文件
1858
+ - **参数**:
1859
+ - `url` (String): 文件 URL
1860
+ - `fileName` (String): 下载文件名
1861
+ - **示例**:
1862
+ ```javascript
1863
+ import { BaseUtil } from '@zkwq-x/business'
1864
+
1865
+ BaseUtil.DownloadUrl('https://example.com/file.pdf', 'file.pdf')
1866
+ ```
1867
+
1868
+ #### Base64toBlob(base64Data[, contentType, sliceSize])
1869
+ - **功能**: 将 Base64 字符串转换为 Blob 对象
1870
+ - **参数**:
1871
+ - `base64Data` (String): Base64 编码数据
1872
+ - `contentType` (String): MIME 类型,默认 `''`
1873
+ - `sliceSize` (Number): 切片大小,默认 `512`
1874
+ - **返回值**: Blob
1875
+
1876
+ #### isPDF(file)
1877
+ - **功能**: 检测文件是否为 PDF 格式(通过读取文件头字节判断)
1878
+ - **参数**:
1879
+ - `file` (File): 文件对象
1880
+ - **返回值**: Promise\<Boolean\>
1881
+ - **示例**:
1882
+ ```javascript
1883
+ import { BaseUtil } from '@zkwq-x/business'
1884
+
1885
+ BaseUtil.isPDF(file).then(result => {
1886
+ console.log('是否为PDF:', result)
1887
+ })
1888
+ ```
1889
+
1890
+ ### 浏览器环境检测函数
1891
+
1892
+ #### isIE()
1893
+ - **功能**: 检测当前浏览器是否为 IE
1894
+ - **返回值**: Boolean
1895
+
1896
+ #### isEdge()
1897
+ - **功能**: 检测当前浏览器是否为 Edge
1898
+ - **返回值**: Boolean
1899
+
1900
+ #### isFirefox()
1901
+ - **功能**: 检测当前浏览器是否为 Firefox
1902
+ - **返回值**: Boolean
1903
+
1506
1904
  ### URL与参数处理函数
1507
1905
 
1508
- #### getQueryString(name)
1906
+ #### getQueryString(name[, mode])
1509
1907
  - **功能**: 获取URL查询字符串参数值
1510
- - **参数**:
1908
+ - **参数**:
1511
1909
  - `name` (String): 参数名
1512
- - **返回值**: String - 参数值,如果不存在则返回null
1910
+ - `mode` (String): 路由模式,`'history'`(默认)或 `'hash'`
1911
+ - **返回值**: String - 参数值,如果不存在则返回空字符串 `''`
1513
1912
  - **示例**:
1514
1913
  ```javascript
1515
1914
  import { BaseUtil } from '@zkwq-x/business'
1516
1915
 
1517
1916
  // 假设当前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
1917
+ console.log(BaseUtil.getQueryString('id')) // "123"
1918
+ console.log(BaseUtil.getQueryString('name')) // "test"
1919
+ console.log(BaseUtil.getQueryString('nonexistent')) // ""
1920
+
1921
+ // hash 路由模式(URL为: https://example.com/#/?id=456)
1922
+ console.log(BaseUtil.getQueryString('id', 'hash')) // "456"
1521
1923
  ```
1522
1924
 
1523
- #### setQueryString(url, params)
1524
- - **功能**: 设置URL查询字符串参数
1525
- - **参数**:
1526
- - `url` (String): 原始URL
1527
- - `params` (Object): 要设置的参数对象
1528
- - **返回值**: String - 设置参数后的URL
1925
+ ### 数据存储函数
1926
+
1927
+ > 存储函数基于 localStorage/sessionStorage 封装,支持过期时间,内部使用 Base64 编码存储。
1928
+
1929
+ #### setStorage(key, value[, expire])
1930
+ - **功能**: 设置本地存储数据(localStorage),支持过期时间
1931
+ - **参数**:
1932
+ - `key` (String): 存储键名
1933
+ - `value` (Any): 要存储的值(自动序列化)
1934
+ - `expire` (Number): 过期时间(毫秒),默认 `7200000`(2小时),传 `-1` 表示永不过期
1935
+ - **返回值**: 无
1529
1936
  - **示例**:
1530
1937
  ```javascript
1531
1938
  import { BaseUtil } from '@zkwq-x/business'
1532
1939
 
1533
- const newUrl = BaseUtil.setQueryString('https://example.com', { id: 123, name: 'test' })
1534
- console.log(newUrl) // "https://example.com?id=123&name=test"
1940
+ BaseUtil.setStorage('user', { id: 1, name: 'John' })
1941
+ BaseUtil.setStorage('token', 'abc123', -1) // 永不过期
1535
1942
  ```
1536
1943
 
1537
- ### 数据存储函数
1944
+ #### getStorage(key)
1945
+ - **功能**: 获取本地存储数据,过期自动清除并返回 null
1946
+ - **参数**:
1947
+ - `key` (String): 存储键名
1948
+ - **返回值**: Any - 存储的值,如果不存在或已过期则返回 null
1949
+ - **示例**:
1950
+ ```javascript
1951
+ import { BaseUtil } from '@zkwq-x/business'
1538
1952
 
1539
- #### setLocalStorage(key, value)
1540
- - **功能**: 设置本地存储数据
1541
- - **参数**:
1953
+ const user = BaseUtil.getStorage('user')
1954
+ console.log(user) // { id: 1, name: 'John' } (示例)
1955
+ ```
1956
+
1957
+ #### removeStorage(key)
1958
+ - **功能**: 删除本地存储数据
1959
+ - **参数**:
1542
1960
  - `key` (String): 存储键名
1543
- - `value` (Any): 要存储的值(会自动序列化为JSON)
1544
1961
  - **返回值**: 无
1545
1962
  - **示例**:
1546
1963
  ```javascript
1547
1964
  import { BaseUtil } from '@zkwq-x/business'
1548
1965
 
1549
- BaseUtil.setLocalStorage('user', { id: 1, name: 'John' })
1966
+ BaseUtil.removeStorage('user')
1550
1967
  ```
1551
1968
 
1552
- #### getLocalStorage(key)
1553
- - **功能**: 获取本地存储数据
1554
- - **参数**:
1969
+ #### setSession(key, value[, expire])
1970
+ - **功能**: 设置会话存储数据(sessionStorage),支持过期时间
1971
+ - **参数**:
1555
1972
  - `key` (String): 存储键名
1556
- - **返回值**: Any - 存储的值(会自动反序列化JSON),如果不存在则返回null
1973
+ - `value` (Any): 要存储的值(自动序列化)
1974
+ - `expire` (Number): 过期时间(毫秒),默认 `72000000`(20小时)
1975
+ - **返回值**: 无
1557
1976
  - **示例**:
1558
1977
  ```javascript
1559
1978
  import { BaseUtil } from '@zkwq-x/business'
1560
1979
 
1561
- const user = BaseUtil.getLocalStorage('user')
1562
- console.log(user) // { id: 1, name: 'John' } (示例)
1980
+ BaseUtil.setSession('tempData', { page: 1 })
1563
1981
  ```
1564
1982
 
1565
- #### removeLocalStorage(key)
1566
- - **功能**: 删除本地存储数据
1567
- - **参数**:
1983
+ #### getSession(key)
1984
+ - **功能**: 获取会话存储数据,过期自动清除并返回 null
1985
+ - **参数**:
1986
+ - `key` (String): 存储键名
1987
+ - **返回值**: Any - 存储的值,如果不存在或已过期则返回 null
1988
+ - **示例**:
1989
+ ```javascript
1990
+ import { BaseUtil } from '@zkwq-x/business'
1991
+
1992
+ const data = BaseUtil.getSession('tempData')
1993
+ ```
1994
+
1995
+ #### removeSession(key)
1996
+ - **功能**: 删除会话存储数据
1997
+ - **参数**:
1568
1998
  - `key` (String): 存储键名
1569
1999
  - **返回值**: 无
1570
2000
  - **示例**:
1571
2001
  ```javascript
1572
2002
  import { BaseUtil } from '@zkwq-x/business'
1573
2003
 
1574
- BaseUtil.removeLocalStorage('user')
2004
+ BaseUtil.removeSession('tempData')
1575
2005
  ```
1576
2006
 
1577
2007
  ### 其他工具函数
1578
2008
 
1579
- #### debounce(func, wait)
1580
- - **功能**: 创建防抖函数
1581
- - **参数**:
1582
- - `func` (Function): 要防抖的函数
1583
- - `wait` (Number): 等待时间(毫秒)
1584
- - **返回值**: Function - 防抖后的函数
2009
+ #### ClearInterval(timer)
2010
+ - **功能**: 安全清除 setInterval 定时器并置为 null
2011
+ - **参数**:
2012
+ - `timer`: 定时器引用
1585
2013
  - **示例**:
1586
2014
  ```javascript
1587
2015
  import { BaseUtil } from '@zkwq-x/business'
1588
2016
 
1589
- const debouncedSearch = BaseUtil.debounce((query) => {
1590
- console.log('搜索:', query)
1591
- }, 300)
2017
+ let timer = setInterval(() => {}, 1000)
2018
+ BaseUtil.ClearInterval(timer)
2019
+ ```
1592
2020
 
1593
- debouncedSearch('test') // 只在停止输入300ms后执行
2021
+ #### ClearTimeout(timer)
2022
+ - **功能**: 安全清除 setTimeout 定时器并置为 null
2023
+ - **参数**:
2024
+ - `timer`: 定时器引用
2025
+
2026
+ #### CalcTextWidth(text[, font])
2027
+ - **功能**: 使用 Canvas 计算文本的像素宽度
2028
+ - **参数**:
2029
+ - `text` (String): 要计算的文本
2030
+ - `font` (String): CSS font 字符串,默认为系统默认字体 14px
2031
+ - **返回值**: Number - 文本像素宽度
2032
+ - **示例**:
2033
+ ```javascript
2034
+ import { BaseUtil } from '@zkwq-x/business'
2035
+
2036
+ const width = BaseUtil.CalcTextWidth('Hello World')
2037
+ console.log(width) // 输出像素宽度数值
1594
2038
  ```
1595
2039
 
1596
- #### throttle(func, wait)
1597
- - **功能**: 创建节流函数
1598
- - **参数**:
1599
- - `func` (Function): 要节流的函数
1600
- - `wait` (Number): 等待时间(毫秒)
1601
- - **返回值**: Function - 节流后的函数
2040
+ #### GenerateNonce(length)
2041
+ - **功能**: 生成指定长度的大写随机字符串(含数字和字母)
2042
+ - **参数**:
2043
+ - `length` (Number): 字符串长度,为空时返回 null
2044
+ - **返回值**: String|null
1602
2045
  - **示例**:
1603
2046
  ```javascript
1604
2047
  import { BaseUtil } from '@zkwq-x/business'
1605
2048
 
1606
- const throttledScroll = BaseUtil.throttle(() => {
1607
- console.log('滚动事件')
1608
- }, 100)
2049
+ const nonce = BaseUtil.GenerateNonce(16)
2050
+ console.log(nonce) // 输出如: "A3B7C2D9E1F4G8H5"
2051
+ ```
1609
2052
 
1610
- window.addEventListener('scroll', throttledScroll)
2053
+ #### isArrayContains(arr, item)
2054
+ - **功能**: 检查数组是否包含指定元素
2055
+ - **参数**:
2056
+ - `arr` (Array): 目标数组
2057
+ - `item` (Any): 要查找的元素
2058
+ - **返回值**: Boolean
2059
+ - **示例**:
2060
+ ```javascript
2061
+ import { BaseUtil } from '@zkwq-x/business'
2062
+
2063
+ console.log(BaseUtil.isArrayContains([1, 2, 3], 2)) // true
2064
+ console.log(BaseUtil.isArrayContains([1, 2, 3], 5)) // false
1611
2065
  ```
1612
2066
 
1613
- #### deepClone(obj)
1614
- - **功能**: 深度克隆对象
1615
- - **参数**:
1616
- - `obj` (Any): 要克隆的对象
1617
- - **返回值**: Any - 克隆后的对象
2067
+ #### getStringLength(str)
2068
+ - **功能**: 获取字符串的字节长度(中文字符计2字节,英文字符计1字节)
2069
+ - **参数**:
2070
+ - `str` (String): 目标字符串
2071
+ - **返回值**: Number - 字节长度
1618
2072
  - **示例**:
1619
2073
  ```javascript
1620
2074
  import { BaseUtil } from '@zkwq-x/business'
1621
2075
 
1622
- const original = { a: 1, b: { c: 2 } }
1623
- const cloned = BaseUtil.deepClone(original)
2076
+ console.log(BaseUtil.getStringLength('hello')) // 5
2077
+ console.log(BaseUtil.getStringLength('你好')) // 4
2078
+ ```
1624
2079
 
1625
- cloned.b.c = 3
1626
- console.log(original.b.c) // 2 (原对象未受影响)
1627
- console.log(cloned.b.c) // 3
2080
+ #### getPlainUrl(url)
2081
+ - **功能**: 获取去除查询参数后的纯 URL
2082
+ - **参数**:
2083
+ - `url` (String): 原始 URL
2084
+ - **返回值**: String|null - 去除 `?` 及其后内容的 URL,url 为空时返回 null
2085
+ - **示例**:
2086
+ ```javascript
2087
+ import { BaseUtil } from '@zkwq-x/business'
2088
+
2089
+ console.log(BaseUtil.getPlainUrl('https://example.com/page?id=1')) // "https://example.com/page"
1628
2090
  ```
1629
2091
 
1630
2092
  ### Base64Util
@@ -1681,68 +2143,146 @@ http.post('/api/data', { name: 'test' }).then(response => {
1681
2143
 
1682
2144
  ### CONSTANT
1683
2145
 
1684
- 常量集合。
1685
-
1686
- #### 属性
1687
-
1688
- | 属性名 | 说明 | 类型 |
1689
- |--------|------|------|
1690
- | API_BASE_URL | API基础URL | string |
1691
- | STATUS_CODE | 状态码常量 | object |
2146
+ 常量集合,包含资源类型、投票类型、上传地址、移动端断点等业务常量。
2147
+
2148
+ #### 导出常量
2149
+
2150
+ | 常量名 | 说明 | |
2151
+ |--------|------|----|
2152
+ | TYPE_ARTICLE | 文章类型 | `'article'` |
2153
+ | TYPE_PATENT | 专利类型 | `'patent'` |
2154
+ | TYPE_REPORT | 报告类型 | `'report'` |
2155
+ | TYPE_BOOK | 图书类型 | `'book'` |
2156
+ | TYPE_HANDBOOK | 手册类型 | `'handbook'` |
2157
+ | TYPE_PROJECT | 项目类型 | `'project'` |
2158
+ | TYPE_SCIENCE_DB | 科学数据类型 | `'sciencedata'` |
2159
+ | TYPE_SOFTWARE | 软件类型 | `'software'` |
2160
+ | TYPE_MONOGRAPH | 专著类型 | `'monograph'` |
2161
+ | TYPE_AWARD | 奖项类型 | `'award'` |
2162
+ | TYPE_LITERATURE | 文献类型 | `'literature'` |
2163
+ | TYPE_NEWS | 新闻类型 | `'news'` |
2164
+ | TYPE_JOURNAL | 期刊类型 | `'journal'` |
2165
+ | TYPE_CHINAXIV | ChinaXiv类型 | `'chinaxiv'` |
2166
+ | TYPE_BULLETIN | 公告类型 | `'bulletin'` |
2167
+ | TYPE_BULLETIN_REPORT | 公告报告类型 | `'bulletin_report'` |
2168
+ | TYPE_FAVLIST | 收藏列表类型 | `'favlist'` |
2169
+ | TYPE_COMMENT | 评论类型 | `'comment'` |
2170
+ | VOTE_TYPE_NEUTRAL | 中立投票 | `'neutral'` |
2171
+ | VOTE_TYPE_UP | 点赞投票 | `'up'` |
2172
+ | TYPE_FOLLOWER | 粉丝类型 | `'follower'` |
2173
+ | TYPE_FOLLOWEE | 关注类型 | `'followee'` |
2174
+ | UPLOAD_ACTION | 默认文件上传地址 | 动态(基于 location) |
2175
+ | UPLOAD_ACTION_HKY | HKY 文件上传地址 | 动态(基于 location) |
2176
+ | BASE_FILE_URL | 文件下载基础 URL | 动态(基于 location) |
2177
+ | MOBILE_CLIENT_WIDTH | 移动端宽度断点 | `576` |
2178
+ | AES_KEY | AES 加密默认密钥 | 内置值 |
2179
+ | AES_IV | AES 加密默认向量 | 内置值 |
1692
2180
 
1693
2181
  #### 示例
1694
2182
 
1695
2183
  ```javascript
1696
2184
  import { CONSTANT } from '@zkwq-x/business';
1697
2185
 
1698
- // 使用常量
1699
- console.log(CONSTANT.API_BASE_URL);
1700
- console.log(CONSTANT.STATUS_CODE.SUCCESS);
2186
+ if (item.type === CONSTANT.TYPE_ARTICLE) {
2187
+ // 处理文章类型
2188
+ }
2189
+
2190
+ const isPC = window.innerWidth > CONSTANT.MOBILE_CLIENT_WIDTH
1701
2191
  ```
1702
2192
 
1703
2193
  ### ScrollTool
1704
2194
 
1705
- 滚动工具。
2195
+ 滚动工具类,封装了纵向/横向滚动监听,支持滚动到顶/左边缘及销毁监听。
2196
+
2197
+ #### 构造函数
2198
+
2199
+ ```javascript
2200
+ new ScrollTool(dom?, useCapture?)
2201
+ ```
2202
+
2203
+ | 参数 | 说明 | 类型 | 默认值 |
2204
+ |------|------|------|--------|
2205
+ | dom | 监听滚动的 DOM 元素 | Element | `document` |
2206
+ | useCapture | 是否使用捕获阶段 | Boolean | `false` |
1706
2207
 
1707
2208
  #### 方法
1708
2209
 
1709
2210
  | 方法名 | 说明 | 参数 |
1710
2211
  |--------|------|------|
1711
- | scrollToTop | 滚动到顶部 | - |
1712
- | scrollToElement | 滚动到指定元素 | (selector: string) |
1713
- | scrollBottom | 滚动到底部 | - |
2212
+ | toTop | 滚动到最顶部(scrollTop = 0) | - |
2213
+ | toLeft | 滚动到最左侧(scrollLeft = 0) | - |
2214
+ | init(callBack) | 初始化滚动监听,回调参数:`(scrollPosition, isBottom, scrollType, event)` | callBack: Function |
2215
+ | destroy | 销毁滚动监听 | - |
2216
+
2217
+ > `init` 回调参数说明:
2218
+ > - `scrollPosition` (Number): 当前滚动位置
2219
+ > - `isBottom` (Boolean): 是否已到达底部/右侧边缘
2220
+ > - `scrollType` (String): 滚动方向,`'vertical'` 或 `'horizontal'`
2221
+ > - `event` (Event): 原始滚动事件
1714
2222
 
1715
2223
  #### 示例
1716
2224
 
1717
2225
  ```javascript
1718
2226
  import { ScrollTool } from '@zkwq-x/business';
1719
2227
 
1720
- // 滚动到顶部
1721
- ScrollTool.scrollToTop();
2228
+ const scroller = new ScrollTool(this.$refs.container)
2229
+
2230
+ scroller.init((position, isBottom, type) => {
2231
+ if (type === 'vertical' && isBottom) {
2232
+ // 纵向滚动到底,加载更多
2233
+ this.loadMore()
2234
+ }
2235
+ })
1722
2236
 
1723
- // 滚动到指定元素
1724
- ScrollTool.scrollToElement('#target');
2237
+ // 组件销毁时
2238
+ scroller.destroy()
1725
2239
  ```
1726
2240
 
1727
- ### Quote
2241
+ ### ExportUtil
1728
2242
 
1729
- 引用工具。
2243
+ 资源导出工具模块(对应源文件 `util/quote.js`),提供将搜索结果批量导出为 Excel(.xlsx)或 RIS(.ris)格式的功能。
1730
2244
 
1731
- #### 方法
2245
+ #### 函数
1732
2246
 
1733
- | 方法名 | 说明 | 参数 | 返回值 |
1734
- |--------|------|------|--------|
1735
- | format | 格式化引用 | (text: string) | string |
2247
+ ##### exportExcel(applicationId, fileName, sheetName, models, resourcePrefix)
2248
+ - **功能**: 将资源数据导出为 Excel 文件并触发浏览器下载
2249
+ - **参数**:
2250
+ - `applicationId` (String): 应用 ID
2251
+ - `fileName` (String): 导出文件名(无需扩展名)
2252
+ - `sheetName` (String): Sheet 名称
2253
+ - `models` (Array): 资源数据数组,支持 article/patent/sciencedata/report/book 等类型
2254
+ - `resourcePrefix` (String): 资源详情页 URL 前缀,如 `'https://example.com/article/'`
2255
+ - **返回值**: Promise
2256
+ - **示例**:
2257
+ ```javascript
2258
+ import { exportExcel } from '@zkwq-x/business'
1736
2259
 
1737
- #### 示例
2260
+ exportExcel('app001', '论文导出', '论文', articleList, 'https://example.com/article/')
2261
+ ```
1738
2262
 
2263
+ ##### buildExcelParams(applicationId, fileName, sheetName, models, resourcePrefix)
2264
+ - **功能**: 构建 Excel 导出参数对象(不触发下载,用于自定义处理)
2265
+ - **返回值**: Object - 包含 `appid`、`fileName`、`sheetName`、`head`、`data` 的参数对象
2266
+
2267
+ ##### exportRIS(applicationId, fileName, models, resourcePrefix)
2268
+ - **功能**: 将资源数据导出为 RIS 文件并触发浏览器下载
2269
+ - **参数**:
2270
+ - `applicationId` (String): 应用 ID
2271
+ - `fileName` (String): 导出文件名(无需扩展名)
2272
+ - `models` (Array): 资源数据数组
2273
+ - `resourcePrefix` (String): 资源详情页 URL 前缀
2274
+ - **返回值**: Promise
2275
+ - **示例**:
1739
2276
  ```javascript
1740
- import { Quote } from '@zkwq-x/business';
2277
+ import { exportRIS } from '@zkwq-x/business'
1741
2278
 
1742
- // 格式化引用
1743
- const formattedQuote = Quote.format('这是一段引用文本');
2279
+ exportRIS('app001', '专利导出', patentList, 'https://example.com/patent/')
1744
2280
  ```
1745
2281
 
2282
+ ##### buildRISParams(applicationId, fileName, models, resourcePrefix)
2283
+ - **功能**: 构建 RIS 导出参数对象(不触发下载,用于自定义处理)
2284
+ - **返回值**: Object - 包含 `appid`、`fileName`、`text` 的参数对象
2285
+
1746
2286
  ### Bus
1747
2287
 
1748
2288
  事件总线。
@@ -1774,23 +2314,62 @@ Bus.on('another-event', handler)
1774
2314
  Bus.remove('another-event', handler)
1775
2315
  ```
1776
2316
 
2317
+ ### CheckRobot
2318
+
2319
+ 机器人验证工具,通过命令式方式弹出验证码对话框,验证通过后自动刷新页面。通常用于 HTTP 响应拦截器中,当检测到需要人机验证时触发。
2320
+
2321
+ #### 函数
2322
+
2323
+ ##### createCaptchaDialog()
2324
+ - **功能**: 创建并显示机器人验证对话框(单例,防止重复弹出)。验证成功后页面自动刷新。
2325
+ - **参数**: 无
2326
+ - **示例**:
2327
+ ```javascript
2328
+ import { CheckRobot } from '@zkwq-x/business'
2329
+
2330
+ // 在 axios 拦截器中使用
2331
+ axios.interceptors.response.use(null, error => {
2332
+ if (error.response?.status === 403) {
2333
+ CheckRobot.createCaptchaDialog()
2334
+ }
2335
+ return Promise.reject(error)
2336
+ })
2337
+ ```
2338
+
1777
2339
  ### HighLight
1778
2340
 
1779
- 高亮工具。
2341
+ 高亮工具,支持中英文混合文本的关键词高亮,通过 Proxy 实现对对象/数组的递归高亮处理。
1780
2342
 
1781
2343
  #### 方法
1782
2344
 
1783
2345
  | 方法名 | 说明 | 参数 | 返回值 |
1784
2346
  |--------|------|------|--------|
1785
- | highlight | 高亮文本 | (text: string, keyword: string) | string |
2347
+ | check | 检查文本是否包含指定关键词 | `(str, particles, ignoreCase?)` | Boolean |
2348
+ | build | 对文本(或对象/数组)进行高亮处理,返回含高亮标签的 HTML 字符串或 Proxy | `(obj, particles, options?)` | String\|Proxy |
2349
+
2350
+ > `build` options 参数说明:
2351
+ > - `ignoreCase` (Boolean): 是否忽略大小写,默认 `false`
2352
+ > - `startTag` (String): 高亮包裹标签名,默认 `'span'`
2353
+ > - `classMapper` (Array): 关键词样式映射,格式 `[{ patten: '关键词', classList: ['class1'] }]`
1786
2354
 
1787
2355
  #### 示例
1788
2356
 
1789
2357
  ```javascript
1790
2358
  import { HighLight } from '@zkwq-x/business';
1791
2359
 
2360
+ // 检查是否包含关键词
2361
+ const contains = HighLight.check('Vue is awesome', ['Vue'], true)
2362
+ console.log(contains) // true
2363
+
1792
2364
  // 高亮文本
1793
- const highlightedText = HighLight.highlight('原始文本', '关键词');
2365
+ const html = HighLight.build('Vue is awesome', ['Vue'], { ignoreCase: true })
2366
+ console.log(html)
2367
+ // 输出: '<span class="highlight_text ">Vue</span> is awesome'
2368
+
2369
+ // 高亮对象属性(通过 Proxy)
2370
+ const obj = { title: 'Vue框架介绍', abstract: '关于Vue的详细介绍' }
2371
+ const highlighted = HighLight.build(obj, ['Vue'], {})
2372
+ console.log(highlighted.title) // 返回高亮后的 title 字符串
1794
2373
  ```
1795
2374
 
1796
2375
  ## 服务模块
@@ -2108,7 +2687,7 @@ Service.GetSearchSuggestions('Vue').then(suggestions => {
2108
2687
 
2109
2688
  ```vue
2110
2689
  <template>
2111
- <button v-ipple>点击我有水波纹效果</button>
2690
+ <button v-ripple>点击我有水波纹效果</button>
2112
2691
  </template>
2113
2692
  ```
2114
2693