Skip to content

Commit 7a0d5a4

Browse files
authored
Merge branch 'youlaitech:master' into master
2 parents fcc53ce + c51bf13 commit 7a0d5a4

File tree

2 files changed

+145
-27
lines changed

2 files changed

+145
-27
lines changed

src/components/Upload/MultiUpload.vue src/components/Upload/ImageUpload.vue

+91-15
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,43 @@
33
<el-upload
44
v-model:file-list="fileList"
55
list-type="picture-card"
6+
:class="
7+
fileList.length >= props.limit || !props.showUploadBtn ? 'hide' : 'show'
8+
"
69
:before-upload="handleBeforeUpload"
710
:http-request="handleUpload"
811
:on-remove="handleRemove"
9-
:on-preview="previewImg"
12+
:accept="props.accept"
1013
:limit="props.limit"
1114
>
1215
<i-ep-plus />
16+
<template #file="{ file }">
17+
<div>
18+
<img class="el-upload-list__item-thumbnail" :src="file.url" alt="" />
19+
<span class="el-upload-list__item-actions">
20+
<span class="el-upload-list__item-preview" @click="previewImg(file)">
21+
<el-icon><zoom-in /></el-icon>
22+
</span>
23+
<span
24+
v-if="props.showDelBtn"
25+
class="el-upload-list__item-delete"
26+
@click="handleRemove(file)"
27+
>
28+
<el-icon><Delete /></el-icon>
29+
</span>
30+
</span>
31+
</div>
32+
</template>
1333
</el-upload>
1434

15-
<el-dialog v-model="dialogVisible">
16-
<img w-full :src="previewImgUrl" alt="Preview Image" />
17-
</el-dialog>
35+
<el-image-viewer
36+
v-if="viewVisible"
37+
:zoom-rate="1.2"
38+
@close="closePreview"
39+
:initialIndex="initialIndex"
40+
:url-list="viewFileList"
41+
/>
1842
</template>
19-
2043
<script setup lang="ts">
2144
import {
2245
UploadRawFile,
@@ -44,12 +67,42 @@ const props = defineProps({
4467
type: Number,
4568
default: 10,
4669
},
70+
/**
71+
* 是否显示删除按钮
72+
*/
73+
showDelBtn: {
74+
type: Boolean,
75+
default: true,
76+
},
77+
/**
78+
* 是否显示上传按钮
79+
*/
80+
showUploadBtn: {
81+
type: Boolean,
82+
default: true,
83+
},
84+
/**
85+
* 单张图片最大大小
86+
*/
87+
uploadMaxSize: {
88+
type: Number,
89+
default: 2 * 1024 * 1024,
90+
},
91+
/**
92+
* 上传文件类型
93+
*/
94+
accept: {
95+
type: String,
96+
default: "image/*",
97+
},
4798
});
4899

49-
const previewImgUrl = ref("");
50-
const dialogVisible = ref(false);
100+
const viewVisible = ref(false);
101+
const initialIndex = ref(0);
51102

