ele-form 上传图片文件 - 预览、删除、限制上传(隐藏上传控件)

news2025/1/12 0:55:19

dialog.vue

<!-- 采集人脸、更新人脸 -->
<template>
  <el-dialog
    :title="title"
    :visible.sync="dialogVisible"
    width="30%"
    top="6vh"
    :close-on-click-modal="false"
    @close="handleClose"
  >
    <ele-form
      ref="submitRef"
      v-model="formData"
      inline
      :form-desc="formDesc"
      :is-show-submit-btn="false"
      :is-show-error-notify="false"
    >
      <template v-slot:file>
        <!-- 【主要代码】 -->
        <el-upload
          ref="uploadRef"
          v-loading="uploadLoading"
          class="upload_demo"
          list-type="picture-card"
          accept=".png,.PNG,.jpg,.JPG,.jpeg,.JPEG"
          action="/api/XXX/upload/oss/fileupload"
          name="files"
          :file-list="fileList"
          :headers="{ 'X-Token': getToken() }"
          :data="{ relativePath: 'face/' }"
          :on-success="onSuccessHandler"
          :on-error="onErrorHandler"
          :on-remove="onRemoveHandler"
          :before-upload="beforeUploadHandler"
        >
          <i slot="default" class="el-icon-plus" />
          <div slot="file" slot-scope="{ file }">
            <el-image
              :id="'image' + file.uid"
              class="el-upload-list__item-thumbnail"
              :src="file.url"
              :preview-src-list="[file.url]"
            />
            <span class="el-upload-list__item-actions">
              <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                <i class="el-icon-zoom-in" />
              </span>
              <span class="el-upload-list__item-delete" @click="onRemoveHandler(file)">
                <i class="el-icon-delete" />
              </span>
            </span>
          </div>
        </el-upload>
      </template>
    </ele-form>
    <template v-slot:footer>
      <el-button size="mini" @click="handleClose">取消</el-button>
      <el-button type="primary" size="mini" @click="handleSubmit">确定</el-button>
    </template>
  </el-dialog>
</template>

<script>
import { getToken } from '@/utils/tool'
import { addFace } from '@/api/file_cabinet.js'
import { operationFormDesc } from '../constant/formList'

export default {
  name: 'OperationDialog',
  components: {},

  data() {
    return {
      dialogVisible: false,
      dialogType: '',
      rowData: {},
      formData: {
        file: []
      },
      uploadLoading: false,
      fileList: [],
      getToken
    }
  },

  computed: {
    title() {
      return this.dialogType === 'add' ? '采集人脸' : '更新人脸'
    },
    formDesc() {
      // return operationFormDesc(this)
      return {
	    xm: {
	      type: 'input',
	      label: '姓名',
	      layout: 24,
	      disabled: true
	    },
	    sfzmhm: {
	      type: 'input',
	      label: '身份证号码',
	      layout: 24,
	      disabled: true
	    },
	    dwmc: {
	      type: 'input',
	      label: '所属部门',
	      layout: 24,
	      disabled: true
	    },
	    sjhm: {
	      type: 'input',
	      label: '手机号码',
	      layout: 24,
	      disabled: true
	    },
	    file: {
	      type: 'upload',
	      label: '人脸信息',
	      layout: 24,
	      required: true
	    }
	  }
    }
  },

  watch: {
    dialogVisible() {
      this.$refs.submitRef &&
        this.$refs.submitRef.$refs.form &&
        this.$refs.submitRef.$refs.form.clearValidate()
    },
    'formData.file': {
      handler(val) {
        console.log('val.length----', val.length)
        const dom = document.querySelector('.el-upload--picture-card')
        // 【注意】限制只能传一张照片,有已传照片时就不显示上传控件
        if (val.length) {
          dom && (dom.style.display = 'none')
        } else {
          dom && (dom.style.display = 'inline-block')
        }
      }
    }
  },

  created() {},

  methods: {
    open(type, rowData) {
      this.dialogType = type
      this.rowData = rowData
      Object.keys(this.formDesc).forEach((key) => {
        key !== 'file' && this.$set(this.formData, key, rowData[key])
      })
      this.dialogVisible = true
    },
    beforeUploadHandler(file) {
      const ext = file.name.substring(file.name.lastIndexOf('.') + 1)
      const types = ['png', 'PNG', 'jpg', 'JPG', 'jpeg', 'JPEG']
      const isLt = file.size / 1024 / 1024 < 5

      if (!types.includes(ext)) {
        this.$message.error(`请上传${types.map((item) => item)}格式的文件!`)
        return false
      } else if (!isLt) {
        this.$message.error('上传文件大小不能超过 5MB!')
        return false
      } else {
        this.uploadLoading = true
        return true
      }
    },

    onRemoveHandler(file) {
      const { uploadFiles } = this.$refs.uploadRef
      uploadFiles.splice(
        uploadFiles.findIndex((item) => item.uid === file.uid),
        1
      )
      this.formData.file.splice(
        this.formData.file.findIndex(
          (item) => item.uid === file.uid && item.filename === file.name
        ),
        1
      )
      // 【注意】删除图片,校验图片字段
      this.$refs.submitRef &&
        this.$refs.submitRef.$refs.form &&
        this.$refs.submitRef.$refs.form.validateField('file')
    },

    // eslint-disable-next-line handle-callback-err
    onErrorHandler(err, file, fileList) {
      this.uploadLoading = false
      this.$message.error(`${file.name}文件上传失败,请重新上传!`)
    },

    // 文件上传成功
    onSuccessHandler(response, file) {
      this.uploadLoading = false
      console.log('response----', response)
      const fileList = response.data.fileUploadInfoList
        ? response.data.fileUploadInfoList.map((item) => {
            return {
              wjmc: item.filename,
              wjlj: item.path,
              wjgs: item.fileType,
              uid: file.uid
            }
          })
        : []
      this.formData.file.push(...fileList)
      this.$refs.submitRef &&
        this.$refs.submitRef.$refs.form &&
        this.$refs.submitRef.$refs.form.validateField('file')
    },

    // 预览图片
    handlePictureCardPreview(file) {
      const imageDom = document.getElementById('image' + file.uid)
      imageDom && imageDom.click()
    },

    handleSubmit() {
      this.$refs.submitRef.validate().then((valid) => {
        const { xm, file } = this.formData
        const { dwdm, yhdh } = this.rowData
        const params = {
          dwdm,
          yhdh,
          xm,
          path: 'addFace/',
          file: file.map((item) => {
            const { uid, ...fileInfo } = item
            return fileInfo
          })
        }
        addFace(params).then((res) => {
          this.$common.CheckCode(res, `${this.title}成功`, () => {
            this.handleClose()
            this.$emit('update')
          })
        })
      })
    },

    handleClose() {
      this.fileList = []
      this.rowData = {}
      for (const key in this.formData) {
        if (this.formData[key] && this.formData[key].constructor === Array) {
          this.formData[key] = []
        } else if (this.formData[key] && this.formData[key].constructor === Object) {
          this.formData[key] = {}
        } else {
          this.formData[key] = ''
        }
      }
      this.dialogVisible = false
    }
  }
}
</script>

