element-ui上传图片组件封装

//上传图片组件 定义文件imageUpload
<template><div class="component-upload-image"><el-upload multiple :action="uploadImgUrl" list-type="picture-card" :on-success="handleUploadSuccess":before-upload="handleBeforeUpload" :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed"ref="imageUpload" :on-remove="handleDelete" :show-file-list="true" :headers="headers" :file-list="fileList":on-preview="handlePictureCardPreview" :class="{ hide: this.fileList.length >= this.limit }"><i class="el-icon-plus"></i></el-upload><!-- 上传提示 --><div class="el-upload__tip" slot="tip" v-if="showTip">请上传<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template><template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>的文件</div><el-dialog :visible.sync="dialogVisible" title="预览" width="800" append-to-body><img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" /></el-dialog></div>
</template><script>
import { getToken } from "@/utils/auth";
//接口api
import { serviceApi} from "@/utils/serviceApi";
export default {props: {value: [String, Object, Array],// 图片数量限制limit: {type: Number,default: 6,},// 大小限制(MB)fileSize: {type: Number,default: 5,},// 文件类型, 例如['png', 'jpg', 'jpeg']fileType: {type: Array,default: () => ["png", "jpg", "jpeg"],},// 是否显示提示isShowTip: {type: Boolean,default: true}},data () {return {number: 0,uploadList: [],dialogImageUrl: "",dialogVisible: false,hideUpload: false,baseUrl: serviceApi(),uploadImgUrl: serviceApi() + "/PicturesUpload", // 上传的图片服务器地址headers: {Authorization: "Bearer " + getToken(),},fileList: []};},watch: {value: {handler (val) {if (val) {// 首先将值转为数组const list = Array.isArray(val) ? val : this.value.split(',');// 然后将数组转为对象数组this.fileList = list.map(item => {if (typeof item === "string") {if (item.indexOf(this.baseUrl) === -1) {item = { name: this.baseUrl + item, url: this.baseUrl + item };} else {item = { name: item, url: item };}}return item;});} else {this.fileList = [];return [];}},deep: true,immediate: true}},computed: {// 是否显示提示showTip () {return this.isShowTip && (this.fileType || this.fileSize);},},methods: {// 上传前loading加载handleBeforeUpload (file) {let isImg = false;if (this.fileType.length) {let fileExtension = "";if (file.name.lastIndexOf(".") > -1) {fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);}isImg = this.fileType.some(type => {if (file.type.indexOf(type) > -1) return true;if (fileExtension && fileExtension.indexOf(type) > -1) return true;return false;});} else {isImg = file.type.indexOf("image") > -1;}if (!isImg) {this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);return false;}if (this.fileSize) {const isLt = file.size / 1024 / 1024 < this.fileSize;if (!isLt) {this.$modal.msgError(`上传头像图片大小不能超过 ${this.fileSize} MB!`);return false;}}this.$modal.loading("正在上传图片,请稍候...");this.number++;},// 文件个数超出handleExceed () {this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);},// 上传成功回调handleUploadSuccess (res, file) {console.log(res, 'res');if (res.code === 200) {this.uploadList.push({ name: res.fileName, url: res.imgUrl });this.uploadedSuccessfully();} else {this.number--;this.$modal.closeLoading();this.$modal.msgError(res.msg);this.$refs.imageUpload.handleRemove(file);this.uploadedSuccessfully();}},// 删除图片handleDelete (file) {const findex = this.fileList.map(f => f.name).indexOf(file.name);if (findex > -1) {this.fileList.splice(findex, 1);this.$emit("input", this.listToString(this.fileList));}},// 上传失败handleUploadError () {this.$modal.msgError("上传图片失败,请重试");this.$modal.closeLoading();},// 上传结束处理uploadedSuccessfully () {if (this.number > 0 && this.uploadList.length === this.number) {this.fileList = this.fileList.concat(this.uploadList);this.uploadList = [];this.number = 0;this.$emit("input", this.listToString(this.fileList));this.$modal.closeLoading();}},// 预览handlePictureCardPreview (file) {this.dialogImageUrl = file.url;this.dialogVisible = true;},// 对象转成指定字符串分隔listToString (list, separator) {let strs = "";separator = separator || ",";for (let i in list) {if (list[i].url) {strs += list[i].url.replace(this.baseUrl, "") + separator;}}return strs != '' ? strs.substr(0, strs.length - 1) : '';}}
};
</script>
<style scoped lang="scss">
// .el-upload--picture-card 控制加号部分
::v-deep.hide .el-upload--picture-card {display: none;
}// 去掉动画效果
::v-deep .el-list-enter-active,
::v-deep .el-list-leave-active {transition: all 0s;
}::v-deep .el-list-enter,
.el-list-leave-active {opacity: 0;transform: translateY(0);
}
</style>
//详情展示图片组件 定义文件 ImagePreview
<template><div><el-image v-for="(item, index) in realSrc" :key="index" :src="`${baseUrl}` + item" fit="cover":style="`width:${realWidth};height:${realHeight};`" :preview-src-list="realSrcList"><div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div></el-image></div>
</template><script>
import { isExternal } from "@/utils/validate";
import { serviceApi} from "@/utils/serviceApi";
export default {name: "ImagePreview",data () {return {baseUrl: serviceApi(),}},props: {src: {type: String,default: ""},width: {type: [Number, String],default: ""},height: {type: [Number, String],default: ""}},computed: {realSrc () {if (!this.src) {return;}let real_src = this.src.split(",");if (isExternal(real_src)) {return real_src;}return real_src;},realSrcList () {if (!this.src) {return;}let real_src_list = this.src.split(",");let srcList = [];real_src_list.forEach(item => {if (isExternal(item)) {return srcList.push(item);}return srcList.push(this.baseUrl + item);});return srcList;},realWidth () {return typeof this.width == "string" ? this.width : `${this.width}px`;},realHeight () {return typeof this.height == "string" ? this.height : `${this.height}px`;}},
};
</script><style lang="scss" scoped>
.el-image {border-radius: 5px;background-color: #ebeef5;box-shadow: 0 0 5px 1px #ccc;margin-left: 15px;margin-top: 6px;::v-deep .el-image__inner {transition: all 0.3s;cursor: pointer;&:hover {transform: scale(1.2);}}::v-deep .image-slot {display: flex;justify-content: center;align-items: center;width: 100%;height: 100%;color: #909399;font-size: 30px;}
}
</style>
//页面调用
<template>
<div class="file-mar">附件:</div>
//上传图片组件<imageUpload v-model="value" />//详情展示图片组件<imagePreview :src="detailImg" :width="120" :height="120" v-if="actionType == 'detail' || actionType == 'check'"></imagePreview>
</template>
//上传图片组件
import ImageUpload from "@/components/ImageUpload";
详情图片展示组件
import ImagePreview from "@/components/ImagePreview";
//组件注册
components: {ImageUpload,ImagePreview
},//定义接受字段value: '', //上传图片会以逗号拼接上传后台detailImg:'' //详情展示图片

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

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

相关文章

Mybatis | 逻辑 sql - 结果的映射默认有缓存

mybatis 里 select 方法默认会使用缓存&#xff0c;即&#xff0c;如果逻辑 sql 的入参不变&#xff0c;则会走缓存。 所以对于只有表名 tableName 变&#xff08;用于 sharding&#xff09;的情况下&#xff0c;需要修改 xml 文件&#xff1a;flushCache true&#xff0c;来…

分享一个Qt使用的模块间通信类

需求&#xff1a; 不同线程&#xff0c;或者同一线程的不同类之间通信&#xff0c;按照Qt的机制&#xff0c;定义一个信号&#xff0c;一个槽&#xff0c;然后绑定。以两个类A,B为例&#xff0c;A触发一个信号&#xff0c;B执行一个槽&#xff0c;在定义好信号和槽之后&#x…

【Java程序设计】【C00196】基于(JavaWeb+SSM)的旅游管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的旅游管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游平台 本系统分为前台、管理员2个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的…

C# 引用同一个dll不同版本的程序集

因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集&#xff0c;如果直接引入另一个版本的程序集的话会提示不成功&#xff0c;所以先将另一个…

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID&#xff1f; 日常开发中&#xff0c;我们需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

BetrFS: A Compleat File System for Commodity SSDs——论文阅读

EuroSys 2022 Paper 分布式元数据论文汇总 问题 在不同的工作负载下&#xff0c;没有单一的Linux文件系统在普通SSD上始终表现良好。我们将一个完备的文件系统定义为在各种微基准测试和应用程序中&#xff0c;没有一个工作负载的性能低于最佳文件系统性能的30%&#xff0c;并…

EasyX图形库学习(一)

目录 一、easyX图形库基本介绍 1、easyX的原理 2、easyX的安装 3、easyX的颜色&#xff08;RGB颜色模型&#xff09; 颜色模型相关函数: 4、easyX的坐标 二、相关函数介绍: 绘图设备相关函数&#xff1a; 图形颜色及样式设置相关函数: 图形绘制相关函数: 文字输出相关…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)

11.7.2 值语义与生命期 值语义的一个巨大好处是生命期管理很简单&#xff0c;就跟int一样——你不需要操心int的生命期。值语义的对象要么是stack object&#xff0c;要么直接作为其他object的成员&#xff0c;因此我们不用担心它的生命期&#xff08;一个函数使用自己stack上…

npm使用国内淘宝镜像

一、命令配置 1、设置淘宝镜像源 npm config set registry https://registry.npmmirror.com2、查看镜像使用状态 npm config get registry如果返回https://registry.npmmirror.com/,说明配置的是淘宝镜像。 如果返回https://registry.npmjs.org/,说明配置的是官网镜像。 二…

分享个前端工具-取色调色工具

这里虽然贴了两个&#xff0c;但推荐 Pipette. PipetteWin22.10.22.zip: https://download.csdn.net/download/rainyspring4540/88799632 图标&#xff1a; 界面&#xff1a; ColorPix https://download.csdn.net/download/rainyspring4540/88799642 图标&#xff1a; 界面…

开源协议介绍

开源协议是控制开源软件分发的法律声明&#xff0c;它使得软件能够被任何人自由使用、复制、修改和分发。下面是一些常见的开源协议&#xff1a; MIT 许可证&#xff1a;非常灵活的许可证&#xff0c;允许你做几乎任何事情&#xff0c;只要在副本中包含原始的版权和许可声明。…

Google Play上架:因行为透明度被拒审或下架的政策自查(基于区块链的内容)

近期很多朋友的项目出现因行为透明度问题被谷歌拒审或者已经上架的包被下架甚至封号,今天解释一下为什么会被封号下架,根据是什么? 目录 政策发布时间与截止时间政策内容政策背景政策解析和问题讲解政策发布时间与截止时间 基于区块链的内容相关政策,于2023-07-12 公布,…

看完这篇文章,你一定能看懂Datasheet!

大家好&#xff0c;我是砖一。 针对以上学妹的疑问&#xff0c;我有几点建议&#xff0c;大家可以听一下~ 一&#xff0c;怎么样查找Datasheet&#xff08;数据手册&#xff09; 大多数人下意识就点开浏览器&#xff0c;把型号往里面一输&#xff0c;不建议这样。 对于刚入行…

Fluent的小bug处理:后处理截面显示存在漏洞

最近发现的Fluent的bug&#xff0c;关于后处理截面显示不完整的问题。 1 现象 在使用六面体核心类型单元&#xff08;包括四面体-六面体核心和多面体-六面体核心&#xff09;进行网格划分的时候&#xff0c;可能会在截面上不能完整捕捉单元形状及其分布状态&#xff0c;导致做…

【计算机安全】相关整理

【安全】计算机安全相关整理 1.计算机安全是什么2.计算机安全研究与解决什么问题3.计算机安全构建在计算机的弱点之上4.不得不聊的密码学4.1 关键概念和基本技术&#xff1a;4.2 应用场景 5. 面向面经学习 归纳整理&#xff0c;便于回顾。 1.计算机安全是什么 计算机安全是指保…

linux使用iptables禁用ip

iptables是什么&#xff1f; iptables 是一个强大的开源软件&#xff0c;它是 Linux 系统内核中 netfilter 包过滤框架的一部分&#xff0c;用来实现防火墙功能。iptables 提供了一种灵活的方式来控制和管理进出以及通过 Linux 计算机的网络流量。 前提 我在云服务器上用doc…

【代码随想录】LC 1. 两数之和

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 1. 两数之和 2、题目描述 二、解题报告 1、思…

2024美赛E题保姆级分析完整思路代码数据教学

2024美国大学生数学建模竞赛E题保姆级分析完整思路代码数据教学 E题&#xff1a;Sustainability of Property Insurance&#xff08;财产保险的可持续性&#xff09; 这道题目同样是比赛的热门题目&#xff0c;是很多同学在训练的时候经常做的题目类型了&#xff0c;属于大数据…

Spring事务:保障钱不会丢

在MySQL中简单的了解过事务&#xff0c;简单说事务就是把一组操作封装成一个执行单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 在一次转账中&#xff0c;第一步A减去一百元&#xff0c;第二步B增加一百元。如果没有事务&#xff0c;第一步执行成功了&#xff0c;但…

网课:校门外的树——牛客(题解)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴0的位置&#xff0c;另一端在L的位置&a…