vue上传图片-banner上传(多张)

vue上传图片-banner上传(多张)

效果图:
在这里插入图片描述
在html中:

<div class="lfzHead">
  <div>首页banner设置</div>
  <el-button type="primary" @click="addBanners">新增(最多5个)</el-button>
</div>

中间的图我们需要用到for循环

<div class="lfzImgs">
  <div
    class="lfzImg"
    v-for="(item,index) in imgList"
    :key="index"
    v-dragging="{ item, list: imgList, group: 'color' }"
  >
    <el-button class="btn" type="primary" @click="removeImg(item,index)">删除</el-button>
    <div class="lfzCenter">
      <el-upload
        class="avatar-uploader"
        action="https://up.qiniup.com/"
        :show-file-list="false"
        :headers="uploader.headers"
        :name="uploader.name"
        :data="uploader.data"
        :limit="uploader.limit.main_thumb"
        :on-success="handleAvatarSuccess"
        :before-upload="beforeAvatarUpload"
        accept=".jpg, .png, .gif"
      >
        <img v-if="item.imageUrl" :src="item.imageUrl" class="avatar" />
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
      </el-upload>
    </div>
    <div style="display:flex;align-items:center">
      <span class="links">链接</span>

      <el-input class="lfzInput" v-model="item.linkUrl" placeholder="请输入链接" show-word-limit></el-input>
    </div>
    <div style="display:flex;align-items:center;margin-top:10px">
      <span class="links">app链接</span>

      <el-input class="lfzInput" v-model="item.applinkUrl" placeholder="请输入链接" show-word-limit></el-input>
    </div>
  </div>
</div>

下面的时间:

<el-row class="views_coupons" :gutter="20">
  <el-col :span="24">
    <div class="tiomes lfzHead">
      <div style="display:flex;align-items:center">
        <span class="links">banner滚动间隔时间:</span>
        <el-input
          class="lfzInput"
          v-model="timeLine"
          placeholder="请输入时间"
          show-word-limit
          style="width:150px"
        >
          <span>s</span>
        </el-input>
        <span class="links" style="color:#666">设置间隔时间范围1S≤间隔时间≤15S</span>
      </div>

      <div class="lfzCenter view_submit" style="margin-top:20px">
        <el-button type="primary" @click="add(1)">保存</el-button>
      </div>
    </div>
  </el-col>
</el-row>

上传图片:
数据模型:

data() {
    return {
      imgList:[],
      timeLine:"",//banner滚动的时间
      uploader:{
        action: "https://up.qiniup.com/",
        headers: {},//设置上传请求头
        name: "file",//上传的文件字段名
        //data上传时附带的额外参数,此时从缓存中取token
        data:{
          token: localStorage.getItem("qiniuToken")
        },
        //limit最大允许上传个数
        limit: {
          main_thumb: 6,
        },
      }
    };
  },

mounted:

mounted() {
  this.onGetUploaderToken();
  this.$dragging.$on("dragged", ({ value }) => {
    console.log(value);
    this.imgList = value.list;
  });
  this.getImgList(1);
},

methods:

//添加按钮
addBanners() {
  if (this.imgList.length < 5) {
    this.imgList.push({
      imageUrl: "",
      linkUrl: "",
      applinkUrl:"",
      siteType: 1
    });
  }
},

图片获取:

 /**
* @description 获取骑牛云token
 * */
onGetUploaderToken: function() {
  get("/sys/merchant/qnToken/hxt-mini-img").then(result => {
    if (result.code === 200) {
      //把token存入缓存中(封装到了storage里面)
      storage.set("qiniuToken", result.data.qnToken, () => {});
      //把token存入缓存中(不使用封装的组件,直接存到缓存里面)
      // localStorage.setItem('qiniuToken', result.data.qnToken);
      this.uploader.data.token = result.data.qnToken;
    }
  });
},
//限制图片的大小和格式
beforeAvatarUpload(file) {
  var testmsg = file.name.substring(file.name.lastIndexOf(".") + 1);
  const extension =
    testmsg === "jpg" ||
    testmsg === "JPG" ||
    testmsg === "png" ||
    testmsg === "PNG" ||
    testmsg === "gif";
  const isLt2M = file.size / 1024 / 1024 < 2;
  if (!extension) {
    this.$message({
      message: "上传图片只能是jpg/png/gif格式!",
      type: "error"
    });
    return false; //必须加上return false; 才能阻止
  }
  if (!isLt2M) {
    this.$message({
      message: "上传文件大小不能超过 2MB!",
      type: "error"
    });
    return false;
  }
  return extension || isLt2M;
},
//文件上传成功时的钩子(让上传的图片显示出来)
handleAvatarSuccess(res, file, fileList) {
  console.log(res);
  console.log(file);
  console.log(fileList);
  for (let i = 0; i < this.imgList.length; i++) {
    if (!this.imgList[i].imageUrl) {
      this.imgList[i].imageUrl = "https://hxt-img.baimokc.com/" + res.key;
      return;
    }
  }
},
//获取banner
getImgList(type) {
  console.log(type);
  let params = {
    siteType: type
  };
  get("/sys/banner/list", params).then(res => {
    if (res.code === 200) {
      if (type == 1) {
        this.imgList = res.data;
        this.timeLine = res.data[0].timeLine;
      } else {
        if (res.data[0]) {
          this.imgLists = res.data[0];
        } else {
          this.imgLists = {
            imageUrl: "",
            linkUrl: "",
            applinkUrl:"",
            siteType: 2
          };
        }
      }
      console.log(this.imgList);
    } else {
      try {
        this.$message.error(res.data);
      } catch {
        this.$message.error(res.msg);
      }
    }
  });
},

