Vue 92 ,Element 15 ,Vue + el-upload 实现图片上传与管理

目录

前言
一. 文章背景
二. 项目结构
三. 核心代码解析
1. 页面结构
2. 属性介绍
3. 必要参数
4. 函数逻辑
四. 相关样式布局
五. 关键功能解释
六. 注意事项
七. 本文总结

前言

在这篇博客中,我们将深入探讨如何使用 Vue 和 el-upload 构建一个图片上传与管理功能。我们将创建一个上传图片、预览图片、下载图片和删除图片的完整功能,并通过一系列的 Vue 组件和方法来实现这些功能。在此过程中,我们还将处理文件上传的限制与管理,并实现界面的过渡动画效果。

一. 文章背景

本文旨在为用户提供一个图片上传识别的前端界面,允许用户上传图片,并进行智能识别。为提升用户体验,我们实现了图片的上传、预览、下载和删除功能,并根据不同操作展示不同的 UI 界面效果。


二. 项目结构

我们将页面结构分为以下几个部分:

  1. 页面标题:显示“智能 识别”。
  2. 左侧内容区域:主要包含图片上传区域,当没有准备上传的图片时,显示默认图片。
  3. 右侧内容区域:用于显示智能识别的结果(如待填充区域)。
  4. 图片预览:提供预览上传的图片功能。
  5. 文件上传与管理:通过 Element UI 的上传组件来处理文件上传,支持文件删除、预览和下载。


三. 核心代码解析

1. 页面结构
<template><div class="homeIndex_test"><!-- 页面标题 --><header class="homeIndex_test_header">XX识别</header><!-- 主内容区域 --><div class="test_Con"><!-- 左侧内容区域,带有过渡动画 --><transition name="slide_left"><article class="testCon_left"><!-- 图片展示区域,当没有准备上传图片时显示默认图片 --><div class="default_imgBox" v-if="!isUploadReady"><div class="img_box"><img src="@/assets/test1/photo1.png" alt="" /></div></div><!-- 上传组件 --><el-upload class="upload_box" :action="uploadImg_url" :headers="headers" :auto-upload="true" name="files"multiple :limit="limitNum" list-type="picture-card" v-model:file-list="fileList":on-change="handleChange"><div class="aperate_btnBox"><!-- 上传按钮 --><el-button class="upload_btn" slot="trigger" size="small" type="primary":disabled="this.upBtnDisable">上传图片<i class="el-icon-upload el-icon--right"></i></el-button><!-- 开始识别按钮,当图片上传准备好时显示 --><el-button v-if="isUploadReady" class="begin_btn" size="small" type="primary"@click.stop="choseBeginSb">开始识别<i class="el-icon-refresh-left"></i></el-button></div><!-- 上传文件的操作项 --><div slot="file" slot-scope="{ file }"><img class="el-upload-list__item-thumbnail" :src="file.url" alt="" /><span class="el-upload-list__item-actions"><!-- 预览图片操作 --><span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"><i class="el-icon-zoom-in"></i></span><!-- 下载图片操作 --><span class="el-upload-list__item-download" @click="handleDownload(file)"><i class="el-icon-download"></i></span><!-- 删除图片操作 --><span class="el-upload-list__item-delete" @click="handleRemove(file)"><i class="el-icon-delete"></i></span></span></div></el-upload><!-- 图片预览对话框 --><el-dialog :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt="" /></el-dialog></article></transition><!-- 右侧内容区域,带有过渡动画 --><transition name="slide_right"><section v-if="showRightSection" class="testCon_right"><!-- 识别结果区域 --></section></transition></div></div>
</template>
2. 属性介绍
  :action="uploadImg_url"          <!-- 必填:上传的服务器地址 -->:headers="headers"               <!-- 可选:设置上传请求头部信息 -->:auto-upload="true"              <!-- 必填:选择文件后是否自动上传 -->name="files"                     <!-- 必填:上传接口接收文件参数的名字 -->multiple                        <!-- 可选:允许一次选择多个文件 -->:limit="limitNum"                <!-- 可选:限制最大上传文件数量 -->list-type="picture-card"        <!-- 可选:文件列表展示类型,此处为图片卡片模式 -->v-model:file-list="fileList"    <!-- 必填:双向绑定文件列表到数据属性,跟踪已选文件 -->:on-change="handleChange"        <!-- 可选:当文件状态改变时触发的方法 -->
