Upload上传图片,回显图片,编辑图片,限制图片,不显示上传图标,图片放大功能

news2024/11/18 7:39:15

效果图:

新增、编辑时:限制上传四张,当超过四张隐藏上传图标

图片放大 :效果图

详情:回显时不显示上传图标

页面:template 部分

图片在前端存储,提交时一并给后端

:file-list="repairPlanfiles",repairPlanfiles用来存储图片

                <el-upload
                  :class="'uploadStay' + index"
                  :disabled="disabled"
                  :file-list="repairPlanfiles[index]"
                  style="margin-top: 6px"
                  accept=".jpg, .png, .jpeg, .gif"
                  action="#"
                  :multiple="false"
                  ref="uploadImg"
                  :auto-upload="false"
                  list-type="picture-card"
                  :on-change="
                    (file, fileList) => {
                      handleFileChange(file, fileList, index);
                    }
                  "
                  :on-remove="
                    (file, fileList) => {
                      handleRemove(file, fileList, index);
                    }
                  "
                  limit="4"
                  :on-preview="handlePictureCardPreview"
                >
                  <span slot="default" class="el-icon-plus"></span>
                </el-upload>

要求:限制图片格式、显示图片大小、当图片超过四张隐藏上传图标

实现逻辑:新增时用imgs字段来存储新增的图片;编辑时用imgVos字段来接收新增的图片、imgs中存贮后端返回(上次存储)的图片;若为编辑状态给后端提交时:将所有的新增图片放到imgs中,之前(后端返回的图片地址)放到imgVos中

auto-upload设置为"false",则 before-upload 会失效;只能通过on-change 事件

此处handleFileChange事件用来处理上传,当不符合条件时需手动删除,调用handleRemove事件

通过 fileList 来判断图片的数量,控制上传组件