52103
const fileList = ref([] as UploadUserFile[]);
104+
const viewFileList = ref([] as string[]);
105+
53106
watch(
54107
() => props.modelValue,
55108
(newVal: string[]) => {
@@ -79,7 +132,7 @@ watch(
79132
/**
80133
* 自定义图片上传
81134
*
82-
* @param params
135+
* @param options
83136
*/
84137
async function handleUpload(options: UploadRequestOptions): Promise<any> {
85138
// 上传API调用
@@ -89,12 +142,10 @@ async function handleUpload(options: UploadRequestOptions): Promise<any> {
89142
const fileIndex = fileList.value.findIndex(
90143
(file) => file.uid == (options.file as any).uid
91144
);
92-
93145
fileList.value.splice(fileIndex, 1, {
94146
name: data.name,
95147
url: data.url,
96148
} as UploadUserFile);
97-
98149
emit(
99150
"update:modelValue",
100151
fileList.value.map((file) => file.url)
@@ -122,8 +173,10 @@ function handleRemove(removeFile: UploadFile) {
122173
* 限制用户上传文件的格式和大小
123174
*/
124175
function handleBeforeUpload(file: UploadRawFile) {
125-
if (file.size > 2 * 1048 * 1048) {
126-
ElMessage.warning("上传图片不能大于2M");
176+
if (file.size > props.uploadMaxSize) {
177+
ElMessage.warning(
178+
"上传图片不能大于" + props.uploadMaxSize / 1024 / 1024 + "M"
179+
);
127180
return false;
128181
}
129182
return true;
@@ -132,8 +185,31 @@ function handleBeforeUpload(file: UploadRawFile) {
132185
/**
133186
* 预览图片
134187
*/
135-
const previewImg: UploadProps["onPreview"] = (uploadFile) => {
136-
previewImgUrl.value = uploadFile.url!;
137-
dialogVisible.value = true;
188+
const previewImg: UploadProps["onPreview"] = (uploadFile: UploadFile) => {
189+
viewFileList.value = fileList.value.map((file) => file.url!);
190+
initialIndex.value = fileList.value.findIndex(
191+
(file) => file.url === uploadFile.url
192+
);
193+
viewVisible.value = true;
194+
};
195+
196+
/**
197+
* 关闭预览
198+
*/
199+
const closePreview = () => {
200+
viewVisible.value = false;
138201
};
139202
</script>
203+
<style lang="scss" scoped>
204+
.hide {
205+
:deep(.el-upload--picture-card) {
206+
display: none;
207+
}
208+
}
209+
210+
.show {
211+
:deep(.el-upload--picture-card) {
212+
display: flex;
213+
}
214+
}
215+
</style>

src/views/demo/upload.vue

+54-12
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,53 @@
11
<!-- 文件上传组件(单图+多图)示例 -->
22
<script setup lang="ts">
3-
import SingleUpload from "@/components/Upload/SingleUpload.vue";
4-
import MultiUpload from "@/components/Upload/MultiUpload.vue";
5-
6-
const singlePicUrl = ref(
7-
"https://oss.youlai.tech/youlai-boot/2023/05/20/2b6d8b49fa1047348a0a41cef5aaf69e.gif"
8-
);
3+
import ImageUpload from "@/components/Upload/ImageUpload.vue";
4+
const size = ref("");
95
// 这里放外链图片,防止被删
10-
const multiPicUrls = ref([
6+
const picUrls = ref([
117
"https://s2.loli.net/2023/05/24/yNsxFC8rLHMZQcK.jpg",
128
"https://s2.loli.net/2023/05/24/RuHFMwW4rG5lIqs.jpg",
139
"https://s2.loli.net/2023/05/24/ZPiGbcpR91WqInB.jpg",
1410
"https://s2.loli.net/2023/05/24/e1bcnEq3MFdmlNL.jpg",
1511
"https://s2.loli.net/2023/05/24/wZTSPj1yDQNcuhU.jpg",
1612
]);
13+
const tableData = [
14+
{
15+
argsName: "v-model",
16+
type: "Arrays",
17+
default: "[]",
18+
desc: "已经上传的图片数组",
19+
},
20+
{
21+
argsName: "limit",
22+
type: "Number",
23+
default: 10,
24+
desc: "上传最大的图片数量",
25+
},
26+
{
27+
argsName: "showDelBtn",
28+
type: "Boolean",
29+
default: true,
30+
desc: "是否显示删除按钮",
31+
},
32+
{
33+
argsName: "showUploadBtn",
34+
type: "Boolean",
35+
default: true,
36+
desc: "是否显示上传按钮",
37+
},
38+
{
39+
argsName: "accept",
40+
type: "String",
41+
default: "image/*",
42+
desc: "上传文件类型",
43+
},
44+
{
45+
argsName: "uploadMaxSize",
46+
type: "Number",
47+
default: "2 * 1024 * 1024",
48+
desc: "单个图片上传大小限制(单位byte)",
49+
},
50+
];
1751
</script>
1852
<template>
1953
<div class="app-container">
@@ -22,15 +56,23 @@ const multiPicUrls = ref([
2256
type="primary"
2357
target="_blank"
2458
class="mb-10"
25-
>示例源码 请点击>>>></el-link
2659
>
60+
示例源码 请点击>>>>
61+
</el-link>
2762

2863
<el-form>
29-
<el-form-item label="单图上传">
30-
<single-upload v-model="singlePicUrl" />
64+
<el-form-item label="图片上传">
65+
<image-upload v-model="picUrls" />
3166
</el-form-item>
32-
<el-form-item label="多图上传">
33-
<multi-upload v-model="multiPicUrls" />
67+
</el-form>
68+
<el-form>
69+
<el-form-item label="参数说明">
70+
<el-table :data="tableData" border>
71+
<el-table-column prop="argsName" label="参数名称" width="300" />
72+
<el-table-column prop="type" label="参数类型" width="200" />
73+
<el-table-column prop="default" label="默认值" width="200" />
74+
<el-table-column prop="desc" label="描述" width="300" />
75+
</el-table>
3476
</el-form-item>
3577
</el-form>
3678
</div>

0 commit comments

Comments
 (0)