3. 必要参数
    // 组件参数// 上传图片的目标URLuploadImg_url: process.env.VUE_APP_BASE_API + "/test/uploads",// 自定义上传请求的头部信息,通常用于传递认证令牌等。headers: {Authorization: 'Bearer your-token-here'},// 双向绑定的文件列表,用于存储用户选择的文件信息。fileList: [],// 文件上传的最大数量限制。limitNum: 3 // 示例:限制最多上传3个文件// 其它参数dialogImageUrl: '',        // 对话框中显示的图片 URLdialogVisible: false,      // 控制图片预览对话框的显示状态upBtnDisable: false,      // 控制上传按钮是否禁用isUploadReady: false,     // 控制“开始识别”按钮的显示状态showRightSection: false,  // 控制右侧部分的显示状态
4. 函数逻辑
// 开始识别操作choseBeginSb() {this.showRightSection = true;  // 显示右侧识别结果区域},// 上传文件变化处理函数,选择图片后触发handleChange(file, fileList) {this.fileList = fileList;this.isUploadReady = fileList.length > 0;// 限制上传文件的数量为3张if (fileList.length >= 3) {this.upBtnDisable = true;this.$message({message: '您已达到最大上传数量, 3张图片, 请删除后重新上传',type: 'warning',offset: 400,showClose: true,  // 是否显示关闭按钮});} else {this.upBtnDisable = false;}},// 图片预览函数handlePictureCardPreview(file) {this.dialogImageUrl = file.url;this.dialogVisible = true;},// 下载图片函数handleDownload(file) {const link = document.createElement('a');link.href = file.url;link.download = file.name;document.body.appendChild(link);link.click();document.body.removeChild(link);},// 删除图片函数handleRemove(file) {const index = this.fileList.findIndex(f => f.uid === file.uid);if (index !== -1) {this.fileList.splice(index, 1);}this.isUploadReady = this.fileList.length > 0;if (this.fileList.length < 3) {this.upBtnDisable = false;}},


四. 相关样式布局