新增、编辑代码:

    handleFileChange(file, fileList, index) {
      const isLt5M = file.size / 1024 / 1024 < 5;
      const isJPG =
        file.raw.type === "image/jpeg" ||
        file.raw.type === "image/jpg" ||
        file.raw.type === "image/png" ||
        file.raw.type === "image/gif";
      if (this.typesOf == "add") {
        if (!isJPG) {
          this.$message({
            message: "上传失败!上传图片文件只支持JPG、PNG、JPEG、GIF",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        if (!isLt5M) {
          this.$message({
            message: "上传图片大小不能超过5M!",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        this.form.schemes[index].imgs.push(file.raw);
        this.repairPlanfiles[index].push(file);

      } else {
        if (!isJPG) {
          this.$message({
            message: "上传失败!上传图片文件只支持JPG、PNG、JPEG、GIF",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        if (!isLt5M) {
          this.$message({
            message: "上传图片大小不能超过5M!",
            type: "warning",
          });
          this.$refs.uploadImg[index].handleRemove(file);
          return false;
        }
        this.form.schemes[index].imgVos.push(file.raw);
        this.repairPlanfiles[index].push(file);

      }
      if (fileList.length == 4) {
        let className = `uploadStay${this.index}`;
        this.$nextTick(() => {
          let ele = document
            .querySelector(`.${className}`)
            .querySelector(".el-upload--picture-card");
          ele.style.display = "none";
        });
      }
    },

删除:我这里处理的比较复杂

默认清空当前的所有图片,然后根据图片的的格式将其存储到 imgs与imgVos中

当当前数组中图片的长度小于4时,显示上传组件

    handleRemove(file, fileList, index) {
      this.form.schemes[index].imgs = [];
      this.form.schemes[index].imgVos = [];
      this.repairPlanfiles[index] = [];
      fileList.forEach((item) => {
        if (item.raw) {
          this.form.schemes[index].imgs.push(item.raw);
          this.repairPlanfiles[index].push(item);
        } else {
          if (item.url) {
            let aa = item.url.toString().split("aiops/");
            this.form.schemes[index].imgVos.push(aa[1]);
            this.repairPlanfiles[index].push(item);
          } else {
            this.form.schemes[index].imgVos.push(item);
            this.repairPlanfiles[index].push(item);
          }
        }
      });
      if (fileList.length < 4) {
        let className = `uploadStay${index}`;
        this.$nextTick(() => {
          let ele = document
            .querySelector(`.${className}`)
            .querySelector(".el-upload--picture-card");
          ele.style.display = "";
        });
      }
    },

详情、编辑:图片回显

回显逻辑:将图片放入repairPlanfiles中

    viewShowImg() {
      //将图片赋值给files对象 处理图片回显
      let schemes = this.formCopy.schemeVoList;
      for (let i in schemes) {
        this.repairPlanfiles.push([]);
        if (schemes[i].imgs) {
          for (let j in schemes[i].imgs) {
            let obj = {};
            obj.url = this.PIC_URL + schemes[i].imgs[j].imgPath;
            this.repairPlanfiles[i].push(obj);
          }
         //处理上传组件
          if (schemes[i].imgs.length == 4) {
            let className = `uploadStay${i}`;
            console.log("className", className);
            this.$nextTick(() => {
              let ele = document
                .querySelector(`.${className}`)
                .querySelector(".el-upload--picture-card");
              ele.style.display = "none";
            });
          }
        }
      }


      this.form.schemes = schemesCopy;
 
    },

图片放大功能

    <!-- 放大图片吗 -->
    <div @click.stop="handleClickItem">
      <el-image-viewer
        v-if="showViewer"
        :on-close="closeImage"
        :url-list="imgList"
        :z-index="5000"
      />
    </div>

逻辑methods

//放大
    handlePictureCardPreview(file) {
      this.imgList.push(file.url);
      this.showViewer = true;
    },
    handleClickItem(e) {
      if (e.target.getAttribute("class") === "el-image-viewer__mask") {
        this.imgList = [];
        this.showViewer = false;
      }
    },
//关闭
    closeImage() {
      this.imgList = [];
      this.showViewer = false;
    },

因小编项目图片数组可以动态累加,相对有点复杂,若你们的不存在动态添加,只有一条,页面

 :file-list="repairPlanfiles"即可;回显时也不用循环 :给repairPlanfiles添加数组

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

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

相关文章

Biotech - 小分子化合物、蛋白质、核酸的不同数据表征方式

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135247719 小分子化合物、蛋白质、核酸之间的关联是生命科学研究的一个重要领域&#xff0c;涉及到细胞功能的调控、信号传导的机制、疾病的发生和…

html table+css实现可编辑表格

要实现可编辑的 HTML 表格&#xff0c;你可以使用 JavaScript 和 HTML5 的 contenteditable 属性。 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align:…

模型树实操

很多时候&#xff0c;数据都是有层级和分类的&#xff0c;使用laravel的Dcat框架&#xff0c;可以快速搭建一个结构清晰、且可以鼠标拖拽排序的后台&#xff1b;先上例子更直观&#xff1a; 这里是Dcat的模型树使用文档&#xff0c;戳一下&#xff1b; 重点注意事项有&#x…

如何给已分区的磁盘增加空间?详细教程分享!

用户案例&#xff1a;​给已分区的磁盘增加空间 “怎样给已分区的磁盘增加空间呢&#xff1f;我的电脑硬盘分成了C、D、E、F这四个区&#xff0c;每个区都是114G。但现在我觉得C盘的114G空间有些太小了&#xff0c;所以想把其他分区多余的空间给C盘。压缩完分区后&#xff0…

一款能封堵牙本质小管的牙膏,帮你告别牙齿敏感

冬天来临&#xff0c;牙齿敏感成为了很多人的困扰。吃冷饮、涮火锅都让人倍感不适&#xff0c;这时候一款有效的牙膏就显得格外重要。最近我发现了一款非常不错的清九野小红盾牙膏&#xff0c;它能够有效缓解牙齿敏感问题。 造成“敏感牙”的原因有很多&#xff0c;但根本原因还…

Vue3-26-路由-useRouter 和 useRoute 两个API 的作用介绍

先来说说两个API 的作用 useRouter() : 返回的是项目中的 路由实例的对象 可以通过这个实例对象进行路由的逻辑跳转 useRoute() : 返回的是当前的 路由对象&#xff0c; 可以在当前路由对象中获取到路由名称、路由参数、路由路径等玩完整的路由信息。 写个案例看一下具体是什么…

利用Milvus Cloud和LangChain构建机器人:一种引人入胜且通俗易懂的方法

一、引言 机器人已经深入我们的日常生活&#xff0c;从家庭服务到工业生产&#xff0c;再到医疗和运输等领域。然而&#xff0c;这些机器人往往需要复杂的算法和数据处理技术才能有效地执行任务。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#…

CTFshow-pwn入门-栈溢出pwn39-pwn40

pwn39 首先我们还是先将二级制文件托到虚拟机里面查看文件的保护信息。 chmod x pwn checksec pwn文件依然是只开启了栈不可执行&#xff0c;canary和pie都没开。并且该文件是32位的&#xff0c;那我们就托到ida32中反编译一下吧。 int __cdecl main(int argc, const char **…

k8s的二进制部署: 源码包部署-----node节点部署

服务器IP软件包k8s--master0120.0.0.61kube-aplserver&#xff0c;kube-controer-manager&#xff0c;kube-scheduler&#xff0c;etcdk8s--master0220.0.0.62kube-controer-manager&#xff0c;kube-schedulernode节点0120.0.0.62kubelet&#xff0c;kube-proxy&#xff0c;et…

Duboo-入门到学废【上篇】

目录 1&#x1f95e;.什么是duboo 2&#x1f32d;.架构图 3.&#x1f37f;快速入门 4.&#x1f9c7;浅浅理解 1.什么是duboo&#x1f936;&#x1f936;&#x1f936; Dubbo是一个由阿里巴巴开发的基于Java的开源RPC框架。它提供了高性能、透明化的远程方法调用&#xff0…

模型的线性化与离散化方法

模型的线性化与离散化方法 一、线性化——泰勒展开 对于非线性系统&#xff1a; 将一个非线性系统转换为线性系统&#xff0c;泰勒展开公式&#xff1a; 由于我们 线性化 的需求&#xff0c;只取前两项即可&#xff1a; 二、离散化——欧拉法

python13

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

Git 分布式版本控制系统(序章1)

第一章 Git 分布式版本控制系统 为什么学Git? 某些企业面试需要掌握Git&#xff0c;同时&#xff0c;也方便管理自己的Qt项目。 一、Git 客户端下载&#xff08;Windows&#xff09; 下载地址 https://gitee.com/all-about-git#git-%E5%A4%A7%E5%85%A8 二、Git 的特点 分支…

网站服务器被入侵,如何排查,该如何预防入侵呢?

在我们日常使用服务器的过程中&#xff0c;当公司的网站服务器被黑客入侵时&#xff0c;导致整个网站以及业务系统瘫痪&#xff0c;将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应&#xff0c;对入侵问题做到及时处理&#xff0c;以最快的时间…

DRF从入门到精通五(路由组件、认证组件)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件 一、路由组件 对于视图集ViewSetMixin&#xff0c;我们除了可以自己手动指明请求方式与动作action之间的对应关系外&#xff0c;还可以使用Routers来帮助我们快速实现路由信息。 REST framework…

EasyExcel实现动态表头(注解实现)

要实现上述动态头&#xff0c;按每日统计&#xff0c;每月统计&#xff0c;每年统计。而时间是一直变化&#xff0c;所以我们需要表头也一直动态生成。 首先&#xff0c;我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

electron 菜单栏打开指定url页面菜单实现方法

electron 菜单栏打开指定url页面菜单 可以是本地URL也可以是远程的URL 自动判断跳转 以下代码可以在主进程main.js里面也可以是在独立的模块文件里面 const { BrowserWindow } require(electron);//定义窗口加载URL export const winURL process.env.NODE_ENV development …

NativePHP:使用 PHP 构建桌面应用程序

PHP 在我心中占据着特殊的位置。它是我的第一份工作&#xff0c;我记得我在家里花了无数个小时做一些小项目。我非常想用 PHP 创建桌面应用程序&#xff0c;但我从来没有做到过。 现在&#xff0c;感谢 NativePHP&#xff0c;我可以了。 NativePHP 追随 Slack、Discord 和 Tre…

Ubuntu 20.04使用Livox Mid-360

参考文章&#xff1a; Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一&#xff1a;Livox mid 360驱动安装与测试 前言&#xff1a; Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部…

开集目标检测-标签提示目标检测大模型(吊打YOLO系列-自动化检测标注)

背景 大多数现有的对象检测模型都经过训练来识别一组有限的预先确定的类别。将新类添加到可识别对象列表中需要收集和标记新数据&#xff0c;并从头开始重新训练模型&#xff0c;这是一个耗时且昂贵的过程。该大模型的目标是开发一个强大的系统来检测由人类语言输入指定的任意…