js_ryl_v3 1.0.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.
Files changed (92) hide show
  1. package/README.md +775 -0
  2. package/dist/base64Img/index.d.ts +5 -0
  3. package/dist/base64Img/index.js +50 -0
  4. package/dist/cookie/index.d.ts +14 -0
  5. package/dist/cookie/index.js +39 -0
  6. package/dist/copy/index.d.ts +9 -0
  7. package/dist/copy/index.js +18 -0
  8. package/dist/deepCopy/index.d.ts +1 -0
  9. package/dist/deepCopy/index.js +28 -0
  10. package/dist/downExcel/index.d.ts +5 -0
  11. package/dist/downExcel/index.js +43 -0
  12. package/dist/emoji/index.d.ts +1 -0
  13. package/dist/emoji/index.js +64 -0
  14. package/dist/emojiToUnicode/index.d.ts +1 -0
  15. package/dist/emojiToUnicode/index.js +8 -0
  16. package/dist/esm/base64Img/index.d.ts +5 -0
  17. package/dist/esm/base64Img/index.js +47 -0
  18. package/dist/esm/cookie/index.d.ts +14 -0
  19. package/dist/esm/cookie/index.js +37 -0
  20. package/dist/esm/copy/index.d.ts +9 -0
  21. package/dist/esm/copy/index.js +15 -0
  22. package/dist/esm/deepCopy/index.d.ts +1 -0
  23. package/dist/esm/deepCopy/index.js +25 -0
  24. package/dist/esm/downExcel/index.d.ts +5 -0
  25. package/dist/esm/downExcel/index.js +7 -0
  26. package/dist/esm/emoji/index.d.ts +1 -0
  27. package/dist/esm/emoji/index.js +61 -0
  28. package/dist/esm/emojiToUnicode/index.d.ts +1 -0
  29. package/dist/esm/emojiToUnicode/index.js +5 -0
  30. package/dist/esm/filterTable/index.d.ts +5 -0
  31. package/dist/esm/filterTable/index.js +21 -0
  32. package/dist/esm/flyToCart/index.d.ts +5 -0
  33. package/dist/esm/flyToCart/index.js +47 -0
  34. package/dist/esm/function/index.d.ts +11 -0
  35. package/dist/esm/function/index.js +23 -0
  36. package/dist/esm/getMonthDays/index.d.ts +1 -0
  37. package/dist/esm/getMonthDays/index.js +4 -0
  38. package/dist/esm/getParamsUtil/index.d.ts +12 -0
  39. package/dist/esm/getParamsUtil/index.js +85 -0
  40. package/dist/esm/highLight/index.d.ts +1 -0
  41. package/dist/esm/highLight/index.js +7 -0
  42. package/dist/esm/index.d.ts +17 -0
  43. package/dist/esm/index.js +17 -0
  44. package/dist/esm/number/index.d.ts +8 -0
  45. package/dist/esm/number/index.js +160 -0
  46. package/dist/esm/reg/index.d.ts +11 -0
  47. package/dist/esm/reg/index.js +35 -0
  48. package/dist/esm/time/index.d.ts +8 -0
  49. package/dist/esm/time/index.js +78 -0
  50. package/dist/esm/verCode/index.d.ts +6 -0
  51. package/dist/esm/verCode/index.js +37 -0
  52. package/dist/filterTable/index.d.ts +5 -0
  53. package/dist/filterTable/index.js +24 -0
  54. package/dist/flyToCart/index.d.ts +5 -0
  55. package/dist/flyToCart/index.js +50 -0
  56. package/dist/function/index.d.ts +11 -0
  57. package/dist/function/index.js +25 -0
  58. package/dist/getMonthDays/index.d.ts +1 -0
  59. package/dist/getMonthDays/index.js +7 -0
  60. package/dist/getParamsUtil/index.d.ts +12 -0
  61. package/dist/getParamsUtil/index.js +87 -0
  62. package/dist/highLight/index.d.ts +1 -0
  63. package/dist/highLight/index.js +10 -0
  64. package/dist/index.d.ts +17 -0
  65. package/dist/index.js +40 -0
  66. package/dist/number/index.d.ts +8 -0
  67. package/dist/number/index.js +162 -0
  68. package/dist/reg/index.d.ts +11 -0
  69. package/dist/reg/index.js +37 -0
  70. package/dist/time/index.d.ts +8 -0
  71. package/dist/time/index.js +80 -0
  72. package/dist/verCode/index.d.ts +6 -0
  73. package/dist/verCode/index.js +39 -0
  74. package/package.json +36 -0
  75. package/src/base64Img/index.ts +66 -0
  76. package/src/cookie/index.ts +47 -0
  77. package/src/copy/index.ts +23 -0
  78. package/src/deepCopy/index.ts +26 -0
  79. package/src/downExcel/index.ts +16 -0
  80. package/src/emoji/index.ts +63 -0
  81. package/src/emojiToUnicode/index.ts +9 -0
  82. package/src/filterTable/index.ts +33 -0
  83. package/src/flyToCart/index.ts +67 -0
  84. package/src/function/index.ts +37 -0
  85. package/src/getMonthDays/index.ts +4 -0
  86. package/src/getParamsUtil/index.ts +107 -0
  87. package/src/highLight/index.ts +10 -0
  88. package/src/index.ts +17 -0
  89. package/src/number/index.ts +133 -0
  90. package/src/reg/index.ts +36 -0
  91. package/src/time/index.ts +90 -0
  92. package/src/verCode/index.ts +42 -0