<style lang='scss' scoped>
@import '@/styles/dialog-style.scss';
>>> .el-dialog__body {
  padding-bottom: 10px;
}
>>> .el-dialog .upload_demo + .el-form-item__error {
  top: 100% !important;
}
</style>

效果图展示

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

RHCE——七、搭建云存储器

搭建私有云存储 一、使用内网穿透搭建私有云存储1、准备工作2、上传软件3、设置数据库4、配置httpd5、私有云安装6、内网穿透配置 二、使用腾讯云服务器搭建私有云存储1、准备工作2、上传软件3、设置数据库4、配置httpd5、私有云安装 一、使用内网穿透搭建私有云存储 1、准备工…

如何保证缓存和 MySQL 的双写一致 ?

1. 如何保证缓存和 MySQL 的双写一致 &#xff1f; 什么叫做如何保证缓存和 MySQL 双写一致&#xff0c;这个问题就是指当应用程序执行写&#xff08;增删改&#xff09;操作时&#xff0c;如何保证 Redis 和 MySQL 的数据一致性。 当用户发送请求时&#xff0c;程序的执行流程…

打造完美的跨境电商系统,助力企业海外扩张!

打造理想的跨境电商系统&#xff1a;关键要素和优势 在如今全球化和互联网时代&#xff0c;跨境电商已成为企业迅速发展的必然选择。打造一套完美的跨境电商系统&#xff0c;不仅可以提升企业的国际竞争力&#xff0c;还可以助力企业实现海外市场的扩张和增长。本文将为您介绍…

单片机 (一) 让LED灯 亮

一&#xff1a;硬件电路图 二&#xff1a;软件代码 #include "reg52.h"#define LED_PORT P2void main() {LED_PORT 0x01; // 0000 0001 D1 是灭的 } #include "reg52.h" 这个头文件的作用&#xff1a;包含52 系列单片机内部所有的功能寄存器 三&#…

Vant 4.6.4发布,增加了一些新功能,并修复了一些bug

导读Vant 4.6.4发布,增加了一些新功能&#xff0c;并修复了一些bug等。 新功能 feat(area-data): 更新芜湖的县区数据&#xff0c;由 nivin-studio 在 #12122 中贡献feat(Locale): 添加塞尔维亚语到国际化&#xff0c;由 RogerZXY 在 #12145 中贡献feat(ImagePreview): 添加 c…

线上问诊:业务数据采集

系列文章目录 线上问诊&#xff1a;业务数据采集 文章目录 系列文章目录前言一、环境准备1.Hadoop2.Zookeeper3.Kafka4.Flume5.Mysql6.Maxwell 二、业务数据采集1.数据模拟2.采集通道 总结 前言 暑假躺了两个月&#xff0c;也没咋写博客&#xff0c;准备在开学前再做个项目找…

