feat(上传组件): 添加文件删除功能和显示文件名
- 在音视频上传组件中添加删除文件功能 - 显示上传文件的文件名 - 移除上传按钮的自定义模板,使用默认样式 - 添加分割线组件提升视觉分隔效果 - 更新文件上传后的处理逻辑以包含文件名
Showing
3 changed files
with
49 additions
and
18 deletions
| ... | @@ -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">上传类型: 音频文件</div> | 32 | <div class="mt-2 text-xs text-gray-500">上传类型: 音频文件</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">上传类型: 视频文件</div> | 32 | <div class="mt-2 text-xs text-gray-500">上传类型: 视频文件</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> | ... | ... |
-
Please register or login to post a comment