package/README.md ADDED
@@ -0,0 +1,775 @@
1
+ # js_ryl_v3
2
+
3
+ 常用 JavaScript 工具函数集合,包含日期处理、数字运算、正则验证、Cookie 操作等。基于 TypeScript 开发,提供完整的类型声明。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install js_ryl_v3
9
+ ```
10
+
11
+ ## 使用
12
+
13
+ ```javascript
14
+ // 按需引入
15
+ import { cookie, time, reg, num } from 'js_ryl_v3';
16
+
17
+ // 全量引入
18
+ import * as utils from 'js_ryl_v3';
19
+ ```
20
+
21
+ ---
22
+
23
+ ## 方法列表
24
+
25
+ ### 1. cookie - Cookie 操作
26
+
27
+ 浏览器 Cookie 的增删改查操作。
28
+
29
+ #### 方法
30
+
31
+ | 方法 | 说明 | 参数 | 返回值 |
32
+ |------|------|------|--------|
33
+ | `cookie.set(key, val, ops?)` | 设置 Cookie | `key: string` - Cookie名称<br>`val: string` - Cookie值<br>`ops?: CookieSetOptions` - 配置项 | `void` |
34
+ | `cookie.get(name)` | 获取 Cookie | `name: string` - Cookie名称 | `string \| null` |
35
+ | `cookie.remove(key, ops?)` | 删除 Cookie | `key: string` - Cookie名称<br>`ops?: CookieOptions` - 配置项 | `void` |
36
+
37
+ #### CookieSetOptions 配置项
38
+
39
+ | 参数 | 类型 | 说明 |
40
+ |------|------|------|
41
+ | `path` | `string` | Cookie 路径,默认当前路径 |
42
+ | `domain` | `'domain' \| string` | Cookie 域名,传 `'domain'` 则自动设置为根域名 |
43
+ | `expires` | `number \| Date` | 过期时间,10位时间戳或 Date 对象 |
44
+
45
+ #### 示例
46
+
47
+ ```javascript
48
+ import { cookie } from 'js_ryl_v3';
49
+
50
+ // 设置Cookie
51
+ cookie.set('token', 'abc123');
52
+ cookie.set('user', 'zhangsan', {
53
+ path: '/',
54
+ domain: 'domain',
55
+ expires: Date.now() + 7 * 24 * 3600 * 1000
56
+ });
57
+
58
+ // 获取Cookie
59
+ const token = cookie.get('token');
60
+
61
+ // 删除Cookie
62
+ cookie.remove('token');
63
+ cookie.remove('user', { path: '/', domain: 'domain' });
64
+ ```
65
+
66
+ ---
67
+
68
+ ### 2. copy - 复制文本
69
+
70
+ 复制指定文本到剪贴板。
71
+
72
+ #### 方法
73
+
74
+ ```typescript
75
+ copy(content: string, callback: (result: CopyResult) => void): void
76
+ ```
77
+
78
+ #### 参数
79
+
80
+ | 参数 | 类型 | 说明 |
81
+ |------|------|------|
82
+ | `content` | `string` | 要复制的文本内容 |
83
+ | `callback` | `(result: CopyResult) => void` | 复制完成后的回调 |
84
+
85
+ #### CopyResult
86
+
87
+ | 属性 | 类型 | 说明 |
88
+ |------|------|------|
89
+ | `code` | `number` | 状态码,200 成功,100 失败 |
90
+ | `msg` | `string` | 状态信息 |
91
+
92
+ #### 示例
93
+
94
+ ```javascript
95
+ import { copy } from 'js_ryl_v3';
96
+
97
+ copy('Hello World', (res) => {
98
+ if (res.code === 200) {
99
+ console.log('复制成功');
100
+ } else {
101
+ console.log('复制失败:', res.msg);
102
+ }
103
+ });
104
+ ```
105
+
106
+ ---
107
+
108
+ ### 3. deepCopy - 深拷贝
109
+
110
+ 深拷贝对象或数组,支持 null、undefined、数组、普通对象。
111
+
112
+ #### 方法
113
+
114
+ ```typescript
115
+ deepCopy<T>(obj: T, tar?: Record<string, any>): T
116
+ ```
117
+
118
+ #### 参数
119
+
120
+ | 参数 | 类型 | 说明 |
121
+ |------|------|------|
122
+ | `obj` | `T` | 目标对象(拷贝结果会合并到此对象) |
123
+ | `tar` | `Record<string, any>` | 要拷贝的源对象 |
124
+
125
+ #### 示例
126
+
127
+ ```javascript
128
+ import { deepCopy } from 'js_ryl_v3';
129
+
130
+ const obj = { a: 1, b: { c: 2, d: [3, 4] } };
131
+ const copyObj = deepCopy({}, obj);
132
+
133
+ copyObj.b.c = 999;
134
+ console.log(obj.b.c); // 2 - 原对象不受影响
135
+ ```
136
+
137
+ ---
138
+
139
+ ### 4. downExcel - 导出 Excel
140
+
141
+ 导出数据为 Excel 文件。
142
+
143
+ #### 方法
144
+
145
+ ```typescript
146
+ downExcel(data: ExcelData[], fileName?: string, sheetName?: string): void
147
+ ```
148
+
149
+ #### 参数
150
+
151
+ | 参数 | 类型 | 默认值 | 说明 |
152
+ |------|------|--------|------|
153
+ | `data` | `ExcelData[]` | - | 要导出的数据数组 |
154
+ | `fileName` | `string` | `'列表'` | 下载的文件名称(不含后缀) |
155
+ | `sheetName` | `string` | `'Sheet1'` | 工作表名称 |
156
+
157
+ #### 示例
158
+
159
+ ```javascript
160
+ import { downExcel } from 'js_ryl_v3';
161
+
162
+ const data = [
163
+ { 姓名: '张三', 年龄: 25, 城市: '北京' },
164
+ { 姓名: '李四', 年龄: 30, 城市: '上海' }
165
+ ];
166
+
167
+ downExcel(data, '人员列表', '员工表');
168
+ ```
169
+
170
+ ---
171
+
172
+ ### 5. emoji - Unicode 转 Emoji
173
+
174
+ 将字符串中的 Unicode 编码转换为 Emoji 表情。
175
+
176
+ 支持格式:`U+xxxx`, `[u+xxxx]`, `\u{xxxx}`
177
+
178
+ #### 方法
179
+
180
+ ```typescript
181
+ emoji(str: string): string
182
+ ```
183
+
184
+ #### 参数
185
+
186
+ | 参数 | 类型 | 说明 |
187
+ |------|------|------|
188
+ | `str` | `string` | 包含 Unicode 编码的字符串 |
189
+
190
+ #### 示例
191
+
192
+ ```javascript
193
+ import { emoji } from 'js_ryl_v3';
194
+
195
+ emoji('你好 U+1F600'); // '你好 😀'
196
+ emoji('你好 [u+1f600]'); // '你好 😀'
197
+ emoji('你好 \\u{1F600}'); // '你好 😀'
198
+ ```
199
+
200
+ ---
201
+
202
+ ### 6. emojiToUnicode - Emoji 转 Unicode
203
+
204
+ 将字符串中的 Emoji 表情转换为 Unicode 编码格式 `[u+xxxx]`。
205
+
206
+ #### 方法
207
+
208
+ ```typescript
209
+ emojiToUnicode(msg: string): string
210
+ ```
211
+
212
+ #### 参数
213
+
214
+ | 参数 | 类型 | 说明 |
215
+ |------|------|------|
216
+ | `msg` | `string` | 包含 Emoji 的字符串 |
217
+
218
+ #### 示例
219
+
220
+ ```javascript
221
+ import { emojiToUnicode } from 'js_ryl_v3';
222
+
223
+ emojiToUnicode('你好😀世界🌍');
224
+ // '你好[u+1f600]世界[u+1f30d]'
225
+ ```
226
+
227
+ ---
228
+
229
+ ### 7. filterTable - 表格空值过滤
230
+
231
+ 将表格数据中的空值、null、undefined 替换为指定占位符。
232
+
233
+ #### 方法
234
+
235
+ ```typescript
236
+ filterTable(data: TableData[], params?: string, more?: (string | undefined | null)[]): TableData[]
237
+ ```
238
+
239
+ #### 参数
240
+
241
+ | 参数 | 类型 | 默认值 | 说明 |
242
+ |------|------|--------|------|
243
+ | `data` | `TableData[]` | - | 表格数据数组 |
244
+ | `params` | `string` | `'--'` | 空值替换为的占位符 |
245
+ | `more` | `(string \| undefined \| null)[]` | - | 额外需要替换为空的值 |
246
+
247
+ #### 示例
248
+
249
+ ```javascript
250
+ import { filterTable } from 'js_ryl_v3';
251
+
252
+ const data = [
253
+ { name: '张三', age: 25, email: '' },
254
+ { name: null, age: undefined, email: 'test@test.com' }
255
+ ];
256
+
257
+ const result = filterTable(data, '--');
258
+ // [{ name: '张三', age: 25, email: '--' }, { name: '--', age: '--', email: 'test@test.com' }]
259
+
260
+ // 自定义额外的空值
261
+ const result2 = filterTable(data, '-', [0, false]);
262
+ ```
263
+
264
+ ---
265
+
266
+ ### 8. flyToCart - 飞入购物车动画
267
+
268
+ 实现商品图片飞入购物车的抛物线动画效果。
269
+
270
+ #### 方法
271
+
272
+ ```typescript
273
+ flyToCart(event: MouseEvent, image: string, targets: HTMLElement, callback?: () => void): void
274
+ ```
275
+
276
+ #### 参数
277
+
278
+ | 参数 | 类型 | 默认值 | 说明 |
279
+ |------|------|--------|------|
280
+ | `event` | `MouseEvent` | - | 点击事件对象(起点位置) |
281
+ | `image` | `string` | - | 飞行的图片 URL(可用 base64) |
282
+ | `targets` | `HTMLElement` | - | 目标元素(购物车位置) |
283
+ | `callback` | `() => void` | `() => {}` | 动画结束回调 |
284
+
285
+ #### 示例
286
+
287
+ ```javascript
288
+ import { flyToCart } from 'js_ryl_v3';
289
+
290
+ document.getElementById('add-btn').addEventListener('click', (e) => {
291
+ const cart = document.getElementById('cart');
292
+ flyToCart(e, '/images/goods.jpg', cart, () => {
293
+ console.log('飞入完成');
294
+ });
295
+ });
296
+ ```
297
+
298
+ ---
299
+
300
+ ### 9. fun - 节流 & 防抖
301
+
302
+ 函数节流和防抖工具。
303
+
304
+ #### 方法
305
+
306
+ | 方法 | 说明 |
307
+ |------|------|
308
+ | `fun.throole(fn, delay?)` | 节流函数:规定时间内只让第一次触发生效 |
309
+ | `fun.debounce(fn, delay?)` | 防抖函数:规定时间内只让最后一次触发生效 |
310
+
311
+ #### 节流 (throole)
312
+
313
+ ```typescript
314
+ fun.throole<T extends (...args: any[]) => any>(fn: T, delay?: number): ThrottleFunction<T>
315
+ ```
316
+
317
+ | 参数 | 类型 | 默认值 | 说明 |
318
+ |------|------|--------|------|
319
+ | `fn` | `Function` | - | 要节流的函数 |
320
+ | `delay` | `number` | `500` | 节流时间(毫秒) |
321
+
322
+ #### 防抖 (debounce)
323
+
324
+ ```typescript
325
+ fun.debounce<T extends (...args: any[]) => any>(fn: T, delay?: number): DebounceFunction<T>
326
+ ```
327
+
328
+ | 参数 | 类型 | 默认值 | 说明 |
329
+ |------|------|--------|------|
330
+ | `fn` | `Function` | - | 要防抖的函数 |
331
+ | `delay` | `number` | `500` | 防抖时间(毫秒) |
332
+
333
+ #### 示例
334
+
335
+ ```javascript
336
+ import { fun } from 'js_ryl_v3';
337
+
338
+ // 节流 - 滚动事件
339
+ const handleScroll = fun.throole(() => {
340
+ console.log('滚动事件触发');
341
+ }, 300);
342
+ window.addEventListener('scroll', handleScroll);
343
+
344
+ // 防抖 - 搜索输入
345
+ const handleSearch = fun.debounce((e) => {
346
+ console.log('搜索:', e.target.value);
347
+ }, 500);
348
+ input.addEventListener('input', handleSearch);
349
+ ```
350
+
351
+ ---
352
+
353
+ ### 10. getMonthDays - 获取月份天数
354
+
355
+ 获取指定年份中指定月份的天数。
356
+
357
+ #### 方法
358
+
359
+ ```typescript
360
+ getMonthDays(year: number, month: number): number
361
+ ```
362
+
363
+ #### 参数
364
+
365
+ | 参数 | 类型 | 说明 |
366
+ |------|------|------|
367
+ | `year` | `number` | 年份 |
368
+ | `month` | `number` | 月份(1-12) |
369
+
370
+ #### 示例
371
+
372
+ ```javascript
373
+ import { getMonthDays } from 'js_ryl_v3';
374
+
375
+ getMonthDays(2024, 2); // 29 - 闰年2月
376
+ getMonthDays(2023, 2); // 28 - 平年2月
377
+ getMonthDays(2024, 1); // 31 - 1月
378
+ ```
379
+
380
+ ---
381
+
382
+ ### 11. getParamsUtil - URL 参数处理
383
+
384
+ URL 查询参数的解析、构建、合并、移除工具。
385
+
386
+ #### 方法
387
+
388
+ | 方法 | 说明 |
389
+ |------|------|
390
+ | `getParamsUtil.getParam(name, url?, defaultValue?, type?)` | 获取单个参数 |
391
+ | `getParamsUtil.getParams(url?)` | 获取所有参数 |
392
+ | `getParamsUtil.buildQueryString(params)` | 构建查询字符串 |
393
+ | `getParamsUtil.joinParams(url, params)` | 合并参数到 URL |
394
+ | `getParamsUtil.removeParams(url, keys)` | 移除 URL 中的参数 |
395
+
396
+ #### getParam
397
+
398
+ ```typescript
399
+ getParam<T = any>(
400
+ name: string,
401
+ url?: string,
402
+ defaultValue?: T,
403
+ type?: 'string' | 'number' | 'boolean' | 'object'
404
+ ): T
405
+ ```
406
+
407
+ | 参数 | 类型 | 说明 |
408
+ |------|------|------|
409
+ | `name` | `string` | 参数名 |
410
+ | `url` | `string` | 指定 URL,默认当前页面 URL |
411
+ | `defaultValue` | `any` | 默认值 |
412
+ | `type` | `'string' \| 'number' \| 'boolean' \| 'object'` | 返回值类型 |
413
+
414
+ #### getParams
415
+
416
+ ```typescript
417
+ getParams(url?: string): ParamsObject
418
+ ```
419
+
420
+ | 参数 | 类型 | 说明 |
421
+ |------|------|------|
422
+ | `url` | `string` | 指定 URL,默认当前页面 URL |
423
+
424
+ #### buildQueryString
425
+
426
+ ```typescript
427
+ buildQueryString(params: Record<string, any>): string
428
+ ```
429
+
430
+ | 参数 | 类型 | 说明 |
431
+ |------|------|------|
432
+ | `params` | `Record<string, any>` | 参数对象 |
433
+
434
+ #### joinParams
435
+
436
+ ```typescript
437
+ joinParams(url: string, params: Record<string, any>): string
438
+ ```
439
+
440
+ | 参数 | 类型 | 说明 |
441
+ |------|------|------|
442
+ | `url` | `string` | 原始 URL |
443
+ | `params` | `Record<string, any>` | 要合并的参数 |
444
+
445
+ #### removeParams
446
+
447
+ ```typescript
448
+ removeParams(url: string, keys: string | string[]): string
449
+ ```
450
+
451
+ | 参数 | 类型 | 说明 |
452
+ |------|------|------|
453
+ | `url` | `string` | 原始 URL |
454
+ | `keys` | `string \| string[]` | 要移除的参数名 |
455
+
456
+ #### 示例
457
+
458
+ ```javascript
459
+ import { getParamsUtil } from 'js_ryl_v3';
460
+
461
+ // 获取所有参数
462
+ const params = getParamsUtil.getParams('https://example.com?name=张三&age=25');
463
+ // { name: '张三', age: '25' }
464
+
465
+ // 获取单个参数
466
+ const name = getParamsUtil.getParam('name');
467
+ const age = getParamsUtil.getParam('age', undefined, 0, 'number');
468
+
469
+ // 构建查询字符串
470
+ const query = getParamsUtil.buildQueryString({ name: '张三', age: 25 });
471
+ // 'name=%E5%BC%A0%E4%B8%89&age=25'
472
+
473
+ // 合并参数
474
+ const newUrl = getParamsUtil.joinParams('https://example.com?a=1', { b: 2, c: 3 });
475
+ // 'https://example.com?a=1&b=2&c=3'
476
+
477
+ // 移除参数
478
+ const cleanUrl = getParamsUtil.removeParams('https://example.com?a=1&b=2&c=3', ['a', 'c']);
479
+ // 'https://example.com?b=2'
480
+ ```
481
+
482
+ ---
483
+
484
+ ### 12. highlight - 搜索高亮
485
+
486
+ 将文本中匹配的关键词用高亮标签包裹。
487
+
488
+ #### 方法
489
+
490
+ ```typescript
491
+ highlight(searchName: string, backText: string, className: string): string
492
+ ```
493
+
494
+ #### 参数
495
+
496
+ | 参数 | 类型 | 说明 |
497
+ |------|------|------|
498
+ | `searchName` | `string` | 搜索关键词 |
499
+ | `backText` | `string` | 原始文本 |
500
+ | `className` | `string` | 高亮元素的 class 名 |
501
+
502
+ #### 示例
503
+
504
+ ```javascript
505
+ import { highlight } from 'js_ryl_v3';
506
+
507
+ const result = highlight('测试', '这是一个测试文本', 'highlight');
508
+ // '这是一个<span class="highlight">测试</span>文本'
509
+ ```
510
+
511
+ ```css
512
+ .highlight {
513
+ background: yellow;
514
+ color: red;
515
+ }
516
+ ```
517
+
518
+ ---
519
+
520
+ ### 13. num - 数字精度计算
521
+
522
+ 解决 JavaScript 浮点数加减乘除精度丢失问题。
523
+
524
+ #### 方法
525
+
526
+ | 方法 | 说明 |
527
+ |------|------|
528
+ | `num.add(num1, num2)` | 加法 |
529
+ | `num.sub(num1, num2)` | 减法 |
530
+ | `num.mul(num1, num2)` | 乘法 |
531
+ | `num.div(num1, num2)` | 除法 |
532
+ | `num.NumFilter(v)` | 数字过滤(保留2位小数) |
533
+
534
+ #### 参数
535
+
536
+ | 参数 | 类型 | 说明 |
537
+ |------|------|------|
538
+ | `num1` | `number \| string` | 第一个数字 |
539
+ | `num2` | `number \| string` | 第二个数字 |
540
+
541
+ #### 示例
542
+
543
+ ```javascript
544
+ import { num } from 'js_ryl_v3';
545
+
546
+ // 加法
547
+ num.add(0.1, 0.2); // 0.3 (普通运算结果: 0.30000000000000004)
548
+
549
+ // 减法
550
+ num.sub(1, 0.9); // 0.1 (普通运算结果: 0.09999999999999998)
551
+
552
+ // 乘法
553
+ num.mul(0.1, 0.2); // 0.02 (普通运算结果: 0.020000000000000004)
554
+
555
+ // 除法
556
+ num.div(1, 0.1); // 10 (普通运算结果: 9.999999999999998)
557
+
558
+ // 数字过滤
559
+ num.NumFilter(1.234); // 1.23
560
+ ```
561
+
562
+ ---
563
+
564
+ ### 14. reg - 正则验证
565
+
566
+ 常用正则表达式验证。
567
+
568
+ #### 方法
569
+
570
+ | 方法 | 说明 |
571
+ |------|------|
572
+ | `reg.Phone(value)` | 手机号验证 |
573
+ | `reg.Email(value)` | 邮箱验证 |
574
+ | `reg.IdCard(value)` | 身份证号验证 |
575
+ | `reg.Common(value)` | 只能包含数字、字母、下划线 |
576
+ | `reg.QQ(value)` | QQ号验证 |
577
+ | `reg.Money(value)` | 金额验证 |
578
+ | `reg.imgUrl(value)` | 是否为 base64 图片 |
579
+ | `reg.verChinese(value)` | 是否包含中文 |
580
+
581
+ #### 参数
582
+
583
+ | 参数 | 类型 | 说明 |
584
+ |------|------|------|
585
+ | `value` | `string` | 要验证的值 |
586
+
587
+ #### 返回值
588
+
589
+ `boolean` - `true` 验证通过,`false` 验证失败
590
+
591
+ #### 示例
592
+
593
+ ```javascript
594
+ import { reg } from 'js_ryl_v3';
595
+
596
+ reg.Phone('13800138000'); // true
597
+ reg.Email('test@example.com'); // true
598
+ reg.IdCard('110101199001011234'); // true
599
+ reg.Common('abc_123'); // true
600
+ reg.QQ('123456'); // true
601
+ reg.Money('123.45'); // true
602
+ reg.imgUrl('data:image/png;base64,...'); // true
603
+ reg.verChinese('你好'); // true
604
+ ```
605
+
606
+ ---
607
+
608
+ ### 15. time - 时间处理
609
+
610
+ 时间戳与日期格式转换、时间格式化工具。
611
+
612
+ #### 方法
613
+
614
+ | 方法 | 说明 |
615
+ |------|------|
616
+ | `time.toDate(v, type?)` | 时间戳转日期 |
617
+ | `time.toStamp(v?, len?)` | 日期转时间戳 |
618
+ | `time.getNow()` | 获取当前时间 |
619
+ | `time.timestampFormat(timestamp)` | 智能时间格式化 |
620
+
621
+ #### toDate
622
+
623
+ ```typescript
624
+ toDate(v: number | string, type?: DateFormatType): string
625
+ ```
626
+
627
+ | 参数 | 类型 | 说明 |
628
+ |------|------|------|
629
+ | `v` | `number \| string` | 时间戳(10位或13位) |
630
+ | `type` | `DateFormatType` | 格式化类型 |
631
+
632
+ DateFormatType 可选值:
633
+ - `'yyyy-MM-dd'` - 年月日
634
+ - `'yyyy-MM-dd HH:mm'` - 年月日 时:分
635
+ - `'yyyy-MM-dd HH:mm:ss'` - 年月日 时:分:秒(默认)
636
+
637
+ #### toStamp
638
+
639
+ ```typescript
640
+ toStamp(v?: Date | string, len?: number): number
641
+ ```
642
+
643
+ | 参数 | 类型 | 默认值 | 说明 |
644
+ |------|------|--------|------|
645
+ | `v` | `Date \| string` | `new Date()` | 日期字符串或 Date 对象 |
646
+ | `len` | `number` | `10` | 返回时间戳位数(10或13) |
647
+
648
+ #### timestampFormat
649
+
650
+ ```typescript
651
+ timestampFormat(timestamp: number | string): string
652
+ ```
653
+
654
+ 智能格式化:
655
+ - 今天 → `HH:mm`
656
+ - 昨天 → `昨天 HH:mm`
657
+ - 今年 → `MM/dd HH:mm`
658
+ - 往年 → `yyyy/MM/dd HH:mm`
659
+
660
+ #### 示例
661
+
662
+ ```javascript
663
+ import { time } from 'js_ryl_v3';
664
+
665
+ // 时间戳转日期
666
+ time.toDate(1700000000); // '2023-11-14 13:33:20'
667
+ time.toDate(1700000000, 'yyyy-MM-dd'); // '2023-11-14'
668
+ time.toDate(1700000000, 'yyyy-MM-dd HH:mm'); // '2023-11-14 13:33'
669
+
670
+ // 日期转时间戳
671
+ time.toStamp('2023-11-14 13:33:20'); // 1700000000 (10位)
672
+ time.toStamp('2023-11-14', 13); // 13位时间戳
673
+
674
+ // 获取当前时间
675
+ time.getNow(); // '2024-01-01 12:00:00'
676
+
677
+ // 智能格式化
678
+ time.timestampFormat(Date.now() / 1000); // '12:00' (今天)
679
+ ```
680
+
681
+ ---
682
+
683
+ ### 16. verCode - 验证码倒计时
684
+
685
+ 手机验证码倒计时功能。
686
+
687
+ #### 方法
688
+
689
+ | 方法 | 说明 |
690
+ |------|------|
691
+ | `verCode.PhoneCode(e, ss?, cc?)` | 开始倒计时 |
692
+ | `verCode.PhoneCodeClear()` | 清除倒计时 |
693
+ | `verCode.phoneCodeStatus()` | 获取倒计时状态 |
694
+
695
+ #### PhoneCode
696
+
697
+ ```typescript
698
+ PhoneCode(e: MouseEvent, ss?: number, cc?: string): void
699
+ ```
700
+
701
+ | 参数 | 类型 | 默认值 | 说明 |
702
+ |------|------|--------|------|
703
+ | `e` | `MouseEvent` | - | 点击事件对象 |
704
+ | `ss` | `number` | `60` | 倒计时秒数 |
705
+ | `cc` | `string` | `'后重新获取'` | 倒计时后缀文字 |
706
+
707
+ #### 示例
708
+
709
+ ```javascript
710
+ import { verCode } from 'js_ryl_v3';
711
+
712
+ // HTML: <button id="code-btn">获取验证码</button>
713
+
714
+ document.getElementById('code-btn').addEventListener('click', (e) => {
715
+ verCode.PhoneCode(e, 60, '秒后重新获取');
716
+ });
717
+
718
+ // 手动清除倒计时
719
+ verCode.PhoneCodeClear();
720
+
721
+ // 获取状态
722
+ const isRunning = verCode.phoneCodeStatus(); // true/false
723
+ ```
724
+
725
+ ---
726
+
727
+ ### 17. base64Img - Base64 图片上传
728
+
729
+ 将 HTML 内容中的 base64 图片上传到服务器并替换为 URL。
730
+
731
+ #### 方法
732
+
733
+ ```typescript
734
+ base64Img(
735
+ content: string,
736
+ apiUrl: string,
737
+ token: string,
738
+ data?: Record<string, any>,
739
+ callback?: (original: string, error: string | Error) => void
740
+ ): Promise<string>
741
+ ```
742
+
743
+ #### 参数
744
+
745
+ | 参数 | 类型 | 说明 |
746
+ |------|------|------|
747
+ | `content` | `string` | 包含 base64 图片的 HTML 内容 |
748
+ | `apiUrl` | `string` | 上传接口地址 |
749
+ | `token` | `string` | 鉴权 token |
750
+ | `data` | `Record<string, any>` | 额外上传参数 |
751
+ | `callback` | `(original, error) => void` | 上传失败回调 |
752
+
753
+ #### 返回值
754
+
755
+ `Promise<string>` - 上传完成后替换好图片 URL 的 HTML 内容
756
+
757
+ #### 示例
758
+
759
+ ```javascript
760
+ import { base64Img } from 'js_ryl_v3';
761
+
762
+ const htmlContent = '<img src="data:image/png;base64,...">';
763
+
764
+ base64Img(htmlContent, '/api/upload', 'token123', { type: 'image' }, (original, err) => {
765
+ console.log('上传失败:', err);
766
+ }).then(result => {
767
+ console.log('处理后的HTML:', result);
768
+ });
769
+ ```
770
+
771
+ ---
772
+
773
+ ## License
774
+
775
+ MIT