爬虫selenium获取元素定位方法总结(动态获取元素)

目录 元素 查看元素信息 元素定位 通过元素id定位 通过元素name定位 通过xpath表达式定位 绝对路径 相对路径 通过完整超链接定位 通过部分链接定位 通过标签定位 通过类名进行定位 通过css选择器进行定位 id选择器 class选择器 标签选择器 属性选择器 定位带…

乘积最大子数组

题目链接 乘积最大子数组 题目描述 注意点 -10 < nums[i] < 10nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数 解答思路 最初想到求和最大的子数组所用的贪心算法&#xff0c;判断包括该元素时的最大值tmp&#xff0c;再将当前最大值res与tmp比较&#xff0…

“车-路-网”电动汽车充电负荷时空分布预测(matlab)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考《基于动态交通信息的电动汽车充电负荷时空分布预测》和《基于动态交通信息的电动汽车充电需求预测模型及其对配网的影响分析》文献模型&#xff0c;考虑私家车、出租车和共用车三类交通工具特性和…

长胜证券:九成注册制公司选择上市标准一,牛股“双高”特征明显

新股注册制施行以来&#xff0c;新股公司可选的上市规范愈加多样化&#xff0c;不同板块、不同上市规范的新股公司亦呈现出不同特征&#xff0c;新股上市后不再呈现“套路化”的上涨行情&#xff0c;新股破发成为常态。数据显现&#xff0c;2022年全年及2023年以来&#xff0c;…

Redis 列表 | Navicat

在最近的博客 文章 中&#xff0c;我们已经了解了 Redis 的六种数据类型。其中&#xff0c;Redis 列表&#xff08;List&#xff09;包含一组字符串&#xff0c;他们按照被添加的顺序进行排序。本文将就列表数据类型进行展开介绍&#xff0c;并且重点介绍一些主要的命令来管理它…

自研分布式IM-HubuIM RFC草案

HubuIM RFC草案 消息协议设计 基本协议 评估标准 【性能】协议传输效率&#xff0c;尽可能降低端到端的延迟&#xff0c;延迟高于200ms用户侧就会有所感知 【兼容】既要向前兼容也要向后兼容 【存储】减少消息包的大小&#xff0c;降低空间占用率&#xff0c;一个字节在亿…

Qt应用开发(拓展篇)——示波器/图表 QCustomPlot

一、介绍 QCustomPlot是一个用于绘图和数据可视化的Qt C小部件。它没有进一步的依赖关系&#xff0c;提供友好的文档帮助。这个绘图库专注于制作好看的&#xff0c;出版质量的2D绘图&#xff0c;图形和图表&#xff0c;以及为实时可视化应用程序提供高性能。 QCustomPl…

温湿度传感器之Modbus TCP相比较Modbus RTU的优势

1) 当多个网关共同接一个后台服务器&#xff0c;而一个网关下挂接多个485设备时&#xff0c;如果不同的网关挂接同样地址号的485设备时那么后台服务器无法区分是哪个485从设备&#xff0c;并且最多只能限制485设备个数254个&#xff0c;而modbus-tcp协议包含自定义报文头4个字节…

什么是NetDevOps

NetDevOps 是一种新兴的方法&#xff0c;它结合了 NetOps 和 DevOps 的流程&#xff0c;即将网络自动化集成到开发过程中。NetDevOps 的目标是将虚拟化、自动化和 API 集成到网络基础架构中&#xff0c;并实现开发和运营团队之间的无缝协作。 开发运营&#xff08;DevOps&…

网站和API支持HTTPS,最好在Nginx上配置

随着我们网站用户的增多&#xff0c;我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下&#xff0c;要从HTTP升级到HTTPS&#xff0c;让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手&#xff0c;从HTTP升级到HTTPS&#xff0c;同时支持静态网站和…

GEE-PIE遥感大数据处理技术

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

机器学习深度学习——针对序列级和词元级应用微调BERT

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;自然语言推断——注意力机制实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机…

独立站怎么搭建?看这一篇就够了!强烈建议收藏!

独立站是跨境卖家对外销售的一个重要渠道&#xff0c;也是品牌塑造和品牌宣传的重要阵地。那么新手如何从0到1搭建出一个属于自己的独立站呢&#xff1f; 01.购买域名&#xff1a; 域名就相当于是一个网站的门牌号&#xff0c;是独立站的重要组成部分。卖家可以选择自己注册&…

C语言:指针(超深度讲解)

目录 指针&#xff1a; 学习目标&#xff1a; 指针可以理解为&#xff1a; 字符指针&#xff1a; 定义&#xff1a;字符指针 char*。 字符指针的使用&#xff1a; 练习&#xff1a; 指针数组&#xff1a; 概念&#xff1a;指针数组是一个存放指针的数组。 实现模拟二维…