@zero-library/common 2.1.10 → 2.2.0
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/dist/index.cjs.js +877 -340
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.mts +1587 -144
- package/dist/index.d.ts +1587 -144
- package/dist/index.esm.js +829 -307
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -3,8 +3,9 @@ import * as react from 'react';
|
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
import dayjs from 'dayjs';
|
|
5
5
|
import Decimal from 'decimal.js';
|
|
6
|
+
import { RuleObject } from 'antd/es/form';
|
|
7
|
+
import * as axios from 'axios';
|
|
6
8
|
import { AxiosRequestConfig } from 'axios';
|
|
7
|
-
import { ThemeConfig } from 'antd/lib';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* 音频播放器组件属性接口
|
|
@@ -18,7 +19,7 @@ interface AudioPlayerProps {
|
|
|
18
19
|
* 提供基本的音频播放功能
|
|
19
20
|
* @param props - 组件属性
|
|
20
21
|
*/
|
|
21
|
-
declare const _default$
|
|
22
|
+
declare const _default$m: ({ fileUrl }: AudioPlayerProps) => react_jsx_runtime.JSX.Element;
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
25
|
* 文件图标组件属性接口
|
|
@@ -44,7 +45,7 @@ interface FileIconProps {
|
|
|
44
45
|
* @param props - 组件属性
|
|
45
46
|
* @returns 对应文件类型的图标
|
|
46
47
|
*/
|
|
47
|
-
declare const _default$
|
|
48
|
+
declare const _default$l: ({ suffix, fontSize }: FileIconProps) => react_jsx_runtime.JSX.Element;
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* 文件预览组件属性接口
|
|
@@ -79,7 +80,7 @@ interface FilePreviewProps {
|
|
|
79
80
|
* 支持图片、PDF、视频、音频、Markdown等文件格式的预览
|
|
80
81
|
* @param props - 组件属性
|
|
81
82
|
*/
|
|
82
|
-
declare const _default$
|
|
83
|
+
declare const _default$k: ({ suffix, fileUrl, pdfParams, password, searchValue }: FilePreviewProps) => react_jsx_runtime.JSX.Element;
|
|
83
84
|
|
|
84
85
|
/**
|
|
85
86
|
* 文件预览抽屉组件属性接口
|
|
@@ -130,7 +131,7 @@ interface FilePreviewDrawerProps {
|
|
|
130
131
|
* @param props - 组件属性
|
|
131
132
|
* @returns 文件预览抽屉组件
|
|
132
133
|
*/
|
|
133
|
-
declare const _default$
|
|
134
|
+
declare const _default$j: ({ open, fileUrl, suffix, title, onClose, password, fileParams, pdfParams, onSetPassSuccess }: FilePreviewDrawerProps) => react_jsx_runtime.JSX.Element;
|
|
134
135
|
|
|
135
136
|
/**
|
|
136
137
|
* Markdown预览组件属性接口
|
|
@@ -146,7 +147,7 @@ interface MarkdownPreviewProps {
|
|
|
146
147
|
* 从指定URL获取Markdown内容并渲染显示
|
|
147
148
|
* @param props - 组件属性
|
|
148
149
|
*/
|
|
149
|
-
declare const _default$
|
|
150
|
+
declare const _default$i: ({ fileUrl, searchValue }: MarkdownPreviewProps) => react_jsx_runtime.JSX.Element;
|
|
150
151
|
|
|
151
152
|
/**
|
|
152
153
|
* PDF预览组件属性接口
|
|
@@ -173,7 +174,7 @@ interface PdfPreviewProps {
|
|
|
173
174
|
* 支持密码保护、缩略图、缩放、页面导航等功能
|
|
174
175
|
* @param props - 组件属性
|
|
175
176
|
*/
|
|
176
|
-
declare const _default$
|
|
177
|
+
declare const _default$h: ({ password, fileUrl, pageNo, scale, isHasThumbnails, onSetPassword, onSetPageNo }: PdfPreviewProps) => react_jsx_runtime.JSX.Element;
|
|
177
178
|
|
|
178
179
|
/**
|
|
179
180
|
* 视频播放器组件属性接口
|
|
@@ -187,12 +188,14 @@ interface VideoPlayerProps {
|
|
|
187
188
|
* 提供基本的视频播放功能
|
|
188
189
|
* @param props - 组件属性
|
|
189
190
|
*/
|
|
190
|
-
declare const _default$
|
|
191
|
+
declare const _default$g: ({ fileUrl }: VideoPlayerProps) => react_jsx_runtime.JSX.Element;
|
|
191
192
|
|
|
192
193
|
/**
|
|
193
194
|
* Iframe组件属性接口
|
|
194
195
|
*/
|
|
195
196
|
interface IframeProps {
|
|
197
|
+
/** 默认主源 */
|
|
198
|
+
defaultMainSource?: string;
|
|
196
199
|
/** iframe ID */
|
|
197
200
|
id?: string;
|
|
198
201
|
/** iframe源地址 */
|
|
@@ -207,7 +210,7 @@ interface IframeProps {
|
|
|
207
210
|
* 支持加载状态、URL参数处理、防缓存等功能
|
|
208
211
|
* @param props - 组件属性
|
|
209
212
|
*/
|
|
210
|
-
declare const _default$
|
|
213
|
+
declare const _default$f: react.ForwardRefExoticComponent<IframeProps & react.RefAttributes<HTMLIFrameElement>>;
|
|
211
214
|
|
|
212
215
|
/**
|
|
213
216
|
* 组件映射类型,用于延时加载
|
|
@@ -232,7 +235,7 @@ interface LazyComponentProps {
|
|
|
232
235
|
* 使用示例:<LazyComponent type="renderMarkdown" data={{}} loading={true} />
|
|
233
236
|
* @param props - 组件属性
|
|
234
237
|
*/
|
|
235
|
-
declare const _default$
|
|
238
|
+
declare const _default$e: ({ type, customComponents, ...rest }: LazyComponentProps) => react_jsx_runtime.JSX.Element;
|
|
236
239
|
|
|
237
240
|
/**
|
|
238
241
|
* Markdown编辑器组件属性接口
|
|
@@ -263,7 +266,7 @@ interface MarkdownEditorProps {
|
|
|
263
266
|
* 提供丰富的编辑功能:格式化、链接、图片、表格、高亮等
|
|
264
267
|
* @param props - 组件属性
|
|
265
268
|
*/
|
|
266
|
-
declare const _default$
|
|
269
|
+
declare const _default$d: ({ value, onChange, onScrollPage, searchValue, disabled, extraNav, showToolbar, onQuote, onDownloadFile }: MarkdownEditorProps) => react_jsx_runtime.JSX.Element;
|
|
267
270
|
|
|
268
271
|
/**
|
|
269
272
|
* Markdown渲染组件属性接口
|
|
@@ -284,9 +287,9 @@ interface RenderMarkdownProps {
|
|
|
284
287
|
* Markdown渲染组件
|
|
285
288
|
* 将Markdown文本转换为HTML并渲染为React组件
|
|
286
289
|
* 支持自定义组件、搜索高亮、内容编辑等功能
|
|
287
|
-
* @param
|
|
290
|
+
* @param RenderMarkdownProps - 组件属性
|
|
288
291
|
*/
|
|
289
|
-
declare const _default$
|
|
292
|
+
declare const _default$c: ({ content, searchValue, customComponents, onChange, onPartialChange }: RenderMarkdownProps) => react_jsx_runtime.JSX.Element;
|
|
290
293
|
|
|
291
294
|
/**
|
|
292
295
|
* 渲染控制对象类型
|
|
@@ -338,7 +341,8 @@ interface RenderWrapperProps<C, P> {
|
|
|
338
341
|
* @param props - 组件属性
|
|
339
342
|
* @returns 渲染的组件或null
|
|
340
343
|
*/
|
|
341
|
-
declare const
|
|
344
|
+
declare const _default$b: react.ForwardRefExoticComponent<RenderWrapperProps<unknown, unknown> & react.RefAttributes<unknown>>;
|
|
345
|
+
|
|
342
346
|
/**
|
|
343
347
|
* 判断是否应该渲染组件
|
|
344
348
|
* @param control - 渲染控制配置
|
|
@@ -373,351 +377,1790 @@ interface UserAvatarProps {
|
|
|
373
377
|
* 如果没有头像图片,则显示用户名首字母作为头像
|
|
374
378
|
* @param props - 组件属性
|
|
375
379
|
*/
|
|
376
|
-
declare const _default: ({ size, avatarSrc, userName }: UserAvatarProps) => react_jsx_runtime.JSX.Element;
|
|
380
|
+
declare const _default$a: ({ size, avatarSrc, userName }: UserAvatarProps) => react_jsx_runtime.JSX.Element;
|
|
377
381
|
|
|
382
|
+
/**
|
|
383
|
+
* iframe 消息参数类型
|
|
384
|
+
* 定义跨iframe通信时的参数结构
|
|
385
|
+
*/
|
|
378
386
|
type Params = Record<string, any>;
|
|
379
387
|
/**
|
|
380
|
-
*
|
|
388
|
+
* 向父页面或顶级窗口发送消息
|
|
389
|
+
* @param type - 消息类型
|
|
390
|
+
* @param data - 消息数据
|
|
391
|
+
* @param to - 发送目标,默认为'top'
|
|
381
392
|
*/
|
|
382
393
|
declare function emit(type: string, data?: Params, to?: 'parent' | 'top'): void;
|
|
383
394
|
/**
|
|
384
|
-
*
|
|
395
|
+
* 向子iframe发送消息
|
|
396
|
+
* @param iframeWindow - 目标iframe的contentWindow
|
|
397
|
+
* @param type - 消息类型
|
|
398
|
+
* @param data - 消息数据
|
|
399
|
+
* @param origin - 消息源,默认为'*'
|
|
385
400
|
*/
|
|
386
401
|
declare function emitToChild(iframeWindow: Window | null, type: string, data?: Params, origin?: string): void;
|
|
387
402
|
|
|
403
|
+
/**
|
|
404
|
+
* 消息处理器函数类型定义
|
|
405
|
+
* @template P 参数类型,默认为 Params
|
|
406
|
+
* @param params 消息参数
|
|
407
|
+
* @param source 消息源窗口对象
|
|
408
|
+
* @param origin 消息来源
|
|
409
|
+
*/
|
|
388
410
|
type Handler<P = Params> = (params: P, source?: MessageEventSource | null, origin?: string) => void;
|
|
389
|
-
|
|
411
|
+
/**
|
|
412
|
+
* iframe 消息中继桥接 Hook
|
|
413
|
+
*
|
|
414
|
+
* 提供跨 iframe 消息通信的桥接功能,支持:
|
|
415
|
+
* - 消息监听与分发
|
|
416
|
+
* - 来源验证(白名单机制)
|
|
417
|
+
* - 消息类型处理
|
|
418
|
+
* - 父子窗口通信
|
|
419
|
+
* - 顶层窗口消息转发
|
|
420
|
+
*
|
|
421
|
+
* @param allowedOrigins 允许的消息来源域名列表,默认允许所有来源
|
|
422
|
+
*
|
|
423
|
+
* @example
|
|
424
|
+
* ```tsx
|
|
425
|
+
* const { on, off } = useIframeRelayBridge(['https://example.com'])
|
|
426
|
+
*
|
|
427
|
+
* // 监听消息
|
|
428
|
+
* const handleMessage = (params, source, origin) => {
|
|
429
|
+
* console.log('收到消息:', params)
|
|
430
|
+
* }
|
|
431
|
+
* on('custom-event', handleMessage)
|
|
432
|
+
*
|
|
433
|
+
* // 取消监听
|
|
434
|
+
* off('custom-event', handleMessage)
|
|
435
|
+
* ```
|
|
436
|
+
*/
|
|
437
|
+
declare const _default$9: (allowedOrigins?: string[]) => {
|
|
390
438
|
on: (type: string, handler: Handler<Params>) => void;
|
|
391
439
|
off: (type: string, handler: Handler<Params>) => void;
|
|
392
440
|
};
|
|
393
441
|
|
|
394
442
|
/**
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
*
|
|
443
|
+
* 通用的自动刷新 Hook
|
|
444
|
+
* 监听指定值的变化,当满足条件时自动触发回调函数
|
|
445
|
+
*
|
|
446
|
+
* @param listenValue - 要监听的值
|
|
447
|
+
* @param shouldRefresh - 判断是否需要触发回调的函数,接收 listenValue 作为参数
|
|
448
|
+
* @param callback - 执行刷新动作的异步方法
|
|
449
|
+
* @param delay - 延迟时间(毫秒),默认为 10000ms
|
|
450
|
+
* @returns 清理定时器的函数
|
|
451
|
+
*/
|
|
452
|
+
declare const _default$8: <T>(listenValue: T, shouldRefresh: (listenValue: T) => boolean, callback: () => Promise<void>, delay?: number) => void;
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* 倒计时 Hook
|
|
456
|
+
* 提供倒计时功能,支持开始、暂停、完成回调等操作
|
|
457
|
+
*
|
|
458
|
+
* @param callback - 倒计时结束时的回调函数
|
|
459
|
+
* @returns 倒计时控制对象
|
|
460
|
+
*/
|
|
461
|
+
declare const _default$7: (callback?: () => void) => {
|
|
462
|
+
count: number;
|
|
463
|
+
start: (initialValue?: number) => void;
|
|
464
|
+
pause: () => void;
|
|
465
|
+
startCount: number;
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* 通用的 Valtio Context 创建工厂 Hook
|
|
470
|
+
* 创建 Valtio 状态管理的 Context 和 Provider
|
|
471
|
+
*
|
|
472
|
+
* 支持的操作:
|
|
473
|
+
* - ValtioProvider:包裹组件以提供 store 状态
|
|
474
|
+
* - useValtioStore:在组件中获取 store 实例
|
|
475
|
+
*
|
|
476
|
+
* @template T - Store 对象类型
|
|
477
|
+
* @returns Valtio Context 相关的工具函数
|
|
398
478
|
*/
|
|
399
|
-
declare
|
|
479
|
+
declare const _default$6: <T extends object>() => {
|
|
400
480
|
ValtioProvider: ({ store, children }: {
|
|
401
481
|
store: T;
|
|
402
482
|
children?: ReactNode;
|
|
403
483
|
}) => react_jsx_runtime.JSX.Element;
|
|
404
484
|
useValtioStore: () => T;
|
|
485
|
+
Context: react.Context<T>;
|
|
405
486
|
};
|
|
406
487
|
|
|
407
488
|
/**
|
|
408
|
-
* 防抖
|
|
409
|
-
*
|
|
410
|
-
*
|
|
489
|
+
* 防抖 Hook
|
|
490
|
+
* 在指定时间内多次调用只执行最后一次,延迟指定时间后执行
|
|
491
|
+
*
|
|
492
|
+
* @param func - 需要防抖的函数
|
|
493
|
+
* @param wait - 延迟时间(毫秒),默认为400ms
|
|
494
|
+
* @returns 防抖处理后的函数,包含 flush 和 cancel 方法
|
|
411
495
|
*/
|
|
412
|
-
declare
|
|
496
|
+
declare const _default$5: <A extends Array<any>, R = void>(func: (..._args: A) => R, wait?: number) => {
|
|
413
497
|
(..._args: A): Promise<R>;
|
|
498
|
+
/** 添加额外方法到防抖函数 */
|
|
414
499
|
flush: () => any;
|
|
415
500
|
cancel: () => void;
|
|
416
501
|
};
|
|
417
502
|
|
|
418
503
|
/**
|
|
419
|
-
*
|
|
420
|
-
*
|
|
504
|
+
* 深度比较 useEffect Hook
|
|
505
|
+
* 使用深度比较算法来检测依赖项变化,避免不必要的重新渲染
|
|
506
|
+
*
|
|
507
|
+
* @param effect - 要执行的副作用函数
|
|
508
|
+
* @param deps - 依赖项数组
|
|
421
509
|
*/
|
|
422
|
-
declare
|
|
510
|
+
declare const _default$4: (effect: React.EffectCallback, deps: any[]) => void;
|
|
423
511
|
|
|
424
512
|
/**
|
|
425
|
-
* 创建同时具有 ref 和 state 特性的状态
|
|
513
|
+
* 创建同时具有 ref 和 state 特性的状态 Hook
|
|
514
|
+
* 解决了 useState 在异步闭包中获取不到最新值的问题
|
|
515
|
+
*
|
|
426
516
|
* @param init - 初始值
|
|
427
517
|
* @returns [state, setState, getState] 元组,包含状态值、设置函数和获取函数
|
|
428
518
|
*/
|
|
429
|
-
declare
|
|
519
|
+
declare const _default$3: <T>(init: T) => readonly [T, (newVal: T) => void, () => T];
|
|
430
520
|
|
|
431
521
|
/**
|
|
432
522
|
* 同步输入框组件和外部状态的 Hook
|
|
433
523
|
* 解决输入中文时因连续渲染关闭中文输入法的问题
|
|
524
|
+
*
|
|
525
|
+
* @template T - 值类型
|
|
434
526
|
* @param storeValue - 外部存储的值
|
|
435
527
|
* @param setStoreValue - 设置外部存储值的函数
|
|
436
528
|
* @returns 包含 inputValue 和 setInputValue 的对象
|
|
437
529
|
*/
|
|
438
|
-
declare const
|
|
530
|
+
declare const _default$2: <T>(storeValue: T, setStoreValue: (value: T) => void) => {
|
|
439
531
|
inputValue: T;
|
|
440
532
|
setInputValue: (value: T) => void;
|
|
441
533
|
};
|
|
442
534
|
|
|
443
535
|
/**
|
|
444
|
-
* 节流
|
|
445
|
-
*
|
|
446
|
-
*
|
|
536
|
+
* 节流 Hook
|
|
537
|
+
* 在指定时间间隔内只执行一次函数,节流控制函数调用频率
|
|
538
|
+
*
|
|
539
|
+
* @template A - 函数参数类型
|
|
540
|
+
* @template R - 返回值类型
|
|
541
|
+
* @param func - 需要节流的函数
|
|
542
|
+
* @param wait - 节流间隔时间(毫秒)
|
|
543
|
+
* @returns 节流处理后的函数,包含 flush 和 cancel 方法
|
|
447
544
|
*/
|
|
448
|
-
declare
|
|
545
|
+
declare const _default$1: <A extends Array<any>, R = void>(func: (..._args: A) => R, wait: number) => {
|
|
449
546
|
(..._args: A): Promise<R>;
|
|
547
|
+
/** 添加额外方法到节流函数 */
|
|
450
548
|
flush: () => any;
|
|
451
549
|
cancel: () => void;
|
|
452
550
|
};
|
|
453
551
|
|
|
454
|
-
|
|
552
|
+
/**
|
|
553
|
+
* useWebSocket Hook 参数类型定义
|
|
554
|
+
*/
|
|
555
|
+
interface WebSocketProps {
|
|
556
|
+
/** WebSocket 服务器地址 */
|
|
455
557
|
url: string;
|
|
558
|
+
/** 接收到消息时的回调函数 */
|
|
456
559
|
onMessage: (message: any) => void;
|
|
560
|
+
/** 连接关闭时的回调函数(可选) */
|
|
457
561
|
onClose?: () => void;
|
|
562
|
+
/** 心跳间隔时间,单位毫秒,默认 30000ms */
|
|
458
563
|
heartbeatInterval?: number;
|
|
564
|
+
/** 心跳消息内容,默认 'ping' */
|
|
459
565
|
heartbeatMessage?: string;
|
|
566
|
+
/** 是否开启客户端心跳,默认 true */
|
|
460
567
|
clientHeartbeat?: boolean;
|
|
568
|
+
/** 重连间隔时间,单位毫秒,默认 5000ms */
|
|
461
569
|
reconnectInterval?: number;
|
|
570
|
+
/** 最大重连尝试次数,不设置则无限重连 */
|
|
462
571
|
maxReconnectAttempts?: number;
|
|
572
|
+
/** 是否开启重连机制,默认 true */
|
|
463
573
|
isReconnect?: boolean;
|
|
464
574
|
}
|
|
465
|
-
|
|
575
|
+
/**
|
|
576
|
+
* useWebSocket Hook 返回值类型定义
|
|
577
|
+
*/
|
|
578
|
+
interface WebSocketType {
|
|
579
|
+
/** 发送消息的方法 */
|
|
466
580
|
sendMessage: (message: string) => void;
|
|
581
|
+
/** WebSocket 连接状态,对应 WebSocket.readyState */
|
|
467
582
|
socketReadyState: number | null;
|
|
468
583
|
}
|
|
469
|
-
|
|
584
|
+
/**
|
|
585
|
+
* WebSocket 连接管理 Hook
|
|
586
|
+
*
|
|
587
|
+
* 提供完整的 WebSocket 连接管理功能,包括:
|
|
588
|
+
* - 自动重连机制
|
|
589
|
+
* - 心跳检测
|
|
590
|
+
* - 页面可见性监听
|
|
591
|
+
* - 连接状态管理
|
|
592
|
+
* - 消息发送与接收
|
|
593
|
+
*
|
|
594
|
+
* @example
|
|
595
|
+
* ```tsx
|
|
596
|
+
* const { sendMessage, socketReadyState } = useWebSocket({
|
|
597
|
+
* url: 'ws://localhost:8080',
|
|
598
|
+
* onMessage: (message) => console.log('收到消息:', message),
|
|
599
|
+
* heartbeatInterval: 30000,
|
|
600
|
+
* maxReconnectAttempts: 5
|
|
601
|
+
* })
|
|
602
|
+
* ```
|
|
603
|
+
*/
|
|
604
|
+
declare const _default: ({ url, onMessage, onClose, heartbeatInterval, heartbeatMessage, clientHeartbeat, reconnectInterval, maxReconnectAttempts, isReconnect }: WebSocketProps) => WebSocketType;
|
|
470
605
|
|
|
471
606
|
/**
|
|
472
607
|
* 深拷贝函数
|
|
608
|
+
*
|
|
609
|
+
* @template T
|
|
473
610
|
* @param obj - 要拷贝的对象
|
|
474
|
-
* @param isJson - 是否使用 JSON
|
|
611
|
+
* @param isJson - 是否使用 JSON 深拷贝(默认 true)
|
|
475
612
|
* @returns 拷贝后的新对象
|
|
613
|
+
*
|
|
614
|
+
* @example
|
|
615
|
+
* const a = { x: { y: 1 } }
|
|
616
|
+
* const b = deepCopy(a)
|
|
617
|
+
* b.x.y = 2
|
|
618
|
+
* console.log(a.x.y) // 1
|
|
619
|
+
*
|
|
620
|
+
* @remarks
|
|
621
|
+
* - JSON 深拷贝会丢失:函数、Map、Set、RegExp、Date 等信息
|
|
622
|
+
* - isJson = false 时使用递归版本,性能差但支持大部分类型,支持循环引用
|
|
623
|
+
* - 不处理 Symbol、getter/setter 属性
|
|
476
624
|
*/
|
|
477
|
-
declare const deepCopy: <T>(
|
|
625
|
+
declare const deepCopy: <T>(obj: T, isJson?: boolean) => T;
|
|
478
626
|
/**
|
|
479
627
|
* 深度比较两个对象是否相等
|
|
480
|
-
*
|
|
628
|
+
*
|
|
481
629
|
* @param a - 第一个对象
|
|
482
630
|
* @param b - 第二个对象
|
|
483
631
|
* @returns 是否相等
|
|
632
|
+
*
|
|
633
|
+
* @example
|
|
634
|
+
* deepEqual({ a: 1 }, { a: 1 }) // true
|
|
635
|
+
* deepEqual([1, 2], [1, 2]) // true
|
|
636
|
+
* deepEqual(new Date(1), new Date(1)) // true
|
|
637
|
+
* deepEqual(new Set([1]), new Set([1])) // true
|
|
638
|
+
*
|
|
639
|
+
* @remarks
|
|
640
|
+
* - 支持 Date、RegExp、Map、Set、Array、Function(仅作引用比较)、Object
|
|
641
|
+
* - 支持循环引用检测
|
|
642
|
+
* - 不处理不可枚举属性、getter/setter 和 Symbol
|
|
484
643
|
*/
|
|
485
644
|
declare function deepEqual(a: any, b: any): boolean;
|
|
486
645
|
/**
|
|
487
|
-
*
|
|
646
|
+
* 深度合并两个对象
|
|
647
|
+
*
|
|
648
|
+
* @template T
|
|
488
649
|
* @param base - 基础对象
|
|
489
650
|
* @param override - 覆盖对象
|
|
490
651
|
* @returns 合并后的新对象
|
|
652
|
+
*
|
|
653
|
+
* @example
|
|
654
|
+
* deepMerge(
|
|
655
|
+
* { a: 1, b: { x: 1 } },
|
|
656
|
+
* { b: { x: 2, y: 3 } }
|
|
657
|
+
* )
|
|
658
|
+
* // => { a: 1, b: { x: 2, y: 3 } }
|
|
659
|
+
*
|
|
660
|
+
* @remarks
|
|
661
|
+
* - 数组不进行合并,只会被直接覆盖
|
|
662
|
+
* - 内部使用递归,性能良好
|
|
663
|
+
* - 只处理普通对象的深度合并,特殊对象(如 Date、RegExp、Map、Set 等)会被直接覆盖
|
|
664
|
+
* - undefined 值会被忽略,不会覆盖原有值
|
|
491
665
|
*/
|
|
492
666
|
declare const deepMerge: <T extends Record<string, any>>(base: T, override: Partial<T>) => T;
|
|
493
667
|
/**
|
|
494
|
-
*
|
|
668
|
+
* 将对象或者数组转换为下拉选项数组
|
|
669
|
+
*
|
|
495
670
|
* @param obj - 键值对象
|
|
496
|
-
* @
|
|
671
|
+
* @param filter - 可选的过滤函数,用于过滤不需要的项
|
|
672
|
+
* @returns label/value 数组,value根据键的类型智能转换:数字字符串转为数字,其他保持为字符串
|
|
673
|
+
*
|
|
674
|
+
* @example
|
|
675
|
+
* objToOptions({ 1: '男', 2: '女' })
|
|
676
|
+
* // => [ { label: '男', value: 1 }, { label: '女', value: 2 } ]
|
|
677
|
+
*
|
|
678
|
+
* @example
|
|
679
|
+
* objToOptions({ admin: '管理员', user: '用户' })
|
|
680
|
+
* // => [ { label: '管理员', value: 'admin' }, { label: '用户', value: 'user' } ]
|
|
681
|
+
*
|
|
682
|
+
* @example
|
|
683
|
+
* objToOptions({ '1': '男', '2': '女', '0': '未知' }, (key) => Number(key) > 0)
|
|
684
|
+
* // => [ { label: '男', value: 1 }, { label: '女', value: 2 } ]
|
|
497
685
|
*/
|
|
498
|
-
declare const objToOptions: (obj:
|
|
499
|
-
label:
|
|
500
|
-
value: number;
|
|
686
|
+
declare const objToOptions: (obj: Record<string, string> | string[], filter?: (key: string, value: string) => boolean) => {
|
|
687
|
+
label: any;
|
|
688
|
+
value: string | number;
|
|
501
689
|
}[];
|
|
502
690
|
/**
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
* @
|
|
691
|
+
* 将数组按照某个 key 转换为对象
|
|
692
|
+
*
|
|
693
|
+
* @template T
|
|
694
|
+
* @param arr - 数组
|
|
695
|
+
* @param key - 作为对象 key 的字段名
|
|
506
696
|
* @returns 转换后的对象
|
|
697
|
+
*
|
|
698
|
+
* @example
|
|
699
|
+
* arrToObj([{ id: 1, name: 'a' }], 'id')
|
|
700
|
+
* // => { "1": { id: 1, name: "a" } }
|
|
507
701
|
*/
|
|
508
702
|
declare const arrToObj: <T>(arr: T[], key: string) => {
|
|
509
703
|
[key: string]: T;
|
|
510
704
|
};
|
|
511
705
|
/**
|
|
512
|
-
* 使用 setTimeout 模拟 setInterval
|
|
513
|
-
*
|
|
514
|
-
* @param
|
|
515
|
-
* @
|
|
706
|
+
* 使用 setTimeout 模拟 setInterval,避免堆积
|
|
707
|
+
*
|
|
708
|
+
* @param fn - 要执行的函数(允许 async)
|
|
709
|
+
* @param t - 间隔毫秒数
|
|
710
|
+
* @returns 控制对象
|
|
711
|
+
*
|
|
712
|
+
* @example
|
|
713
|
+
* const timer = setInterval(() => console.log('run'), 1000)
|
|
714
|
+
*
|
|
715
|
+
* setTimeout(() => timer.cancel(), 5000)
|
|
716
|
+
*
|
|
717
|
+
* @remarks
|
|
718
|
+
* - 可以确保执行 fn 时间不影响下一次调用,天然避免 setInterval 的堆积问题
|
|
516
719
|
*/
|
|
517
|
-
|
|
518
|
-
/** 检查是否正在运行 */
|
|
720
|
+
declare const setInterval: (fn: () => void | Promise<void>, t: number) => {
|
|
519
721
|
isRun: () => boolean;
|
|
520
|
-
/** 取消定时器 */
|
|
521
722
|
cancel: () => void;
|
|
522
|
-
}
|
|
523
|
-
declare const nsSetInterval: (fn: () => void, t: number) => NsSetIntervalReturnType;
|
|
723
|
+
};
|
|
524
724
|
/**
|
|
525
|
-
*
|
|
526
|
-
*
|
|
725
|
+
* 生成唯一的 UUID v4 格式 ID
|
|
726
|
+
* 使用 crypto.randomUUID() 生成符合 RFC 4122 标准的 UUID
|
|
727
|
+
*
|
|
728
|
+
* @returns 符合 UUID v4 格式的唯一标识符字符串
|
|
729
|
+
*
|
|
730
|
+
* @example
|
|
731
|
+
* const id = genNonDuplicateID()
|
|
732
|
+
* console.log(id) // 输出类似: "f8c8e6d2-35a2-4f4d-9d53-994f2b6e1c2d"
|
|
527
733
|
*/
|
|
528
|
-
declare const genNonDuplicateID: () => string
|
|
734
|
+
declare const genNonDuplicateID: () => `${string}-${string}-${string}-${string}-${string}`;
|
|
529
735
|
/**
|
|
530
736
|
* 复制文本到剪贴板
|
|
531
|
-
*
|
|
532
|
-
* @param text -
|
|
533
|
-
* @
|
|
737
|
+
*
|
|
738
|
+
* @param text - 文本
|
|
739
|
+
* @param prompt - 提示语(默认"复制成功")
|
|
740
|
+
*
|
|
741
|
+
* @example
|
|
742
|
+
* copyText('HELLO')
|
|
534
743
|
*/
|
|
535
|
-
declare const copyText: (text: string) => Promise<void>;
|
|
744
|
+
declare const copyText: (text: string, prompt?: string) => Promise<void>;
|
|
536
745
|
/**
|
|
537
|
-
*
|
|
538
|
-
*
|
|
746
|
+
* 数字千分位格式化
|
|
747
|
+
*
|
|
748
|
+
* @param number - 数字或字符串
|
|
749
|
+
* @returns 格式化字符串
|
|
750
|
+
*
|
|
751
|
+
* @example
|
|
752
|
+
* formatNumberWithCommas(1234567) // "1,234,567"
|
|
539
753
|
*/
|
|
540
754
|
declare function formatNumberWithCommas(number: number | string): string | number;
|
|
755
|
+
/**
|
|
756
|
+
* 生成范围内的不重复随机数
|
|
757
|
+
*
|
|
758
|
+
* @param min - 最小值
|
|
759
|
+
* @param max - 最大值
|
|
760
|
+
* @param count - 生成数量
|
|
761
|
+
* @returns 不重复的随机数数组
|
|
762
|
+
*
|
|
763
|
+
* @example
|
|
764
|
+
* generateRandomNumbers(1, 100, 3)
|
|
765
|
+
* // => [13, 77, 54]
|
|
766
|
+
*/
|
|
541
767
|
declare const generateRandomNumbers: (min: number, max: number, count: number) => number[];
|
|
542
768
|
/**
|
|
543
|
-
*
|
|
544
|
-
*
|
|
769
|
+
* 根据文件路径提取文件名
|
|
770
|
+
*
|
|
771
|
+
* @param filePath - 路径
|
|
545
772
|
* @returns 文件名
|
|
773
|
+
*
|
|
774
|
+
* @example
|
|
775
|
+
* getFileName('/a/b/c.png?xxx') // "c.png"
|
|
546
776
|
*/
|
|
547
777
|
declare const getFileName: (filePath: string) => string;
|
|
548
778
|
/**
|
|
549
|
-
*
|
|
779
|
+
* 获取文件后缀
|
|
780
|
+
*
|
|
550
781
|
* @param fileName - 文件名
|
|
551
|
-
* @returns
|
|
782
|
+
* @returns 后缀
|
|
783
|
+
*
|
|
784
|
+
* @example
|
|
785
|
+
* getFileSuffixName('a.png') // "png"
|
|
552
786
|
*/
|
|
553
787
|
declare const getFileSuffixName: (fileName: string) => string;
|
|
554
788
|
/**
|
|
555
|
-
*
|
|
556
|
-
*
|
|
557
|
-
* @
|
|
789
|
+
* 将换行转换为 <br/>
|
|
790
|
+
*
|
|
791
|
+
* @param con - 文本
|
|
792
|
+
* @returns HTML 字符串
|
|
793
|
+
*
|
|
794
|
+
* @example
|
|
795
|
+
* convertNewlineToBr("a\nb")
|
|
796
|
+
* // => "a<br/>b"
|
|
558
797
|
*/
|
|
559
|
-
declare const
|
|
798
|
+
declare const convertNewlineToBr: (con?: string) => string;
|
|
560
799
|
/**
|
|
561
|
-
*
|
|
562
|
-
* @param
|
|
563
|
-
* @
|
|
564
|
-
*
|
|
800
|
+
* 获取 URL 中所有参数
|
|
801
|
+
* @param url - URL
|
|
802
|
+
* @returns Record<string, string | string[]> 返回参数键值对对象,对于同名参数会以数组形式存储
|
|
803
|
+
*
|
|
804
|
+
* @example
|
|
805
|
+
* getAllUrlParams("http://example.com?a=1&b=2")
|
|
806
|
+
* // => { a: "1", b: "2" }
|
|
807
|
+
*
|
|
808
|
+
* @example
|
|
809
|
+
* getAllUrlParams("http://example.com?a=1&a=2&b=3")
|
|
810
|
+
* // => { a: ["1", "2"], b: "3" }
|
|
811
|
+
*/
|
|
812
|
+
declare const getAllUrlParams: (url?: string) => Record<string, string | string[]>;
|
|
813
|
+
/**
|
|
814
|
+
* 构建 URL 查询参数
|
|
815
|
+
*
|
|
816
|
+
* @param obj - 参数对象
|
|
817
|
+
* @param url - 可选,拼接到某个 URL 上
|
|
818
|
+
* @param format - 数组格式化方式,'repeat' | 'comma'; 默认为 'repeat'
|
|
819
|
+
* @returns 最终字符串
|
|
820
|
+
*
|
|
821
|
+
* @example
|
|
822
|
+
* buildUrlParams({ a: 1, b: [2, 3] })
|
|
823
|
+
* // "a=1&b=2&b=3"
|
|
824
|
+
*
|
|
825
|
+
* buildUrlParams({ a: 1 }, "/api")
|
|
826
|
+
* // "/api?a=1"
|
|
827
|
+
*
|
|
828
|
+
* buildUrlParams({ a: [1, 2] }, "/api", "comma")
|
|
829
|
+
* // "/api?a=1,2"
|
|
830
|
+
*/
|
|
831
|
+
declare const buildUrlParams: (obj: Record<string, any>, url?: string, format?: "repeat" | "comma") => string;
|
|
832
|
+
/**
|
|
833
|
+
* 触发浏览器下载文件
|
|
834
|
+
*
|
|
835
|
+
* @param url - 文件地址
|
|
836
|
+
* @param name - 文件名 默认 "图片下载"
|
|
837
|
+
*
|
|
838
|
+
* @example
|
|
839
|
+
* downloadFile("/xx/a.png", "头像.png")
|
|
565
840
|
*/
|
|
566
|
-
declare const buildUrlParams: (obj: Record<string, any>, url?: string) => string;
|
|
567
841
|
declare const downloadFile: (url: string, name?: string) => void;
|
|
568
842
|
/**
|
|
569
|
-
* 给URL
|
|
843
|
+
* 给 URL 最后追加斜杠
|
|
844
|
+
*
|
|
845
|
+
* @param url - URL
|
|
846
|
+
* @returns 新 URL
|
|
847
|
+
*
|
|
848
|
+
* @example
|
|
849
|
+
* addUrlLastSlash("/api/user") // "/api/user/"
|
|
570
850
|
*/
|
|
571
851
|
declare const addUrlLastSlash: (url?: string) => string;
|
|
572
852
|
/**
|
|
573
|
-
* 给
|
|
853
|
+
* 给URL增加mainSource参数
|
|
854
|
+
*
|
|
855
|
+
* 此函数用于在URL中添加或保留mainSource查询参数,主要用于追踪来源。
|
|
856
|
+
* 如果URL中已经存在mainSource参数,则不会修改该URL。
|
|
857
|
+
* 如果不存在,则会从preHref参数中提取mainSource值,如果preHref中也没有,
|
|
858
|
+
* 则使用默认值defaultMainSource。
|
|
859
|
+
*
|
|
860
|
+
* @param url - 需要处理的目标URL
|
|
861
|
+
* @param preHref - 可选,参考URL,用于从中提取mainSource参数值
|
|
862
|
+
* @param defaultMainSource - 可选,mainSource默认值,默认为'cube-uc'
|
|
863
|
+
* @returns 添加了mainSource参数的URL字符串
|
|
864
|
+
*
|
|
865
|
+
* @example
|
|
866
|
+
* // URL中已有mainSource参数,直接返回原URL
|
|
867
|
+
* setUrlMainSource('https://example.com/page?mainSource=adwords')
|
|
868
|
+
* // => 'https://example.com/page?mainSource=adwords'
|
|
869
|
+
*
|
|
870
|
+
* @example
|
|
871
|
+
* // URL中没有mainSource参数,preHref中有mainSource参数
|
|
872
|
+
* setUrlMainSource('https://example.com/page', 'https://referrer.com/?mainSource=facebook')
|
|
873
|
+
* // => 'https://example.com/page?mainSource=facebook'
|
|
874
|
+
*
|
|
875
|
+
* @example
|
|
876
|
+
* // URL和preHref中都没有mainSource参数,使用默认值
|
|
877
|
+
* setUrlMainSource('https://example.com/page')
|
|
878
|
+
* // => 'https://example.com/page?mainSource=defaultMainSource'
|
|
574
879
|
*/
|
|
575
|
-
declare const
|
|
880
|
+
declare const setUrlMainSource: (url: string, preHref?: string, defaultMainSource?: string) => string;
|
|
576
881
|
/**
|
|
577
|
-
*
|
|
578
|
-
*
|
|
579
|
-
* @param
|
|
882
|
+
* 构建 WebSocket 地址
|
|
883
|
+
*
|
|
884
|
+
* @param path - WS 路径
|
|
885
|
+
* @param customHost - 可选 host; 默认使用当前页面的 host
|
|
886
|
+
* @returns 完整 WS 地址
|
|
887
|
+
*
|
|
888
|
+
* @example
|
|
889
|
+
* getWebSocketUrl("/ws") // "ws://xxx/ws"
|
|
580
890
|
*/
|
|
581
891
|
declare const getWebSocketUrl: (path: string, customHost?: string) => string;
|
|
892
|
+
/**
|
|
893
|
+
* 按照字段映射转换对象
|
|
894
|
+
*
|
|
895
|
+
* @template T, U
|
|
896
|
+
* @param source - 源对象
|
|
897
|
+
* @param fieldMap - 字段映射表
|
|
898
|
+
* @returns 转换结果
|
|
899
|
+
*
|
|
900
|
+
* @example
|
|
901
|
+
* transform(
|
|
902
|
+
* { a: 1, b: 2 },
|
|
903
|
+
* { x: 'a', y: (s) => s.b + 1 }
|
|
904
|
+
* )
|
|
905
|
+
* // => { x: 1, y: 3 }
|
|
906
|
+
*/
|
|
582
907
|
declare function transform<T extends object, U extends object>(source: T, fieldMap: {
|
|
583
908
|
[K in keyof U]: keyof T | ((source: T) => U[K]) | U[K];
|
|
584
909
|
}): U;
|
|
910
|
+
/**
|
|
911
|
+
* 批量对象转换函数
|
|
912
|
+
* @param sources - 源对象数组
|
|
913
|
+
* @param fieldMap - 字段映射配置
|
|
914
|
+
* @returns 转换后的目标对象数组
|
|
915
|
+
*
|
|
916
|
+
* @example
|
|
917
|
+
* transforms([{ a: 1 }], { x: 'a' })
|
|
918
|
+
* // => [{ x: 1 }]
|
|
919
|
+
*/
|
|
585
920
|
declare function transforms<T extends object, U extends object>(sources: T[], fieldMap: {
|
|
586
921
|
[K in keyof U]: keyof T | ((source: T) => U[K]) | U[K];
|
|
587
922
|
}): U[];
|
|
923
|
+
/**
|
|
924
|
+
* 将数字金额转换为中文大写金额
|
|
925
|
+
*
|
|
926
|
+
* 该函数将阿拉伯数字表示的金额转换为中文大写形式,常用于财务票据、合同等正式场合
|
|
927
|
+
* 支持处理整数和小数部分,最大处理金额不超过 999,999,999,999,999.9999
|
|
928
|
+
*
|
|
929
|
+
* @param money - 需要转换的金额,可以是数字或字符串形式的数字
|
|
930
|
+
* @returns 中文大写金额字符串
|
|
931
|
+
*
|
|
932
|
+
* @example
|
|
933
|
+
* convertCurrency(123456.78)
|
|
934
|
+
* // => "壹拾贰万叁仟肆佰伍拾陆圆柒角捌分"
|
|
935
|
+
*
|
|
936
|
+
* @example
|
|
937
|
+
* convertCurrency("1000")
|
|
938
|
+
* // => "壹仟圆整"
|
|
939
|
+
*
|
|
940
|
+
* @example
|
|
941
|
+
* convertCurrency(-123.45)
|
|
942
|
+
* // => "(负数)壹佰贰拾叁圆肆角伍分"
|
|
943
|
+
*/
|
|
944
|
+
declare const convertCurrency: (money?: string | number) => string;
|
|
945
|
+
/**
|
|
946
|
+
* 计算表格中指定列的行合并数量
|
|
947
|
+
*
|
|
948
|
+
* 该函数通常用于表格渲染中,根据某一列的相同值进行行合并(rowspan)
|
|
949
|
+
* 它会将连续相同的值分为一组,并返回目标位置所在的组的大小
|
|
950
|
+
*
|
|
951
|
+
* @param data - 数据数组,每一项应为对象
|
|
952
|
+
* @param key - 需要检查的字段名,用于比较值是否相同
|
|
953
|
+
* @param target - 目标索引位置,函数将返回该位置所在组的大小
|
|
954
|
+
* @returns 目标位置所在组的大小,如果是组的第一个元素则返回组大小,否则返回0
|
|
955
|
+
*
|
|
956
|
+
* @example
|
|
957
|
+
* const data = [
|
|
958
|
+
* { name: 'Alice', dept: 'IT' },
|
|
959
|
+
* { name: 'Bob', dept: 'IT' },
|
|
960
|
+
* { name: 'Charlie', dept: 'HR' },
|
|
961
|
+
* { name: 'David', dept: 'HR' },
|
|
962
|
+
* { name: 'Eve', dept: 'HR' }
|
|
963
|
+
* ]
|
|
964
|
+
*
|
|
965
|
+
* getRowSpanCount(data, 'dept', 0) // 返回 2 (IT部门有2人)
|
|
966
|
+
* getRowSpanCount(data, 'dept', 1) // 返回 0 (IT部门第2个人)
|
|
967
|
+
* getRowSpanCount(data, 'dept', 2) // 返回 3 (HR部门有3人)
|
|
968
|
+
* getRowSpanCount(data, 'dept', 3) // 返回 0 (HR部门第2个人)
|
|
969
|
+
* getRowSpanCount(data, 'dept', 4) // 返回 0 (HR部门第3个人)
|
|
970
|
+
*/
|
|
971
|
+
declare const getRowSpanCount: (data: any[], key: string, target: number) => any;
|
|
972
|
+
/**
|
|
973
|
+
* 动态加载第三方文件(JavaScript 或 CSS)
|
|
974
|
+
*
|
|
975
|
+
* 该函数用于在运行时动态加载外部资源文件,支持 JavaScript 和 CSS 文件
|
|
976
|
+
* 主要用于按需加载第三方库或样式文件,避免在页面初始加载时引入所有资源
|
|
977
|
+
*
|
|
978
|
+
* @param document - DOM 文档对象,用于创建和插入元素
|
|
979
|
+
* @param path - 文件路径,支持相对路径或绝对路径
|
|
980
|
+
*
|
|
981
|
+
* @example
|
|
982
|
+
* // 加载 JavaScript 文件
|
|
983
|
+
* importThirdPartyFile(document, 'https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js')
|
|
984
|
+
*
|
|
985
|
+
* @example
|
|
986
|
+
* // 加载 CSS 文件
|
|
987
|
+
* importThirdPartyFile(document, '/assets/styles/third-party.css')
|
|
988
|
+
*
|
|
989
|
+
* @example
|
|
990
|
+
* // 加载本地 JavaScript 文件
|
|
991
|
+
* importThirdPartyFile(document, './libs/custom-lib.js')
|
|
992
|
+
*
|
|
993
|
+
* @remarks
|
|
994
|
+
* - 根据文件扩展名自动识别文件类型(.js 为脚本文件,其他为样式文件)
|
|
995
|
+
* - JavaScript 文件会异步加载(async = true)
|
|
996
|
+
* - CSS 文件会作为 stylesheet 添加到文档头部
|
|
997
|
+
* - 需要确保 document.head 存在才会添加元素
|
|
998
|
+
*/
|
|
999
|
+
declare const importThirdPartyFile: (document: Document, path: string) => void;
|
|
1000
|
+
/**
|
|
1001
|
+
* 主要用于处理需要设置key的数组数据
|
|
1002
|
+
*
|
|
1003
|
+
* 该函数用于过滤和处理项目数组,主要功能包括:
|
|
1004
|
+
* 1. 过滤掉标记为隐藏的项目(hidden 为 true 的项目)
|
|
1005
|
+
* 2. 为每个项目添加唯一的 key 属性(使用数组索引)
|
|
1006
|
+
*
|
|
1007
|
+
* @template T - 项目类型,hidden 属性(可选)
|
|
1008
|
+
* @param items - 需要处理的项目数组
|
|
1009
|
+
* @returns 处理后的项目数组,已过滤隐藏项并添加了 key 属性(优先使用数组项自身的key属性)
|
|
1010
|
+
*
|
|
1011
|
+
* @example
|
|
1012
|
+
* // 过滤带有 hidden 标记的菜单项
|
|
1013
|
+
* const menuItems = [
|
|
1014
|
+
* { name: '首页', path: '/', hidden: true },
|
|
1015
|
+
* { name: '关于', path: '/about' },
|
|
1016
|
+
* { name: '联系', path: '/contact', hidden: false }
|
|
1017
|
+
* ];
|
|
1018
|
+
* const processedItems = processItemList(menuItems);
|
|
1019
|
+
* // 结果: [{ key: 0, name: '关于', path: '/about' }, { key: 1, name: '联系', path: '/contact', hidden: false }]
|
|
1020
|
+
*
|
|
1021
|
+
* @remarks
|
|
1022
|
+
* - 该函数不会修改原始数组,而是返回一个新的处理后的数组
|
|
1023
|
+
* - key 值基于过滤后的数组索引生成,不是原始数组的索引
|
|
1024
|
+
* - hidden 属性为 true 的项目会被过滤掉,其他情况(false、undefined、null等)都会保留
|
|
1025
|
+
*/
|
|
1026
|
+
declare const processItemList: <T extends {
|
|
1027
|
+
hidden?: boolean;
|
|
1028
|
+
}>(items: T[]) => (T & {
|
|
1029
|
+
key: number;
|
|
1030
|
+
})[];
|
|
1031
|
+
/**
|
|
1032
|
+
* 执行安全的脚本代码
|
|
1033
|
+
*
|
|
1034
|
+
* @param script - 需要执行的脚本代码字符串
|
|
1035
|
+
* @param params - 传递给脚本的参数对象,键为参数名,值为参数值
|
|
1036
|
+
*
|
|
1037
|
+
* @example
|
|
1038
|
+
* // 执行简单的数学运算脚本
|
|
1039
|
+
* executeScript('return a + b;', { a: 1, b: 2 });
|
|
1040
|
+
*
|
|
1041
|
+
* @example
|
|
1042
|
+
* // 执行带条件逻辑的脚本
|
|
1043
|
+
* executeScript(`
|
|
1044
|
+
* if (age >= 18) {
|
|
1045
|
+
* return "成年人";
|
|
1046
|
+
* } else {
|
|
1047
|
+
* return "未成年人";
|
|
1048
|
+
* }
|
|
1049
|
+
* `, { age: 20 });
|
|
1050
|
+
*
|
|
1051
|
+
* @example
|
|
1052
|
+
* // 执行数组处理脚本
|
|
1053
|
+
* executeScript(`
|
|
1054
|
+
* return numbers.map(n => n * 2).filter(n => n > 5);
|
|
1055
|
+
* `, { numbers: [1, 2, 3, 4, 5] });
|
|
1056
|
+
*
|
|
1057
|
+
* @remarks
|
|
1058
|
+
* - 函数会先调用 isScriptSafe 检查脚本安全性,只有安全的脚本才会被执行
|
|
1059
|
+
* - 使用 Function 构造器而非 eval,相对更安全
|
|
1060
|
+
* - 参数通过解构方式传递给脚本函数
|
|
1061
|
+
* - 脚本中可以直接使用 params 对象中的键作为变量名
|
|
1062
|
+
* - 如果脚本执行出错,会在控制台输出错误信息
|
|
1063
|
+
*
|
|
1064
|
+
* @security
|
|
1065
|
+
* - 脚本执行在 JavaScript 运行时环境中,仍可能访问全局对象
|
|
1066
|
+
* - 应确保传入的脚本来自可信源
|
|
1067
|
+
* - 仅依赖 isScriptSafe 检查不足以防范所有安全风险
|
|
1068
|
+
*/
|
|
1069
|
+
declare const executeScript: (script: string, params: {
|
|
1070
|
+
[key: string]: any;
|
|
1071
|
+
}) => any;
|
|
1072
|
+
/**
|
|
1073
|
+
* AES 加密
|
|
1074
|
+
* @param data - 需要加密的数据
|
|
1075
|
+
* @param key - 加密密钥
|
|
1076
|
+
* @returns 加密后的字符串
|
|
1077
|
+
* @throws 当密钥为空或加密过程失败时抛出错误
|
|
1078
|
+
*/
|
|
1079
|
+
declare function aesEncrypt<T = any>(data: T, key: string): string;
|
|
1080
|
+
/**
|
|
1081
|
+
* AES 解密
|
|
1082
|
+
* @param data - 加密后的字符串
|
|
1083
|
+
* @param key - 解密密钥
|
|
1084
|
+
* @returns 解密后的数据,解密失败时返回null
|
|
1085
|
+
*/
|
|
1086
|
+
declare function aesDecrypt<T = any>(data: string, key: string): T | null;
|
|
588
1087
|
|
|
589
1088
|
type DateType = string | number | Date | dayjs.Dayjs | null;
|
|
590
|
-
|
|
591
|
-
declare const
|
|
592
|
-
/**
|
|
593
|
-
|
|
1089
|
+
/** 默认日期时间格式:年-月-日 时:分:秒 */
|
|
1090
|
+
declare const DEFAULT_DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
|
|
1091
|
+
/** 默认日期格式:年-月-日 */
|
|
1092
|
+
declare const DEFAULT_DATE_FORMAT = "YYYY-MM-DD";
|
|
1093
|
+
/** 年月中文格式:**年**月 */
|
|
1094
|
+
declare const DEFAULT_YEAR_MONTH_FORMAT = "YYYY\u5E74MM\u6708";
|
|
1095
|
+
/** 年月日格式:**年**月**日 */
|
|
1096
|
+
declare const DEFAULT_YEAR_MONTH_DAY_FORMAT = "YYYY\u5E74MM\u6708DD\u65E5";
|
|
1097
|
+
/**
|
|
1098
|
+
* 获取指定日期开始时间戳 (如: '2023/10/17 00:00:00')
|
|
1099
|
+
* @param date 日期
|
|
1100
|
+
* @param unit 时间单位,默认为 'date' (天)
|
|
1101
|
+
* @returns 时间戳
|
|
594
1102
|
*/
|
|
595
1103
|
declare const getStartOfTimestamp: (date?: DateType, unit?: dayjs.OpUnitType) => number;
|
|
596
1104
|
/**
|
|
597
|
-
*
|
|
1105
|
+
* 获取指定日期结束时间戳 (如: '2023/10/17 23:59:59')
|
|
1106
|
+
* @param date 日期
|
|
1107
|
+
* @param unit 时间单位,默认为 'date' (天)
|
|
1108
|
+
* @returns 时间戳
|
|
598
1109
|
*/
|
|
599
1110
|
declare const getEndOfTimestamp: (date?: DateType, unit?: dayjs.OpUnitType) => number;
|
|
1111
|
+
/**
|
|
1112
|
+
* 格式化日期
|
|
1113
|
+
* @param date 待格式化的日期
|
|
1114
|
+
* @param format 格式字符串,默认为 'YYYY-MM-DD HH:mm:ss'
|
|
1115
|
+
* @returns 格式化后的日期字符串
|
|
1116
|
+
*/
|
|
600
1117
|
declare const formatDate: (date: Date | number | string, fmt?: string) => string;
|
|
1118
|
+
/**
|
|
1119
|
+
* 获取日期的时间戳
|
|
1120
|
+
* @param date 日期,默认当前时间
|
|
1121
|
+
* @returns 时间戳
|
|
1122
|
+
*/
|
|
601
1123
|
declare const getTimestamp: (date?: DateType) => number;
|
|
1124
|
+
/**
|
|
1125
|
+
* 检查日期是否已过期
|
|
1126
|
+
* @param date 待检查的日期, 默认当前时间
|
|
1127
|
+
* @returns 是否过期
|
|
1128
|
+
*/
|
|
602
1129
|
declare const isExpire: (date?: DateType) => boolean;
|
|
603
1130
|
|
|
604
1131
|
/**
|
|
605
1132
|
* 类型判断函数
|
|
1133
|
+
*
|
|
606
1134
|
* @param val - 要判断的值
|
|
607
1135
|
* @param type - 目标类型名
|
|
608
1136
|
* @returns 是否为目标类型
|
|
1137
|
+
*
|
|
1138
|
+
* @example
|
|
1139
|
+
* ```typescript
|
|
1140
|
+
* is({}, 'Object') // true
|
|
1141
|
+
* is([], 'Array') // true
|
|
1142
|
+
* is(123, 'Number') // true
|
|
1143
|
+
* ```
|
|
609
1144
|
*/
|
|
610
1145
|
declare function is(val: unknown, type: string): boolean;
|
|
611
1146
|
/**
|
|
612
1147
|
* 判断值是否为 undefined
|
|
1148
|
+
*
|
|
613
1149
|
* @param val - 要判断的值
|
|
614
1150
|
* @returns 是否为 undefined
|
|
1151
|
+
*
|
|
1152
|
+
* @example
|
|
1153
|
+
* ```typescript
|
|
1154
|
+
* isUnDef(undefined) // true
|
|
1155
|
+
* isUnDef(null) // false
|
|
1156
|
+
* isUnDef(0) // false
|
|
1157
|
+
* ```
|
|
615
1158
|
*/
|
|
616
1159
|
declare function isUnDef<T = unknown>(val?: T): val is T;
|
|
617
1160
|
/**
|
|
618
1161
|
* 判断值是否已定义(非 undefined)
|
|
1162
|
+
*
|
|
619
1163
|
* @param val - 要判断的值
|
|
620
1164
|
* @returns 是否已定义
|
|
1165
|
+
*
|
|
1166
|
+
* @example
|
|
1167
|
+
* ```typescript
|
|
1168
|
+
* isDef(null) // true
|
|
1169
|
+
* isDef(0) // true
|
|
1170
|
+
* isDef('') // true
|
|
1171
|
+
* isDef(undefined) // false
|
|
1172
|
+
* ```
|
|
621
1173
|
*/
|
|
622
1174
|
declare function isDef<T = unknown>(val?: T): val is T;
|
|
623
1175
|
/**
|
|
624
|
-
*
|
|
1176
|
+
* 判断值是否为纯对象
|
|
1177
|
+
*
|
|
625
1178
|
* @param val - 要判断的值
|
|
626
|
-
* @returns
|
|
1179
|
+
* @returns 是否为纯对象
|
|
1180
|
+
*
|
|
1181
|
+
* @example
|
|
1182
|
+
* ```typescript
|
|
1183
|
+
* isObject({}) // true
|
|
1184
|
+
* isObject([]) // false
|
|
1185
|
+
* isObject(null) // false
|
|
1186
|
+
* isObject(new Date()) // false
|
|
1187
|
+
* ```
|
|
627
1188
|
*/
|
|
628
1189
|
declare function isObject(val: any): val is Record<any, any>;
|
|
629
1190
|
/**
|
|
630
1191
|
* 判断对象是否为空对象
|
|
1192
|
+
*
|
|
631
1193
|
* @param val - 要判断的值
|
|
632
1194
|
* @returns 是否为空对象
|
|
1195
|
+
*
|
|
1196
|
+
* @example
|
|
1197
|
+
* ```typescript
|
|
1198
|
+
* isEmptyObj({}) // true
|
|
1199
|
+
* isEmptyObj({ a: 1 }) // false
|
|
1200
|
+
* isEmptyObj([]) // false
|
|
1201
|
+
* isEmptyObj(null) // false
|
|
1202
|
+
* ```
|
|
633
1203
|
*/
|
|
634
1204
|
declare function isEmptyObj<T = unknown>(val: T): boolean;
|
|
635
1205
|
/**
|
|
636
1206
|
* 判断值是否为 Date 对象
|
|
1207
|
+
*
|
|
637
1208
|
* @param val - 要判断的值
|
|
638
1209
|
* @returns 是否为 Date 对象
|
|
1210
|
+
*
|
|
1211
|
+
* @example
|
|
1212
|
+
* ```typescript
|
|
1213
|
+
* isDate(new Date()) // true
|
|
1214
|
+
* isDate('2023-01-01') // false
|
|
1215
|
+
* isDate({}) // false
|
|
1216
|
+
* ```
|
|
639
1217
|
*/
|
|
640
1218
|
declare function isDate(val: unknown): val is Date;
|
|
1219
|
+
/**
|
|
1220
|
+
* 判断值是否为 null
|
|
1221
|
+
*
|
|
1222
|
+
* @param val - 要判断的值
|
|
1223
|
+
* @returns 是否为 null
|
|
1224
|
+
*
|
|
1225
|
+
* @example
|
|
1226
|
+
* ```typescript
|
|
1227
|
+
* isNull(null) // true
|
|
1228
|
+
* isNull(undefined) // false
|
|
1229
|
+
* isNull(0) // false
|
|
1230
|
+
* ```
|
|
1231
|
+
*/
|
|
641
1232
|
declare function isNull(val: unknown): val is null;
|
|
1233
|
+
/**
|
|
1234
|
+
* 判断值是否为 null 或 undefined
|
|
1235
|
+
*
|
|
1236
|
+
* @param val - 要判断的值
|
|
1237
|
+
* @returns 是否为 null 或 undefined
|
|
1238
|
+
*
|
|
1239
|
+
* @example
|
|
1240
|
+
* ```typescript
|
|
1241
|
+
* isNullOrUnDef(null) // true
|
|
1242
|
+
* isNullOrUnDef(undefined) // true
|
|
1243
|
+
* isNullOrUnDef(0) // false
|
|
1244
|
+
* isNullOrUnDef('') // false
|
|
1245
|
+
* ```
|
|
1246
|
+
*/
|
|
642
1247
|
declare function isNullOrUnDef(val: unknown): val is null | undefined;
|
|
1248
|
+
/**
|
|
1249
|
+
* 判断值是否为数字(包括 NaN)
|
|
1250
|
+
*
|
|
1251
|
+
* @param val - 要判断的值
|
|
1252
|
+
* @returns 是否为数字类型
|
|
1253
|
+
*
|
|
1254
|
+
* @example
|
|
1255
|
+
* ```typescript
|
|
1256
|
+
* isNumber(123) // true
|
|
1257
|
+
* isNumber('123') // false
|
|
1258
|
+
* isNumber(NaN) // true
|
|
1259
|
+
* ```
|
|
1260
|
+
*/
|
|
643
1261
|
declare function isNumber(val: unknown): val is number;
|
|
1262
|
+
/**
|
|
1263
|
+
* 判断值是否为有效数字(不包括 NaN)
|
|
1264
|
+
*
|
|
1265
|
+
* @param val - 要判断的值
|
|
1266
|
+
* @returns 是否为有效数字
|
|
1267
|
+
*
|
|
1268
|
+
* @example
|
|
1269
|
+
* ```typescript
|
|
1270
|
+
* isNumberNoNaN(123) // true
|
|
1271
|
+
* isNumberNoNaN(NaN) // false
|
|
1272
|
+
* isNumberNoNaN('123') // false
|
|
1273
|
+
* ```
|
|
1274
|
+
*/
|
|
644
1275
|
declare function isNumberNoNaN(val: unknown): val is number;
|
|
1276
|
+
/**
|
|
1277
|
+
* 判断值是否为字符串
|
|
1278
|
+
*
|
|
1279
|
+
* @param val - 要判断的值
|
|
1280
|
+
* @returns 是否为字符串
|
|
1281
|
+
*
|
|
1282
|
+
* @example
|
|
1283
|
+
* ```typescript
|
|
1284
|
+
* isString('hello') // true
|
|
1285
|
+
* isString(123) // false
|
|
1286
|
+
* isString(new String('hello')) // true
|
|
1287
|
+
* ```
|
|
1288
|
+
*/
|
|
645
1289
|
declare function isString(val: unknown): val is string;
|
|
1290
|
+
/**
|
|
1291
|
+
* 判断值是否为函数
|
|
1292
|
+
*
|
|
1293
|
+
* @param val - 要判断的值
|
|
1294
|
+
* @returns 是否为函数
|
|
1295
|
+
*
|
|
1296
|
+
* @example
|
|
1297
|
+
* ```typescript
|
|
1298
|
+
* isFunction(() => {}) // true
|
|
1299
|
+
* isFunction(function() {}) // true
|
|
1300
|
+
* isFunction('function') // false
|
|
1301
|
+
* isFunction({}) // false
|
|
1302
|
+
* ```
|
|
1303
|
+
*/
|
|
646
1304
|
declare function isFunction(val: unknown): boolean;
|
|
1305
|
+
/**
|
|
1306
|
+
* 判断值是否为 Promise 对象
|
|
1307
|
+
*
|
|
1308
|
+
* @param val - 要判断的值
|
|
1309
|
+
* @returns 是否为 Promise
|
|
1310
|
+
*
|
|
1311
|
+
* @example
|
|
1312
|
+
* ```typescript
|
|
1313
|
+
* isPromise(Promise.resolve()) // true
|
|
1314
|
+
* isPromise({ then: () => {}, catch: () => {} }) // false
|
|
1315
|
+
* isPromise({}) // false
|
|
1316
|
+
* ```
|
|
1317
|
+
*/
|
|
647
1318
|
declare function isPromise<T = any>(val: unknown): val is Promise<T>;
|
|
1319
|
+
/**
|
|
1320
|
+
* 判断值是否为布尔值
|
|
1321
|
+
*
|
|
1322
|
+
* @param val - 要判断的值
|
|
1323
|
+
* @returns 是否为布尔值
|
|
1324
|
+
*
|
|
1325
|
+
* @example
|
|
1326
|
+
* ```typescript
|
|
1327
|
+
* isBoolean(true) // true
|
|
1328
|
+
* isBoolean(false) // true
|
|
1329
|
+
* isBoolean(1) // false
|
|
1330
|
+
* isBoolean('true') // false
|
|
1331
|
+
* ```
|
|
1332
|
+
*/
|
|
648
1333
|
declare function isBoolean(val: unknown): val is boolean;
|
|
1334
|
+
/**
|
|
1335
|
+
* 判断值是否为正则表达式
|
|
1336
|
+
*
|
|
1337
|
+
* @param val - 要判断的值
|
|
1338
|
+
* @returns 是否为正则表达式
|
|
1339
|
+
*
|
|
1340
|
+
* @example
|
|
1341
|
+
* ```typescript
|
|
1342
|
+
* isRegExp(/test/) // true
|
|
1343
|
+
* isRegExp(new RegExp('test')) // true
|
|
1344
|
+
* isRegExp('/test/') // false
|
|
1345
|
+
* isRegExp({}) // false
|
|
1346
|
+
* ```
|
|
1347
|
+
*/
|
|
649
1348
|
declare function isRegExp(val: unknown): val is RegExp;
|
|
650
|
-
|
|
651
|
-
|
|
1349
|
+
/**
|
|
1350
|
+
* 判断值是否为数组
|
|
1351
|
+
*
|
|
1352
|
+
* @param val - 要判断的值
|
|
1353
|
+
* @returns 是否为数组
|
|
1354
|
+
*
|
|
1355
|
+
* @example
|
|
1356
|
+
* ```typescript
|
|
1357
|
+
* isArray([]) // true
|
|
1358
|
+
* isArray([1, 2, 3]) // true
|
|
1359
|
+
* isArray({}) // false
|
|
1360
|
+
* isArray('array') // false
|
|
1361
|
+
* ```
|
|
1362
|
+
*/
|
|
1363
|
+
declare function isArray<T = any>(val: unknown): val is Array<T>;
|
|
1364
|
+
/**
|
|
1365
|
+
* 判断值是否为空值
|
|
1366
|
+
*
|
|
1367
|
+
* @param val - 要判断的值
|
|
1368
|
+
* @returns 是否为空值
|
|
1369
|
+
*
|
|
1370
|
+
* @example
|
|
1371
|
+
* ```typescript
|
|
1372
|
+
* isEmpty('') // true
|
|
1373
|
+
* isEmpty([]) // true
|
|
1374
|
+
* isEmpty({}) // true
|
|
1375
|
+
* isEmpty(null) // true
|
|
1376
|
+
* isEmpty(undefined) // true
|
|
1377
|
+
* isEmpty(0) // false
|
|
1378
|
+
* isEmpty(false) // false
|
|
1379
|
+
* ```
|
|
1380
|
+
*/
|
|
1381
|
+
declare function isEmpty<T = unknown>(val: T): boolean;
|
|
1382
|
+
/**
|
|
1383
|
+
* 判断值是否为 Window 对象
|
|
1384
|
+
*
|
|
1385
|
+
* @param val - 要判断的值
|
|
1386
|
+
* @returns 是否为 Window 对象
|
|
1387
|
+
*
|
|
1388
|
+
* @example
|
|
1389
|
+
* ```typescript
|
|
1390
|
+
* isWindow(window) // true
|
|
1391
|
+
* isWindow({}) // false
|
|
1392
|
+
* isWindow(global) // false
|
|
1393
|
+
* ```
|
|
1394
|
+
*/
|
|
652
1395
|
declare function isWindow(val: any): val is Window;
|
|
1396
|
+
/**
|
|
1397
|
+
* 判断值是否为 DOM 元素
|
|
1398
|
+
*
|
|
1399
|
+
* @param val - 要判断的值
|
|
1400
|
+
* @returns 是否为 DOM 元素
|
|
1401
|
+
*
|
|
1402
|
+
* @example
|
|
1403
|
+
* ```typescript
|
|
1404
|
+
* isElement(document.body) // true
|
|
1405
|
+
* isElement(document.createElement('div')) // true
|
|
1406
|
+
* isElement({ tagName: 'div' }) // false
|
|
1407
|
+
* isElement('div') // false
|
|
1408
|
+
* ```
|
|
1409
|
+
*/
|
|
653
1410
|
declare function isElement(val: unknown): val is Element;
|
|
654
|
-
declare function isMap(val: unknown): val is Map<any, any>;
|
|
655
|
-
declare const isServer: boolean;
|
|
656
|
-
declare const isClient: boolean;
|
|
657
1411
|
/**
|
|
658
|
-
*
|
|
659
|
-
*
|
|
660
|
-
* @
|
|
661
|
-
* @
|
|
1412
|
+
* 判断值是否为 Map 对象
|
|
1413
|
+
*
|
|
1414
|
+
* @param val - 要判断的值
|
|
1415
|
+
* @returns 是否为 Map
|
|
1416
|
+
*
|
|
1417
|
+
* @example
|
|
1418
|
+
* ```typescript
|
|
1419
|
+
* isMap(new Map()) // true
|
|
1420
|
+
* isMap(new WeakMap()) // false
|
|
1421
|
+
* isMap({}) // false
|
|
1422
|
+
* ```
|
|
1423
|
+
*/
|
|
1424
|
+
declare function isMap<K = any, V = any>(val: unknown): val is Map<K, V>;
|
|
1425
|
+
/**
|
|
1426
|
+
* 判断值是否为 Set 对象
|
|
1427
|
+
*
|
|
1428
|
+
* @param val - 要判断的值
|
|
1429
|
+
* @returns 是否为 Set
|
|
1430
|
+
*
|
|
1431
|
+
* @example
|
|
1432
|
+
* ```typescript
|
|
1433
|
+
* isSet(new Set()) // true
|
|
1434
|
+
* isSet(new WeakSet()) // false
|
|
1435
|
+
* isSet([]) // false
|
|
1436
|
+
* ```
|
|
1437
|
+
*/
|
|
1438
|
+
declare function isSet<T = any>(val: unknown): val is Set<T>;
|
|
1439
|
+
/**
|
|
1440
|
+
* 判断是否为外部链接
|
|
1441
|
+
*
|
|
1442
|
+
* @param path - 路径字符串
|
|
1443
|
+
* @returns 是否为外部链接
|
|
1444
|
+
*
|
|
1445
|
+
* @example
|
|
1446
|
+
* ```typescript
|
|
1447
|
+
* isExternal('https://example.com') // true
|
|
1448
|
+
* isExternal('mailto:test@example.com') // true
|
|
1449
|
+
* isExternal('tel:123456789') // true
|
|
1450
|
+
* isExternal('/home') // false
|
|
1451
|
+
* isExternal('http://localhost:3000') // true
|
|
1452
|
+
* ```
|
|
662
1453
|
*/
|
|
663
1454
|
declare const isExternal: (path: string) => boolean;
|
|
664
|
-
|
|
1455
|
+
/**
|
|
1456
|
+
* 判断值是否为 Blob 对象
|
|
1457
|
+
*
|
|
1458
|
+
* @param val - 要判断的值
|
|
1459
|
+
* @returns 是否为 Blob
|
|
1460
|
+
*
|
|
1461
|
+
* @example
|
|
1462
|
+
* ```typescript
|
|
1463
|
+
* isBlob(new Blob()) // true
|
|
1464
|
+
* isBlob(new File([], 'test.txt')) // true
|
|
1465
|
+
* isBlob({}) // false
|
|
1466
|
+
* ```
|
|
1467
|
+
*/
|
|
1468
|
+
declare const isBlob: (val: unknown) => val is Blob;
|
|
1469
|
+
/**
|
|
1470
|
+
* 判断是否为本地主机
|
|
1471
|
+
*
|
|
1472
|
+
* @param host - 主机名,默认取当前 location.host
|
|
1473
|
+
* @returns 是否为本地主机
|
|
1474
|
+
*
|
|
1475
|
+
* @example
|
|
1476
|
+
* ```typescript
|
|
1477
|
+
* isLocalhost() // 检查当前主机
|
|
1478
|
+
* isLocalhost('localhost:3000') // true
|
|
1479
|
+
* isLocalhost('127.0.0.1:3000') // true
|
|
1480
|
+
* isLocalhost('example.com') // false
|
|
1481
|
+
* ```
|
|
1482
|
+
*/
|
|
665
1483
|
declare const isLocalhost: (host?: string) => boolean;
|
|
1484
|
+
/**
|
|
1485
|
+
* 判断值是否为引用类型(对象或函数)
|
|
1486
|
+
* 引用类型包括:Object, Array, Function, Date, RegExp, Map, Set 等
|
|
1487
|
+
*
|
|
1488
|
+
* @param val - 要判断的值
|
|
1489
|
+
* @returns 是否为引用类型
|
|
1490
|
+
*
|
|
1491
|
+
* @example
|
|
1492
|
+
* ```typescript
|
|
1493
|
+
* isReferenceType({}) // true
|
|
1494
|
+
* isReferenceType([]) // true
|
|
1495
|
+
* isReferenceType(function(){}) // true
|
|
1496
|
+
* isReferenceType(null) // false
|
|
1497
|
+
* isReferenceType(undefined) // false
|
|
1498
|
+
* isReferenceType(123) // false
|
|
1499
|
+
* isReferenceType('string') // false
|
|
1500
|
+
* ```
|
|
1501
|
+
*/
|
|
1502
|
+
declare function isReferenceType(val: unknown): boolean;
|
|
1503
|
+
/**
|
|
1504
|
+
* 检查脚本字符串是否安全
|
|
1505
|
+
*
|
|
1506
|
+
* 该函数用于检测给定的脚本字符串是否包含潜在的不安全代码,
|
|
1507
|
+
* 主要用于防范 XSS(跨站脚本攻击)和其他安全风险。
|
|
1508
|
+
* 通过检测常见的危险关键字和全局对象来判断脚本的安全性。
|
|
1509
|
+
*
|
|
1510
|
+
* @param script - 需要检查的脚本字符串
|
|
1511
|
+
* @returns 如果脚本被认为是安全的则返回 true,否则返回 false
|
|
1512
|
+
*
|
|
1513
|
+
* @example
|
|
1514
|
+
* // 安全的脚本
|
|
1515
|
+
* isScriptSafe('const a = 1; console.log(a);') // true
|
|
1516
|
+
*
|
|
1517
|
+
* @example
|
|
1518
|
+
* // 不安全的脚本(包含 eval)
|
|
1519
|
+
* isScriptSafe('eval("alert(1)")') // false
|
|
1520
|
+
*
|
|
1521
|
+
* @example
|
|
1522
|
+
* // 不安全的脚本(访问全局对象)
|
|
1523
|
+
* isScriptSafe('window.location.href = "http://malicious.com"') // false
|
|
1524
|
+
*
|
|
1525
|
+
* @remarks
|
|
1526
|
+
* - 该函数仅做基础的关键字检测,不能保证 100% 安全
|
|
1527
|
+
* - 对于复杂的安全需求,应使用专门的沙箱环境或服务端验证
|
|
1528
|
+
* - 函数不区分大小写进行关键字匹配
|
|
1529
|
+
* - 关键字使用单词边界匹配,避免误判(如 'evaluation' 不会被误判为 'eval')
|
|
1530
|
+
*
|
|
1531
|
+
* @security
|
|
1532
|
+
* - 注意:这只是一个基础的安全检查,不应作为唯一的安全防护措施
|
|
1533
|
+
* - 生产环境中建议结合 Content Security Policy (CSP) 等多重安全机制
|
|
1534
|
+
*/
|
|
1535
|
+
declare const isScriptSafe: (script: string) => boolean;
|
|
1536
|
+
/**
|
|
1537
|
+
* 检查字符串是否为有效的 JSON 格式
|
|
1538
|
+
*
|
|
1539
|
+
* @param text - 需要检查的字符串,默认为空字符串
|
|
1540
|
+
* @returns 如果字符串是有效的 JSON 格式则返回 true,否则返回 false
|
|
1541
|
+
*
|
|
1542
|
+
* @example
|
|
1543
|
+
* isJson('{"name": "张三", "age": 25}') // true
|
|
1544
|
+
* isJson('[1, 2, 3]') // true
|
|
1545
|
+
* isJson('hello world') // false
|
|
1546
|
+
* isJson('true') // false (虽然 JSON.parse('true') 有效,但不是对象或数组)
|
|
1547
|
+
* isJson('') // false
|
|
1548
|
+
*
|
|
1549
|
+
* @remarks
|
|
1550
|
+
* - 该函数使用 try/catch 机制来捕获 JSON.parse 解析结果
|
|
1551
|
+
* - 只接受 JSON 对象 ({}) 或 JSON 数组 ([]),不接受基本类型值 (如: true, 123, "string")
|
|
1552
|
+
*/
|
|
1553
|
+
declare const isJson: (text?: string) => boolean;
|
|
666
1554
|
|
|
667
|
-
|
|
668
|
-
id: number;
|
|
669
|
-
orgName: string;
|
|
670
|
-
name: string;
|
|
671
|
-
username: string;
|
|
672
|
-
mobile: string;
|
|
673
|
-
avatar: string;
|
|
674
|
-
myInviteCode: string;
|
|
675
|
-
email?: string;
|
|
676
|
-
remark?: string;
|
|
677
|
-
roles: number[];
|
|
678
|
-
permissions: string[];
|
|
679
|
-
}
|
|
680
|
-
declare function setCurrentUser(userInfo: any): void;
|
|
681
|
-
declare function getCurrentUser(): any;
|
|
682
|
-
declare function clearCurrentUser(): void;
|
|
683
|
-
declare function getDeviceId(): string;
|
|
684
|
-
|
|
1555
|
+
/** 数学运算符类型 */
|
|
685
1556
|
type OperatorType = '+' | '-' | '*' | '/';
|
|
1557
|
+
/**
|
|
1558
|
+
* 通用数学计算函数
|
|
1559
|
+
* 支持链式运算,对多个数值执行相同类型的运算
|
|
1560
|
+
*
|
|
1561
|
+
* 实现原理:
|
|
1562
|
+
* 1. 取第一个数值作为初始值
|
|
1563
|
+
* 2. 使用reduce对剩余数值依次进行运算
|
|
1564
|
+
* 3. 使用Decimal.js确保精度
|
|
1565
|
+
*
|
|
1566
|
+
* @param operator - 运算符:+、-、*、/
|
|
1567
|
+
* @param args - 要计算的数值数组(可变参数)
|
|
1568
|
+
* @returns 计算结果字符串
|
|
1569
|
+
*
|
|
1570
|
+
* @example
|
|
1571
|
+
* calculate('+', 0.1, 0.2) // 返回 "0.3"
|
|
1572
|
+
* calculate('*', 2, 3, 4) // 返回 "24"
|
|
1573
|
+
*/
|
|
686
1574
|
declare const calculate: (operator: OperatorType, ...args: Decimal.Value[]) => string;
|
|
1575
|
+
/**
|
|
1576
|
+
* 精确加法运算
|
|
1577
|
+
* 解决JavaScript浮点数精度问题,支持多个数值相加
|
|
1578
|
+
*
|
|
1579
|
+
* @param args - 要相加的数值列表(可变参数)
|
|
1580
|
+
* @returns 相加结果字符串
|
|
1581
|
+
*
|
|
1582
|
+
* @example
|
|
1583
|
+
* plus(0.1, 0.2) // 返回 "0.3"
|
|
1584
|
+
* plus(1, 2, 3, 4, 5) // 返回 "15"
|
|
1585
|
+
*/
|
|
687
1586
|
declare const plus: (...args: Decimal.Value[]) => string;
|
|
1587
|
+
/**
|
|
1588
|
+
* 精确减法运算
|
|
1589
|
+
* 解决JavaScript浮点数精度问题,支持多个数值连续相减
|
|
1590
|
+
*
|
|
1591
|
+
* @param args - 要相减的数值列表(可变参数)
|
|
1592
|
+
* @returns 相减结果字符串
|
|
1593
|
+
*
|
|
1594
|
+
* @example
|
|
1595
|
+
* minus(0.3, 0.1) // 返回 "0.2"
|
|
1596
|
+
* minus(10, 1, 2, 3) // 返回 "4" (10-1-2-3)
|
|
1597
|
+
*/
|
|
688
1598
|
declare const minus: (...args: Decimal.Value[]) => string;
|
|
1599
|
+
/**
|
|
1600
|
+
* 精确乘法运算
|
|
1601
|
+
* 解决JavaScript浮点数精度问题,支持多个数值连续相乘
|
|
1602
|
+
*
|
|
1603
|
+
* @param args - 要相乘的数值列表(可变参数)
|
|
1604
|
+
* @returns 相乘结果字符串
|
|
1605
|
+
*
|
|
1606
|
+
* @example
|
|
1607
|
+
* times(0.1, 0.2) // 返回 "0.02"
|
|
1608
|
+
* times(2, 3, 4) // 返回 "24"
|
|
1609
|
+
*/
|
|
689
1610
|
declare const times: (...args: Decimal.Value[]) => string;
|
|
1611
|
+
/**
|
|
1612
|
+
* 精确除法运算
|
|
1613
|
+
* 解决JavaScript浮点数精度问题,支持多个数值连续相除
|
|
1614
|
+
*
|
|
1615
|
+
* @param args - 要相除的数值列表(可变参数)
|
|
1616
|
+
* @returns 相除结果字符串
|
|
1617
|
+
*
|
|
1618
|
+
* @example
|
|
1619
|
+
* dividedBy(0.3, 0.1) // 返回 "3"
|
|
1620
|
+
* dividedBy(100, 2, 5) // 返回 "10" (100/2/5)
|
|
1621
|
+
*/
|
|
690
1622
|
declare const dividedBy: (...args: Decimal.Value[]) => string;
|
|
1623
|
+
/**
|
|
1624
|
+
* 查看小数位数(不计算小数点最后末尾的0)
|
|
1625
|
+
* 返回数值中小数点后非零数字的位数
|
|
1626
|
+
*
|
|
1627
|
+
* @param arg1 - 要检查的数值
|
|
1628
|
+
* @returns 小数位数
|
|
1629
|
+
*
|
|
1630
|
+
* @example
|
|
1631
|
+
* decimalPlaces(1.23) // 返回 2
|
|
1632
|
+
* decimalPlaces(1.2300) // 返回 2 (末尾的0不计入)
|
|
1633
|
+
* decimalPlaces(1) // 返回 0
|
|
1634
|
+
*/
|
|
691
1635
|
declare const decimalPlaces: (arg1: Decimal.Value) => number;
|
|
1636
|
+
/**
|
|
1637
|
+
* 查看数值总位数(包括整数和小数部分)
|
|
1638
|
+
* 返回数值中所有有效数字的总位数
|
|
1639
|
+
*
|
|
1640
|
+
* @param arg1 - 要检查的数值
|
|
1641
|
+
* @returns 总位数
|
|
1642
|
+
*
|
|
1643
|
+
* @example
|
|
1644
|
+
* precision(1.23) // 返回 3
|
|
1645
|
+
* precision(123) // 返回 3
|
|
1646
|
+
* precision(0.01) // 返回 1
|
|
1647
|
+
*/
|
|
692
1648
|
declare const precision: (arg1: Decimal.Value) => number;
|
|
1649
|
+
/**
|
|
1650
|
+
* 取绝对值
|
|
1651
|
+
* 返回数值的绝对值(非负值)
|
|
1652
|
+
*
|
|
1653
|
+
* @param arg1 - 要处理的数值
|
|
1654
|
+
* @returns 绝对值字符串
|
|
1655
|
+
*
|
|
1656
|
+
* @example
|
|
1657
|
+
* absVal(-5) // 返回 "5"
|
|
1658
|
+
* absVal(5) // 返回 "5"
|
|
1659
|
+
* absVal(-1.5) // 返回 "1.5"
|
|
1660
|
+
*/
|
|
693
1661
|
declare const absVal: (arg1: Decimal.Value) => string;
|
|
1662
|
+
/**
|
|
1663
|
+
* 数值比较函数
|
|
1664
|
+
* 支持多种比较操作,解决浮点数比较精度问题
|
|
1665
|
+
*
|
|
1666
|
+
* @param arg1 - 第一个数值
|
|
1667
|
+
* @param arg2 - 第二个数值
|
|
1668
|
+
* @param type - 比较类型:>、>=、<、<=、==
|
|
1669
|
+
* @returns 比较结果布尔值
|
|
1670
|
+
*
|
|
1671
|
+
* @example
|
|
1672
|
+
* compareNum(0.1 + 0.2, 0.3, '==') // 返回 true
|
|
1673
|
+
* compareNum(1, 2, '<') // 返回 true
|
|
1674
|
+
* compareNum(2, 2, '>=') // 返回 true
|
|
1675
|
+
*/
|
|
694
1676
|
declare const compareNum: (arg1: Decimal.Value, arg2: Decimal.Value, type: string) => boolean;
|
|
1677
|
+
/**
|
|
1678
|
+
* 四舍五入处理
|
|
1679
|
+
* 对数值进行指定小数位数的四舍五入处理(解决原始toFixed精度问题)
|
|
1680
|
+
*
|
|
1681
|
+
* @param num - 要处理的数值
|
|
1682
|
+
* @param decimals - 保留小数位数,默认为2
|
|
1683
|
+
* @param fill - 是否补0,默认为true
|
|
1684
|
+
* @returns 处理后的数字字符串
|
|
1685
|
+
*
|
|
1686
|
+
* @example
|
|
1687
|
+
* toFixed(1.2345) // 返回 "1.23"
|
|
1688
|
+
* toFixed(1.2345, 3) // 返回 "1.235"
|
|
1689
|
+
* toFixed(1.2, 2, true) // 返回 "1.20" (补0)
|
|
1690
|
+
* toFixed(1.2, 2, false) // 返回 "1.2" (不补0)
|
|
1691
|
+
*/
|
|
695
1692
|
declare const toFixed: (num: Decimal.Value, decimals?: number, fill?: boolean) => string;
|
|
1693
|
+
/**
|
|
1694
|
+
* 判断是否为整数
|
|
1695
|
+
* 检查数值是否为整数(没有小数部分)
|
|
1696
|
+
*
|
|
1697
|
+
* @param num - 要判断的数值
|
|
1698
|
+
* @returns 是否为整数
|
|
1699
|
+
*
|
|
1700
|
+
* @example
|
|
1701
|
+
* isInteger(1) // 返回 true
|
|
1702
|
+
* isInteger(1.0) // 返回 true
|
|
1703
|
+
* isInteger(1.1) // 返回 false
|
|
1704
|
+
*/
|
|
696
1705
|
declare const isInteger: (num: Decimal.Value) => boolean;
|
|
1706
|
+
/**
|
|
1707
|
+
* 判断是否为负数
|
|
1708
|
+
* 检查数值是否小于0
|
|
1709
|
+
*
|
|
1710
|
+
* @param num - 要判断的数值
|
|
1711
|
+
* @returns 是否为负数
|
|
1712
|
+
*
|
|
1713
|
+
* @example
|
|
1714
|
+
* isNegative(-1) // 返回 true
|
|
1715
|
+
* isNegative(0) // 返回 false
|
|
1716
|
+
* isNegative(1) // 返回 false
|
|
1717
|
+
*/
|
|
697
1718
|
declare const isNegative: (num: Decimal.Value) => boolean;
|
|
698
1719
|
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
1720
|
+
/**
|
|
1721
|
+
* 消息提示配置接口
|
|
1722
|
+
*/
|
|
1723
|
+
interface Message {
|
|
1724
|
+
/** 消息标题 */
|
|
1725
|
+
title?: string;
|
|
1726
|
+
/** 消息内容 */
|
|
1727
|
+
content: string;
|
|
1728
|
+
/** 显示时长(秒),为0则不自动关闭 */
|
|
1729
|
+
duration?: number;
|
|
1730
|
+
/** 消息类型:成功、错误、警告、信息 */
|
|
1731
|
+
type?: 'success' | 'error' | 'warning' | 'info';
|
|
1732
|
+
/** 关闭回调 */
|
|
1733
|
+
onClose?: () => void;
|
|
1734
|
+
}
|
|
1735
|
+
/**
|
|
1736
|
+
* 缓存消息配置接口
|
|
1737
|
+
* 扩展基础消息接口,增加缓存控制
|
|
1738
|
+
*/
|
|
1739
|
+
interface CacheMessage extends Message {
|
|
1740
|
+
/** 是否启用缓存机制 */
|
|
1741
|
+
isCache?: boolean;
|
|
1742
|
+
/** 是否为唯一消息 */
|
|
1743
|
+
isOnly?: boolean;
|
|
1744
|
+
}
|
|
1745
|
+
/**
|
|
1746
|
+
* 导出的缓存消息显示函数
|
|
1747
|
+
* 支持防重复显示、自动关闭、多种显示形式
|
|
1748
|
+
*
|
|
1749
|
+
* 使用示例:
|
|
1750
|
+
* ```typescript
|
|
1751
|
+
* // 基本用法
|
|
1752
|
+
* cachedMessage({ content: '操作成功', type: 'success' })
|
|
1753
|
+
*
|
|
1754
|
+
* // 长消息自动使用通知形式
|
|
1755
|
+
* cachedMessage({ title: '系统通知', content: '这是一条很长的通知内容,将会以notification形式显示...', type: 'info' })
|
|
1756
|
+
*
|
|
1757
|
+
* // 弹窗形式(duration=0)
|
|
1758
|
+
* cachedMessage({ title: '确认操作', content: '确定要删除这项数据吗?', duration: 0, type: 'warning' })
|
|
1759
|
+
*
|
|
1760
|
+
* // 防重复显示
|
|
1761
|
+
* cachedMessage({ content: '请先登录', type: 'error' })
|
|
1762
|
+
* cachedMessage({ content: '请先登录', type: 'error' }) // 此条不会显示
|
|
1763
|
+
*
|
|
1764
|
+
* // 强制重新显示(禁用缓存)
|
|
1765
|
+
* cachedMessage({ content: '请先登录', type: 'error', isCache: false })
|
|
1766
|
+
* ```
|
|
1767
|
+
*/
|
|
1768
|
+
declare const cachedMessage: ({ title, content, type, duration, onClose, isCache, isOnly }: CacheMessage) => void;
|
|
1769
|
+
|
|
1770
|
+
/**
|
|
1771
|
+
* 手机号验证规则
|
|
1772
|
+
* 匹配以1开头,第二位为3-9的11位数字
|
|
1773
|
+
*/
|
|
1774
|
+
declare const RegMobile: {
|
|
1775
|
+
pattern: RegExp;
|
|
1776
|
+
message: string;
|
|
1777
|
+
};
|
|
1778
|
+
/**
|
|
1779
|
+
* 固定电话验证规则
|
|
1780
|
+
* 匹配区号(0开头2-3位数字) + 连字符 + 7-8位号码
|
|
1781
|
+
*/
|
|
1782
|
+
declare const RegFixedTelePhone: {
|
|
1783
|
+
pattern: RegExp;
|
|
1784
|
+
message: string;
|
|
1785
|
+
};
|
|
1786
|
+
/**
|
|
1787
|
+
* 通用电话号码验证规则
|
|
1788
|
+
* 匹配包含数字及常见电话符号(+、-、()、()、 )的1-20位字符串
|
|
1789
|
+
*/
|
|
1790
|
+
declare const RegTelePhone: {
|
|
1791
|
+
pattern: RegExp;
|
|
1792
|
+
message: string;
|
|
1793
|
+
};
|
|
1794
|
+
/**
|
|
1795
|
+
* 税号验证规则
|
|
1796
|
+
* 匹配15位、18位或20位的大写字母和数字组合
|
|
1797
|
+
*/
|
|
1798
|
+
declare const RegTaxNo: {
|
|
1799
|
+
pattern: RegExp;
|
|
1800
|
+
message: string;
|
|
1801
|
+
};
|
|
1802
|
+
/**
|
|
1803
|
+
* 银行卡号验证规则
|
|
1804
|
+
* 匹配纯数字组成的字符串
|
|
1805
|
+
*/
|
|
1806
|
+
declare const RegBankCardNo: {
|
|
1807
|
+
pattern: RegExp;
|
|
1808
|
+
message: string;
|
|
1809
|
+
};
|
|
1810
|
+
/**
|
|
1811
|
+
* 身份证号验证规则
|
|
1812
|
+
* 匹配15位数字、18位数字或17位数字加X/x的格式
|
|
1813
|
+
*/
|
|
1814
|
+
declare const RegIdentityCardNo: {
|
|
1815
|
+
pattern: RegExp;
|
|
1816
|
+
message: string;
|
|
1817
|
+
};
|
|
1818
|
+
/**
|
|
1819
|
+
* 数字验证规则
|
|
1820
|
+
* 匹配纯数字组成的字符串
|
|
1821
|
+
*/
|
|
1822
|
+
declare const RegNumNo: {
|
|
1823
|
+
pattern: RegExp;
|
|
1824
|
+
message: string;
|
|
1825
|
+
};
|
|
1826
|
+
/**
|
|
1827
|
+
* 短信验证码验证规则
|
|
1828
|
+
* 匹配6位数字
|
|
1829
|
+
*/
|
|
1830
|
+
declare const RegSmsCode: {
|
|
1831
|
+
pattern: RegExp;
|
|
1832
|
+
message: string;
|
|
1833
|
+
};
|
|
1834
|
+
/**
|
|
1835
|
+
* 邮箱验证规则
|
|
1836
|
+
* 匹配标准邮箱格式:用户名@域名.顶级域名
|
|
1837
|
+
*/
|
|
1838
|
+
declare const RegEmail: {
|
|
1839
|
+
pattern: RegExp;
|
|
1840
|
+
message: string;
|
|
1841
|
+
};
|
|
1842
|
+
/**
|
|
1843
|
+
* 详细地址验证规则
|
|
1844
|
+
* 必须包含地址相关关键词(街、路、村、乡、镇、道、巷、号)
|
|
1845
|
+
*/
|
|
1846
|
+
declare const RegDetailAddress: {
|
|
1847
|
+
pattern: RegExp;
|
|
1848
|
+
message: string;
|
|
1849
|
+
};
|
|
1850
|
+
/**
|
|
1851
|
+
* 手机号或固定电话验证器
|
|
1852
|
+
* 验证输入是否符合手机号或固定电话格式
|
|
1853
|
+
*
|
|
1854
|
+
* @param errMessage - 自定义错误消息
|
|
1855
|
+
* @returns Ant Design 表单验证规则对象
|
|
1856
|
+
*
|
|
1857
|
+
* @example
|
|
1858
|
+
* // 基本使用
|
|
1859
|
+
* <Form.Item name="phone" rules={[PhoneOrMobileValidator()]}>
|
|
1860
|
+
* <Input />
|
|
1861
|
+
* </Form.Item>
|
|
1862
|
+
*
|
|
1863
|
+
* @example
|
|
1864
|
+
* // 自定义错误消息
|
|
1865
|
+
* <Form.Item name="phone" rules={[PhoneOrMobileValidator('请输入正确的联系电话')]}>
|
|
1866
|
+
* <Input />
|
|
1867
|
+
* </Form.Item>
|
|
1868
|
+
*/
|
|
1869
|
+
declare const PhoneOrMobileValidator: (errMessage?: string) => {
|
|
1870
|
+
validator: (_: RuleObject, value: string) => Promise<void>;
|
|
1871
|
+
};
|
|
1872
|
+
/**
|
|
1873
|
+
* 数值范围验证器
|
|
1874
|
+
* 验证输入数值是否在指定范围内
|
|
1875
|
+
*
|
|
1876
|
+
* @param options - 验证选项
|
|
1877
|
+
* @param options.min - 最小值
|
|
1878
|
+
* @param options.max - 最大值
|
|
1879
|
+
* @param options.equalMin - 是否可等于最小值,默认false
|
|
1880
|
+
* @param options.equalMax - 是否可等于最大值,默认false
|
|
1881
|
+
* @param options.errMessage - 通用错误消息
|
|
1882
|
+
* @param options.maxErrMessage - 最大值错误消息
|
|
1883
|
+
* @param options.minErrMessage - 最小值错误消息
|
|
1884
|
+
* @returns Ant Design 表单验证规则对象
|
|
1885
|
+
*
|
|
1886
|
+
* @example
|
|
1887
|
+
* // 验证年龄在0-150之间
|
|
1888
|
+
* <Form.Item name="age" rules={[ThanNumValidator({ min: 0, max: 150, equalMin: true, equalMax: true })]}>
|
|
1889
|
+
* <InputNumber />
|
|
1890
|
+
* </Form.Item>
|
|
1891
|
+
*
|
|
1892
|
+
* @example
|
|
1893
|
+
* // 验证价格大于0
|
|
1894
|
+
* <Form.Item name="price" rules={[ThanNumValidator({ min: 0, equalMin: false })]}>
|
|
1895
|
+
* <InputNumber />
|
|
1896
|
+
* </Form.Item>
|
|
1897
|
+
*/
|
|
1898
|
+
declare const ThanNumValidator: ({ min, max, equalMin, equalMax, errMessage, maxErrMessage, minErrMessage }: {
|
|
1899
|
+
min?: number | string;
|
|
1900
|
+
max?: number | string;
|
|
1901
|
+
equalMin?: boolean;
|
|
1902
|
+
equalMax?: boolean;
|
|
1903
|
+
maxErrMessage?: string;
|
|
1904
|
+
minErrMessage?: string;
|
|
1905
|
+
errMessage?: string;
|
|
1906
|
+
}) => {
|
|
1907
|
+
validator: (_: RuleObject, value: string) => Promise<void>;
|
|
1908
|
+
};
|
|
1909
|
+
/**
|
|
1910
|
+
* 数值位数验证器
|
|
1911
|
+
* 验证输入数值的总位数、整数位数和小数位数是否符合要求
|
|
1912
|
+
*
|
|
1913
|
+
* @param options - 验证选项
|
|
1914
|
+
* @param options.length - 总位数限制
|
|
1915
|
+
* @param options.decimalsLength - 小数位数限制
|
|
1916
|
+
* @param options.integerLength - 整数位数限制
|
|
1917
|
+
* @param options.lengthErrMessage - 总位数错误消息
|
|
1918
|
+
* @param options.decimalsLengthErrMessage - 小数位数错误消息
|
|
1919
|
+
* @param options.integerLengthErrMessage - 整数位数错误消息
|
|
1920
|
+
* @returns Ant Design 表单验证规则对象
|
|
1921
|
+
*
|
|
1922
|
+
* @example
|
|
1923
|
+
* // 验证金额最多8位,其中小数点后2位
|
|
1924
|
+
* <Form.Item name="amount" rules={[ThanNumLengthValidator({ length: 8, decimalsLength: 2 })]}>
|
|
1925
|
+
* <InputNumber />
|
|
1926
|
+
* </Form.Item>
|
|
1927
|
+
*
|
|
1928
|
+
* @example
|
|
1929
|
+
* // 验证百分比最多3位整数,最多2位小数
|
|
1930
|
+
* <Form.Item name="percent" rules={[ThanNumLengthValidator({ integerLength: 3, decimalsLength: 2 })]}>
|
|
1931
|
+
* <InputNumber />
|
|
1932
|
+
* </Form.Item>
|
|
1933
|
+
*/
|
|
1934
|
+
declare const ThanNumLengthValidator: ({ length, decimalsLength, integerLength, lengthErrMessage, decimalsLengthErrMessage, integerLengthErrMessage }: {
|
|
1935
|
+
length?: number;
|
|
1936
|
+
decimalsLength?: number;
|
|
1937
|
+
integerLength?: number;
|
|
1938
|
+
lengthErrMessage?: string;
|
|
1939
|
+
decimalsLengthErrMessage?: string;
|
|
1940
|
+
integerLengthErrMessage?: string;
|
|
1941
|
+
}) => {
|
|
1942
|
+
validator: (_: RuleObject, value: string) => Promise<void>;
|
|
1943
|
+
};
|
|
1944
|
+
/**
|
|
1945
|
+
* 多邮箱验证器
|
|
1946
|
+
* 验证逗号分隔的多个邮箱地址是否都符合格式要求
|
|
1947
|
+
*
|
|
1948
|
+
* @param max - 最大邮箱数量
|
|
1949
|
+
* @returns Ant Design 表单验证规则对象
|
|
1950
|
+
*
|
|
1951
|
+
* @example
|
|
1952
|
+
* // 最多允许输入5个邮箱
|
|
1953
|
+
* <Form.Item name="emails" rules={[MultiEmailValidator(5)]}>
|
|
1954
|
+
* <Input placeholder="多个邮箱用逗号分隔" />
|
|
1955
|
+
* </Form.Item>
|
|
1956
|
+
*/
|
|
1957
|
+
declare const MultiEmailValidator: (max: number) => {
|
|
1958
|
+
validator: (_: RuleObject, value: string) => Promise<void>;
|
|
711
1959
|
};
|
|
712
1960
|
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
declare
|
|
718
|
-
|
|
1961
|
+
/**
|
|
1962
|
+
* HTTP 错误状态码常量映射
|
|
1963
|
+
* 用于定义常见的 HTTP 错误响应状态码
|
|
1964
|
+
*/
|
|
1965
|
+
declare const HttpStatus: {
|
|
1966
|
+
/** 服务器错误 */
|
|
1967
|
+
readonly ERROR: 500;
|
|
1968
|
+
/** 缺少参数或参数错误 */
|
|
1969
|
+
readonly MISSING_PARAMETER: 400;
|
|
1970
|
+
/** 未授权,需要用户验证 */
|
|
1971
|
+
readonly UNAUTHORIZED: 401;
|
|
1972
|
+
/** 禁止访问,服务器理解请求但拒绝执行 */
|
|
1973
|
+
readonly FORBIDDEN: 403;
|
|
1974
|
+
/** 请求的资源未找到 */
|
|
1975
|
+
readonly NOT_FOUND: 404;
|
|
1976
|
+
};
|
|
1977
|
+
/**
|
|
1978
|
+
* 业务码常量映射
|
|
1979
|
+
* 用于定义应用层面的业务逻辑码
|
|
1980
|
+
*/
|
|
1981
|
+
declare const BusinessCode: {
|
|
1982
|
+
/** 请求成功 */
|
|
1983
|
+
readonly OK: 200;
|
|
1984
|
+
/** 权限拒绝,没有足够的权限执行操作 */
|
|
1985
|
+
readonly PERMISSION_DENIED: 13001;
|
|
1986
|
+
};
|
|
1987
|
+
/**
|
|
1988
|
+
* 扩展的请求配置接口
|
|
1989
|
+
* 继承自 AxiosRequestConfig,并增加了控制错误提示的选项
|
|
1990
|
+
*/
|
|
1991
|
+
interface RequestConfig extends AxiosRequestConfig {
|
|
1992
|
+
showError?: boolean;
|
|
1993
|
+
}
|
|
1994
|
+
/**
|
|
1995
|
+
* 创建一个配置好的 HTTP 请求实例
|
|
1996
|
+
* @param config - 可选的默认配置项
|
|
1997
|
+
* @returns 包含各种 HTTP 方法的对象
|
|
1998
|
+
*/
|
|
1999
|
+
declare function createRequest(config?: RequestConfig): {
|
|
2000
|
+
/**
|
|
2001
|
+
* 返回原始 axios 实例
|
|
2002
|
+
* 可以用于添加拦截器等
|
|
2003
|
+
*/
|
|
2004
|
+
instance: axios.AxiosInstance;
|
|
2005
|
+
/**
|
|
2006
|
+
* 发送 GET 请求
|
|
2007
|
+
* @param url - 请求地址
|
|
2008
|
+
* @param params - 查询参数
|
|
2009
|
+
* @param options - 额外的请求配置
|
|
2010
|
+
* @returns Promise<any> 响应数据
|
|
2011
|
+
*/
|
|
2012
|
+
get: (url: string, params?: any, options?: RequestConfig) => Promise<any>;
|
|
2013
|
+
/**
|
|
2014
|
+
* 发送 POST 请求
|
|
2015
|
+
* @param url - 请求地址
|
|
2016
|
+
* @param data - 请求体数据
|
|
2017
|
+
* @param options - 额外的请求配置
|
|
2018
|
+
* @returns Promise<any> 响应数据
|
|
2019
|
+
*/
|
|
2020
|
+
post: (url: string, data?: any, options?: RequestConfig) => Promise<any>;
|
|
2021
|
+
/**
|
|
2022
|
+
* 发送 PUT 请求
|
|
2023
|
+
* @param url - 请求地址
|
|
2024
|
+
* @param data - 请求体数据
|
|
2025
|
+
* @param options - 额外的请求配置
|
|
2026
|
+
* @returns Promise<any> 响应数据
|
|
2027
|
+
*/
|
|
2028
|
+
put: (url: string, data?: any, options?: RequestConfig) => Promise<any>;
|
|
2029
|
+
/**
|
|
2030
|
+
* 发送 DELETE 请求
|
|
2031
|
+
* @param url - 请求地址
|
|
2032
|
+
* @param data - 请求体数据
|
|
2033
|
+
* @param options - 额外的请求配置
|
|
2034
|
+
* @returns Promise<any> 响应数据
|
|
2035
|
+
*/
|
|
2036
|
+
delete: (url: string, data?: any, options?: RequestConfig) => Promise<any>;
|
|
2037
|
+
};
|
|
719
2038
|
|
|
720
|
-
|
|
721
|
-
|
|
2039
|
+
/**
|
|
2040
|
+
* 获取或生成设备唯一标识
|
|
2041
|
+
*
|
|
2042
|
+
* 该函数用于获取设备的唯一标识符,如果本地存储中不存在则会生成一个新的唯一ID
|
|
2043
|
+
* 主要用途:
|
|
2044
|
+
* 1. 跟踪用户设备(不涉及个人隐私)
|
|
2045
|
+
* 2. 设备统计分析
|
|
2046
|
+
* 3. 防止重复提交等场景
|
|
2047
|
+
*
|
|
2048
|
+
* 实现逻辑:
|
|
2049
|
+
* 1. 首先尝试从localStorage中获取已存储的设备ID
|
|
2050
|
+
* 2. 如果存在,则直接返回该设备ID
|
|
2051
|
+
* 3. 如果不存在,则生成一个新的唯一ID
|
|
2052
|
+
* 4. 将新生成的ID存储到localStorage中,以便下次使用
|
|
2053
|
+
* 5. 返回设备ID
|
|
2054
|
+
*
|
|
2055
|
+
* @param DEVICEID_KEY - 设备ID在localStorage中的存储键名
|
|
2056
|
+
* @returns 设备唯一标识字符串
|
|
2057
|
+
*
|
|
2058
|
+
* @example
|
|
2059
|
+
* // 使用自定义键名获取设备ID
|
|
2060
|
+
* const deviceId = getDeviceId('MY-APP-DEVICE-ID')
|
|
2061
|
+
*
|
|
2062
|
+
* 注意事项:
|
|
2063
|
+
* 1. 设备ID存储在localStorage中,清除浏览器数据会导致重新生成
|
|
2064
|
+
* 2. 不同域名下会有不同的设备ID
|
|
2065
|
+
* 3. 该ID不包含任何个人身份信息,仅用于设备识别
|
|
2066
|
+
*/
|
|
2067
|
+
declare function getDeviceId(DEVICEID_KEY: string): string;
|
|
2068
|
+
interface SecureManagerProps {
|
|
2069
|
+
/** 存储键名 */
|
|
2070
|
+
key: string;
|
|
2071
|
+
/** AES加密密钥;(不传则明文存储) */
|
|
2072
|
+
aesKey?: string;
|
|
2073
|
+
/** 存储类型,默认为localStorage */
|
|
2074
|
+
storage?: Storage;
|
|
2075
|
+
}
|
|
2076
|
+
/**
|
|
2077
|
+
* 创建安全存储管理器
|
|
2078
|
+
*
|
|
2079
|
+
* 提供统一的数据存储接口,支持加密和明文两种存储模式
|
|
2080
|
+
*
|
|
2081
|
+
* 特性:
|
|
2082
|
+
* 1. 灵活存储:支持sessionStorage和localStorage
|
|
2083
|
+
* 2. 可选加密:通过aesKey参数控制是否加密存储
|
|
2084
|
+
* 3. 自动处理:根据是否提供aesKey自动切换加密/明文模式
|
|
2085
|
+
* 4. 类型安全:支持泛型,可指定存储数据的类型
|
|
2086
|
+
*
|
|
2087
|
+
* @param options 安全存储配置选项
|
|
2088
|
+
* @returns 安全存储管理器对象
|
|
2089
|
+
*
|
|
2090
|
+
* @example
|
|
2091
|
+
* // 加密存储(提供aesKey时自动启用加密)
|
|
2092
|
+
* const secureManager = createSecureManager({
|
|
2093
|
+
* key: 'user-profile',
|
|
2094
|
+
* aesKey: 'my-secret-key'
|
|
2095
|
+
* })
|
|
2096
|
+
* secureManager.set({ name: 'John', id: 123 })
|
|
2097
|
+
*
|
|
2098
|
+
* @example
|
|
2099
|
+
* // 明文存储(不提供aesKey时使用明文存储)
|
|
2100
|
+
* const plainManager = createSecureManager({
|
|
2101
|
+
* key: 'app-settings'
|
|
2102
|
+
* })
|
|
2103
|
+
* plainManager.set({ theme: 'dark', lang: 'en' })
|
|
2104
|
+
*
|
|
2105
|
+
* @example
|
|
2106
|
+
* // 自定义存储类型
|
|
2107
|
+
* const localManager = createSecureManager({
|
|
2108
|
+
* key: 'local-data',
|
|
2109
|
+
* aesKey: 'secret-key',
|
|
2110
|
+
* storage: localStorage
|
|
2111
|
+
* })
|
|
2112
|
+
*/
|
|
2113
|
+
declare function createSecureManager<T>({ key, storage, aesKey }: SecureManagerProps): {
|
|
2114
|
+
set: (data: T) => void;
|
|
2115
|
+
get: () => T | null;
|
|
2116
|
+
clear: () => void;
|
|
2117
|
+
};
|
|
2118
|
+
interface TokenManagerProps {
|
|
2119
|
+
/** token在存储中的键名 */
|
|
2120
|
+
key: string;
|
|
2121
|
+
/** 存储类型,支持localStorage和sessionStorage,默认为localStorage */
|
|
2122
|
+
storage?: Storage;
|
|
2123
|
+
}
|
|
2124
|
+
/**
|
|
2125
|
+
* 创建token管理器
|
|
2126
|
+
*
|
|
2127
|
+
* 提供统一的token管理功能,支持从URL参数或存储中获取、设置和清除token
|
|
2128
|
+
*
|
|
2129
|
+
* 设计特点:
|
|
2130
|
+
* 1. 自动同步:从URL获取token时会自动同步到存储中
|
|
2131
|
+
* 2. 灵活存储:支持localStorage和sessionStorage
|
|
2132
|
+
* 3. 优先级获取:优先使用URL参数中的token
|
|
2133
|
+
* 4. 简洁API:提供完整的token管理操作
|
|
2134
|
+
*
|
|
2135
|
+
* @param options token管理器配置选项
|
|
2136
|
+
* @returns token管理器对象
|
|
2137
|
+
*
|
|
2138
|
+
* @example
|
|
2139
|
+
* // 创建基于localStorage的token管理器
|
|
2140
|
+
* const tokenManager = createTokenManager({
|
|
2141
|
+
* key: 'ACCESS_TOKEN'
|
|
2142
|
+
* })
|
|
2143
|
+
*
|
|
2144
|
+
* // 从URL参数或localStorage获取token
|
|
2145
|
+
* const token = tokenManager.get()
|
|
2146
|
+
*
|
|
2147
|
+
* // 设置token
|
|
2148
|
+
* tokenManager.set('new-token-value')
|
|
2149
|
+
*
|
|
2150
|
+
* // 清除token
|
|
2151
|
+
* tokenManager.clear()
|
|
2152
|
+
*
|
|
2153
|
+
* @example
|
|
2154
|
+
* // 创建基于sessionStorage的token管理器
|
|
2155
|
+
* const tokenManager = createTokenManager({
|
|
2156
|
+
* key: 'SESSION_TOKEN',
|
|
2157
|
+
* storage: sessionStorage
|
|
2158
|
+
* })
|
|
2159
|
+
*/
|
|
2160
|
+
declare function createTokenManager({ key, storage }: TokenManagerProps): {
|
|
2161
|
+
set: (data: string) => void;
|
|
2162
|
+
get: () => string;
|
|
2163
|
+
clear: () => void;
|
|
2164
|
+
};
|
|
722
2165
|
|
|
723
|
-
export { _default$
|
|
2166
|
+
export { _default$m as AudioPlayer, type AudioPlayerProps, BusinessCode, type CacheMessage, type ComponentMapType, DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT, DEFAULT_YEAR_MONTH_DAY_FORMAT, DEFAULT_YEAR_MONTH_FORMAT, _default$l as FileIcon, type FileIconProps, _default$k as FilePreview, _default$j as FilePreviewDrawer, type FilePreviewDrawerProps, type FilePreviewProps, HttpStatus, _default$f as Iframe, type IframeProps, _default$e as LazyComponent, type LazyComponentProps, _default$d as MarkdownEditor, type MarkdownEditorProps, _default$i as MarkdownPreview, type MarkdownPreviewProps, MultiEmailValidator, _default$h as PdfPreview, type PdfPreviewProps, PhoneOrMobileValidator, RegBankCardNo, RegDetailAddress, RegEmail, RegFixedTelePhone, RegIdentityCardNo, RegMobile, RegNumNo, RegSmsCode, RegTaxNo, RegTelePhone, type RenderControl, _default$c as RenderMarkdown, type RenderMarkdownProps, _default$b as RenderWrapper, type RenderWrapperProps, type RequestConfig, type SecureManagerProps, ThanNumLengthValidator, ThanNumValidator, type TokenManagerProps, _default$a as UserAvatar, type UserAvatarProps, _default$g as VideoPlayer, type VideoPlayerProps, type WebSocketProps, type WebSocketType, absVal, addUrlLastSlash, aesDecrypt, aesEncrypt, arrToObj, buildUrlParams, cachedMessage, calculate, compareNum, convertCurrency, convertNewlineToBr, copyText, createRequest, createSecureManager, createTokenManager, decimalPlaces, deepCopy, deepEqual, deepMerge, dividedBy, downloadFile, emit, emitToChild, executeScript, formatDate, formatNumberWithCommas, genNonDuplicateID, generateRandomNumbers, getAllUrlParams, getDeviceId, getEndOfTimestamp, getFileName, getFileSuffixName, getRowSpanCount, getStartOfTimestamp, getTimestamp, getWebSocketUrl, importThirdPartyFile, is, isArray, isBlob, isBoolean, isDate, isDef, isElement, isEmpty, isEmptyObj, isExpire, isExternal, isFunction, isInteger, isJson, isLocalhost, isMap, isNegative, isNull, isNullOrUnDef, isNumber, isNumberNoNaN, isObject, isPromise, isReferenceType, isRegExp, isScriptSafe, isSet, isString, isUnDef, isWindow, minus, objToOptions, plus, precision, processItemList, propsMerge, setInterval, setUrlMainSource, shouldRender, times, toFixed, transform, transforms, _default$8 as useAutoRefresh, _default$7 as useCountDown, _default$6 as useCreateValtioContext, _default$5 as useDebounce, _default$4 as useDeepEffect, _default$9 as useIframeRelayBridge, _default$3 as useRefState, _default$2 as useSyncInput, _default$1 as useThrottle, _default as useWebSocket };
|