hookehuyr

feat(上传组件): 添加文件删除功能和显示文件名

- 在音视频上传组件中添加删除文件功能
- 显示上传文件的文件名
- 移除上传按钮的自定义模板,使用默认样式
- 添加分割线组件提升视觉分隔效果
- 更新文件上传后的处理逻辑以包含文件名
...@@ -38,6 +38,7 @@ declare module 'vue' { ...@@ -38,6 +38,7 @@ declare module 'vue' {
38 VanConfigProvider: typeof import('vant/es')['ConfigProvider'] 38 VanConfigProvider: typeof import('vant/es')['ConfigProvider']
39 VanDatePicker: typeof import('vant/es')['DatePicker'] 39 VanDatePicker: typeof import('vant/es')['DatePicker']
40 VanDialog: typeof import('vant/es')['Dialog'] 40 VanDialog: typeof import('vant/es')['Dialog']
41 + VanDivider: typeof import('vant/es')['Divider']
41 VanEmpty: typeof import('vant/es')['Empty'] 42 VanEmpty: typeof import('vant/es')['Empty']
42 VanField: typeof import('vant/es')['Field'] 43 VanField: typeof import('vant/es')['Field']
43 VanForm: typeof import('vant/es')['Form'] 44 VanForm: typeof import('vant/es')['Form']
......
1 <!-- 1 <!--
2 * @Date: 2025-06-03 09:41:41 2 * @Date: 2025-06-03 09:41:41
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-06-06 17:52:29 4 + * @LastEditTime: 2025-06-06 21:17:15
5 * @FilePath: /mlaj/src/views/checkin/upload/audio.vue 5 * @FilePath: /mlaj/src/views/checkin/upload/audio.vue
6 * @Description: 音视频文件上传组件 6 * @Description: 音视频文件上传组件
7 --> 7 -->
...@@ -20,15 +20,14 @@ ...@@ -20,15 +20,14 @@
20 accept="audio/*" 20 accept="audio/*"
21 result-type="file" 21 result-type="file"
22 upload-icon="plus" 22 upload-icon="plus"
23 + :deletable="false"
23 > 24 >
24 - <template #upload-text>
25 - <!-- :accept="route.query.type === 'video' ? 'video/*' : 'audio/*'" -->
26 - <div class="text-center">
27 - <van-icon name="plus" size="24" />
28 - <div class="mt-1 text-sm text-gray-600">上传文件</div>
29 - </div>
30 - </template>
31 </van-uploader> 25 </van-uploader>
26 + <van-row v-for="(item, index) in fileList" :key="index" class="mt-2 text-s text-gray-500">
27 + <van-col span="22">{{ item.name }}</van-col>
28 + <van-col span="2" @click="delItem(item)"><van-icon name="clear" /></van-col>
29 + </van-row>
30 + <van-divider />
32 <div class="mt-2 text-xs text-gray-500">最多上传{{ max_count }}个文件,每个不超过20M</div> 31 <div class="mt-2 text-xs text-gray-500">最多上传{{ max_count }}个文件,每个不超过20M</div>
33 <div class="mt-2 text-xs text-gray-500">上传类型:&nbsp;音频文件</div> 32 <div class="mt-2 text-xs text-gray-500">上传类型:&nbsp;音频文件</div>
34 </div> 33 </div>
...@@ -228,6 +227,7 @@ const afterRead = async (file) => { ...@@ -228,6 +227,7 @@ const afterRead = async (file) => {
228 item.message = '上传成功' 227 item.message = '上传成功'
229 item.url = result.url 228 item.url = result.url
230 item.meta_id = result.meta_id 229 item.meta_id = result.meta_id
230 + item.name = result.name
231 } else { 231 } else {
232 item.status = 'failed' 232 item.status = 'failed'
233 item.message = '上传失败' 233 item.message = '上传失败'
...@@ -244,6 +244,7 @@ const afterRead = async (file) => { ...@@ -244,6 +244,7 @@ const afterRead = async (file) => {
244 file.message = '上传成功' 244 file.message = '上传成功'
245 file.url = result.url 245 file.url = result.url
246 file.meta_id = result.meta_id 246 file.meta_id = result.meta_id
247 + file.name = result.name
247 } else { 248 } else {
248 file.status = 'failed' 249 file.status = 'failed'
249 file.message = '上传失败' 250 file.message = '上传失败'
...@@ -316,6 +317,7 @@ onMounted(async () => { ...@@ -316,6 +317,7 @@ onMounted(async () => {
316 const { code, data } = await getUploadTaskInfoAPI({ i: route.query.post_id }); 317 const { code, data } = await getUploadTaskInfoAPI({ i: route.query.post_id });
317 if (code) { 318 if (code) {
318 fileList.value = data.files.map(item => ({ 319 fileList.value = data.files.map(item => ({
320 + name: item.name,
319 url: item.value, 321 url: item.value,
320 status: 'done', 322 status: 'done',
321 message: '上传成功', 323 message: '上传成功',
...@@ -324,7 +326,14 @@ onMounted(async () => { ...@@ -324,7 +326,14 @@ onMounted(async () => {
324 message.value = data.note 326 message.value = data.note
325 } 327 }
326 } 328 }
327 -}) 329 +});
330 +
331 +const delItem = (item) => {
332 + const index = fileList.value.indexOf(item)
333 + if (index!== -1) {
334 + fileList.value.splice(index, 1)
335 + }
336 +}
328 </script> 337 </script>
329 338
330 <style lang="less" scoped> 339 <style lang="less" scoped>
...@@ -339,4 +348,16 @@ onMounted(async () => { ...@@ -339,4 +348,16 @@ onMounted(async () => {
339 justify-content: center; 348 justify-content: center;
340 height: 100%; 349 height: 100%;
341 } 350 }
351 +
352 +.preview-cover {
353 + position: absolute;
354 + bottom: 0;
355 + box-sizing: border-box;
356 + width: 100%;
357 + padding: 4px;
358 + color: #fff;
359 + font-size: 12px;
360 + text-align: center;
361 + background: rgba(0, 0, 0, 0.3);
362 + }
342 </style> 363 </style>
......
1 <!-- 1 <!--
2 * @Date: 2025-06-03 09:41:41 2 * @Date: 2025-06-03 09:41:41
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-06-06 17:54:23 4 + * @LastEditTime: 2025-06-06 21:20:43
5 * @FilePath: /mlaj/src/views/checkin/upload/video.vue 5 * @FilePath: /mlaj/src/views/checkin/upload/video.vue
6 * @Description: 音视频文件上传组件 6 * @Description: 音视频文件上传组件
7 --> 7 -->
...@@ -20,15 +20,14 @@ ...@@ -20,15 +20,14 @@
20 accept="video/*" 20 accept="video/*"
21 result-type="file" 21 result-type="file"
22 upload-icon="plus" 22 upload-icon="plus"
23 + :deletable="false"
23 > 24 >
24 - <template #upload-text>
25 - <!-- :accept="route.query.type === 'video' ? 'video/*' : 'audio/*'" -->
26 - <div class="text-center">
27 - <van-icon name="plus" size="24" />
28 - <div class="mt-1 text-sm text-gray-600">上传文件</div>
29 - </div>
30 - </template>
31 </van-uploader> 25 </van-uploader>
26 + <van-row v-for="(item, index) in fileList" :key="index" class="mt-2 text-s text-gray-500">
27 + <van-col span="22">{{ item.name }}</van-col>
28 + <van-col span="2" @click="delItem(item)"><van-icon name="clear" /></van-col>
29 + </van-row>
30 + <van-divider />
32 <div class="mt-2 text-xs text-gray-500">最多上传{{ max_count }}个文件,每个不超过20M</div> 31 <div class="mt-2 text-xs text-gray-500">最多上传{{ max_count }}个文件,每个不超过20M</div>
33 <div class="mt-2 text-xs text-gray-500">上传类型:&nbsp;视频文件</div> 32 <div class="mt-2 text-xs text-gray-500">上传类型:&nbsp;视频文件</div>
34 </div> 33 </div>
...@@ -228,6 +227,7 @@ const afterRead = async (file) => { ...@@ -228,6 +227,7 @@ const afterRead = async (file) => {
228 item.message = '上传成功' 227 item.message = '上传成功'
229 item.url = result.url 228 item.url = result.url
230 item.meta_id = result.meta_id 229 item.meta_id = result.meta_id
230 + item.name = result.name
231 } else { 231 } else {
232 item.status = 'failed' 232 item.status = 'failed'
233 item.message = '上传失败' 233 item.message = '上传失败'
...@@ -244,6 +244,7 @@ const afterRead = async (file) => { ...@@ -244,6 +244,7 @@ const afterRead = async (file) => {
244 file.message = '上传成功' 244 file.message = '上传成功'
245 file.url = result.url 245 file.url = result.url
246 file.meta_id = result.meta_id 246 file.meta_id = result.meta_id
247 + file.name = result.name
247 } else { 248 } else {
248 file.status = 'failed' 249 file.status = 'failed'
249 file.message = '上传失败' 250 file.message = '上传失败'
...@@ -320,11 +321,19 @@ onMounted(async () => { ...@@ -320,11 +321,19 @@ onMounted(async () => {
320 status: 'done', 321 status: 'done',
321 message: '上传成功', 322 message: '上传成功',
322 meta_id: item.meta_id, 323 meta_id: item.meta_id,
324 + name: item.name,
323 })) 325 }))
324 message.value = data.note 326 message.value = data.note
325 } 327 }
326 } 328 }
327 -}) 329 +});
330 +
331 +const delItem = (item) => {
332 + const index = fileList.value.indexOf(item)
333 + if (index!== -1) {
334 + fileList.value.splice(index, 1)
335 + }
336 +}
328 </script> 337 </script>
329 338
330 <style lang="less" scoped> 339 <style lang="less" scoped>
......