@jzwd/vnd-design 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +259 -2
- package/dist/file-center/api/endpoints.d.ts +42 -0
- package/dist/file-center/api/endpoints.js +45 -0
- package/dist/file-center/api/error.d.ts +6 -0
- package/dist/file-center/api/error.js +34 -0
- package/dist/file-center/api/index.d.ts +64 -0
- package/dist/file-center/api/index.js +238 -0
- package/dist/file-center/api/request.d.ts +28 -0
- package/dist/file-center/api/request.js +170 -0
- package/dist/file-center/api/token.d.ts +10 -0
- package/dist/file-center/api/token.js +122 -0
- package/dist/file-center/components/FcFileList/index.d.ts +39 -0
- package/dist/file-center/components/FcFileList/index.js +804 -0
- package/dist/file-center/components/FcFileList/style.css +106 -0
- package/dist/file-center/components/FcImage/index.d.ts +30 -0
- package/dist/file-center/components/FcImage/index.js +144 -0
- package/dist/file-center/components/FcImage/style.css +14 -0
- package/dist/file-center/components/FcUpload/index.d.ts +5 -0
- package/dist/file-center/components/FcUpload/index.js +642 -0
- package/dist/file-center/components/FcUpload/interface.d.ts +65 -0
- package/dist/file-center/components/FcUpload/interface.js +1 -0
- package/dist/file-center/components/FcUpload/style.css +279 -0
- package/dist/file-center/context.d.ts +22 -0
- package/dist/file-center/context.js +22 -0
- package/dist/file-center/index.d.ts +26 -0
- package/dist/file-center/index.js +21 -0
- package/dist/file-center/types.d.ts +144 -0
- package/dist/file-center/types.js +1 -0
- package/dist/file-center/upload.d.ts +35 -0
- package/dist/file-center/upload.js +295 -0
- package/dist/file-center/utils/common.d.ts +10 -0
- package/dist/file-center/utils/common.js +165 -0
- package/dist/file-center/utils/compress.d.ts +18 -0
- package/dist/file-center/utils/compress.js +108 -0
- package/dist/file-center/utils/md5.d.ts +5 -0
- package/dist/file-center/utils/md5.js +41 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +15 -0
- package/dist/mobile/FcImage/index.d.ts +26 -0
- package/dist/mobile/FcImage/index.js +114 -0
- package/dist/mobile/FcImage/style.css +11 -0
- package/dist/mobile/FcUpload/index.d.ts +74 -0
- package/dist/mobile/FcUpload/index.js +539 -0
- package/dist/mobile/FcUpload/style.css +233 -0
- package/dist/mobile/index.d.ts +13 -0
- package/dist/mobile/index.js +9 -0
- package/package.json +70 -4
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { UploadFile } from 'antd';
|
|
3
|
+
import type { FcCompressOptions } from '../../utils/compress';
|
|
4
|
+
import type { FcFileInfo, FcUploadProgress } from '../../types';
|
|
5
|
+
/**
|
|
6
|
+
* FcUpload 的文件项:在 antd UploadFile 基础上扩展文件中心元数据
|
|
7
|
+
*/
|
|
8
|
+
export interface FcUploadFile extends UploadFile {
|
|
9
|
+
/** 文件中心返回的文件 ID(上传成功后有值) */
|
|
10
|
+
fileId?: string;
|
|
11
|
+
/** 文件中心返回的文件元数据(上传成功后有值) */
|
|
12
|
+
fileInfo?: FcFileInfo;
|
|
13
|
+
/** 上传阶段(md5 计算 / 上传中 / 合并分片) */
|
|
14
|
+
stage?: FcUploadProgress['stage'];
|
|
15
|
+
}
|
|
16
|
+
export interface FcUploadProps {
|
|
17
|
+
/** 受控文件列表 */
|
|
18
|
+
value?: FcUploadFile[];
|
|
19
|
+
/** 文件列表变化回调(上传中/成功/失败/移除都会触发) */
|
|
20
|
+
onChange?: (fileList: FcUploadFile[]) => void;
|
|
21
|
+
/** 项目 AppKey(必填) */
|
|
22
|
+
appKey?: string;
|
|
23
|
+
/** 文件中心服务地址;不传则使用内置默认地址 */
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
/** 自定义令牌获取方式 */
|
|
26
|
+
getToken?: (appKey: string) => Promise<string>;
|
|
27
|
+
/** 业务类型,如 goodsImage;同时作为文件的 bizType 标签 */
|
|
28
|
+
bizType?: string;
|
|
29
|
+
/** 业务记录 ID */
|
|
30
|
+
bizId?: string;
|
|
31
|
+
/** 业务跳转链接 */
|
|
32
|
+
bizUrl?: string;
|
|
33
|
+
/** 展示形态:picture-card 图片卡片墙 / text 文件列表 / picture 带缩略图列表 */
|
|
34
|
+
listType?: 'picture-card' | 'text' | 'picture';
|
|
35
|
+
/** 是否启用拖拽上传(listType 为 text/picture 时生效) */
|
|
36
|
+
drag?: boolean;
|
|
37
|
+
/** 最多上传个数 */
|
|
38
|
+
maxCount?: number;
|
|
39
|
+
/** 单文件大小上限(MB),默认 50(与文件中心全局默认一致) */
|
|
40
|
+
maxSizeMB?: number;
|
|
41
|
+
/** 接受的文件类型(同 antd accept) */
|
|
42
|
+
accept?: string;
|
|
43
|
+
/** 支持多选 */
|
|
44
|
+
multiple?: boolean;
|
|
45
|
+
/** 禁用 */
|
|
46
|
+
disabled?: boolean;
|
|
47
|
+
/** 图片上传前压缩;传 true 用默认配置,仅对图片生效 */
|
|
48
|
+
compress?: boolean | FcCompressOptions;
|
|
49
|
+
/** 是否启用秒传,默认 true */
|
|
50
|
+
instant?: boolean;
|
|
51
|
+
/** 移除文件时是否同步删除文件中心的文件,默认 false(仅移出列表,删除由业务方/管理端负责) */
|
|
52
|
+
deleteOnRemove?: boolean;
|
|
53
|
+
/** 单文件上传成功 */
|
|
54
|
+
onUploadSuccess?: (fileInfo: FcFileInfo, file: FcUploadFile) => void;
|
|
55
|
+
/** 单文件上传失败 */
|
|
56
|
+
onUploadError?: (error: Error, file: FcUploadFile) => void;
|
|
57
|
+
/** 点击预览:图片默认弹灯箱,其他文件默认新窗口打开;传入后完全接管 */
|
|
58
|
+
onPreview?: (file: FcUploadFile) => void;
|
|
59
|
+
/** 上传按钮文案(非卡片形态),默认「上传文件」 */
|
|
60
|
+
buttonText?: string;
|
|
61
|
+
/** 卡片形态自定义内容 */
|
|
62
|
+
cardContent?: React.ReactNode;
|
|
63
|
+
className?: string;
|
|
64
|
+
style?: React.CSSProperties;
|
|
65
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/* FcUpload 样式:前缀 bc-fc-upload */
|
|
2
|
+
|
|
3
|
+
.bc-fc-upload-grid {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-wrap: wrap;
|
|
6
|
+
gap: 8px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/* ---- 卡片形态 ---- */
|
|
10
|
+
|
|
11
|
+
.bc-fc-upload-item-card .bc-fc-upload-card {
|
|
12
|
+
position: relative;
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
width: 102px;
|
|
17
|
+
height: 102px;
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
background: #fafafa;
|
|
20
|
+
border: 1px solid #d9d9d9;
|
|
21
|
+
border-radius: 8px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.bc-fc-upload-item-error .bc-fc-upload-card {
|
|
25
|
+
border-color: #ff4d4f;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.bc-fc-upload-card-add {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
gap: 6px;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: center;
|
|
34
|
+
width: 102px;
|
|
35
|
+
height: 102px;
|
|
36
|
+
color: rgba(0, 0, 0, 0.45);
|
|
37
|
+
font-size: 14px;
|
|
38
|
+
background: #fafafa;
|
|
39
|
+
border: 1px dashed #d9d9d9;
|
|
40
|
+
border-radius: 8px;
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
transition: border-color 0.2s;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.bc-fc-upload-card-add:hover {
|
|
46
|
+
border-color: #1677ff;
|
|
47
|
+
color: #1677ff;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.bc-fc-upload-add-text {
|
|
51
|
+
font-size: 12px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.bc-fc-upload-thumb {
|
|
55
|
+
width: 100%;
|
|
56
|
+
height: 100%;
|
|
57
|
+
object-fit: cover;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.bc-fc-upload-fileicon {
|
|
61
|
+
display: flex;
|
|
62
|
+
align-items: center;
|
|
63
|
+
justify-content: center;
|
|
64
|
+
width: 100%;
|
|
65
|
+
height: 100%;
|
|
66
|
+
color: rgba(0, 0, 0, 0.35);
|
|
67
|
+
font-size: 26px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.bc-fc-upload-card-mask {
|
|
71
|
+
position: absolute;
|
|
72
|
+
inset: 0;
|
|
73
|
+
display: flex;
|
|
74
|
+
flex-direction: column;
|
|
75
|
+
gap: 4px;
|
|
76
|
+
align-items: center;
|
|
77
|
+
justify-content: center;
|
|
78
|
+
color: #fff;
|
|
79
|
+
font-size: 12px;
|
|
80
|
+
background: rgba(0, 0, 0, 0.45);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.bc-fc-upload-card-mask-error {
|
|
84
|
+
background: rgba(255, 77, 79, 0.65);
|
|
85
|
+
font-size: 13px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.bc-fc-upload-card-hover {
|
|
89
|
+
position: absolute;
|
|
90
|
+
inset: 0;
|
|
91
|
+
display: flex;
|
|
92
|
+
flex-direction: column;
|
|
93
|
+
gap: 6px;
|
|
94
|
+
align-items: center;
|
|
95
|
+
justify-content: center;
|
|
96
|
+
color: #fff;
|
|
97
|
+
background: rgba(0, 0, 0, 0.5);
|
|
98
|
+
opacity: 0;
|
|
99
|
+
transition: opacity 0.2s;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.bc-fc-upload-card:hover .bc-fc-upload-card-hover {
|
|
103
|
+
opacity: 1;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.bc-fc-upload-actions {
|
|
107
|
+
display: inline-flex;
|
|
108
|
+
gap: 10px;
|
|
109
|
+
align-items: center;
|
|
110
|
+
font-size: 15px;
|
|
111
|
+
cursor: pointer;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.bc-fc-upload-actions .anticon:hover {
|
|
115
|
+
color: #1677ff;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.bc-fc-upload-card-hover .bc-fc-upload-actions,
|
|
119
|
+
.bc-fc-upload-card-hover .bc-fc-upload-actions .anticon:hover {
|
|
120
|
+
color: #fff;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.bc-fc-upload-size {
|
|
124
|
+
color: rgba(0, 0, 0, 0.45);
|
|
125
|
+
font-size: 12px;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.bc-fc-upload-card-hover .bc-fc-upload-size {
|
|
129
|
+
color: rgba(255, 255, 255, 0.85);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* ---- 列表形态 ---- */
|
|
133
|
+
|
|
134
|
+
.bc-fc-upload-rows {
|
|
135
|
+
display: flex;
|
|
136
|
+
flex-direction: column;
|
|
137
|
+
gap: 4px;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.bc-fc-upload-row {
|
|
141
|
+
display: flex;
|
|
142
|
+
gap: 8px;
|
|
143
|
+
align-items: center;
|
|
144
|
+
padding: 6px 8px;
|
|
145
|
+
border-radius: 6px;
|
|
146
|
+
transition: background 0.2s;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.bc-fc-upload-row:hover {
|
|
150
|
+
background: rgba(0, 0, 0, 0.04);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.bc-fc-upload-row .bc-fc-upload-thumb {
|
|
154
|
+
width: 36px;
|
|
155
|
+
height: 36px;
|
|
156
|
+
border-radius: 4px;
|
|
157
|
+
flex: none;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.bc-fc-upload-row .bc-fc-upload-fileicon {
|
|
161
|
+
width: 36px;
|
|
162
|
+
height: 36px;
|
|
163
|
+
font-size: 18px;
|
|
164
|
+
flex: none;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.bc-fc-upload-row-main {
|
|
168
|
+
display: flex;
|
|
169
|
+
flex: 1;
|
|
170
|
+
flex-direction: column;
|
|
171
|
+
gap: 2px;
|
|
172
|
+
min-width: 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.bc-fc-upload-name {
|
|
176
|
+
overflow: hidden;
|
|
177
|
+
color: rgba(0, 0, 0, 0.88);
|
|
178
|
+
font-size: 13px;
|
|
179
|
+
white-space: nowrap;
|
|
180
|
+
text-overflow: ellipsis;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.bc-fc-upload-name-link {
|
|
184
|
+
cursor: pointer;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.bc-fc-upload-name-link:hover {
|
|
188
|
+
color: #1677ff;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.bc-fc-upload-item-error .bc-fc-upload-name {
|
|
192
|
+
color: #ff4d4f;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.bc-fc-upload-progress {
|
|
196
|
+
display: flex;
|
|
197
|
+
gap: 8px;
|
|
198
|
+
align-items: center;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.bc-fc-upload-progress .ant-progress {
|
|
202
|
+
flex: 1;
|
|
203
|
+
margin: 0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.bc-fc-upload-stage {
|
|
207
|
+
color: rgba(0, 0, 0, 0.45);
|
|
208
|
+
font-size: 12px;
|
|
209
|
+
flex: none;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.bc-fc-upload-error {
|
|
213
|
+
overflow: hidden;
|
|
214
|
+
color: #ff4d4f;
|
|
215
|
+
font-size: 12px;
|
|
216
|
+
white-space: nowrap;
|
|
217
|
+
text-overflow: ellipsis;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* ---- 拖拽区 ---- */
|
|
221
|
+
|
|
222
|
+
.bc-fc-upload-dragger {
|
|
223
|
+
padding: 16px;
|
|
224
|
+
text-align: center;
|
|
225
|
+
background: #fafafa;
|
|
226
|
+
border: 1px dashed #d9d9d9;
|
|
227
|
+
border-radius: 8px;
|
|
228
|
+
cursor: pointer;
|
|
229
|
+
transition: border-color 0.2s;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.bc-fc-upload-dragger:hover,
|
|
233
|
+
.bc-fc-upload-dragger-over {
|
|
234
|
+
border-color: #1677ff;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.bc-fc-upload-dragger-icon {
|
|
238
|
+
margin: 0 0 8px;
|
|
239
|
+
color: #1677ff;
|
|
240
|
+
font-size: 28px;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.bc-fc-upload-dragger p {
|
|
244
|
+
margin: 0;
|
|
245
|
+
color: rgba(0, 0, 0, 0.65);
|
|
246
|
+
font-size: 13px;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.bc-fc-upload-dragger-tip {
|
|
250
|
+
margin-top: 4px !important;
|
|
251
|
+
color: rgba(0, 0, 0, 0.45) !important;
|
|
252
|
+
font-size: 12px !important;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* ---- 引用列表(删除确认弹窗) ---- */
|
|
256
|
+
|
|
257
|
+
.bc-fc-upload-refs ul {
|
|
258
|
+
max-height: 200px;
|
|
259
|
+
margin: 8px 0;
|
|
260
|
+
padding-left: 18px;
|
|
261
|
+
overflow-y: auto;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.bc-fc-upload-refs li {
|
|
265
|
+
display: flex;
|
|
266
|
+
gap: 8px;
|
|
267
|
+
align-items: center;
|
|
268
|
+
padding: 3px 0;
|
|
269
|
+
font-size: 13px;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.bc-fc-upload-refs-project {
|
|
273
|
+
color: rgba(0, 0, 0, 0.88);
|
|
274
|
+
font-weight: 500;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.bc-fc-upload-refs-biz {
|
|
278
|
+
color: rgba(0, 0, 0, 0.55);
|
|
279
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FcGetToken } from './types';
|
|
2
|
+
import type { FcRequestContext } from './api/request';
|
|
3
|
+
/** 文件中心默认服务地址(内置,无需配置;特殊环境可通过组件 props 覆盖) */
|
|
4
|
+
export declare const FC_DEFAULT_BASE_URL = "https://upload.yydslgd.cn";
|
|
5
|
+
/** 组件级文件中心配置 props:所有组件统一直接传参,无需任何 Provider 包裹 */
|
|
6
|
+
export interface FcComponentConfigProps {
|
|
7
|
+
/** 项目 AppKey(必填,项目注册后获得的唯一标识) */
|
|
8
|
+
appKey?: string;
|
|
9
|
+
/** 文件中心服务地址;不传则使用内置默认地址 */
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
/** 自定义令牌获取方式;不传则默认调 OPEN-1 用 appKey 换令牌 */
|
|
12
|
+
getToken?: FcGetToken;
|
|
13
|
+
/** 大文件分片阈值(字节),默认 10MB */
|
|
14
|
+
chunkThreshold?: number;
|
|
15
|
+
/** 分片大小(字节),默认 5MB */
|
|
16
|
+
chunkSize?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 由组件 props 解析出最终请求上下文。
|
|
20
|
+
* baseUrl 缺省时取内置默认地址;缺少 appKey 时抛错,提醒接入方配置。
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveFcContext(props: FcComponentConfigProps): FcRequestContext;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** 文件中心默认服务地址(内置,无需配置;特殊环境可通过组件 props 覆盖) */
|
|
2
|
+
export var FC_DEFAULT_BASE_URL = 'https://upload.yydslgd.cn';
|
|
3
|
+
|
|
4
|
+
/** 组件级文件中心配置 props:所有组件统一直接传参,无需任何 Provider 包裹 */
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 由组件 props 解析出最终请求上下文。
|
|
8
|
+
* baseUrl 缺省时取内置默认地址;缺少 appKey 时抛错,提醒接入方配置。
|
|
9
|
+
*/
|
|
10
|
+
export function resolveFcContext(props) {
|
|
11
|
+
var _props$baseUrl;
|
|
12
|
+
if (!props.appKey) {
|
|
13
|
+
throw new Error('[vnd-design] 缺少 appKey:请在组件 props 中传入项目 AppKey');
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
baseUrl: (_props$baseUrl = props.baseUrl) !== null && _props$baseUrl !== void 0 ? _props$baseUrl : FC_DEFAULT_BASE_URL,
|
|
17
|
+
appKey: props.appKey,
|
|
18
|
+
getToken: props.getToken,
|
|
19
|
+
chunkThreshold: props.chunkThreshold,
|
|
20
|
+
chunkSize: props.chunkSize
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件中心(FileCenter)业务组件模块
|
|
3
|
+
*
|
|
4
|
+
* 对外导出:
|
|
5
|
+
* - FcUpload:上传组件(图片卡片墙 / 文件列表 / 拖拽三种形态)
|
|
6
|
+
* - FcImage:图片回显组件(按文件 ID 取 URL,私有签名过期自动刷新)
|
|
7
|
+
* - FcFileList:文件列表组件(表格 / 宫格双视图,筛选、复制、预览、下载、删除含引用溯源)
|
|
8
|
+
* - uploadFile:不带 UI 的上传函数(供业务方自行定制 UI 时使用)
|
|
9
|
+
* - 开放接口函数与类型(供高级场景直接调用)
|
|
10
|
+
*/
|
|
11
|
+
export { FC_DEFAULT_BASE_URL, resolveFcContext } from './context';
|
|
12
|
+
export type { FcComponentConfigProps } from './context';
|
|
13
|
+
export { FcUpload } from './components/FcUpload';
|
|
14
|
+
export type { FcUploadProps, FcUploadFile } from './components/FcUpload/interface';
|
|
15
|
+
export { FcImage } from './components/FcImage';
|
|
16
|
+
export type { FcImageProps } from './components/FcImage';
|
|
17
|
+
export { FcFileList } from './components/FcFileList';
|
|
18
|
+
export type { FcFileListProps } from './components/FcFileList';
|
|
19
|
+
export { uploadFile } from './upload';
|
|
20
|
+
export type { FcUploadOptions } from './upload';
|
|
21
|
+
export { compressImage } from './utils/compress';
|
|
22
|
+
export type { FcCompressOptions } from './utils/compress';
|
|
23
|
+
export { calcFileMd5 } from './utils/md5';
|
|
24
|
+
export { copyText, downloadFile, formatFileSize, getFileCategory } from './utils/common';
|
|
25
|
+
export * from './api';
|
|
26
|
+
export * from './types';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件中心(FileCenter)业务组件模块
|
|
3
|
+
*
|
|
4
|
+
* 对外导出:
|
|
5
|
+
* - FcUpload:上传组件(图片卡片墙 / 文件列表 / 拖拽三种形态)
|
|
6
|
+
* - FcImage:图片回显组件(按文件 ID 取 URL,私有签名过期自动刷新)
|
|
7
|
+
* - FcFileList:文件列表组件(表格 / 宫格双视图,筛选、复制、预览、下载、删除含引用溯源)
|
|
8
|
+
* - uploadFile:不带 UI 的上传函数(供业务方自行定制 UI 时使用)
|
|
9
|
+
* - 开放接口函数与类型(供高级场景直接调用)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export { FC_DEFAULT_BASE_URL, resolveFcContext } from "./context";
|
|
13
|
+
export { FcUpload } from "./components/FcUpload";
|
|
14
|
+
export { FcImage } from "./components/FcImage";
|
|
15
|
+
export { FcFileList } from "./components/FcFileList";
|
|
16
|
+
export { uploadFile } from "./upload";
|
|
17
|
+
export { compressImage } from "./utils/compress";
|
|
18
|
+
export { calcFileMd5 } from "./utils/md5";
|
|
19
|
+
export { copyText, downloadFile, formatFileSize, getFileCategory } from "./utils/common";
|
|
20
|
+
export * from "./api";
|
|
21
|
+
export * from "./types";
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件中心(FileCenter)类型契约
|
|
3
|
+
*
|
|
4
|
+
* 说明:文件中心服务端尚在开发中,本文件按需求文档 v1.1 预先定义
|
|
5
|
+
* 「组件可直接消费」的入参/出参标准。服务端落地后若有出入,
|
|
6
|
+
* 只需调整本目录(api)内的少量代码,业务方无感知。
|
|
7
|
+
*/
|
|
8
|
+
/** 文件访问类型:公开读 / 私有读 */
|
|
9
|
+
export type FcAccessType = 'public' | 'private';
|
|
10
|
+
/** 文件上传来源 */
|
|
11
|
+
export type FcFileSource = 'api' | 'admin' | 'direct';
|
|
12
|
+
/** 文件中心返回的文件元数据 */
|
|
13
|
+
export interface FcFileInfo {
|
|
14
|
+
/** 文件 ID(雪花 ID,字符串形式,防精度丢失) */
|
|
15
|
+
id: string;
|
|
16
|
+
/** 文件名(含扩展名) */
|
|
17
|
+
name: string;
|
|
18
|
+
/** 扩展名,如 png */
|
|
19
|
+
ext: string;
|
|
20
|
+
/** MIME 类型,如 image/png */
|
|
21
|
+
mime: string;
|
|
22
|
+
/** 文件大小(字节) */
|
|
23
|
+
size: number;
|
|
24
|
+
/** 文件 MD5 */
|
|
25
|
+
md5: string;
|
|
26
|
+
/** 可访问 URL(公开文件为永久地址;私有文件为带签名的临时地址) */
|
|
27
|
+
url: string;
|
|
28
|
+
/** 访问类型 */
|
|
29
|
+
accessType: FcAccessType;
|
|
30
|
+
/** 业务标签 */
|
|
31
|
+
bizType?: string;
|
|
32
|
+
/** 上传来源 */
|
|
33
|
+
source: FcFileSource;
|
|
34
|
+
/** 上传时间(ISO 字符串) */
|
|
35
|
+
createdAt: string;
|
|
36
|
+
}
|
|
37
|
+
/** 文件引用记录(引用溯源) */
|
|
38
|
+
export interface FcFileReference {
|
|
39
|
+
id: string;
|
|
40
|
+
fileId: string;
|
|
41
|
+
/** 引用方项目 ID */
|
|
42
|
+
projectId: string;
|
|
43
|
+
/** 引用方项目名称 */
|
|
44
|
+
projectName?: string;
|
|
45
|
+
/** 业务类型,如「商品图」 */
|
|
46
|
+
bizType: string;
|
|
47
|
+
/** 业务记录 ID */
|
|
48
|
+
bizId: string;
|
|
49
|
+
/** 业务跳转链接(管理端可直达业务页面) */
|
|
50
|
+
bizUrl?: string;
|
|
51
|
+
createdAt: string;
|
|
52
|
+
}
|
|
53
|
+
/** 业务引用信息:上传成功后组件自动登记(OPEN-12) */
|
|
54
|
+
export interface FcBizInfo {
|
|
55
|
+
/** 业务类型,如 goodsImage */
|
|
56
|
+
bizType: string;
|
|
57
|
+
/** 业务记录 ID */
|
|
58
|
+
bizId: string;
|
|
59
|
+
/** 业务跳转链接 */
|
|
60
|
+
bizUrl?: string;
|
|
61
|
+
}
|
|
62
|
+
/** 服务端统一响应包裹 */
|
|
63
|
+
export interface FcResponse<T> {
|
|
64
|
+
/** 0 表示成功,其余为业务错误码 */
|
|
65
|
+
code: number;
|
|
66
|
+
message: string;
|
|
67
|
+
data: T;
|
|
68
|
+
}
|
|
69
|
+
/** 认证结果(OPEN-1) */
|
|
70
|
+
export interface FcAuthResult {
|
|
71
|
+
accessToken: string;
|
|
72
|
+
/** 过期秒数(默认 7200) */
|
|
73
|
+
expiresIn: number;
|
|
74
|
+
}
|
|
75
|
+
/** 文件列表查询参数(OPEN-7) */
|
|
76
|
+
export interface FcFileListQuery {
|
|
77
|
+
page?: number;
|
|
78
|
+
pageSize?: number;
|
|
79
|
+
/** 文件名模糊搜索 */
|
|
80
|
+
name?: string;
|
|
81
|
+
/** 业务标签 */
|
|
82
|
+
bizType?: string;
|
|
83
|
+
/** MIME 大类,如 image / video / application */
|
|
84
|
+
type?: string;
|
|
85
|
+
/** 起始时间(ISO 字符串) */
|
|
86
|
+
startTime?: string;
|
|
87
|
+
/** 截止时间(ISO 字符串) */
|
|
88
|
+
endTime?: string;
|
|
89
|
+
}
|
|
90
|
+
/** 分页结果 */
|
|
91
|
+
export interface FcPageResult<T> {
|
|
92
|
+
list: T[];
|
|
93
|
+
total: number;
|
|
94
|
+
page: number;
|
|
95
|
+
pageSize: number;
|
|
96
|
+
}
|
|
97
|
+
/** 秒传校验结果(OPEN-4) */
|
|
98
|
+
export interface FcInstantUploadResult {
|
|
99
|
+
/** 是否命中秒传(同 MD5 文件已存在) */
|
|
100
|
+
uploaded: boolean;
|
|
101
|
+
/** 命中时直接返回文件信息 */
|
|
102
|
+
file?: FcFileInfo;
|
|
103
|
+
}
|
|
104
|
+
/** 分片上传初始化结果(OPEN-5) */
|
|
105
|
+
export interface FcChunkInitResult {
|
|
106
|
+
uploadId: string;
|
|
107
|
+
/** 服务端建议的分片大小(字节) */
|
|
108
|
+
chunkSize?: number;
|
|
109
|
+
/** 已完成分片序号(断点续传时跳过) */
|
|
110
|
+
doneParts?: number[];
|
|
111
|
+
}
|
|
112
|
+
/** 删除文件结果(OPEN-10):存在业务引用时返回引用列表要求二次确认 */
|
|
113
|
+
export interface FcDeleteResult {
|
|
114
|
+
/** 是否已删除 */
|
|
115
|
+
deleted: boolean;
|
|
116
|
+
/** 需要二次确认时为 true */
|
|
117
|
+
needConfirm?: boolean;
|
|
118
|
+
/** 该文件的全部引用记录 */
|
|
119
|
+
references?: FcFileReference[];
|
|
120
|
+
}
|
|
121
|
+
/** 令牌获取函数:传入项目 AppKey,返回访问令牌。
|
|
122
|
+
* 默认实现走 OPEN-1(appKey 换令牌);业务方可通过组件 props 覆盖
|
|
123
|
+
* (如改为自己服务端用 AppKey + AppSecret 换令牌后下发) */
|
|
124
|
+
export type FcGetToken = (appKey: string) => Promise<string>;
|
|
125
|
+
/** 组件库通用配置(各组件的文件中心 props 即此结构) */
|
|
126
|
+
export interface FcConfig {
|
|
127
|
+
/** 项目 AppKey(必填,项目注册后获得的唯一标识) */
|
|
128
|
+
appKey: string;
|
|
129
|
+
/** 文件中心服务地址;不传则使用内置默认地址 https://upload.yydslgd.cn */
|
|
130
|
+
baseUrl?: string;
|
|
131
|
+
/** 自定义令牌获取方式 */
|
|
132
|
+
getToken?: FcGetToken;
|
|
133
|
+
/** 大文件分片阈值(字节),默认 10MB,超过走分片上传 */
|
|
134
|
+
chunkThreshold?: number;
|
|
135
|
+
/** 分片大小(字节),默认 5MB */
|
|
136
|
+
chunkSize?: number;
|
|
137
|
+
}
|
|
138
|
+
/** 上传进度回调参数 */
|
|
139
|
+
export interface FcUploadProgress {
|
|
140
|
+
/** 0-100 */
|
|
141
|
+
percent: number;
|
|
142
|
+
/** 当前阶段:计算 MD5 / 上传中 / 合并分片 */
|
|
143
|
+
stage?: 'md5' | 'uploading' | 'merging';
|
|
144
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { FcComponentConfigProps } from './context';
|
|
2
|
+
import type { FcBizInfo, FcFileInfo, FcUploadProgress } from './types';
|
|
3
|
+
import type { FcCompressOptions } from './utils/compress';
|
|
4
|
+
/** 上传参数 */
|
|
5
|
+
export interface FcUploadOptions extends FcComponentConfigProps {
|
|
6
|
+
/** 待上传文件 */
|
|
7
|
+
file: File;
|
|
8
|
+
/** 业务标签(存入文件元数据,便于筛选) */
|
|
9
|
+
bizType?: string;
|
|
10
|
+
/** 业务引用信息:上传成功后自动调 OPEN-12 登记,业务方无感 */
|
|
11
|
+
bizInfo?: FcBizInfo;
|
|
12
|
+
/** 图片上传前压缩配置,传 true 用默认配置;仅对图片生效 */
|
|
13
|
+
compress?: boolean | FcCompressOptions;
|
|
14
|
+
/** 大文件分片阈值(字节),默认 10MB;设为 Infinity 可禁用分片 */
|
|
15
|
+
chunkThreshold?: number;
|
|
16
|
+
/** 分片大小(字节),默认 5MB */
|
|
17
|
+
chunkSize?: number;
|
|
18
|
+
/** 是否启用秒传(同 MD5 文件已存在时直接登记归属),默认 true */
|
|
19
|
+
instant?: boolean;
|
|
20
|
+
/** 进度回调 */
|
|
21
|
+
onProgress?: (progress: FcUploadProgress) => void;
|
|
22
|
+
/** 取消信号 */
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 上传文件到文件中心(组件库上传能力总入口)
|
|
27
|
+
*
|
|
28
|
+
* 完整流程:
|
|
29
|
+
* 1. 图片按配置压缩(可选);
|
|
30
|
+
* 2. 分片读取计算 MD5(进度 0-10%);
|
|
31
|
+
* 3. 秒传校验:同 MD5 已存在则直接返回(OPEN-4);
|
|
32
|
+
* 4. 大文件走分片上传(OPEN-5),小文件走普通上传(OPEN-2),均自动重试;
|
|
33
|
+
* 5. 传入 bizInfo 时自动登记业务引用(OPEN-12),失败不影响上传结果。
|
|
34
|
+
*/
|
|
35
|
+
export declare function uploadFile(options: FcUploadOptions): Promise<FcFileInfo>;
|