删除某一个:

// 删除banner
del(id, type, index) {
   if (id) {
     post("/sys/banner/del?id=" + id).then(result => {
       if (result.code === 200) {
         this.$message.success("删除成功!");
         console.log(this.imgList);
         console.log(this.imgLists);
         if (type == "1") {
           // this.getImgList(1);
           this.imgList.splice(index, 1);
         } else {
           this.getImgList(2);
         }
         console.log(this.imgList);
         console.log(this.imgLists);
       } else {
         try {
           this.$message.error(result.data);
         } catch {
           this.$message.error(result.msg);
         }
       }
     });
   } else {
     if (type == "1") {
       this.imgList.splice(index, 1);
     } else {
       this.imgLists.imageUrl = "";
       this.imgLists.linkUrl = "";
       this.imgLists.applinkUrl= "";
       this.imgLists.siteType = 2;
     }
   }
 },
 //删除
 removeImg(item, index) {
   console.log(item);
   this.del(item.id, "1", index);
 },

提交:

//提交banner
add(type) {
  if (type == "1") {
    this.imgList.forEach((item, index) => {
      item.sort = index + 1;
    });
  } else {
    this.imgLists.sort = 1;
  }
  let params = {
    bannerToList: type == "1" ? this.imgList : [this.imgLists],
    // timeLine: this.timeLine ? parseFloat(this.timeLine) : 0,
    timeLine: type == "1" ? parseFloat(this.timeLine) : ""
  };
  post("/sys/banner/add", params).then(result => {
    if (result.code === 200) {
      this.$message.success("上传成功!");
      if (type == "1") {
        this.getImgList(1);
      } else {
        this.getImgList(2);
      }
    } else {
      try {
        this.$message.error(result.data);
      } catch {
        this.$message.error(result.msg);
      }
    }
  });
},
submit(type) {
  console.log(this.imgList);
  console.log(this.imgLists);
  this.add(type);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图片拖拽调换位置:
安装

npm install awe-dnd --save
yarn add awe-and

在main.js中写入:

import VueDND from 'awe-dnd'

Vue.use(VueDND)

使用:
v-dragging

  <div
    class="lfzImg"
    v-for="(item,index) in imgList"
    :key="index"
    v-dragging="{ item, list: imgList, group: 'color' }"
  >
mounted() {
  this.$dragging.$on("dragged", ({ value }) => {
    console.log(value);
    this.imgList = value.list;
  });
},

使用的插件,$on响应插件内暴露的方法,执行内置的方法,然后把list传进去,这样v-for遍历的数组渲染出的节点就可以拖拽了
这个地方的list的赋值,是将拖拽完成之后改变了元素位置的数组赋值给了原数组,个方法输出的list就是改变了元素位置的新数组,赋值给原数组,页面样式就改变了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Vue3的el-upload组件上传多张的示例代码: ```html <template> <el-upload class="upload-demo" action="/upload" :on-success="handleSuccess" :before-upload="beforeUpload" multiple :limit="3" :auto-upload="false" :file-list="fileList" > <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> <script> import { ref } from 'vue'; export default { setup() { const fileList = ref([]); const beforeUpload = (file) => { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt500K = file.size / 1024 < 500; if (!isJPG) { this.$message.error('只能上传jpg/png文件'); } if (!isLt500K) { this.$message.error('文件大小不能超过500kb'); } return isJPG && isLt500K; }; const handleSuccess = (response, file) => { this.$message.success('上传成功'); // 处理上传成功后的逻辑 }; return { fileList, beforeUpload, handleSuccess, }; }, }; </script> ``` 在上述代码中,我们使用了Vue3的`ref`函数来创建了一个响应式的`fileList`数组,于存储上传的文件列表。`beforeUpload`函数用于在上传之前进行文件类型和大小的校验,只有符合要求的文件才会被上传。`handleSuccess`函数用于处理上传成功后的逻辑,你可以在其中进行图压缩和合并为zip文件的操作。 请注意,上述代码中的`action`属性需要根据你的实际情况进行修改,以指定上传文件的接口地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值