@zykj2024/much-library 1.1.7-beta.3 → 1.1.7-beta.4
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/esm/McCascader/city.js +909 -0
- package/dist/esm/McCascader/index.d.ts +19 -0
- package/dist/esm/McCascader/index.js +221 -0
- package/dist/esm/McCascader/index.less +72 -0
- package/dist/esm/McContainer/index.d.ts +192 -0
- package/dist/esm/McContainer/index.js +522 -0
- package/dist/esm/McContainer/index.less +132 -0
- package/dist/esm/McDateRange/index.d.ts +28 -0
- package/dist/esm/McDateRange/index.js +167 -0
- package/dist/esm/McDateRange/index.less +33 -0
- package/dist/esm/McEllipsis/index.d.ts +40 -0
- package/dist/esm/McEllipsis/index.js +115 -0
- package/dist/esm/McEllipsis/index.less +9 -0
- package/dist/esm/McEllipsisMiddle/index.d.ts +13 -0
- package/dist/esm/McEllipsisMiddle/index.js +42 -0
- package/dist/esm/McEllipsisMiddle/index.less +9 -0
- package/dist/esm/McFonts/index.d.ts +8 -0
- package/dist/esm/McFonts/index.js +7 -0
- package/dist/esm/McGroupPanel/comps/SelectedItem/index.d.ts +4 -0
- package/dist/esm/McGroupPanel/comps/SelectedItem/index.js +75 -0
- package/dist/esm/McGroupPanel/index.d.ts +30 -0
- package/dist/esm/McGroupPanel/index.js +426 -0
- package/dist/esm/McGroupPanel/index.less +161 -0
- package/dist/esm/McIconFont/iconfont.js +1 -0
- package/dist/esm/McIconFont/index.d.ts +5 -0
- package/dist/esm/McIconFont/index.js +8 -0
- package/dist/esm/McIcons/business.json +137 -0
- package/dist/esm/McIcons/index.less +22 -0
- package/dist/esm/McInput/Input.d.ts +19 -0
- package/dist/esm/McInput/Input.js +48 -0
- package/dist/esm/McInput/Search.d.ts +39 -0
- package/dist/esm/McInput/Search.js +81 -0
- package/dist/esm/McInput/TextArea.d.ts +11 -0
- package/dist/esm/McInput/TextArea.js +37 -0
- package/dist/esm/McInput/demo/Input/addonBefore.d.ts +3 -0
- package/dist/esm/McInput/demo/Input/addonBefore.js +67 -0
- package/dist/esm/McInput/demo/Input/base.d.ts +2 -0
- package/dist/esm/McInput/demo/Input/base.js +31 -0
- package/dist/esm/McInput/demo/Input/isTrim.d.ts +2 -0
- package/dist/esm/McInput/demo/Input/isTrim.js +22 -0
- package/dist/esm/McInput/demo/Input/label.d.ts +2 -0
- package/dist/esm/McInput/demo/Input/label.js +26 -0
- package/dist/esm/McInput/demo/Input/ref.d.ts +3 -0
- package/dist/esm/McInput/demo/Input/ref.js +53 -0
- package/dist/esm/McInput/demo/Input/status.d.ts +2 -0
- package/dist/esm/McInput/demo/Input/status.js +23 -0
- package/dist/esm/McInput/demo/Search/search-base.d.ts +2 -0
- package/dist/esm/McInput/demo/Search/search-base.js +38 -0
- package/dist/esm/McInput/demo/TextArea/text-area-base.d.ts +2 -0
- package/dist/esm/McInput/demo/TextArea/text-area-base.js +38 -0
- package/dist/esm/McInput/index.d.ts +13 -0
- package/dist/esm/McInput/index.js +7 -0
- package/dist/esm/McInput/index.less +62 -0
- package/dist/esm/McInputNumber/index.d.ts +16 -0
- package/dist/esm/McInputNumber/index.js +50 -0
- package/dist/esm/McInputNumber/index.less +18 -0
- package/dist/esm/McLazyLoader/index.d.ts +39 -0
- package/dist/esm/McLazyLoader/index.js +88 -0
- package/dist/esm/McListSelect/comps/ListSelect.d.ts +67 -0
- package/dist/esm/McListSelect/comps/ListSelect.js +289 -0
- package/dist/esm/McListSelect/comps/ListSelectPanel.d.ts +138 -0
- package/dist/esm/McListSelect/comps/ListSelectPanel.js +451 -0
- package/dist/esm/McListSelect/comps/SelectedItem.d.ts +17 -0
- package/dist/esm/McListSelect/comps/SelectedItem.js +76 -0
- package/dist/esm/McListSelect/index.d.ts +10 -0
- package/dist/esm/McListSelect/index.js +5 -0
- package/dist/esm/McListSelect/index.less +257 -0
- package/dist/esm/McModalProvider/index.d.ts +174 -0
- package/dist/esm/McModalProvider/index.js +498 -0
- package/dist/esm/McPeriodSelect/index.d.ts +13 -0
- package/dist/esm/McPeriodSelect/index.js +305 -0
- package/dist/esm/McPeriodSelect/index.less +187 -0
- package/dist/esm/McPopoverButton/index.d.ts +14 -0
- package/dist/esm/McPopoverButton/index.js +52 -0
- package/dist/esm/McPopoverForm/index.d.ts +14 -0
- package/dist/esm/McPopoverForm/index.js +95 -0
- package/dist/esm/McProSelect/index.d.ts +35 -0
- package/dist/esm/McProSelect/index.js +152 -0
- package/dist/esm/McResult/default.d.ts +1 -0
- package/dist/esm/McResult/default.js +98 -0
- package/dist/esm/McResult/icon.d.ts +25 -0
- package/dist/esm/McResult/icon.js +1014 -0
- package/dist/esm/McResult/index.d.ts +31 -0
- package/dist/esm/McResult/index.js +119 -0
- package/dist/esm/McResult/index.less +18 -0
- package/dist/esm/McResult/public/403.svg +164 -0
- package/dist/esm/McResult/public/404.svg +123 -0
- package/dist/esm/McResult/public/500.svg +129 -0
- package/dist/esm/McResult/public/building.svg +127 -0
- package/dist/esm/McResult/public/code403.svg +7 -0
- package/dist/esm/McResult/public/code404.svg +5 -0
- package/dist/esm/McResult/public/code500.svg +5 -0
- package/dist/esm/McResult/public/detailEmpty.svg +1 -0
- package/dist/esm/McResult/public/empty.svg +1 -0
- package/dist/esm/McResult/public/noFunction.svg +1 -0
- package/dist/esm/McResult/public/noUser.svg +90 -0
- package/dist/esm/McSelect/components/PanelSearchInput/index.d.ts +12 -0
- package/dist/esm/McSelect/components/PanelSearchInput/index.js +45 -0
- package/dist/esm/McSelect/components/PanelSearchInput/index.less +7 -0
- package/dist/esm/McSelect/index.d.ts +47 -0
- package/dist/esm/McSelect/index.js +436 -0
- package/dist/esm/McSelect/index.less +72 -0
- package/dist/esm/McTag/index.d.ts +22 -0
- package/dist/esm/McTag/index.js +59 -0
- package/dist/esm/McThemeConfig/customToken.json +39 -0
- package/dist/esm/McThemeConfig/globalStyle.d.ts +2 -0
- package/dist/esm/McThemeConfig/globalStyle.js +198 -0
- package/dist/esm/McThemeConfig/index.d.ts +9 -0
- package/dist/esm/McThemeConfig/index.js +16 -0
- package/dist/esm/McThemeConfig/layoutStyle.d.ts +2 -0
- package/dist/esm/McThemeConfig/layoutStyle.js +1 -0
- package/dist/esm/McThemeConfig/provider.d.ts +8 -0
- package/dist/esm/McThemeConfig/provider.js +20 -0
- package/dist/esm/McThemeConfig/themeToken.json +152 -0
- package/dist/esm/McTreePanel/SelectedItem.d.ts +4 -0
- package/dist/esm/McTreePanel/SelectedItem.js +75 -0
- package/dist/esm/McTreePanel/index.d.ts +27 -0
- package/dist/esm/McTreePanel/index.js +315 -0
- package/dist/esm/McTreePanel/index.less +106 -0
- package/dist/esm/McTreeSelect/index.d.ts +13 -0
- package/dist/esm/McTreeSelect/index.js +182 -0
- package/dist/esm/McTreeSelect/index.less +72 -0
- package/dist/esm/McUpload/comps/McFormUpload/comps/UploadForVal/index.d.ts +38 -0
- package/dist/esm/McUpload/comps/McFormUpload/comps/UploadForVal/index.js +209 -0
- package/dist/esm/McUpload/comps/McFormUpload/comps/UploadForVal/index.less +6 -0
- package/dist/esm/McUpload/comps/McFormUpload/index.d.ts +7 -0
- package/dist/esm/McUpload/comps/McFormUpload/index.js +29 -0
- package/dist/esm/McUpload/comps/McUploadCmp/index.d.ts +49 -0
- package/dist/esm/McUpload/comps/McUploadCmp/index.js +396 -0
- package/dist/esm/McUpload/comps/McUploadCmp/index.less +68 -0
- package/dist/esm/McUpload/comps/McUploadDragger/index.d.ts +49 -0
- package/dist/esm/McUpload/comps/McUploadDragger/index.js +264 -0
- package/dist/esm/McUpload/comps/McUploadTrigger/index.d.ts +39 -0
- package/dist/esm/McUpload/comps/McUploadTrigger/index.js +318 -0
- package/dist/esm/McUpload/comps/McUploadTrigger/index.less +204 -0
- package/dist/esm/McUpload/index.d.ts +14 -0
- package/dist/esm/McUpload/index.js +9 -0
- package/dist/esm/McUpload/tools/calculateMD5/index.d.ts +3 -0
- package/dist/esm/McUpload/tools/calculateMD5/index.js +94 -0
- package/dist/esm/McUpload/tools/calculateMD5/md5Worker.js +44 -0
- package/dist/esm/McUpload/tools/getUid.d.ts +1 -0
- package/dist/esm/McUpload/tools/getUid.js +6 -0
- package/dist/esm/McUpload/tools/materialVerification.d.ts +50 -0
- package/dist/esm/McUpload/tools/materialVerification.js +257 -0
- package/dist/esm/McUpload/tools/uploadTools.d.ts +5 -0
- package/dist/esm/McUpload/tools/uploadTools.js +56 -0
- package/dist/esm/Utils/index.d.ts +8 -0
- package/dist/esm/Utils/index.js +9 -0
- package/dist/esm/Utils/lib/Queue/PriorityQueue.d.ts +21 -0
- package/dist/esm/Utils/lib/Queue/PriorityQueue.js +197 -0
- package/dist/esm/Utils/lib/Queue/TaskQueue.d.ts +17 -0
- package/dist/esm/Utils/lib/Queue/TaskQueue.js +199 -0
- package/dist/esm/Utils/lib/Queue/tools/BinaryHeap.d.ts +25 -0
- package/dist/esm/Utils/lib/Queue/tools/BinaryHeap.js +184 -0
- package/dist/esm/Utils/lib/Queue/tools/publicDependencyMethod.d.ts +6 -0
- package/dist/esm/Utils/lib/Queue/tools/publicDependencyMethod.js +26 -0
- package/dist/esm/Utils/lib/Queue/types/baseTaskQueue.d.ts +23 -0
- package/dist/esm/Utils/lib/Queue/types/baseTaskQueue.js +10 -0
- package/dist/esm/Utils/lib/copyToClipboard.d.ts +8 -0
- package/dist/esm/Utils/lib/copyToClipboard.js +54 -0
- package/dist/esm/index.d.ts +34 -0
- package/dist/esm/index.js +33 -0
- package/dist/esm/styles/index.less +2 -0
- package/dist/esm/styles/mixins.less +52 -0
- package/dist/esm/styles/utilities.less +51 -0
- package/dist/esm/typings.d.ts +20 -0
- package/package.json +4 -3
@@ -0,0 +1,204 @@
|
|
1
|
+
.uploadTrigger {
|
2
|
+
position: relative;
|
3
|
+
display: flex;
|
4
|
+
align-items: center;
|
5
|
+
justify-content: center;
|
6
|
+
border-radius: 4px;
|
7
|
+
cursor: pointer;
|
8
|
+
user-select: none;
|
9
|
+
background: #f5f5f5;
|
10
|
+
}
|
11
|
+
|
12
|
+
.square-container {
|
13
|
+
width: 102px;
|
14
|
+
height: 102px;
|
15
|
+
}
|
16
|
+
|
17
|
+
.rectangle-container {
|
18
|
+
width: 90px;
|
19
|
+
height: 120px;
|
20
|
+
}
|
21
|
+
|
22
|
+
.circle-container {
|
23
|
+
width: 102px;
|
24
|
+
height: 102px;
|
25
|
+
border-radius: 50%;
|
26
|
+
}
|
27
|
+
|
28
|
+
.base {
|
29
|
+
width: 100%;
|
30
|
+
height: 100%;
|
31
|
+
display: flex;
|
32
|
+
align-items: center;
|
33
|
+
justify-content: center;
|
34
|
+
flex-flow: column;
|
35
|
+
border-radius: inherit;
|
36
|
+
gap: 8px;
|
37
|
+
position: relative;
|
38
|
+
}
|
39
|
+
|
40
|
+
.picture-container_default {
|
41
|
+
border: 1px dashed #d9d9d9;
|
42
|
+
transition: border-color 0.3s, color 0.3s;
|
43
|
+
|
44
|
+
&:hover {
|
45
|
+
border: 1px dashed #325cf7;
|
46
|
+
color: #325cf7;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
.picture-container_error {
|
51
|
+
background: rgba(255, 77, 79, 10%);
|
52
|
+
border: 1px dashed #ff4d4f;
|
53
|
+
|
54
|
+
&:hover {
|
55
|
+
.mc-trigger-mask {
|
56
|
+
display: flex;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
.mc-trigger-mask {
|
62
|
+
position: absolute;
|
63
|
+
top: 0;
|
64
|
+
left: 0;
|
65
|
+
box-sizing: border-box;
|
66
|
+
border-radius: inherit;
|
67
|
+
width: 100%;
|
68
|
+
height: 100%;
|
69
|
+
display: none;
|
70
|
+
align-items: center;
|
71
|
+
justify-content: center;
|
72
|
+
gap: 8px;
|
73
|
+
background: rgba(0, 0, 0, 80%) !important;
|
74
|
+
}
|
75
|
+
|
76
|
+
.img-container {
|
77
|
+
width: 100%;
|
78
|
+
height: 100%;
|
79
|
+
display: flex;
|
80
|
+
align-items: center;
|
81
|
+
border-radius: inherit;
|
82
|
+
|
83
|
+
> img {
|
84
|
+
width: 100%;
|
85
|
+
height: 100% !important;
|
86
|
+
object-fit: cover;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
.picture-container_uploading {
|
91
|
+
&:hover {
|
92
|
+
.mc-trigger-mask {
|
93
|
+
display: flex;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
.picture-container_done {
|
99
|
+
width: 100%;
|
100
|
+
height: 100%;
|
101
|
+
display: flex;
|
102
|
+
align-items: center;
|
103
|
+
justify-content: center;
|
104
|
+
position: relative;
|
105
|
+
gap: 8px;
|
106
|
+
|
107
|
+
&:hover {
|
108
|
+
.mc-trigger-mask {
|
109
|
+
display: flex;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
// -----------------------------按钮样式----------------------------- //
|
115
|
+
.button-container {
|
116
|
+
height: 24px;
|
117
|
+
margin-top: 4px;
|
118
|
+
display: flex;
|
119
|
+
align-items: center;
|
120
|
+
line-height: 1;
|
121
|
+
box-sizing: border-box;
|
122
|
+
|
123
|
+
&:hover {
|
124
|
+
background: #f5f5f5;
|
125
|
+
|
126
|
+
.button-content-name-delete {
|
127
|
+
opacity: 1 !important;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
.button-icon {
|
132
|
+
box-sizing: inherit;
|
133
|
+
padding: 4px 6px 6px;
|
134
|
+
}
|
135
|
+
|
136
|
+
.button-content {
|
137
|
+
height: 24px;
|
138
|
+
flex: 1 1;
|
139
|
+
width: calc(100% - 48px);
|
140
|
+
display: flex;
|
141
|
+
flex-flow: column;
|
142
|
+
justify-content: flex-end;
|
143
|
+
|
144
|
+
.button-content-name {
|
145
|
+
display: flex;
|
146
|
+
align-items: center;
|
147
|
+
justify-content: space-between;
|
148
|
+
width: 100%;
|
149
|
+
|
150
|
+
.button-content-name-delete {
|
151
|
+
opacity: 0;
|
152
|
+
padding: 4px;
|
153
|
+
box-sizing: border-box;
|
154
|
+
border-radius: 4px;
|
155
|
+
cursor: pointer;
|
156
|
+
|
157
|
+
&:hover {
|
158
|
+
background: #d9d9d9;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
.delete_error {
|
163
|
+
opacity: 1;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
.button-content-progress {
|
168
|
+
line-height: 2px;
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
// -------------------拖拽部分---------------------//
|
174
|
+
.uploadTriggerDrag {
|
175
|
+
display: flex;
|
176
|
+
align-items: center;
|
177
|
+
flex-flow: column;
|
178
|
+
box-sizing: border-box;
|
179
|
+
padding: 24px;
|
180
|
+
border: 1px dashed #d9d9d9;
|
181
|
+
border-radius: 4px;
|
182
|
+
background: #f5f5f5;
|
183
|
+
cursor: pointer;
|
184
|
+
|
185
|
+
.uploadTriggerDrag-icon {
|
186
|
+
margin-bottom: 16px;
|
187
|
+
}
|
188
|
+
|
189
|
+
.uploadTriggerDrag-text {
|
190
|
+
font-weight: 500;
|
191
|
+
color: #262626;
|
192
|
+
margin-bottom: 8px;
|
193
|
+
}
|
194
|
+
|
195
|
+
.uploadTriggerDrag-desc {
|
196
|
+
font-size: 12px;
|
197
|
+
color: #8c8c8c;
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
.uploadTriggerDrag.active {
|
202
|
+
border: 1px dashed #325cf7;
|
203
|
+
background: #eaeefe;
|
204
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { GetProps } from 'antd';
|
2
|
+
import { ForwardRefExoticComponent } from 'react';
|
3
|
+
import McFormUpload from './comps/McFormUpload';
|
4
|
+
import McUploadCmp from './comps/McUploadCmp';
|
5
|
+
import McUploadDragger from './comps/McUploadDragger';
|
6
|
+
export type { McUploadProps } from './comps/McUploadCmp';
|
7
|
+
export * from './comps/McUploadDragger';
|
8
|
+
export * from './comps/McUploadTrigger';
|
9
|
+
type CompoundedComponent = ForwardRefExoticComponent<GetProps<typeof McUploadCmp>> & {
|
10
|
+
McFormUpload: typeof McFormUpload;
|
11
|
+
Dragger: typeof McUploadDragger;
|
12
|
+
};
|
13
|
+
declare const McUpload: CompoundedComponent;
|
14
|
+
export default McUpload;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import McFormUpload from "./comps/McFormUpload";
|
2
|
+
import McUploadCmp from "./comps/McUploadCmp";
|
3
|
+
import McUploadDragger from "./comps/McUploadDragger";
|
4
|
+
export * from "./comps/McUploadDragger";
|
5
|
+
export * from "./comps/McUploadTrigger";
|
6
|
+
var McUpload = McUploadCmp;
|
7
|
+
McUploadCmp.McFormUpload = McFormUpload;
|
8
|
+
McUploadCmp.Dragger = McUploadDragger;
|
9
|
+
export default McUpload;
|
@@ -0,0 +1,3 @@
|
|
1
|
+
export declare const getIdleCPUCores: () => number;
|
2
|
+
export declare const calculateByNormal: (file: File, chunkSize: number) => Promise<string | ProgressEvent<FileReader>>;
|
3
|
+
export declare const calculateMD5: (file: File, chunkSize?: number) => Promise<string | MessageEvent['data']['error'] | ProgressEvent<FileReader>>;
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import SparkMD5 from 'spark-md5';
|
2
|
+
import { transformNumber } from "../uploadTools";
|
3
|
+
// 创建一个纯js计算线程
|
4
|
+
var createWebWorker = function createWebWorker() {
|
5
|
+
return new Worker(new URL('./md5Worker.js', import.meta.url));
|
6
|
+
};
|
7
|
+
|
8
|
+
// 获取用户cpu核心数用于控制并发线程数量
|
9
|
+
export var getIdleCPUCores = function getIdleCPUCores() {
|
10
|
+
var _navigator;
|
11
|
+
var BROWSER_CPU_COUNT = transformNumber((_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.hardwareConcurrency);
|
12
|
+
// Safari总是返回1
|
13
|
+
return BROWSER_CPU_COUNT < 5 ? 2 : Math.min(BROWSER_CPU_COUNT - 2, 8); // 默认4核,留两核防止浏览器崩溃
|
14
|
+
};
|
15
|
+
|
16
|
+
// webwork的纯js计算
|
17
|
+
var calculateByWebWorker = function calculateByWebWorker(file, chunkSize) {
|
18
|
+
return new Promise(function (resolve, reject) {
|
19
|
+
var worker = createWebWorker();
|
20
|
+
var reader = new FileReader();
|
21
|
+
var currentChunk = 0;
|
22
|
+
var totalChunks = Math.ceil(file.size / chunkSize);
|
23
|
+
function loadNext() {
|
24
|
+
var start = currentChunk * chunkSize;
|
25
|
+
var end = Math.min(start + chunkSize, file.size);
|
26
|
+
reader.readAsArrayBuffer(file.slice(start, end));
|
27
|
+
}
|
28
|
+
reader.onload = function (e) {
|
29
|
+
var _e$target;
|
30
|
+
var buffer = (_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.result;
|
31
|
+
worker.postMessage({
|
32
|
+
buffer: buffer,
|
33
|
+
isEnd: currentChunk === totalChunks - 1
|
34
|
+
}, [buffer]);
|
35
|
+
currentChunk++;
|
36
|
+
if (currentChunk < totalChunks) {
|
37
|
+
loadNext();
|
38
|
+
}
|
39
|
+
};
|
40
|
+
reader.onerror = function (err) {
|
41
|
+
reject(err);
|
42
|
+
};
|
43
|
+
worker.onmessage = function (e) {
|
44
|
+
if (e.data.error) {
|
45
|
+
reject(e.data.error);
|
46
|
+
} else {
|
47
|
+
resolve(e.data);
|
48
|
+
}
|
49
|
+
worker.terminate(); // 关闭worker
|
50
|
+
};
|
51
|
+
loadNext();
|
52
|
+
});
|
53
|
+
};
|
54
|
+
|
55
|
+
// 纯js串行计算
|
56
|
+
export var calculateByNormal = function calculateByNormal(file, chunkSize) {
|
57
|
+
return new Promise(function (resolve, reject) {
|
58
|
+
var reader = new FileReader();
|
59
|
+
var hashTool = new SparkMD5.ArrayBuffer();
|
60
|
+
var currentChunk = 0;
|
61
|
+
var totalChunks = Math.ceil(file.size / chunkSize);
|
62
|
+
function loadNext() {
|
63
|
+
var start = currentChunk * chunkSize;
|
64
|
+
var end = Math.min(start + chunkSize, file.size);
|
65
|
+
reader.readAsArrayBuffer(file.slice(start, end));
|
66
|
+
}
|
67
|
+
reader.onload = function (e) {
|
68
|
+
var _e$target2;
|
69
|
+
var buffer = (_e$target2 = e.target) === null || _e$target2 === void 0 ? void 0 : _e$target2.result;
|
70
|
+
hashTool.append(buffer);
|
71
|
+
currentChunk++;
|
72
|
+
if (currentChunk < totalChunks) {
|
73
|
+
loadNext();
|
74
|
+
} else {
|
75
|
+
resolve(hashTool.end());
|
76
|
+
}
|
77
|
+
};
|
78
|
+
reader.onerror = function (err) {
|
79
|
+
reject(err);
|
80
|
+
};
|
81
|
+
loadNext();
|
82
|
+
});
|
83
|
+
};
|
84
|
+
|
85
|
+
// TODO MD5是串行算法,所以采用每个线程算一个文件的方式,而不是多个线程计算同一个文件
|
86
|
+
export var calculateMD5 = function calculateMD5(file) {
|
87
|
+
var chunkSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5 * 1024 * 1024;
|
88
|
+
// 判断当前浏览器环境支不支持webworker
|
89
|
+
if (window.Worker) {
|
90
|
+
return calculateByWebWorker(file, chunkSize);
|
91
|
+
} else {
|
92
|
+
return calculateByNormal(file, chunkSize);
|
93
|
+
}
|
94
|
+
};
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
3
|
+
var SparkMD5 = require('spark-md5');
|
4
|
+
// 一期因为hash-wasm和spark-md5的兼容性问题,暂时使用spark-md5
|
5
|
+
var hashTool = new SparkMD5.ArrayBuffer();
|
6
|
+
self.onmessage = /*#__PURE__*/function () {
|
7
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(e) {
|
8
|
+
var _e$data, buffer, isEnd, timeoutId, md5;
|
9
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
10
|
+
while (1) switch (_context.prev = _context.next) {
|
11
|
+
case 0:
|
12
|
+
_e$data = e.data, buffer = _e$data.buffer, isEnd = _e$data.isEnd; // 接收主线程传递过来的文件
|
13
|
+
timeoutId = setTimeout(function () {
|
14
|
+
self.postMessage({
|
15
|
+
error: 'Hash calculation timed out'
|
16
|
+
}); // 超时错误消息
|
17
|
+
self.close(); // 关闭 worker
|
18
|
+
}, 10000); // 设置超时时间为10秒
|
19
|
+
try {
|
20
|
+
hashTool.append(buffer); // 将文件内容添加到哈希计算中
|
21
|
+
if (isEnd) {
|
22
|
+
md5 = hashTool.end(); // 计算文件的 MD5 值
|
23
|
+
clearTimeout(timeoutId); // 清除超时计时器
|
24
|
+
self.postMessage(md5); // 将计算结果发送给主线程
|
25
|
+
}
|
26
|
+
} catch (err) {
|
27
|
+
clearTimeout(timeoutId); // 清除超时计时器
|
28
|
+
self.postMessage({
|
29
|
+
error: err.message
|
30
|
+
}); // 发送错误消息
|
31
|
+
}
|
32
|
+
case 3:
|
33
|
+
case "end":
|
34
|
+
return _context.stop();
|
35
|
+
}
|
36
|
+
}, _callee);
|
37
|
+
}));
|
38
|
+
return function (_x) {
|
39
|
+
return _ref.apply(this, arguments);
|
40
|
+
};
|
41
|
+
}();
|
42
|
+
self.onerror = function (e) {
|
43
|
+
self.postMessage(e);
|
44
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export default function getUid(): string;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import { RcFile } from 'antd/es/upload';
|
2
|
+
export interface FileInfo {
|
3
|
+
type: string;
|
4
|
+
size: number;
|
5
|
+
width: number;
|
6
|
+
height: number;
|
7
|
+
name: string;
|
8
|
+
duration?: number;
|
9
|
+
}
|
10
|
+
export type FileError = {
|
11
|
+
name?: string;
|
12
|
+
message?: string;
|
13
|
+
};
|
14
|
+
export type FileRangeInfo = {
|
15
|
+
min?: number;
|
16
|
+
max?: number;
|
17
|
+
};
|
18
|
+
export type DAR = [number, number];
|
19
|
+
export interface VerifyConfig {
|
20
|
+
size?: FileRangeInfo;
|
21
|
+
width?: FileRangeInfo;
|
22
|
+
height?: FileRangeInfo;
|
23
|
+
duration?: FileRangeInfo;
|
24
|
+
DAR?: DAR;
|
25
|
+
}
|
26
|
+
export type CheckResult = {
|
27
|
+
isPassed: boolean;
|
28
|
+
errList: ('min' | 'max')[];
|
29
|
+
};
|
30
|
+
type FileInfoResult = {
|
31
|
+
error: FileError;
|
32
|
+
data: null;
|
33
|
+
} | {
|
34
|
+
error: null;
|
35
|
+
data: FileInfo;
|
36
|
+
};
|
37
|
+
export declare const getImgInfo: (imgFile: RcFile) => Promise<FileInfoResult>;
|
38
|
+
export declare const getVideoInfo: (videoFile: RcFile) => Promise<FileInfoResult>;
|
39
|
+
export declare const isNumber: (num?: number) => boolean;
|
40
|
+
export declare const isNumberInRange: (reference: number, rangeInfo: FileRangeInfo) => CheckResult;
|
41
|
+
export type FileCheckedResult = {
|
42
|
+
isPassed: boolean;
|
43
|
+
errList?: {
|
44
|
+
target: string;
|
45
|
+
messages: string[];
|
46
|
+
}[];
|
47
|
+
fileInfo?: Partial<FileInfo>;
|
48
|
+
};
|
49
|
+
export declare const checkFile: (file: RcFile, config: VerifyConfig) => Promise<FileCheckedResult>;
|
50
|
+
export {};
|
@@ -0,0 +1,257 @@
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
3
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
4
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
5
|
+
// 图片信息获取
|
6
|
+
// 参数校验配置
|
7
|
+
// 数据大小范围
|
8
|
+
// 素材校验配置参数
|
9
|
+
var E_VerifyType = /*#__PURE__*/function (E_VerifyType) {
|
10
|
+
E_VerifyType["SIZE"] = "size";
|
11
|
+
E_VerifyType["WIDTH"] = "width";
|
12
|
+
E_VerifyType["HEIGHT"] = "height";
|
13
|
+
E_VerifyType["DURATION"] = "duration";
|
14
|
+
E_VerifyType["DAR"] = "DAR";
|
15
|
+
return E_VerifyType;
|
16
|
+
}(E_VerifyType || {}); // 单项校验
|
17
|
+
// 获取图片信息
|
18
|
+
export var getImgInfo = function getImgInfo(imgFile) {
|
19
|
+
return new Promise(function (resolve) {
|
20
|
+
var img = new Image();
|
21
|
+
img.src = URL.createObjectURL(imgFile);
|
22
|
+
img.onload = function () {
|
23
|
+
resolve({
|
24
|
+
error: null,
|
25
|
+
data: {
|
26
|
+
type: imgFile.type,
|
27
|
+
size: imgFile.size,
|
28
|
+
width: img.width,
|
29
|
+
height: img.height,
|
30
|
+
name: imgFile.name
|
31
|
+
}
|
32
|
+
});
|
33
|
+
window.URL.revokeObjectURL(img.src); // 释放URL对象
|
34
|
+
};
|
35
|
+
img.onerror = function () {
|
36
|
+
window.URL.revokeObjectURL(img.src); // 释放URL对象
|
37
|
+
resolve({
|
38
|
+
error: {
|
39
|
+
name: imgFile.name,
|
40
|
+
message: '图片加载失败'
|
41
|
+
},
|
42
|
+
data: null
|
43
|
+
});
|
44
|
+
};
|
45
|
+
});
|
46
|
+
};
|
47
|
+
|
48
|
+
// 获取视频信息
|
49
|
+
export var getVideoInfo = function getVideoInfo(videoFile) {
|
50
|
+
return new Promise(function (resolve) {
|
51
|
+
var video = document.createElement('video');
|
52
|
+
video.preload = 'metadata';
|
53
|
+
video.onloadedmetadata = function () {
|
54
|
+
resolve({
|
55
|
+
error: null,
|
56
|
+
data: {
|
57
|
+
type: videoFile.type,
|
58
|
+
size: videoFile.size,
|
59
|
+
width: video.videoWidth,
|
60
|
+
height: video.videoHeight,
|
61
|
+
name: videoFile.name,
|
62
|
+
duration: video.duration
|
63
|
+
}
|
64
|
+
});
|
65
|
+
window.URL.revokeObjectURL(video.src); // 释放URL对象
|
66
|
+
};
|
67
|
+
video.onerror = function () {
|
68
|
+
window.URL.revokeObjectURL(video.src); // 释放URL对象
|
69
|
+
resolve({
|
70
|
+
error: {
|
71
|
+
name: videoFile.name,
|
72
|
+
message: '视频加载失败'
|
73
|
+
},
|
74
|
+
data: null
|
75
|
+
});
|
76
|
+
};
|
77
|
+
// 创建资源
|
78
|
+
video.src = URL.createObjectURL(videoFile);
|
79
|
+
});
|
80
|
+
};
|
81
|
+
|
82
|
+
// 大小校验
|
83
|
+
|
84
|
+
// 判断变量是不是数字
|
85
|
+
export var isNumber = function isNumber(num) {
|
86
|
+
return typeof num === 'number' && !Number.isNaN(num);
|
87
|
+
};
|
88
|
+
|
89
|
+
// 判断数字有没有在某一个区间内
|
90
|
+
export var isNumberInRange = function isNumberInRange(reference, rangeInfo) {
|
91
|
+
var min = rangeInfo.min,
|
92
|
+
max = rangeInfo.max;
|
93
|
+
var res = {
|
94
|
+
isPassed: true,
|
95
|
+
errList: []
|
96
|
+
};
|
97
|
+
if (typeof min === 'number' && !Number.isNaN(min) && reference < min) {
|
98
|
+
var _res$errList;
|
99
|
+
res.isPassed = false;
|
100
|
+
(_res$errList = res.errList) === null || _res$errList === void 0 || _res$errList.push('min');
|
101
|
+
}
|
102
|
+
if (typeof max === 'number' && !Number.isNaN(max) && reference > max) {
|
103
|
+
var _res$errList2;
|
104
|
+
res.isPassed = false;
|
105
|
+
(_res$errList2 = res.errList) === null || _res$errList2 === void 0 || _res$errList2.push('max');
|
106
|
+
}
|
107
|
+
return res;
|
108
|
+
};
|
109
|
+
var PARAMETER_MAP = {
|
110
|
+
size: {
|
111
|
+
title: '',
|
112
|
+
unit: 'MB',
|
113
|
+
transfer: function transfer(value) {
|
114
|
+
return value / 1024 / 1024;
|
115
|
+
}
|
116
|
+
},
|
117
|
+
width: {
|
118
|
+
title: '宽度',
|
119
|
+
unit: 'px',
|
120
|
+
transfer: function transfer(value) {
|
121
|
+
return value;
|
122
|
+
}
|
123
|
+
},
|
124
|
+
height: {
|
125
|
+
title: '高度',
|
126
|
+
unit: 'px',
|
127
|
+
transfer: function transfer(value) {
|
128
|
+
return value;
|
129
|
+
}
|
130
|
+
},
|
131
|
+
duration: {
|
132
|
+
title: '时长',
|
133
|
+
unit: 's',
|
134
|
+
transfer: function transfer(value) {
|
135
|
+
return value;
|
136
|
+
}
|
137
|
+
},
|
138
|
+
DAR: {
|
139
|
+
title: '宽高比',
|
140
|
+
unit: '',
|
141
|
+
transfer: function transfer(value) {
|
142
|
+
return value;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
};
|
146
|
+
|
147
|
+
// 校验函数
|
148
|
+
export var checkFile = /*#__PURE__*/function () {
|
149
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(file, config) {
|
150
|
+
var _file$type;
|
151
|
+
var res, type, fileType, size, width, height, duration, DAR, checkItem, _ref2, err, infoRes, _res$errList4;
|
152
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
153
|
+
while (1) switch (_context.prev = _context.next) {
|
154
|
+
case 0:
|
155
|
+
res = {
|
156
|
+
isPassed: true,
|
157
|
+
errList: []
|
158
|
+
}; // 判断文件类型
|
159
|
+
type = (_file$type = file.type) === null || _file$type === void 0 || (_file$type = _file$type.split('/')) === null || _file$type === void 0 ? void 0 : _file$type[0];
|
160
|
+
res.fileInfo = {
|
161
|
+
name: file.name,
|
162
|
+
type: file.type
|
163
|
+
};
|
164
|
+
fileType = type === 'image' ? '图片' : type === 'video' ? '视频' : '文件';
|
165
|
+
size = config.size, width = config.width, height = config.height, duration = config.duration, DAR = config.DAR; // 单项校验函数
|
166
|
+
checkItem = function checkItem(verifyInfo, verifyValue) {
|
167
|
+
var verifyType = verifyInfo.type,
|
168
|
+
verifyRange = verifyInfo.range;
|
169
|
+
if (!!verifyInfo.range) {
|
170
|
+
res.fileInfo = _objectSpread(_objectSpread({}, res.fileInfo), {}, _defineProperty({}, verifyInfo.type, verifyValue));
|
171
|
+
var result = isNumberInRange(verifyValue, verifyInfo.range);
|
172
|
+
if (!result.isPassed) {
|
173
|
+
var _res$errList3, _result$errList;
|
174
|
+
res.isPassed = false;
|
175
|
+
(_res$errList3 = res.errList) === null || _res$errList3 === void 0 || _res$errList3.push({
|
176
|
+
target: verifyInfo.type,
|
177
|
+
messages: (_result$errList = result.errList) === null || _result$errList === void 0 ? void 0 : _result$errList.map(function (item) {
|
178
|
+
var _PARAMETER_MAP$verify, _PARAMETER_MAP$verify2, _PARAMETER_MAP$verify3;
|
179
|
+
return "".concat(fileType).concat(file.name).concat(PARAMETER_MAP === null || PARAMETER_MAP === void 0 || (_PARAMETER_MAP$verify = PARAMETER_MAP[verifyType]) === null || _PARAMETER_MAP$verify === void 0 ? void 0 : _PARAMETER_MAP$verify.title).concat(item === 'min' ? '不能小于' : '不能大于', ": ").concat(PARAMETER_MAP === null || PARAMETER_MAP === void 0 || (_PARAMETER_MAP$verify2 = PARAMETER_MAP[verifyType]) === null || _PARAMETER_MAP$verify2 === void 0 ? void 0 : _PARAMETER_MAP$verify2.transfer(verifyRange === null || verifyRange === void 0 ? void 0 : verifyRange[item])).concat(PARAMETER_MAP === null || PARAMETER_MAP === void 0 || (_PARAMETER_MAP$verify3 = PARAMETER_MAP[verifyType]) === null || _PARAMETER_MAP$verify3 === void 0 ? void 0 : _PARAMETER_MAP$verify3.unit);
|
180
|
+
})
|
181
|
+
});
|
182
|
+
}
|
183
|
+
}
|
184
|
+
}; // 大小校验
|
185
|
+
checkItem({
|
186
|
+
type: E_VerifyType.SIZE,
|
187
|
+
range: size
|
188
|
+
}, file.size);
|
189
|
+
// 图片或视频才能使用以下校验
|
190
|
+
if (!((!!width || !!height || !!duration || !!DAR && (DAR === null || DAR === void 0 ? void 0 : DAR[0]) > 0 && (DAR === null || DAR === void 0 ? void 0 : DAR[1]) > 0) && ['image', 'video'].includes(type))) {
|
191
|
+
_context.next = 21;
|
192
|
+
break;
|
193
|
+
}
|
194
|
+
if (!(type === 'image')) {
|
195
|
+
_context.next = 14;
|
196
|
+
break;
|
197
|
+
}
|
198
|
+
_context.next = 11;
|
199
|
+
return getImgInfo(file);
|
200
|
+
case 11:
|
201
|
+
_context.t0 = _context.sent;
|
202
|
+
_context.next = 17;
|
203
|
+
break;
|
204
|
+
case 14:
|
205
|
+
_context.next = 16;
|
206
|
+
return getVideoInfo(file);
|
207
|
+
case 16:
|
208
|
+
_context.t0 = _context.sent;
|
209
|
+
case 17:
|
210
|
+
_ref2 = _context.t0;
|
211
|
+
err = _ref2.error;
|
212
|
+
infoRes = _ref2.data;
|
213
|
+
if (!err && res) {
|
214
|
+
// 宽度校验
|
215
|
+
checkItem({
|
216
|
+
type: E_VerifyType.WIDTH,
|
217
|
+
range: width
|
218
|
+
}, infoRes.width);
|
219
|
+
// 高度校验
|
220
|
+
checkItem({
|
221
|
+
type: E_VerifyType.HEIGHT,
|
222
|
+
range: height
|
223
|
+
}, infoRes.height);
|
224
|
+
if (type === 'video') {
|
225
|
+
// 时长校验
|
226
|
+
checkItem({
|
227
|
+
type: E_VerifyType.DURATION,
|
228
|
+
range: duration
|
229
|
+
}, infoRes.duration);
|
230
|
+
}
|
231
|
+
// 宽高比校验
|
232
|
+
if (!!DAR) {
|
233
|
+
res.fileInfo = _objectSpread(_objectSpread({}, res.fileInfo), {}, {
|
234
|
+
width: infoRes.width,
|
235
|
+
height: infoRes.height
|
236
|
+
});
|
237
|
+
if (!(infoRes.width / DAR[0] === infoRes.height / DAR[1])) {
|
238
|
+
res.isPassed = false;
|
239
|
+
(_res$errList4 = res.errList) === null || _res$errList4 === void 0 || _res$errList4.push({
|
240
|
+
target: E_VerifyType.DAR,
|
241
|
+
messages: ["".concat(fileType).concat(file.name, "\u5BBD\u9AD8\u6BD4\u4E0D\u6EE1\u8DB3\u4E3A: ").concat(DAR[0], ":").concat(DAR[1])]
|
242
|
+
});
|
243
|
+
}
|
244
|
+
}
|
245
|
+
}
|
246
|
+
case 21:
|
247
|
+
return _context.abrupt("return", res);
|
248
|
+
case 22:
|
249
|
+
case "end":
|
250
|
+
return _context.stop();
|
251
|
+
}
|
252
|
+
}, _callee);
|
253
|
+
}));
|
254
|
+
return function checkFile(_x, _x2) {
|
255
|
+
return _ref.apply(this, arguments);
|
256
|
+
};
|
257
|
+
}();
|