pit-docs-mcp 1.0.2

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 (203) hide show
  1. package/README.md +180 -0
  2. package/dist/codegen.d.ts +5 -0
  3. package/dist/codegen.d.ts.map +1 -0
  4. package/dist/codegen.js +112 -0
  5. package/dist/constants.d.ts +6 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/constants.js +10 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +115 -0
  11. package/dist/resources.d.ts +3 -0
  12. package/dist/resources.d.ts.map +1 -0
  13. package/dist/resources.js +80 -0
  14. package/dist/tools.d.ts +3 -0
  15. package/dist/tools.d.ts.map +1 -0
  16. package/dist/tools.js +258 -0
  17. package/dist/utils.d.ts +26 -0
  18. package/dist/utils.d.ts.map +1 -0
  19. package/dist/utils.js +198 -0
  20. package/docs/codegen/pit-simplify-web.md +686 -0
  21. package/docs/pitBusinessUi/README.md +102 -0
  22. package/docs/pitBusinessUi/add-date-picker.md +57 -0
  23. package/docs/pitBusinessUi/add-operation.md +64 -0
  24. package/docs/pitBusinessUi/batch-download.md +44 -0
  25. package/docs/pitBusinessUi/bill-tree-dialog.md +82 -0
  26. package/docs/pitBusinessUi/collapse.md +88 -0
  27. package/docs/pitBusinessUi/date-time-picker.md +74 -0
  28. package/docs/pitBusinessUi/design-report-explain.md +47 -0
  29. package/docs/pitBusinessUi/dialog.md +89 -0
  30. package/docs/pitBusinessUi/dic-radio.md +67 -0
  31. package/docs/pitBusinessUi/dic.md +78 -0
  32. package/docs/pitBusinessUi/document-preview.md +54 -0
  33. package/docs/pitBusinessUi/drawer.md +67 -0
  34. package/docs/pitBusinessUi/editor.md +63 -0
  35. package/docs/pitBusinessUi/expand-search-form.md +65 -0
  36. package/docs/pitBusinessUi/file-preview.md +56 -0
  37. package/docs/pitBusinessUi/flow-table-status.md +47 -0
  38. package/docs/pitBusinessUi/icon-box.md +74 -0
  39. package/docs/pitBusinessUi/image-preview.md +55 -0
  40. package/docs/pitBusinessUi/image.md +53 -0
  41. package/docs/pitBusinessUi/input-formatter.md +100 -0
  42. package/docs/pitBusinessUi/input-number.md +47 -0
  43. package/docs/pitBusinessUi/input-select.md +68 -0
  44. package/docs/pitBusinessUi/input.md +56 -0
  45. package/docs/pitBusinessUi/jm-preview.md +47 -0
  46. package/docs/pitBusinessUi/json-editor.md +71 -0
  47. package/docs/pitBusinessUi/loading-btn.md +64 -0
  48. package/docs/pitBusinessUi/monaco.md +82 -0
  49. package/docs/pitBusinessUi/money-input.md +59 -0
  50. package/docs/pitBusinessUi/pagination.md +70 -0
  51. package/docs/pitBusinessUi/password-strength.md +59 -0
  52. package/docs/pitBusinessUi/positive-number.md +63 -0
  53. package/docs/pitBusinessUi/preview-image.md +62 -0
  54. package/docs/pitBusinessUi/preview-office.md +50 -0
  55. package/docs/pitBusinessUi/preview.md +57 -0
  56. package/docs/pitBusinessUi/quill.md +52 -0
  57. package/docs/pitBusinessUi/runflow-btn.md +52 -0
  58. package/docs/pitBusinessUi/search-date-picker.md +60 -0
  59. package/docs/pitBusinessUi/select-bid-list.md +66 -0
  60. package/docs/pitBusinessUi/select-color.md +38 -0
  61. package/docs/pitBusinessUi/select-contract-tree.md +41 -0
  62. package/docs/pitBusinessUi/select-dept.md +38 -0
  63. package/docs/pitBusinessUi/select-project-unit.md +48 -0
  64. package/docs/pitBusinessUi/select-section-tree.md +45 -0
  65. package/docs/pitBusinessUi/select-section.md +66 -0
  66. package/docs/pitBusinessUi/select-string.md +60 -0
  67. package/docs/pitBusinessUi/select-system-unit.md +41 -0
  68. package/docs/pitBusinessUi/select-user-by-role.md +51 -0
  69. package/docs/pitBusinessUi/switch.md +43 -0
  70. package/docs/pitBusinessUi/table-contract.md +66 -0
  71. package/docs/pitBusinessUi/table-operation.md +81 -0
  72. package/docs/pitBusinessUi/table.md +75 -0
  73. package/docs/pitBusinessUi/tag.md +86 -0
  74. package/docs/pitBusinessUi/textarea.md +65 -0
  75. package/docs/pitBusinessUi/transfer-direct.md +57 -0
  76. package/docs/pitBusinessUi/transfer-user-project.md +78 -0
  77. package/docs/pitBusinessUi/transfer.md +68 -0
  78. package/docs/pitBusinessUi/tree-lazy.md +72 -0
  79. package/docs/pitBusinessUi/tree-select-name.md +59 -0
  80. package/docs/pitBusinessUi/tree-select-plus.md +106 -0
  81. package/docs/pitBusinessUi/tree-select.md +86 -0
  82. package/docs/pitBusinessUi/upload-avatar.md +60 -0
  83. package/docs/pitBusinessUi/upload-file-dialog.md +86 -0
  84. package/docs/pitBusinessUi/upload-file.md +77 -0
  85. package/docs/pitBusinessUi/upload-list-card.md +62 -0
  86. package/docs/pitBusinessUi/upload-table.md +77 -0
  87. package/docs/pitBusinessUi/user-transform.md +72 -0
  88. package/docs/pitBusinessUi/utils.md +272 -0
  89. package/docs/pitBusinessUtils/README.md +144 -0
  90. package/docs/pitBusinessUtils/auth.md +170 -0
  91. package/docs/pitBusinessUtils/clipboard.md +72 -0
  92. package/docs/pitBusinessUtils/filePreview.md +60 -0
  93. package/docs/pitBusinessUtils/formValidate.md +75 -0
  94. package/docs/pitBusinessUtils/generateTitle.md +49 -0
  95. package/docs/pitBusinessUtils/get-page-title.md +65 -0
  96. package/docs/pitBusinessUtils/i18n.md +130 -0
  97. package/docs/pitBusinessUtils/jwks.md +82 -0
  98. package/docs/pitBusinessUtils/oss.md +391 -0
  99. package/docs/pitBusinessUtils/passwordValidate.md +120 -0
  100. package/docs/pitBusinessUtils/pit.md +496 -0
  101. package/docs/pitBusinessUtils/print.md +126 -0
  102. package/docs/pitBusinessUtils/request.md +137 -0
  103. package/docs/pitBusinessUtils/scroll-to.md +68 -0
  104. package/docs/pitBusinessUtils/utils.md +762 -0
  105. package/docs/pitBusinessUtils/validate.md +224 -0
  106. package/docs/pitElementUi/alert.md +238 -0
  107. package/docs/pitElementUi/avatar.md +147 -0
  108. package/docs/pitElementUi/backtop.md +60 -0
  109. package/docs/pitElementUi/badge.md +120 -0
  110. package/docs/pitElementUi/base-tabs.md +73 -0
  111. package/docs/pitElementUi/border.md +135 -0
  112. package/docs/pitElementUi/breadcrumb.md +44 -0
  113. package/docs/pitElementUi/button.md +301 -0
  114. package/docs/pitElementUi/calendar.md +66 -0
  115. package/docs/pitElementUi/card.md +170 -0
  116. package/docs/pitElementUi/carousel.md +212 -0
  117. package/docs/pitElementUi/cascader.md +1966 -0
  118. package/docs/pitElementUi/checkbox.md +283 -0
  119. package/docs/pitElementUi/collapse.md +131 -0
  120. package/docs/pitElementUi/color-picker.md +123 -0
  121. package/docs/pitElementUi/color.md +244 -0
  122. package/docs/pitElementUi/container.md +240 -0
  123. package/docs/pitElementUi/custom-theme.md +131 -0
  124. package/docs/pitElementUi/date-picker.md +448 -0
  125. package/docs/pitElementUi/datetime-picker.md +254 -0
  126. package/docs/pitElementUi/descriptions.md +191 -0
  127. package/docs/pitElementUi/dialog-header.md +53 -0
  128. package/docs/pitElementUi/dialog.md +239 -0
  129. package/docs/pitElementUi/divider.md +61 -0
  130. package/docs/pitElementUi/drawer.md +307 -0
  131. package/docs/pitElementUi/dropdown.md +308 -0
  132. package/docs/pitElementUi/empty.md +61 -0
  133. package/docs/pitElementUi/font-family.md +90 -0
  134. package/docs/pitElementUi/form-base.md +1239 -0
  135. package/docs/pitElementUi/form-item-checkbox-group.md +48 -0
  136. package/docs/pitElementUi/form-item-date.md +60 -0
  137. package/docs/pitElementUi/form-item-dic.md +18 -0
  138. package/docs/pitElementUi/form-item-editor.md +16 -0
  139. package/docs/pitElementUi/form-item-input-money.md +19 -0
  140. package/docs/pitElementUi/form-item-input-number.md +20 -0
  141. package/docs/pitElementUi/form-item-input.md +18 -0
  142. package/docs/pitElementUi/form-item-radio-group.md +21 -0
  143. package/docs/pitElementUi/form-item-select.md +21 -0
  144. package/docs/pitElementUi/form-item-switch.md +15 -0
  145. package/docs/pitElementUi/form-item-textarea.md +20 -0
  146. package/docs/pitElementUi/form-item-tree-select.md +27 -0
  147. package/docs/pitElementUi/form-item-upload-card.md +18 -0
  148. package/docs/pitElementUi/form-item-upload.md +1 -0
  149. package/docs/pitElementUi/form-two.md +102 -0
  150. package/docs/pitElementUi/form.md +952 -0
  151. package/docs/pitElementUi/i18n.md +228 -0
  152. package/docs/pitElementUi/icon-custom.md +99 -0
  153. package/docs/pitElementUi/icon-line-custom.md +12 -0
  154. package/docs/pitElementUi/icon.md +28 -0
  155. package/docs/pitElementUi/image.md +178 -0
  156. package/docs/pitElementUi/infiniteScroll.md +87 -0
  157. package/docs/pitElementUi/input-number.md +197 -0
  158. package/docs/pitElementUi/input-select.md +1 -0
  159. package/docs/pitElementUi/input.md +800 -0
  160. package/docs/pitElementUi/installation.md +9 -0
  161. package/docs/pitElementUi/layout-column.md +376 -0
  162. package/docs/pitElementUi/layout-tree.md +715 -0
  163. package/docs/pitElementUi/layout.md +354 -0
  164. package/docs/pitElementUi/link.md +66 -0
  165. package/docs/pitElementUi/loading.md +208 -0
  166. package/docs/pitElementUi/menu.md +403 -0
  167. package/docs/pitElementUi/message-box.md +326 -0
  168. package/docs/pitElementUi/message.md +219 -0
  169. package/docs/pitElementUi/notification.md +311 -0
  170. package/docs/pitElementUi/page-header.md +40 -0
  171. package/docs/pitElementUi/pagination.md +200 -0
  172. package/docs/pitElementUi/popconfirm.md +60 -0
  173. package/docs/pitElementUi/popover.md +167 -0
  174. package/docs/pitElementUi/progress.md +178 -0
  175. package/docs/pitElementUi/quickstart.md +290 -0
  176. package/docs/pitElementUi/radio.md +211 -0
  177. package/docs/pitElementUi/rate.md +135 -0
  178. package/docs/pitElementUi/result.md +76 -0
  179. package/docs/pitElementUi/select-tree.md +661 -0
  180. package/docs/pitElementUi/select.md +586 -0
  181. package/docs/pitElementUi/skeleton.md +316 -0
  182. package/docs/pitElementUi/slider.md +237 -0
  183. package/docs/pitElementUi/steps.md +154 -0
  184. package/docs/pitElementUi/switch.md +142 -0
  185. package/docs/pitElementUi/table.md +4023 -0
  186. package/docs/pitElementUi/tabs.md +303 -0
  187. package/docs/pitElementUi/tag.md +203 -0
  188. package/docs/pitElementUi/time-picker.md +199 -0
  189. package/docs/pitElementUi/timeline.md +154 -0
  190. package/docs/pitElementUi/tooltip.md +177 -0
  191. package/docs/pitElementUi/transfer.md +249 -0
  192. package/docs/pitElementUi/transition.md +155 -0
  193. package/docs/pitElementUi/tree.md +1157 -0
  194. package/docs/pitElementUi/typography.md +151 -0
  195. package/docs/pitElementUi/upload-table.md +39 -0
  196. package/docs/pitElementUi/upload.md +392 -0
  197. package/docs/pitElementUi/virtual-list.md +154 -0
  198. package/docs/pitElementUi/virtual-select-tree.md +243 -0
  199. package/docs/pitElementUi/virtual-select.md +451 -0
  200. package/docs/pitElementUi/virtual-table-column.md +1 -0
  201. package/docs/pitElementUi/virtual-table.md +490 -0
  202. package/docs/pitElementUi/virtual-tree.md +119 -0
  203. package/package.json +33 -0
@@ -0,0 +1,762 @@
1
+ # utils — 通用工具函数集合
2
+
3
+ 本模块是库中体量最大的工具集,涵盖时间格式化、URL 处理、字符串操作、DOM 类名操作、函数工具、文件下载、表格路由等多个类别,共约 30 个实用函数。
4
+
5
+ ## 引用方式
6
+
7
+ ```js
8
+ import {
9
+ parseTime, formatTime, getQueryObject, param, param2Obj,
10
+ debounce, deepClone, downloadTemplate, formatFileSize,
11
+ handleRules, iterationArr, getPreviewUrl
12
+ // ... 更多按需引入
13
+ } from 'pit-business-utils'
14
+ ```
15
+
16
+ ---
17
+
18
+ ## 一、时间格式化
19
+
20
+ ### `parseTime(time, cFormat)`
21
+
22
+ 全能时间解析与格式化,支持多种输入类型,对 Safari 的日期解析做了兼容处理。
23
+
24
+ | 参数 | 类型 | 必填 | 说明 |
25
+ |------|------|------|------|
26
+ | `time` | `string \| number \| Object` | ✅ | 时间值,支持时间戳(秒/毫秒)、日期字符串、Date 对象 |
27
+ | `cFormat` | `string` | — | 输出格式模板,默认 `"{y}-{m}-{d} {h}:{i}:{s}"`;占位符:`{y}`年、`{m}`月、`{d}`日、`{h}`时、`{i}`分、`{s}`秒、`{a}`星期 |
28
+
29
+ | — | — |
30
+ |---|---|
31
+ | **返回值** | `string \| null`,格式化后的字符串;输入为空时返回 `null` |
32
+
33
+ ```js
34
+ parseTime(1711036800000) // "2024-03-22 08:00:00"
35
+ parseTime(1711036800, '{y}/{m}/{d}') // "2024/03/22"(秒级时间戳自动 ×1000)
36
+ parseTime('2024-03-22', '{y}年{m}月{d}日') // "2024年03月22日"
37
+ parseTime(null) // null
38
+ ```
39
+
40
+ ---
41
+
42
+ ### `formatTime(time, option)`
43
+
44
+ 将时间戳转换为人性化的相对时间描述,适合消息列表、动态流等场景。
45
+
46
+ | 参数 | 类型 | 必填 | 说明 |
47
+ |------|------|------|------|
48
+ | `time` | `number \| string` | ✅ | 毫秒时间戳 |
49
+ | `option` | `string` | — | 超过一天时的自定义格式,传入则使用 `parseTime` 格式化,不传则显示 `"M月D日 H:i"` |
50
+
51
+ | — | — |
52
+ |---|---|
53
+ | **返回值** | `string`,如 `"刚刚"`、`"3分钟前"`、`"2小时前"`、`"1天前"`、`"03月22日 08:30"` |
54
+
55
+ ```js
56
+ formatTime(Date.now() - 30 * 1000) // "刚刚"
57
+ formatTime(Date.now() - 5 * 60 * 1000) // "5分钟前"
58
+ formatTime(Date.now() - 25 * 3600 * 1000) // "03月21日 08:00"
59
+ ```
60
+
61
+ ---
62
+
63
+ ### `handleDateStr(stamp)`
64
+
65
+ 将时间戳转为本地日期字符串 `yyyy-MM-dd HH:mm:ss`,兼容处理斜杠分隔问题。
66
+
67
+ | 参数 | 类型 | 必填 | 说明 |
68
+ |------|------|------|------|
69
+ | `stamp` | `number \| string` | ✅ | 毫秒时间戳 |
70
+
71
+ | — | — |
72
+ |---|---|
73
+ | **返回值** | `string`,格式 `yyyy-MM-dd HH:mm:ss` |
74
+
75
+ ```js
76
+ handleDateStr(1711036800000) // "2024-03-22 08:00:00"
77
+ ```
78
+
79
+ ---
80
+
81
+ ## 二、URL 处理
82
+
83
+ ### `getQueryObject(url)`
84
+
85
+ 解析 URL 查询字符串为键值对对象。
86
+
87
+ | 参数 | 类型 | 必填 | 说明 |
88
+ |------|------|------|------|
89
+ | `url` | `string` | — | 待解析的 URL,默认为 `window.location.href` |
90
+
91
+ | — | — |
92
+ |---|---|
93
+ | **返回值** | `Object`,键值对(值均为字符串类型) |
94
+
95
+ ```js
96
+ getQueryObject('https://example.com?a=1&b=hello')
97
+ // { a: '1', b: 'hello' }
98
+
99
+ getQueryObject() // 解析当前页面 URL 参数
100
+ ```
101
+
102
+ ---
103
+
104
+ ### `param(json)`
105
+
106
+ 将对象序列化为 URL 查询字符串,值为 `undefined` 的属性会被跳过,值会进行 URL 编码。
107
+
108
+ | 参数 | 类型 | 必填 | 说明 |
109
+ |------|------|------|------|
110
+ | `json` | `Object` | ✅ | 待序列化的键值对对象 |
111
+
112
+ | — | — |
113
+ |---|---|
114
+ | **返回值** | `string`,如 `"name=%E5%BC%A0%E4%B8%89&age=28"` |
115
+
116
+ ```js
117
+ param({ name: '张三', age: 28, empty: undefined })
118
+ // "name=%E5%BC%A0%E4%B8%89&age=28"(undefined 被跳过)
119
+ ```
120
+
121
+ ---
122
+
123
+ ### `param2Obj(url)`
124
+
125
+ 将完整 URL 或查询字符串解析为对象,自动 decode 并将 `+` 替换为空格。
126
+
127
+ | 参数 | 类型 | 必填 | 说明 |
128
+ |------|------|------|------|
129
+ | `url` | `string` | ✅ | 完整 URL 或 `?` 开头的查询字符串 |
130
+
131
+ | — | — |
132
+ |---|---|
133
+ | **返回值** | `Object` |
134
+
135
+ ```js
136
+ param2Obj('https://example.com?name=John+Doe&age=28')
137
+ // { name: 'John Doe', age: '28' }
138
+ ```
139
+
140
+ ---
141
+
142
+ ### `appendObjectToPath(path, object)`
143
+
144
+ 向路径字符串追加对象参数,用于构建带查询参数的 GET 请求 URL。
145
+
146
+ | 参数 | 类型 | 必填 | 说明 |
147
+ |------|------|------|------|
148
+ | `path` | `string` | ✅ | 基础路径 |
149
+ | `object` | `Object` | — | 需要追加的参数对象 |
150
+
151
+ | — | — |
152
+ |---|---|
153
+ | **返回值** | `string`,拼接后的完整路径 |
154
+
155
+ ```js
156
+ appendObjectToPath('/api/list', { page: 1, size: 10 })
157
+ // "/api/list?page=1&size=10"
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 三、字符串与数据处理
163
+
164
+ ### `byteLength(str)`
165
+
166
+ 计算字符串的 UTF-8 字节长度(中文等多字节字符各计为 3 字节)。
167
+
168
+ | 参数 | 类型 | 必填 | 说明 |
169
+ |------|------|------|------|
170
+ | `str` | `string` | ✅ | 待计算长度的字符串 |
171
+
172
+ | — | — |
173
+ |---|---|
174
+ | **返回值** | `number`,UTF-8 字节长度 |
175
+
176
+ ```js
177
+ byteLength('hello') // 5
178
+ byteLength('你好') // 6(每个汉字 3 字节)
179
+ ```
180
+
181
+ ---
182
+
183
+ ### `cleanArray(actual)`
184
+
185
+ 过滤数组中所有 falsy 值(`false`、`null`、`undefined`、`""`、`0`、`NaN`)。
186
+
187
+ | 参数 | 类型 | 必填 | 说明 |
188
+ |------|------|------|------|
189
+ | `actual` | `Array` | ✅ | 原始数组 |
190
+
191
+ | — | — |
192
+ |---|---|
193
+ | **返回值** | `Array`,过滤后的新数组 |
194
+
195
+ ```js
196
+ cleanArray([1, null, 2, '', undefined, 3]) // [1, 2, 3]
197
+ ```
198
+
199
+ ---
200
+
201
+ ### `html2Text(val)`
202
+
203
+ 去除 HTML 标签,提取纯文本内容。
204
+
205
+ | 参数 | 类型 | 必填 | 说明 |
206
+ |------|------|------|------|
207
+ | `val` | `string` | ✅ | 包含 HTML 标签的字符串 |
208
+
209
+ | — | — |
210
+ |---|---|
211
+ | **返回值** | `string`,纯文本内容 |
212
+
213
+ ```js
214
+ html2Text('<p>你好 <strong>世界</strong></p>') // "你好 世界"
215
+ ```
216
+
217
+ ---
218
+
219
+ ### `objectMerge(target, source)`
220
+
221
+ 深度合并两个对象或数组(数组直接浅拷贝替换,对象递归合并)。
222
+
223
+ | 参数 | 类型 | 必填 | 说明 |
224
+ |------|------|------|------|
225
+ | `target` | `Object \| Array` | ✅ | 目标对象 |
226
+ | `source` | `Object \| Array` | ✅ | 源对象,其属性将合并到 target |
227
+
228
+ | — | — |
229
+ |---|---|
230
+ | **返回值** | `Object \| Array`,合并后的新对象 |
231
+
232
+ ```js
233
+ objectMerge({ a: 1, b: { x: 1 } }, { b: { y: 2 }, c: 3 })
234
+ // { a: 1, b: { x: 1, y: 2 }, c: 3 }
235
+ ```
236
+
237
+ ---
238
+
239
+ ### `uniqueArr(arr)`
240
+
241
+ 数组去重(保留首次出现的元素)。
242
+
243
+ | 参数 | 类型 | 必填 | 说明 |
244
+ |------|------|------|------|
245
+ | `arr` | `Array` | ✅ | 原始数组 |
246
+
247
+ | — | — |
248
+ |---|---|
249
+ | **返回值** | `Array`,去重后的新数组 |
250
+
251
+ ```js
252
+ uniqueArr([1, 2, 2, 3, 1]) // [1, 2, 3]
253
+ ```
254
+
255
+ ---
256
+
257
+ ### `createUniqueString()`
258
+
259
+ 生成一个基于时间戳和随机数的唯一 ID 字符串(32 进制编码)。
260
+
261
+ | — | — |
262
+ |---|---|
263
+ | **参数** | 无 |
264
+ | **返回值** | `string`,唯一 ID |
265
+
266
+ ```js
267
+ createUniqueString() // 如 "m8q3k1v7p2"
268
+ ```
269
+
270
+ ---
271
+
272
+ ### `amountThousandsConversion(number)`
273
+
274
+ 将数字格式化为千分位字符串(整数和小数部分分别处理)。
275
+
276
+ | 参数 | 类型 | 必填 | 说明 |
277
+ |------|------|------|------|
278
+ | `number` | `number \| string` | ✅ | 原始数字 |
279
+
280
+ | — | — |
281
+ |---|---|
282
+ | **返回值** | `string`,千分位格式化后的字符串 |
283
+
284
+ ```js
285
+ amountThousandsConversion(1234567.89) // "1,234,567.89"
286
+ amountThousandsConversion(1000) // "1,000"
287
+ ```
288
+
289
+ ---
290
+
291
+ ### `analyzeIDCard(IDCard)`
292
+
293
+ 通过 18 位身份证号码计算年龄。
294
+
295
+ | 参数 | 类型 | 必填 | 说明 |
296
+ |------|------|------|------|
297
+ | `IDCard` | `string` | ✅ | 18 位居民身份证号码 |
298
+
299
+ | — | — |
300
+ |---|---|
301
+ | **返回值** | `number \| ""`,计算得到的年龄;输入无效时返回 `""` |
302
+
303
+ ```js
304
+ analyzeIDCard('110101199001011234') // 返回当前年龄(如 34)
305
+ analyzeIDCard('invalid') // ""
306
+ ```
307
+
308
+ ---
309
+
310
+ ## 四、DOM 类名操作
311
+
312
+ ### `hasClass(ele, cls)`
313
+
314
+ 判断元素是否包含指定类名。
315
+
316
+ | 参数 | 类型 | 必填 | 说明 |
317
+ |------|------|------|------|
318
+ | `ele` | `HTMLElement` | ✅ | 目标 DOM 元素 |
319
+ | `cls` | `string` | ✅ | 类名(不含 `.`) |
320
+
321
+ | — | — |
322
+ |---|---|
323
+ | **返回值** | `boolean` |
324
+
325
+ ```js
326
+ hasClass(document.getElementById('app'), 'active') // true / false
327
+ ```
328
+
329
+ ---
330
+
331
+ ### `addClass(ele, cls)`
332
+
333
+ 为元素添加类名(带错误保护)。
334
+
335
+ | 参数 | 类型 | 必填 | 说明 |
336
+ |------|------|------|------|
337
+ | `ele` | `Element` | ✅ | 目标 DOM 元素 |
338
+ | `cls` | `string` | ✅ | 类名 |
339
+
340
+ ```js
341
+ addClass(document.body, 'loading')
342
+ ```
343
+
344
+ ---
345
+
346
+ ### `removeClass(ele, cls)`
347
+
348
+ 从元素上移除指定类名。
349
+
350
+ | 参数 | 类型 | 必填 | 说明 |
351
+ |------|------|------|------|
352
+ | `ele` | `Element` | ✅ | 目标 DOM 元素 |
353
+ | `cls` | `string` | ✅ | 类名 |
354
+
355
+ ```js
356
+ removeClass(document.body, 'loading')
357
+ ```
358
+
359
+ ---
360
+
361
+ ### `toggleClass(element, className)`
362
+
363
+ 切换元素的指定类名(有则移除,无则添加)。
364
+
365
+ | 参数 | 类型 | 必填 | 说明 |
366
+ |------|------|------|------|
367
+ | `element` | `Element` | ✅ | 目标 DOM 元素 |
368
+ | `className` | `string` | ✅ | 类名 |
369
+
370
+ ```js
371
+ toggleClass(menuEl, 'is-active')
372
+ ```
373
+
374
+ ---
375
+
376
+ ## 五、函数工具
377
+
378
+ ### `debounce(func, wait, immediate)`
379
+
380
+ 函数防抖,在 `wait` 毫秒内连续调用只执行最后一次(或第一次)。
381
+
382
+ | 参数 | 类型 | 必填 | 说明 |
383
+ |------|------|------|------|
384
+ | `func` | `Function` | ✅ | 需要防抖的函数 |
385
+ | `wait` | `number` | ✅ | 防抖等待时间(毫秒) |
386
+ | `immediate` | `boolean` | — | `true` 表示立即执行(首次触发立刻执行,后续等待),默认 `false` |
387
+
388
+ | — | — |
389
+ |---|---|
390
+ | **返回值** | `Function`,防抖包装后的函数 |
391
+
392
+ ```js
393
+ const lazySearch = debounce(() => fetchData(), 300)
394
+ input.addEventListener('input', lazySearch)
395
+ ```
396
+
397
+ ---
398
+
399
+ ### `deepClone(source)`
400
+
401
+ 递归深克隆对象或数组,返回与原对象完全独立的新对象。
402
+
403
+ | 参数 | 类型 | 必填 | 说明 |
404
+ |------|------|------|------|
405
+ | `source` | `Object \| Array` | ✅ | 原始对象(不支持传入 `null`) |
406
+
407
+ | — | — |
408
+ |---|---|
409
+ | **返回值** | `Object \| Array`,深克隆后的新对象 |
410
+
411
+ ```js
412
+ const original = { a: { b: 1 } }
413
+ const copy = deepClone(original)
414
+ copy.a.b = 99
415
+ console.log(original.a.b) // 1(互不影响)
416
+ ```
417
+
418
+ ---
419
+
420
+ ### `iteration(node, cb, key)`
421
+
422
+ 递归遍历单个树节点及其所有子节点,对每个节点执行回调。
423
+
424
+ | 参数 | 类型 | 必填 | 说明 |
425
+ |------|------|------|------|
426
+ | `node` | `Object` | ✅ | 树节点对象 |
427
+ | `cb` | `Function(node)` | — | 每个节点的处理回调,默认无操作 |
428
+ | `key` | `string` | — | 子节点列表的属性名,默认 `"children"` |
429
+
430
+ ```js
431
+ iteration(treeNode, (node) => {
432
+ node.checked = false
433
+ })
434
+ ```
435
+
436
+ ---
437
+
438
+ ### `iterationArr(nodeArr, cb, key)`
439
+
440
+ 递归遍历树节点数组,对所有节点执行回调。
441
+
442
+ | 参数 | 类型 | 必填 | 说明 |
443
+ |------|------|------|------|
444
+ | `nodeArr` | `Array` | ✅ | 树节点数组 |
445
+ | `cb` | `Function(node)` | ✅ | 每个节点的处理回调 |
446
+ | `key` | `string` | — | 子节点列表的属性名,默认 `"children"` |
447
+
448
+ ```js
449
+ iterationArr(menuList, (node) => {
450
+ node.expanded = true
451
+ })
452
+ ```
453
+
454
+ ---
455
+
456
+ ### `iterationArrEnd(nodeArr, cb, key)`
457
+
458
+ 带终止条件的树遍历:当回调返回 falsy 值时,停止递归该节点的子节点。
459
+
460
+ | 参数 | 类型 | 必填 | 说明 |
461
+ |------|------|------|------|
462
+ | `nodeArr` | `Array` | ✅ | 树节点数组 |
463
+ | `cb` | `Function(node) => boolean` | ✅ | 回调返回 `true` 继续遍历子节点,返回 falsy 则停止 |
464
+ | `key` | `string` | — | 子节点列表的属性名,默认 `"children"` |
465
+
466
+ ```js
467
+ // 找到目标节点后停止深入
468
+ iterationArrEnd(tree, (node) => {
469
+ if (node.id === targetId) { /* 处理 */ return false }
470
+ return true
471
+ })
472
+ ```
473
+
474
+ ---
475
+
476
+ ### `treeToArray(list, newArr)`
477
+
478
+ 将树形数据结构展平为扁平数组,**会清空每个节点的 `children` 属性**。
479
+
480
+ | 参数 | 类型 | 必填 | 说明 |
481
+ |------|------|------|------|
482
+ | `list` | `Array` | ✅ | 树形节点数组 |
483
+ | `newArr` | `Array` | — | 累加器数组,默认为空数组 |
484
+
485
+ | — | — |
486
+ |---|---|
487
+ | **返回值** | `Array`,扁平化的节点数组(节点无 `children` 字段) |
488
+
489
+ > ⚠️ 该操作会修改原始节点的 `children` 属性(清空),若需保留原树结构,请先 `deepClone`。
490
+
491
+ ```js
492
+ const flatList = treeToArray(treeData)
493
+ ```
494
+
495
+ ---
496
+
497
+ ## 六、文件操作
498
+
499
+ ### `downloadTemplate(res, fileName)`
500
+
501
+ 从接口响应的文件流(Blob)触发浏览器下载。
502
+
503
+ | 参数 | 类型 | 必填 | 说明 |
504
+ |------|------|------|------|
505
+ | `res` | `Blob \| { data: Blob }` | ✅ | 接口返回的文件流数据,支持直接传 Blob 或含 `data` 属性的响应对象 |
506
+ | `fileName` | `string` | — | 下载文件名,默认 `"导入模板"` |
507
+
508
+ ```js
509
+ // 接口调用后直接传入 response
510
+ const res = await exportApi()
511
+ downloadTemplate(res, '用户数据导出')
512
+ ```
513
+
514
+ ---
515
+
516
+ ### `downloadTemplateAddType(res, fileName)`
517
+
518
+ 从接口响应触发下载,文件名和扩展名从响应头 `content-disposition` 自动提取。
519
+
520
+ | 参数 | 类型 | 必填 | 说明 |
521
+ |------|------|------|------|
522
+ | `res` | `Object` | ✅ | 完整的 axios 响应对象(含 `headers` 和 `data`) |
523
+ | `fileName` | `string` | — | 备用文件名(解析不到响应头时使用) |
524
+
525
+ ```js
526
+ const res = await exportExcelApi()
527
+ downloadTemplateAddType(res, '备用文件名')
528
+ ```
529
+
530
+ ---
531
+
532
+ ### `downloadUrlFile(url, fileName, type)`
533
+
534
+ 通过 XHR 方式下载指定 URL 的文件,兼容 IE 的 `msSaveBlob`。
535
+
536
+ | 参数 | 类型 | 必填 | 说明 |
537
+ |------|------|------|------|
538
+ | `url` | `string` | ✅ | 文件下载地址 |
539
+ | `fileName` | `string` | ✅ | 下载后的文件名 |
540
+ | `type` | `string` | — | MIME 类型,默认 `"text/csv"` |
541
+
542
+ ```js
543
+ downloadUrlFile('https://example.com/file.xlsx', '报表.xlsx', 'application/vnd.ms-excel')
544
+ ```
545
+
546
+ ---
547
+
548
+ ### `downloadFileFromOss(fileIds, _this)`
549
+
550
+ 批量从 OSS 下载文件。
551
+
552
+ | 参数 | 类型 | 必填 | 说明 |
553
+ |------|------|------|------|
554
+ | `fileIds` | `string[]` | ✅ | OSS 文件 ID 数组 |
555
+ | `_this` | `Object` | ✅ | Vue 组件实例(用于弹出 `$message` 提示) |
556
+
557
+ ```js
558
+ downloadFileFromOss(['file-id-1', 'file-id-2'], this)
559
+ ```
560
+
561
+ ---
562
+
563
+ ### `fileType(format)`
564
+
565
+ 根据文件后缀名判断文件所属类型分类。
566
+
567
+ | 参数 | 类型 | 必填 | 说明 |
568
+ |------|------|------|------|
569
+ | `format` | `string` | ✅ | 文件扩展名(如 `"pdf"`、`"mp4"`、`"jpg"`) |
570
+
571
+ | — | — |
572
+ |---|---|
573
+ | **返回值** | `"bimModel" \| "document" \| "video" \| "image" \| ""`,若无法识别返回空字符串 |
574
+
575
+ ```js
576
+ fileType('pdf') // "document"
577
+ fileType('mp4') // "video"
578
+ fileType('jpg') // "image"
579
+ fileType('rvt') // "bimModel"
580
+ fileType('xxx') // ""
581
+ ```
582
+
583
+ ---
584
+
585
+ ### `formatFileSize(bytes)`
586
+
587
+ 将字节数转换为人性化文件大小字符串,支持到 TB 级别。
588
+
589
+ | 参数 | 类型 | 必填 | 说明 |
590
+ |------|------|------|------|
591
+ | `bytes` | `number` | ✅ | 文件大小(字节数) |
592
+
593
+ | — | — |
594
+ |---|---|
595
+ | **返回值** | `string`,如 `"2.50 MB"`、`"1.00 GB"` |
596
+
597
+ ```js
598
+ formatFileSize(2621440) // "2.50 MB"
599
+ formatFileSize(1024) // "1.00 KB"
600
+ ```
601
+
602
+ ---
603
+
604
+ ### `getPreviewUrl(config, type)`
605
+
606
+ 获取文件预览 URL,支持 `fileId` 模式(调用 OSS 接口)和 `stream` 模式(直接拼接 token)。
607
+
608
+ | 参数 | 类型 | 必填 | 说明 |
609
+ |------|------|------|------|
610
+ | `config` | `Object` | ✅ | 预览配置对象,`fileId` 模式需含 `fileId`,`stream` 模式需含 `previewUrl` |
611
+ | `type` | `"fileId" \| "stream"` | — | 获取方式,默认 `"fileId"` |
612
+
613
+ | — | — |
614
+ |---|---|
615
+ | **返回值** | `Promise<string>`,预览 URL |
616
+
617
+ ```js
618
+ // fileId 模式:通过 OSS 接口获取预览链接
619
+ const url = await getPreviewUrl({ fileId: 'xxx-yyy' }, 'fileId')
620
+
621
+ // stream 模式:直接拼接 token
622
+ const url = await getPreviewUrl({ previewUrl: '/preview/xxx' }, 'stream')
623
+ ```
624
+
625
+ ---
626
+
627
+ ## 七、表单 / 表格工具
628
+
629
+ ### `formatFloat(val, i, max, min, negative)`
630
+
631
+ 数字输入框格式化,清除非法字符,限制小数位数和数值范围,常用于金额/数量输入。
632
+
633
+ | 参数 | 类型 | 必填 | 说明 |
634
+ |------|------|------|------|
635
+ | `val` | `string \| number` | ✅ | 用户输入值 |
636
+ | `i` | `number` | — | 允许的最大小数位数 |
637
+ | `max` | `number` | — | 最大值限制 |
638
+ | `min` | `number` | — | 最小值限制 |
639
+ | `negative` | `boolean` | — | 是否允许负数 |
640
+
641
+ | — | — |
642
+ |---|---|
643
+ | **返回值** | `string`,处理后的合法数字字符串 |
644
+
645
+ ```js
646
+ // 在 el-input 的 @input 事件中使用
647
+ handleInput(val) {
648
+ this.form.amount = formatFloat(val, 2, 9999999, 0)
649
+ }
650
+ ```
651
+
652
+ ---
653
+
654
+ ### `handleRules(obj, other)`
655
+
656
+ 快速生成 Element UI 表单的 `required` 必填校验规则对象,避免手写重复的 rules 配置。
657
+
658
+ | 参数 | 类型 | 必填 | 说明 |
659
+ |------|------|------|------|
660
+ | `obj` | `Object` | ✅ | `{ 字段名: '必填提示语' }` 的映射对象 |
661
+ | `other` | `Object` | — | 需要合并的额外 rules(如带 validator 的自定义规则) |
662
+
663
+ | — | — |
664
+ |---|---|
665
+ | **返回值** | `Object`,Element UI `rules` 格式的校验规则对象 |
666
+
667
+ ```js
668
+ this.rules = handleRules({
669
+ name: '请输入姓名',
670
+ phone: '请输入手机号'
671
+ }, {
672
+ phone: [{ validator: phoneValidator, trigger: 'blur' }]
673
+ })
674
+ ```
675
+
676
+ ---
677
+
678
+ ### `filterColumns(columns, hasFlow, addIndex, approvalStatusObj, approvalStatus)`
679
+
680
+ 根据是否启用审批流程,动态向表格列配置中添加或移除「审批状态」列。
681
+
682
+ | 参数 | 类型 | 必填 | 说明 |
683
+ |------|------|------|------|
684
+ | `columns` | `Array` | ✅ | el-table 列配置数组 |
685
+ | `hasFlow` | `boolean` | ✅ | 是否启用流程 |
686
+ | `addIndex` | `number` | — | 审批状态列的插入位置索引 |
687
+ | `approvalStatusObj` | `Object` | — | 审批状态枚举映射对象 |
688
+ | `approvalStatus` | `string` | — | 列的 `prop` 字段名,默认 `"approvalStatus"` |
689
+
690
+ | — | — |
691
+ |---|---|
692
+ | **返回值** | `Array`,处理后的列配置数组 |
693
+
694
+ ```js
695
+ const columns = filterColumns(this.baseColumns, this.hasFlow, 2, approvalStatusDict)
696
+ ```
697
+
698
+ ---
699
+
700
+ ## 八、路由跳转
701
+
702
+ ### `goToRouteWithThePlatform(url, target, cb, timer)`
703
+
704
+ 在同一系统内部进行路由跳转,自动识别 hash/history 路由模式。
705
+
706
+ | 参数 | 类型 | 必填 | 说明 |
707
+ |------|------|------|------|
708
+ | `url` | `string` | ✅ | 跳转的相对路径(如 `/dashboard`) |
709
+ | `target` | `string` | — | 同 `window.open` 的第二个参数,如 `"_blank"` |
710
+ | `cb` | `Function` | — | 跳转完成后的回调 |
711
+ | `timer` | `number` | — | 回调延迟时间(毫秒),默认 `1000` |
712
+
713
+ ```js
714
+ goToRouteWithThePlatform('/project/detail?id=123')
715
+ goToRouteWithThePlatform('/report', '_blank')
716
+ ```
717
+
718
+ ---
719
+
720
+ ### `goToRouteOutThePlatform(url, target, cb)`
721
+
722
+ 跳转到外部系统(延时 1000ms 后执行 `window.open`)。
723
+
724
+ | 参数 | 类型 | 必填 | 说明 |
725
+ |------|------|------|------|
726
+ | `url` | `string` | ✅ | 目标 URL(支持绝对/相对路径) |
727
+ | `target` | `string` | — | 如 `"_blank"`,默认在新标签页打开 |
728
+ | `cb` | `Function` | — | 打开后的回调 |
729
+
730
+ ```js
731
+ goToRouteOutThePlatform('https://other-system.com/login?token=xxx', '_blank')
732
+ ```
733
+
734
+ ---
735
+
736
+ ### `checkImgIsVaild(imgurl)`
737
+
738
+ 检测图片 URL 是否有效(能否正常加载)。
739
+
740
+ | 参数 | 类型 | 必填 | 说明 |
741
+ |------|------|------|------|
742
+ | `imgurl` | `string` | ✅ | 图片 URL 地址 |
743
+
744
+ | — | — |
745
+ |---|---|
746
+ | **返回值** | `Promise<boolean>`,图片可正常加载返回 `true`,否则 `false` |
747
+
748
+ ```js
749
+ const isValid = await checkImgIsVaild('https://example.com/avatar.jpg')
750
+ if (!isValid) {
751
+ this.avatar = defaultAvatar
752
+ }
753
+ ```
754
+
755
+ ---
756
+
757
+ ## 注意事项
758
+
759
+ - `downloadFileFromOss` 依赖 `window._store`(Vuex store)读取 token,宿主项目需提前注入。
760
+ - `getPreviewUrl` 的 `stream` 模式会从 `window._store` 读取用户 token 并拼接到 URL 中,请注意 URL 安全性。
761
+ - `treeToArray` 会**直接修改**传入节点的 `children` 属性为空数组,如需保留原数据,请先使用 `deepClone` 克隆后再调用。
762
+ - `debounce` 返回的函数 `this` 上下文遵循原函数,在 Vue 组件中使用时注意绑定 `this`。