Skip to content

Commit 5563c22

Browse files
committed
feat: add examples: form-upload
1 parent bf7496f commit 5563c22

File tree

6 files changed

+89
-3
lines changed

6 files changed

+89
-3
lines changed

apps/backend-mock/api/upload.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { verifyAccessToken } from '~/utils/jwt-utils';
2+
import { unAuthorizedResponse } from '~/utils/response';
3+
4+
export default eventHandler((event) => {
5+
const userinfo = verifyAccessToken(event);
6+
if (!userinfo) {
7+
return unAuthorizedResponse(event);
8+
}
9+
return useResponseSuccess({
10+
url: 'https://unpkg.com/@vbenjs/[email protected]/source/logo-v1.webp',
11+
});
12+
// return useResponseError("test")
13+
});

apps/backend-mock/routes/[...].ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export default defineEventHandler(() => {
77
<li><a href="/api/menu">/api/menu/all</a></li>
88
<li><a href="/api/auth/codes">/api/auth/codes</a></li>
99
<li><a href="/api/auth/login">/api/auth/login</a></li>
10+
<li><a href="/api/upload">/api/upload</a></li>
1011
</ul>
1112
`;
1213
});

playground/src/api/examples/upload.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { requestClient } from '#/api/request';
2+
3+
interface UploadFileParams {
4+
file: File;
5+
onError?: (error: Error) => void;
6+
onProgress?: (progress: { percent: number }) => void;
7+
onSuccess?: (data: any, file: File) => void;
8+
}
9+
export async function upload_file({
10+
file,
11+
onError,
12+
onProgress,
13+
onSuccess,
14+
}: UploadFileParams) {
15+
try {
16+
onProgress?.({ percent: 0 });
17+
18+
const data = await requestClient.upload('/upload', { file });
19+
20+
onProgress?.({ percent: 100 });
21+
onSuccess?.(data, file);
22+
} catch (error) {
23+
onError?.(error instanceof Error ? error : new Error(String(error)));
24+
}
25+
}

playground/src/locales/langs/en-US/examples.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
"dynamic": "Dynamic Form",
1919
"custom": "Custom Component",
2020
"api": "Api",
21-
"merge": "Merge Form"
21+
"merge": "Merge Form",
22+
"upload-error": "Partial file upload failed",
23+
"upload-urls": "Urls after file upload"
2224
},
2325
"vxeTable": {
2426
"title": "Vxe Table",

playground/src/locales/langs/zh-CN/examples.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
"dynamic": "动态表单",
2222
"custom": "自定义组件",
2323
"api": "Api",
24-
"merge": "合并表单"
24+
"merge": "合并表单",
25+
"upload-error": "部分文件上传失败",
26+
"upload-urls": "文件上传后的网址"
2527
},
2628
"vxeTable": {
2729
"title": "Vxe 表格",

playground/src/views/examples/form/basic.vue

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts" setup>
2-
import { h, ref } from 'vue';
2+
import type { UploadFile } from 'ant-design-vue';
3+
4+
import { h, ref, toRaw } from 'vue';
35
46
import { Page } from '@vben/common-ui';
57
@@ -9,6 +11,8 @@ import dayjs from 'dayjs';
911
1012
import { useVbenForm, z } from '#/adapter/form';
1113
import { getAllMenusApi } from '#/api';
14+
import { upload_file } from '#/api/examples/upload';
15+
import { $t } from '#/locales';
1216
1317
import DocButton from '../doc-button.vue';
1418
@@ -326,12 +330,51 @@ const [BaseForm, baseFormApi] = useVbenForm({
326330
fieldName: 'treeSelect',
327331
label: '树选择',
328332
},
333+
{
334+
component: 'Upload',
335+
componentProps: {
336+
accept: '.png,.jpg,jpeg',
337+
customRequest: upload_file,
338+
disabled: false,
339+
maxCount: 1,
340+
multiple: false,
341+
showUploadList: true,
342+
},
343+
fieldName: 'files',
344+
label: '文件',
345+
renderComponentContent: () => {
346+
return {
347+
default: () => '点击上传图片',
348+
};
349+
},
350+
rules: 'required',
351+
},
329352
],
330353
// 大屏一行显示3个,中屏一行显示2个,小屏一行显示1个
331354
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
332355
});
333356
334357
function onSubmit(values: Record<string, any>) {
358+
const files = toRaw(values.files) as UploadFile[];
359+
const doneFiles = files.filter((file) => file.status === 'done');
360+
const failedFiles = files.filter((file) => file.status !== 'done');
361+
362+
const msg = [
363+
...doneFiles.map((file) => file.response.url),
364+
...failedFiles.map((file) => file.name),
365+
].join(', ');
366+
367+
if (failedFiles.length === 0) {
368+
message.success({
369+
content: `${$t('examples.form.upload-urls')}: ${msg}`,
370+
});
371+
} else {
372+
message.error({
373+
content: `${$t('examples.form.upload-error')}: ${msg}`,
374+
});
375+
return;
376+
}
377+
335378
message.success({
336379
content: `form values: ${JSON.stringify(values)}`,
337380
});

0 commit comments

Comments
 (0)