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,130 @@
1
+ # i18n — 国际化集成
2
+
3
+ 提供将本库内置语言包合并到项目 i18n 实例的工具,以及库内部独立的翻译函数,兼容 vue-i18n v8、v9+ 和其他 i18n 方案。
4
+
5
+ ## 引用方式
6
+
7
+ ```js
8
+ import locale, { setI18nInstance, t } from 'pit-business-utils'
9
+ ```
10
+
11
+ ---
12
+
13
+ ## 函数列表
14
+
15
+ ### `locale(i18n)`(默认导出)
16
+
17
+ 将本库内置语言包(中文 + 英文)合并到项目的 i18n 实例中,使库内的提示文本跟随项目语言切换。
18
+ **在项目初始化时调用一次即可。**
19
+
20
+ | 参数 | 类型 | 必填 | 说明 |
21
+ |------|------|------|------|
22
+ | `i18n` | `Object` | ✅ | 项目的 i18n 实例(vue-i18n 或其他 i18n 库实例) |
23
+
24
+ | — | — |
25
+ |---|---|
26
+ | **返回值** | `void` |
27
+
28
+ **兼容方案:**
29
+ - vue-i18n v8:调用 `i18n.mergeLocaleMessage('zh', messages)` 方式合并
30
+ - vue-i18n v9+(Composition API):调用 `i18n.global.mergeLocaleMessage(...)` 合并
31
+ - 其他 i18n 库:使用 `Object.assign` 直接合并消息对象
32
+
33
+ ```js
34
+ // main.js
35
+ import Vue from 'vue'
36
+ import VueI18n from 'vue-i18n'
37
+ import locale from 'pit-business-utils'
38
+ import i18n from './i18n' // 项目自己的 i18n 实例
39
+
40
+ Vue.use(VueI18n)
41
+ locale(i18n) // 合并库语言包到项目 i18n
42
+
43
+ new Vue({ i18n, render: h => h(App) }).$mount('#app')
44
+ ```
45
+
46
+ ---
47
+
48
+ ### `setI18nInstance(instance)`
49
+
50
+ 将项目的 i18n 实例注入到库内部,使库内 `t()` 函数能调用项目 i18n 实例进行翻译。
51
+ 通常在调用 `locale(i18n)` 后紧接着调用。
52
+
53
+ | 参数 | 类型 | 必填 | 说明 |
54
+ |------|------|------|------|
55
+ | `instance` | `Object` | ✅ | vue-i18n 实例或兼容 `.t(key)` 方法的 i18n 对象 |
56
+
57
+ | — | — |
58
+ |---|---|
59
+ | **返回值** | `void` |
60
+
61
+ ```js
62
+ import { setI18nInstance } from 'pit-business-utils'
63
+ import i18n from './i18n'
64
+
65
+ setI18nInstance(i18n)
66
+ ```
67
+
68
+ ---
69
+
70
+ ### `getI18nInstance()`
71
+
72
+ 获取当前注入的 i18n 实例(通常用于库内部使用,业务代码一般无需调用)。
73
+
74
+ | — | — |
75
+ |---|---|
76
+ | **参数** | 无 |
77
+ | **返回值** | `Object`,当前注入的 i18n 实例 |
78
+
79
+ ---
80
+
81
+ ### `t(key)`
82
+
83
+ 库内部通用翻译函数,优先使用注入的 i18n 实例翻译,未注入时回退到库内置语言包查找,仍未找到则返回 key 本身。
84
+
85
+ | 参数 | 类型 | 必填 | 说明 |
86
+ |------|------|------|------|
87
+ | `key` | `string` | ✅ | 翻译键,支持点分隔的路径,如 `"validate.phone"` |
88
+
89
+ | — | — |
90
+ |---|---|
91
+ | **返回值** | `string`,翻译后的文本;未找到时返回 `key` 本身 |
92
+
93
+ ```js
94
+ import { t } from 'pit-business-utils'
95
+
96
+ t('validate.phone') // "请输入正确的手机号"(中文环境)
97
+ t('validate.phone') // "Please enter a valid phone number"(英文环境)
98
+ ```
99
+
100
+ ---
101
+
102
+ ## 完整初始化示例
103
+
104
+ ```js
105
+ // main.js
106
+ import Vue from 'vue'
107
+ import VueI18n from 'vue-i18n'
108
+ import locale, { setI18nInstance } from 'pit-business-utils'
109
+ import i18n from './i18n'
110
+
111
+ Vue.use(VueI18n)
112
+
113
+ // 1. 合并库语言包到项目 i18n
114
+ locale(i18n)
115
+ // 2. 注入 i18n 实例到库内部(使 t() 生效)
116
+ setI18nInstance(i18n)
117
+
118
+ new Vue({
119
+ i18n,
120
+ render: h => h(App)
121
+ }).$mount('#app')
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 注意事项
127
+
128
+ - 如果项目没有使用 i18n,可以跳过 `locale` 和 `setI18nInstance` 的调用,库内提示文本将默认显示中文。
129
+ - `locale()` 和 `setI18nInstance()` 只需在应用启动时调用一次,不需要在每个组件中重复调用。
130
+ - 库内置语言包含 `zh`(中文)和 `en`(英文)两种语言,键名格式为 `"pit.xxx"`。
@@ -0,0 +1,82 @@
1
+ # jwks — JWKS 公钥加密
2
+
3
+ 通过 JWKS(JSON Web Key Set)端点获取 RSA 公钥,并使用该公钥对敏感数据(如密码)进行加密,适合登录场景中前端加密密码后再传输。
4
+
5
+ ## 引用方式
6
+
7
+ ```js
8
+ import { getJwks } from 'pit-business-utils'
9
+ ```
10
+
11
+ ---
12
+
13
+ ## 环境变量依赖
14
+
15
+ > ⚠️ **使用前必须在项目中配置以下环境变量:**
16
+
17
+ | 变量名 | 说明 |
18
+ |--------|------|
19
+ | `VUE_APP_BASE_JWKS_KID` | JWKS 密钥集中目标密钥的 Key ID(`kid`),用于从密钥集中匹配正确的公钥 |
20
+
21
+ ```bash
22
+ # .env.production
23
+ VUE_APP_BASE_JWKS_KID=your-key-id-here
24
+ ```
25
+
26
+ ---
27
+
28
+ ## 函数
29
+
30
+ ### `getJwks(value, url)`
31
+
32
+ 从 JWKS 端点获取公钥,并使用 RSA 算法加密指定值。
33
+
34
+ | 参数 | 类型 | 必填 | 说明 |
35
+ |------|------|------|------|
36
+ | `value` | `string` | ✅ | 需要加密的明文字符串(通常为用户密码) |
37
+ | `url` | `string` | ✅ | JWKS 接口端点 URL,返回标准 JWKS JSON 格式数据 |
38
+
39
+ | — | — |
40
+ |---|---|
41
+ | **返回值** | `Promise<string>`,RSA 加密后的密文字符串(十六进制格式) |
42
+
43
+ ---
44
+
45
+ ## 使用示例
46
+
47
+ ```js
48
+ import { getJwks } from 'pit-business-utils'
49
+
50
+ // 登录时对密码进行加密
51
+ async function login(username, password) {
52
+ const jwksUrl = `${process.env.VUE_APP_BASE_API}/.well-known/jwks.json`
53
+ const encryptedPassword = await getJwks(password, jwksUrl)
54
+
55
+ await request.post('/api/auth/login', {
56
+ username,
57
+ password: encryptedPassword
58
+ })
59
+ }
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 工作流程
65
+
66
+ ```
67
+ 1. fetch(url) → 获取 JWKS JSON 数据
68
+ 2. 匹配 kid → 从 keys 数组中找到 kid === VUE_APP_BASE_JWKS_KID 的密钥
69
+ 3. 提取 kty/e/n → 解析 RSA 公钥参数
70
+ 4. KEYUTIL.getKey(jwk) → 构造 RSA 公钥对象(jsrsasign 库)
71
+ 5. Cipher.encrypt(value, pubKey, 'RSAOAEP') → 执行加密
72
+ 6. 返回加密后的十六进制字符串
73
+ ```
74
+
75
+ ---
76
+
77
+ ## 注意事项
78
+
79
+ - `VUE_APP_BASE_JWKS_KID` 未配置或与服务端密钥集中的 `kid` 不匹配时,函数将无法找到公钥,**会抛出错误**。
80
+ - 该函数依赖 `jsrsasign` 库(已内置在本库中),无需单独安装。
81
+ - 加密使用 `RSAOAEP` 算法(OAEP 填充的 RSA),服务端需配套使用对应的私钥解密。
82
+ - 每次调用都会发出一次 HTTP 请求获取 JWKS,如登录页频繁使用建议自行缓存 JWKS 响应。
@@ -0,0 +1,391 @@
1
+ # oss — OSS 文件服务 API
2
+
3
+ 封装了与 OSS 文件服务后端的全部接口调用,涵盖普通上传、分片上传、下载、预览、删除、重命名等完整文件生命周期管理。
4
+
5
+ ## 引用方式
6
+
7
+ ```js
8
+ import {
9
+ reqOssUpload,
10
+ reqOssDownload,
11
+ reqOssList,
12
+ reqOssRemove,
13
+ reqOssPresignedObjectUrl,
14
+ // ... 其他接口按需引入
15
+ } from 'pit-business-utils'
16
+ ```
17
+
18
+ ---
19
+
20
+ ## 接口列表
21
+
22
+ ### 普通上传
23
+
24
+ #### `reqOssUpload(data, uploadProgress)`
25
+
26
+ 上传单个文件,支持监听上传进度。
27
+
28
+ | 参数 | 类型 | 必填 | 说明 |
29
+ |------|------|------|------|
30
+ | `data` | `FormData` | ✅ | 包含 `file` 字段的 FormData 对象 |
31
+ | `uploadProgress` | `Function(progressEvent)` | — | 上传进度回调,`progressEvent.loaded / progressEvent.total` 计算百分比 |
32
+
33
+ | — | — |
34
+ |---|---|
35
+ | **接口** | `POST /api/oss/upload` |
36
+ | **返回值** | `Promise<{ fileUploadRecordId, fileName, fileSize, ... }>` |
37
+
38
+ ```js
39
+ const formData = new FormData()
40
+ formData.append('file', file)
41
+
42
+ const res = await reqOssUpload(formData, (e) => {
43
+ const percent = Math.round((e.loaded / e.total) * 100)
44
+ console.log(`上传进度:${percent}%`)
45
+ })
46
+ ```
47
+
48
+ ---
49
+
50
+ ### 分片上传(大文件推荐)
51
+
52
+ 大文件建议使用分片上传,分三步完成:
53
+
54
+ **Step 1:创建分片上传任务**
55
+
56
+ #### `reqOssMultipartUploadPost(data)`
57
+
58
+ | 参数 | 类型 | 必填 | 说明 |
59
+ |------|------|------|------|
60
+ | `data` | `Object` | ✅ | `{ fileName, fileSize, contentType }` |
61
+
62
+ | — | — |
63
+ |---|---|
64
+ | **接口** | `POST /api/oss/multipart-upload` |
65
+ | **返回值** | `Promise<{ uploadId, key }>` — `uploadId` 用于后续分片上传 |
66
+
67
+ ---
68
+
69
+ **Step 2:逐片上传**
70
+
71
+ #### `reqOssMultipartUploadPut(data)`
72
+
73
+ | 参数 | 类型 | 必填 | 说明 |
74
+ |------|------|------|------|
75
+ | `data` | `Object` | ✅ | `{ uploadId, key, partNumber, file }` — `partNumber` 从 1 开始 |
76
+
77
+ | — | — |
78
+ |---|---|
79
+ | **接口** | `PUT /api/oss/multipart-upload` |
80
+ | **返回值** | `Promise<{ eTag }>` — 每片返回的 ETag |
81
+
82
+ ---
83
+
84
+ **Step 3:合并分片**
85
+
86
+ #### `reqOssCompleteMultipartUpload(data)`
87
+
88
+ | 参数 | 类型 | 必填 | 说明 |
89
+ |------|------|------|------|
90
+ | `data` | `Object` | ✅ | `{ uploadId, key, parts: [{ partNumber, eTag }] }` |
91
+
92
+ | — | — |
93
+ |---|---|
94
+ | **接口** | `PUT /api/oss/complete-multipart-upload` |
95
+ | **返回值** | `Promise<{ fileUploadRecordId, ... }>` |
96
+
97
+ **分片上传完整示例:**
98
+
99
+ ```js
100
+ const CHUNK_SIZE = 5 * 1024 * 1024 // 5MB 每片
101
+
102
+ async function uploadLargeFile(file) {
103
+ // Step 1
104
+ const { uploadId, key } = await reqOssMultipartUploadPost({
105
+ fileName: file.name, fileSize: file.size, contentType: file.type
106
+ })
107
+
108
+ // Step 2
109
+ const parts = []
110
+ const totalChunks = Math.ceil(file.size / CHUNK_SIZE)
111
+ for (let i = 0; i < totalChunks; i++) {
112
+ const chunk = file.slice(i * CHUNK_SIZE, (i + 1) * CHUNK_SIZE)
113
+ const { eTag } = await reqOssMultipartUploadPut({
114
+ uploadId, key, partNumber: i + 1, file: chunk
115
+ })
116
+ parts.push({ partNumber: i + 1, eTag })
117
+ }
118
+
119
+ // Step 3
120
+ const result = await reqOssCompleteMultipartUpload({ uploadId, key, parts })
121
+ return result.fileUploadRecordId
122
+ }
123
+ ```
124
+
125
+ ---
126
+
127
+ ### 下载
128
+
129
+ #### `reqOssDownload(data)`
130
+
131
+ 下载单个文件(Blob 格式)。
132
+
133
+ | 参数 | 类型 | 必填 | 说明 |
134
+ |------|------|------|------|
135
+ | `data` | `Object` | ✅ | `{ fileUploadRecordId }` |
136
+
137
+ | — | — |
138
+ |---|---|
139
+ | **接口** | `GET /api/oss/download`(responseType: blob)|
140
+ | **返回值** | `Promise<Blob>` |
141
+
142
+ ```js
143
+ const blob = await reqOssDownload({ fileUploadRecordId: 'xxx' })
144
+ downloadTemplate(blob, '文件名.pdf')
145
+ ```
146
+
147
+ ---
148
+
149
+ #### `reqOssMultipartDownload(data)`
150
+
151
+ 分片下载(适合大文件下载场景)。
152
+
153
+ | 参数 | 类型 | 必填 | 说明 |
154
+ |------|------|------|------|
155
+ | `data` | `Object` | ✅ | `{ fileUploadRecordId, rangeStart, rangeEnd }` |
156
+
157
+ | — | — |
158
+ |---|---|
159
+ | **接口** | `GET /api/oss/multipart-download` |
160
+
161
+ ---
162
+
163
+ #### `downloadZip(data)`
164
+
165
+ 批量下载多个文件,服务端打包为 ZIP 后返回。
166
+
167
+ | 参数 | 类型 | 必填 | 说明 |
168
+ |------|------|------|------|
169
+ | `data` | `Object` | ✅ | `{ fileUploadRecordIds: string[] }` |
170
+
171
+ | — | — |
172
+ |---|---|
173
+ | **接口** | `POST /api/oss/download-zip`(responseType: blob)|
174
+ | **返回值** | `Promise<Blob>` |
175
+
176
+ ```js
177
+ const blob = await downloadZip({ fileUploadRecordIds: ['id1', 'id2'] })
178
+ downloadTemplate(blob, '批量下载.zip')
179
+ ```
180
+
181
+ ---
182
+
183
+ ### 查询
184
+
185
+ #### `reqOssList(data)`
186
+
187
+ 查询文件列表。
188
+
189
+ | 参数 | 类型 | 必填 | 说明 |
190
+ |------|------|------|------|
191
+ | `data` | `Object` | ✅ | 查询参数,如 `{ pageNum, pageSize, fileName }` |
192
+
193
+ | — | — |
194
+ |---|---|
195
+ | **接口** | `GET /api/oss/list` |
196
+
197
+ ---
198
+
199
+ #### `reqOssInfo(fileUploadRecordId)`
200
+
201
+ 查询单个文件详情。
202
+
203
+ | 参数 | 类型 | 必填 | 说明 |
204
+ |------|------|------|------|
205
+ | `fileUploadRecordId` | `string` | ✅ | 文件 ID |
206
+
207
+ | — | — |
208
+ |---|---|
209
+ | **接口** | `GET /api/oss/info/:id` |
210
+ | **返回值** | `Promise<{ fileName, fileSize, fileType, url, ... }>` |
211
+
212
+ ```js
213
+ const fileInfo = await reqOssInfo('file-id-xxx')
214
+ console.log(fileInfo.fileName, fileInfo.fileSize)
215
+ ```
216
+
217
+ ---
218
+
219
+ #### `reqOssInfoByYz(fileUploadRecordId)`
220
+
221
+ 获取永中在线预览所需的文件信息。
222
+
223
+ | 参数 | 类型 | 必填 | 说明 |
224
+ |------|------|------|------|
225
+ | `fileUploadRecordId` | `string` | ✅ | 文件 ID |
226
+
227
+ | — | — |
228
+ |---|---|
229
+ | **接口** | `GET /api/oss/officePreview/:id` |
230
+
231
+ ---
232
+
233
+ #### `reqOssListImage(data)`
234
+
235
+ 查询图片类文件列表(按业务 ID 批量获取关联图片)。
236
+
237
+ | 参数 | 类型 | 必填 | 说明 |
238
+ |------|------|------|------|
239
+ | `data` | `string` | ✅ | 业务关联 ID 字符串 |
240
+
241
+ | — | — |
242
+ |---|---|
243
+ | **接口** | `GET /api/oss/getList/:data` |
244
+
245
+ ---
246
+
247
+ #### `reqOssHasStored(data)`
248
+
249
+ 检查文件是否已存储(秒传功能,通过文件 MD5 判断)。
250
+
251
+ | 参数 | 类型 | 必填 | 说明 |
252
+ |------|------|------|------|
253
+ | `data` | `Object` | ✅ | `{ md5, fileName }` |
254
+
255
+ | — | — |
256
+ |---|---|
257
+ | **接口** | `GET /api/oss/has-stored` |
258
+ | **返回值** | `Promise<{ stored: boolean, fileUploadRecordId? }>` |
259
+
260
+ ```js
261
+ const { stored, fileUploadRecordId } = await reqOssHasStored({ md5: fileMd5, fileName })
262
+ if (stored) {
263
+ // 秒传:文件已存在,无需重新上传
264
+ onSuccess(fileUploadRecordId)
265
+ }
266
+ ```
267
+
268
+ ---
269
+
270
+ #### `reqOssPresignedObjectUrl(data)`
271
+
272
+ 获取文件的临时预签名访问 URL(直接访问 OSS,有时效限制)。
273
+
274
+ | 参数 | 类型 | 必填 | 说明 |
275
+ |------|------|------|------|
276
+ | `data` | `Object` | ✅ | `{ fileUploadRecordId }` |
277
+
278
+ | — | — |
279
+ |---|---|
280
+ | **接口** | `GET /api/oss/presigned-object-url` |
281
+ | **返回值** | `Promise<string>` — 带签名的临时 URL |
282
+
283
+ ```js
284
+ const url = await reqOssPresignedObjectUrl({ fileUploadRecordId: 'xxx' })
285
+ window.open(url)
286
+ ```
287
+
288
+ ---
289
+
290
+ ### 操作
291
+
292
+ #### `reqOssRemove(fileUploadRecordId)`
293
+
294
+ 删除文件。
295
+
296
+ | 参数 | 类型 | 必填 | 说明 |
297
+ |------|------|------|------|
298
+ | `fileUploadRecordId` | `string` | ✅ | 文件 ID |
299
+
300
+ | — | — |
301
+ |---|---|
302
+ | **接口** | `DELETE /api/oss/remove/:id` |
303
+
304
+ ```js
305
+ await reqOssRemove('file-id-xxx')
306
+ ```
307
+
308
+ ---
309
+
310
+ #### `reqOssRename(data)`
311
+
312
+ 重命名文件。
313
+
314
+ | 参数 | 类型 | 必填 | 说明 |
315
+ |------|------|------|------|
316
+ | `data` | `Object` | ✅ | `{ fileUploadRecordId, fileName }` — 传 `application/x-www-form-urlencoded` 格式 |
317
+
318
+ | — | — |
319
+ |---|---|
320
+ | **接口** | `PUT /api/oss/rename` |
321
+
322
+ ```js
323
+ await reqOssRename({ fileUploadRecordId: 'xxx', fileName: '新文件名.pdf' })
324
+ ```
325
+
326
+ ---
327
+
328
+ #### `getUpdateFileId(id)`
329
+
330
+ 内容相同的文件重新生成 fileId(用于更新文件后保持 ID 关联)。
331
+
332
+ | 参数 | 类型 | 必填 | 说明 |
333
+ |------|------|------|------|
334
+ | `id` | `string` | ✅ | 原文件 ID |
335
+
336
+ | — | — |
337
+ |---|---|
338
+ | **接口** | `GET /api/oss/update-file/:id` |
339
+
340
+ ---
341
+
342
+ #### `batchCopyFile(data)`
343
+
344
+ 批量复制文件(通常用于归档或初始数据备份)。
345
+
346
+ | 参数 | 类型 | 必填 | 说明 |
347
+ |------|------|------|------|
348
+ | `data` | `Object` | ✅ | `{ fileUploadRecordIds: string[] }` |
349
+
350
+ | — | — |
351
+ |---|---|
352
+ | **接口** | `POST /api/oss/batch-copy-file` |
353
+
354
+ ---
355
+
356
+ #### `reqFileTransform(fileId)`
357
+
358
+ 将文件转换为其他格式(如 Office 转 PDF)。
359
+
360
+ | 参数 | 类型 | 必填 | 说明 |
361
+ |------|------|------|------|
362
+ | `fileId` | `string` | ✅ | 文件 ID |
363
+
364
+ | — | — |
365
+ |---|---|
366
+ | **接口** | `POST /api/project/file-transform?fileId=:id`(responseType: blob)|
367
+ | **返回值** | `Promise<Blob>` |
368
+
369
+ ---
370
+
371
+ #### `excelToPdfPreview(data)`
372
+
373
+ 将 Excel 文件转换为 PDF 格式以供预览。
374
+
375
+ | 参数 | 类型 | 必填 | 说明 |
376
+ |------|------|------|------|
377
+ | `data` | `Object` | ✅ | `{ fileUploadRecordId }` |
378
+
379
+ | — | — |
380
+ |---|---|
381
+ | **接口** | `POST /api/oss/excelToPdfPreview`(responseType: blob)|
382
+ | **返回值** | `Promise<Blob>` |
383
+
384
+ ---
385
+
386
+ ## 注意事项
387
+
388
+ - 所有接口均依赖 `request` 模块,需要宿主项目完成 `window.setConfigCallback` 等三个拦截器的配置。
389
+ - 分片上传时,`partNumber` 从 **1** 开始计数(非 0)。
390
+ - `downloadZip`、`reqOssDownload`、`excelToPdfPreview` 返回的是 Blob,需配合 `downloadTemplate` 等工具函数触发浏览器下载。
391
+ - `reqOssPresignedObjectUrl` 返回的 URL 有时效性,请在获取后尽快使用,不要长期缓存。
@@ -0,0 +1,120 @@
1
+ # passwordValidate — 密码强度校验
2
+
3
+ 提供三个密码强度校验函数,覆盖从简单正则到企业级复杂度规则的多种场景。
4
+
5
+ ## 引用方式
6
+
7
+ ```js
8
+ import { passwordValidate, passwordValidateMsg, checkPasswordComplexity } from 'pit-business-utils'
9
+ ```
10
+
11
+ ---
12
+
13
+ ## 函数对比
14
+
15
+ | 函数 | 适用场景 | 返回值 |
16
+ |------|----------|--------|
17
+ | `passwordValidate(pwd)` | 仅需 true/false 判断 | `boolean` |
18
+ | `passwordValidateMsg(pwd)` | 需要向用户展示具体失败原因 | `string(失败) \| undefined(通过)` |
19
+ | `checkPasswordComplexity(pwd)` | 简化场景,只需基本复杂度验证 | `string(失败原因) \| true(通过)` |
20
+
21
+ ---
22
+
23
+ ## 密码规则说明(`passwordValidate` / `passwordValidateMsg`)
24
+
25
+ 以下规则**全部满足**才视为通过:
26
+
27
+ | 规则 | 说明 |
28
+ |------|------|
29
+ | 长度 | 12 ~ 16 位 |
30
+ | 字符组成 | 同时包含大写字母、小写字母、数字、特殊字符(`!#@*&.?%~/+=$_^-`)|
31
+ | 无重复 | 不允许 4 位及以上相同字符(如 `aaaa`、`1111`) |
32
+ | 无字母连续 | 不允许 4 位字母连续序列(如 `abcd`、`wxyz`) |
33
+ | 无数字连续 | 不允许 4 位数字连续序列(如 `1234`、`6789`) |
34
+ | 无键盘横向连续 | 不允许键盘上横向 4 连按键(如 `qwer`、`asdf`) |
35
+ | 无键盘斜向连续 | 不允许键盘斜向 4 连按键 |
36
+ | 无 ASCII 连续 | 不允许任意 3 位 ASCII 码差值为 1 的连续字符 |
37
+
38
+ ---
39
+
40
+ ## 函数详情
41
+
42
+ ### `passwordValidate(pwd)`
43
+
44
+ 全量密码强度校验,适合在提交前做最终验证。
45
+
46
+ | 参数 | 类型 | 必填 | 说明 |
47
+ |------|------|------|------|
48
+ | `pwd` | `string` | ✅ | 待校验的密码字符串 |
49
+
50
+ | — | — |
51
+ |---|---|
52
+ | **返回值** | `boolean`,满足所有规则返回 `true`,否则 `false` |
53
+
54
+ ```js
55
+ if (!passwordValidate(form.newPassword)) {
56
+ this.$message.error('密码不符合安全要求')
57
+ return
58
+ }
59
+ ```
60
+
61
+ ---
62
+
63
+ ### `passwordValidateMsg(pwd)`
64
+
65
+ 校验密码强度并返回**具体失败原因**(i18n 文本),通过时无返回值(`undefined`)。
66
+
67
+ | 参数 | 类型 | 必填 | 说明 |
68
+ |------|------|------|------|
69
+ | `pwd` | `string` | ✅ | 待校验的密码字符串 |
70
+
71
+ | — | — |
72
+ |---|---|
73
+ | **返回值** | `string`(不通过时,具体的失败原因)或 `undefined`(通过时) |
74
+
75
+ ```js
76
+ const errMsg = passwordValidateMsg(form.password)
77
+ if (errMsg) {
78
+ this.$message.warning(errMsg) // 如 "密码不能包含4个及以上连续相同字符"
79
+ return
80
+ }
81
+ // 密码合法,继续提交
82
+ ```
83
+
84
+ ---
85
+
86
+ ### `checkPasswordComplexity(password)`
87
+
88
+ 简化版密码复杂度校验:仅验证长度(12-16位)和字符种类(大写、小写、数字、特殊字符),**不检查连续/重复字符规则**,适合实时输入反馈场景。
89
+
90
+ | 参数 | 类型 | 必填 | 说明 |
91
+ |------|------|------|------|
92
+ | `password` | `string` | ✅ | 待校验的密码字符串 |
93
+
94
+ | — | — |
95
+ |---|---|
96
+ | **返回值** | `true`(验证通过)或 `string`(验证失败的错误提示文本) |
97
+
98
+ ```js
99
+ // 配合 Element UI 自定义校验器
100
+ const validatePass = (rule, value, callback) => {
101
+ const result = checkPasswordComplexity(value)
102
+ if (result !== true) {
103
+ callback(new Error(result))
104
+ } else {
105
+ callback()
106
+ }
107
+ }
108
+
109
+ rules: {
110
+ password: [{ validator: validatePass, trigger: 'blur' }]
111
+ }
112
+ ```
113
+
114
+ ---
115
+
116
+ ## 注意事项
117
+
118
+ - `passwordValidate` 和 `passwordValidateMsg` 使用**完整规则**,安全性更强,推荐在修改密码场景使用。
119
+ - `checkPasswordComplexity` 规则相对宽松,适合注册场景的实时格式检查。
120
+ - 如果项目配置了 `i18n`,`passwordValidateMsg` 返回的错误文本会自动走国际化翻译。