// CSS
::v-deep .testCon_right {background-image:linear-gradient(90deg,rgba(255, 255, 255, 0.5),rgba(192, 192, 192, 0.479),rgba(255, 255, 255, 0.5));background-size: 40px 100%;background-repeat: no-repeat;background-position: left -40px top 0;animation: shine .8s ease infinite;
}
// 定义动画
@keyframes shine {to {background-position: right -40px top 0;}
}.el-upload-list__item-thumbnail {position: relative;/* 确保操作图标定位相对于图片 */
}
.el-upload-list__item-actions {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);/* 图标居中 */z-index: 10;opacity: 0;transition: opacity 0.3s ease;
}
.el-upload-list__item-thumbnail:hover .el-upload-list__item-actions {opacity: 1;/* 鼠标悬停时显示操作图标 */
}
.el-upload-list__item-preview,
.el-upload-list__item-download,
.el-upload-list__item-delete {margin: 0 5px;cursor: pointer;
}
.el-upload-list__item-preview i,
.el-upload-list__item-download i,
.el-upload-list__item-delete i {font-size: 16px;/* 设置图标大小 */
}
.el-upload-list__item-delete i {color: #f56c6c;/* 删除图标颜色 */
}
.el-upload-list__item-preview i {color: #409eff;/* 放大图标颜色 */
}.el-upload-list__item-download i {color: #67c23a;/* 下载图标颜色 */
}
// 隐藏上传按钮的边框
::v-deep .el-upload--picture-card {border: none;width: 100%;height: 100px;.aperate_btnBox {width: 100%;height: 100%;display: flex;justify-content: space-evenly;align-items: center;}button {height: 40px;}i {// height: auto;font-size: 20px;}
}
// 上传图片的布局
::v-deep .el-upload-list {width: 100%;display: flex;flex-direction: column;justify-content: flex-start;align-items: center;&>li {width: 220px;height: 220px;}
}// 主页面布局
.homeIndex_test {width: 100%;height: calc(100vh - 84px);// border: 1px solid red;.homeIndex_test_header {width: 100%;height: 60px;font-size: 22px;font-weight: bolder;// font-family: "楷体";display: flex;justify-content: center;align-items: center;border-bottom: 1px solid #46a6ff;}.test_Con {width: 100%;height: calc(100% - 60px);box-sizing: border-box;padding: 15px;// border: 1px solid red;display: flex;justify-content: space-evenly;align-items: center;overflow: auto;.testCon_left {width: 49%;height: 100%;// box-shadow: 0px 0px 6px red;border-radius: 6px;.default_imgBox {display: flex;justify-content: center;align-items: center;.img_box {width: 150px;height: 150px;border-radius: 50%;background-color: #409eff;display: flex;justify-content: center;align-items: center;img {width: 100px;height: 100px;}}}.upload_box {width: 100%;height: 100%;display: flex;flex-direction: column;justify-content: flex-start;align-items: center;.upload_btn {.el-icon-upload:before {color: white;font-size: 16px;}}.begin_btn {.el-icon-refresh-left:before {color: white;font-size: 16px;}}}}.testCon_right {width: 49%;height: 100%;// border: 1px solid red;border-radius: 6px;position: relative;.parse_test {width: 100%;height: 100%;position: absolute;left: 0;top: 0;font-size: 22px;display: flex;justify-content: center;align-items: center;font-family: "楷体";}.parse_btn {position: absolute;right: 2%;bottom: 2%;}}}}


五. 关键功能解释

  1. 文件上传: 使用 Element UI 提供的 el-upload 组件处理图片的上传。v-model:file-list="fileList" 用于双向绑定文件列表,当文件上传时,我们通过 handleChange 方法进行处理,检查上传的文件数量限制(最多上传三张图片)。

  2. 上传按钮禁用: 当上传的图片数量超过 3 张时,上传按钮被禁用,并通过 this.upBtnDisable = true; 显示警告信息。用户需要删除一些图片才能继续上传。

  3. 图片预览: 用户可以点击上传列表中的预览按钮查看图片详情,图片将通过 el-dialog 显示在弹窗中。

  4. 图片下载和删除: 用户可以点击删除按钮移除文件,删除时会更新文件列表,并且控制上传按钮是否禁用。

  5. 过渡动画: 使用 Vue 的 transition 标签为左右两个区域的切换添加动画效果,使页面更具交互性。


六. 注意事项

  • 文件上传数量限制:在实际应用中,我们可能需要根据实际需求调整上传文件的数量限制,例如支持多文件上传或限制文件大小。
  • 性能优化:由于我们使用的是图片上传功能,因此需要处理大文件的上传,建议进行文件压缩或在服务器端进行文件大小校验。
  • UI 交互:确保用户在上传图片时能够清晰地了解上传状态和错误信息,可以在合适的地方添加进度条或提示框。


七. 本文总结

本文介绍了如何使用 Vue 和 Element UI 实现一个图片上传与管理功能。通过本教程,您应该能够掌握如何使用 el-upload 组件实现文件上传、删除、预览、下载等基本功能,并且结合 Vue 的过渡动画增强用户体验。


八. 更多操作

早期关于上传的博客,请看

Vue 58
文件上传icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_65793170/article/details/132627341?ops_request_misc=%257B%2522request%255Fid%2522%253A%25223af974ce6f04f9315291ea871855f43b%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=3af974ce6f04f9315291ea871855f43b&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-132627341-null-null.nonecase&utm_term=%E4%B8%8A%E4%BC%A0&spm=1018.2226.3001.4450Vue 59

图片上传icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_65793170/article/details/133745982?ops_request_misc=%257B%2522request%255Fid%2522%253A%25223af974ce6f04f9315291ea871855f43b%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=3af974ce6f04f9315291ea871855f43b&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-133745982-null-null.nonecase&utm_term=%E4%B8%8A%E4%BC%A0&spm=1018.2226.3001.4450

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494689.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安宝特应用 | 美国OSHA扩展Vuzix AR眼镜应用,强化劳动安全与效率

随着工业技术的进步&#xff0c;如何在保障员工安全的同时提高生产效率成为现代企业面临的重要挑战。 美国劳工部职业安全与健康管理局&#xff08;OSHA&#xff09;于2024年12月2日宣布对Vuzix M400智能眼镜进行扩大部署&#xff0c;代表AR技术正为工业环境下的劳动保护开辟了…

linux socket编程之udp_dict_serve服务端--引入配置文件

注意&#xff1a;本篇博客只是对上一篇博客功能的增加 1.创建配置文件(翻译) Dict.txt apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 happy: 快乐的 sad: 悲伤的 run: 跑 jump: 跳 teacher: 老师 student: 学生 car: 汽车 bus: 公交车 love: 爱 hate: 恨 hell…

HTML基础学习(1)

目录 第一章、基础知识介绍1.1&#xff09;基础知识介绍1.1.1&#xff09;计算机介绍&#xff1a;硬件和软件1.1.2&#xff09;架构介绍1.1.3&#xff09;网站介绍 1.2&#xff09;HTML基础介绍1.2.1&#xff09;HTML创建网页文件与标签1.2.2&#xff09;标签1.2.3&#xff09;…

Android修行手册 - 移动端几种常用动画方案对比

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

MySQL 数据库优化详解【Java数据库调优】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

初学stm32 --- NVIC中断

目录 STM32 NVIC 中断优先级管理 NVIC_Type: ISER[8]&#xff1a; ICER[8]&#xff1a; ISPR[8]&#xff1a; ICPR[8]&#xff1a; IABR[8]&#xff1a; IP[240]&#xff1a; STM32 的中断分组&#xff1a; 中断优先级分组函数 NVIC_PriorityGroupConfig 中断初始化函…

掌握命令行参数的艺术:Python的`argparse`库

文章目录 掌握命令行参数的艺术&#xff1a;Python的argparse库背景argparse库简介标准库中的重要性简单库函数使用方法场景应用常见Bug及解决方案总结 掌握命令行参数的艺术&#xff1a;Python的argparse库 背景 在Python编程中&#xff0c;我们经常需要从命令行接收参数来控…

如何根据一系列提交文件,匹配对应的git提交记录?用ai

显示提取提交文件记录的git历史&#xff08;用的豆包写一下&#xff09; 显示每次提交涉及的文件名及提交注释等基本信息 可以使用以下命令格式&#xff1a; git log --name-only --prettyformat:“%an - %s” myFolder/ –name-only选项的作用是在显示提交信息时&#xff0…

Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)

1、概述 在使用Redis作为MySQL的缓存层时&#xff0c;缓存一致性问题是指Redis中的缓存数据与MySQL数据库中的实际数据不一致的情况。这可能会导致读取到过期或错误的数据&#xff0c;从而影响系统的正确性和用户体验。 为了减轻数据库的压力&#xff0c;通常读操作都是先读缓…

探寻快速排序的局限性及其优化策略

一. 快速排序之局限 快速排序的平均时间复杂度为O(nlogn)。其核心步骤是&#xff1a;先从待排序数组中选定一个元素作为基准&#xff08;pivot&#xff09;&#xff0c;通过一趟排序将数组分成两部分&#xff0c;使得左边部分的元素都小于等于基准元素&#xff0c;右边部分的元…

CS!GO

CS&#xff08;computer science&#xff09;计算机科学&#xff0c;说实话&#xff0c;不是找工作面试&#xff0c;这些题谁会背啊&#xff0c;反正我不行&#xff0c;一问三不知。 咱也不管这些&#xff0c;这个系列&#xff0c;可能会时不时的给出一些计网和操作系统相关的东…

python 内存管理

Python中的内存管理涉及包含所有Python对象和数据结构的私有堆。Python内存管理器在内部确保对此私有堆的管理。需要注意的是&#xff0c;Python堆的管理是由解释器本身执行的&#xff0c;并且用户无法控制它。从源码来看&#xff0c;分为以下几层&#xff1a; level 3&#xf…

Matlab个性化绘图第6期—带标记面的三维折线图

带标记面的三维折线图本质上就是多组折线图&#xff1a; Matlab论文插图绘制模板第92期—折线图&#xff08;Plot&#xff09; 或者三维折线图&#xff1a; Matlab论文插图绘制模板第37期—三维折线图(plot3) 不同之处在于带标记面的三维折线图把每一组数据单独放在一个三维平…

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…

【C++语言】多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某种行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 我们可以举一个例子&#xff1a; 比如买票这种行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

GitCode 光引计划投稿|MilvusPlus:开启向量数据库新篇章

在人工智能和大数据时代&#xff0c;向量数据库作为处理非结构化数据的核心技术&#xff0c;正变得越来越重要。MilvusPlus&#xff0c;作为「光引计划」的一部分&#xff0c;应运而生&#xff0c;旨在提供一个高性能、易扩展、全功能的向量数据库解决方案。项目背景根植于对现…

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…

Gin-vue-admin(1):环境配置和安装

目录 环境配置如果443网络连接问题&#xff0c;需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令&#xff0c;用于维护 go.mod 文件…

浅谈算法交易

本文想基于我的简单理解说说什么是算法交易&#xff0c;或者说是量化交易。 原文地址请访问&#xff1a;浅谈算法交易 什么是算法交易&#xff1f; 刚开始接触算法交易的时候&#xff0c;对它的理解&#xff0c;它就是把我平时的交易规则搬进计算机里自动执行。这个理解也没…

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …