前端批量生成二维码并打包下载

前端批量生成二维码并打包下载

项目中遇到一个紧急需求在没有后端配合的情况下,前端独自实现生成二维码并打包下载
生成二维码:下载 qrcodejs2
批量打包下载:下载 JSZip 和 FileSaver
对二维码进行二次加工:html2canvas
首先项目中分别引入
import QRCode from 'qrcodejs2';
import JSZip from 'jszip';
import FileSaver from 'file-saver';

生成的效果图
由于QRCode只是生成了一个二维码,
QRCode生成的二维码
产品这边嫌太单调让做二次加工,需要带上需要生成二维码的一下文本信息,
在这里插入图片描述
所以用到了html2canvas来将一个dom转成图片进行下载(要是大佬们有什么好的方法请告诉我,我实在不知道应该怎么弄只能选这种最笨的方法了QAQ)
接下来就是生成二维码:
生成二维码首先要认识到其实只是将一个你需要跳转的url给转成二维码而已,所以你需要一个跳转的url(最好是短链接,长链接的话会导致打点太密集有可能微信扫不出来)
你要是短链接的话可以直接使用不是的话最好转换一下防止扫不出来的问题

// 生成二维码
    bindQRCode(codeurl, index) {
      // eslint-disable-next-line no-new
      new QRCode(this.$refs.qrcode.children[index].children[0], {
        // 二维码宽度,单位像素
        width: 450,
        // 二维码高度,单位像素
        height: 450,
        // 二维码内容:二维码扫描之后访问的地址
        text: codeurl,
        // 前景色
        colorDark: '#000000',
        // 背景色
        colorLight: '#ffffff',
        // 容错级别,
        correctLevel: QRCode.CorrectLevel.H,
      });
      // 关闭loading
      this.loading = false;
      // 显示下载按钮
      this.HasDatacodeShow = true;
    },

this.$refs.qrcode.children[index].children[0]这个东西是你二维码生成的位置
由于我这里是循环生成的需要索引

//   打包下载
    packageImages() {
      console.log('进入到打包下载');
      //   const that = this;
      this.stationCanvas = [];
      // eslint-disable-next-line no-plusplus
      document.getElementsByClassName('codeBox').forEach((item, index) => {
        html2canvas(document.getElementById(`codeimg${index}`)).then((canvas) => {
          const url = canvas.toDataURL();
          const Obj = {
            url: item.children[0].getAttribute('title'),
            src: url,
          };
          // eslint-disable-next-line no-shadow
          this.shortUrlList.forEach((item) => {
            if (item.shorturl === Obj.url) {
              // eslint-disable-next-line no-param-reassign
              item.imgSrc = url;
            }
          });
          this.stationCanvas.push(Obj);
          // 这里才是下载的地方,上面的方法是将通过二次加工后的赋值的操作
          if (this.stationCanvas.length === this.shortUrlList.length) {
            const zip = new JSZip();
            const cache = {};
            const arr = this.shortUrlList;
            // eslint-disable-next-line no-shadow
            arr.forEach((item) => {
             // 设置生成的文件名,并且直接生成的二维码是base64二次加工过后的也是base64
              const fileName = item.address.split('东港区')[1] + item.name;
              zip.file(`${fileName}.png`, item.imgSrc.substring(22), { base64: true });
              cache[fileName] = item.imgSrc;
            });
            zip.generateAsync({ type: 'blob' }).then((content) => {
              this.loading = false;
              FileSaver.saveAs(content, '二维码.zip');//这里设置压缩包的名称
              this.$nextTick(() => {
              //这里是由于我有分页操作要是不清空前一页的数据会导致后来生成的和之前的二维码重叠这样二次加工的就会错误
                this.shortUrlList = [];
              });
            });
          }
        });
      });
    },

用html2canvas做二次加工会有个问题是html2canvas是个异步方法,而且会动态创建iframe然后销毁,要是大量的数据会导致内存泄漏,逼不得已加了分页来导出,要是大佬们有什么好的建议还请告诉我QAQ~
下面放一下页面结构~样式就不放了

<template>
  <div
    id="exportBox"
    v-loading="loading"
    :element-loading-text="loadingtext"
    element-loading-spinner="el-icon-loading"
    element-loading-background="rgba(0, 0, 0, 0.8)"
  >
    <!-- <div class="title">日照智慧药房门店二维码导出系统</div> -->
    <div class="contentBox">
      <div class="cityBox">
        <div class="ChooseCode">
          <el-select
            v-model="chooseArea"
            placeholder="请选择区域"
            style="width:200px;margin-right:20px"
            @change="ChangeArea"
          >
            <el-option v-for="item in cities" :key="item.id" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
          <el-select
            v-model="chooseStreet"
            placeholder="请选择街道"
            style="width:200px;margin-right:20px"
            @change="ChangeStreet"
          >
            <el-option v-for="item in Strees" :key="item.id" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
          <el-select
            v-model="chooseCommunity"
            placeholder="请选择社区"
            style="width:200px;"
            @change="ChangeCommunity"
          >
            <el-option v-for="item in Community" :key="item.id" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </div>
        <div class="ChooseTime">
          <el-date-picker
            v-model="hasChooseDate"
            type="daterange"
            range-separator=""
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            value-format="yyyy-MM-dd HH:mm:ss"
            @change="ChangeTimeData"
          >
          </el-date-picker>
        </div>
      </div>
      <div class="exportButton">
        <el-button type="primary" @click="clickecport">生成二维码</el-button>
        <el-button v-show="HasDatacodeShow" type="primary" @click="clickeexportcode"
          >下载</el-button
        >
      </div>
      <el-pagination
        background
        layout="prev, pager, next"
        :total="AllTotals"
        :page-size="50"
        @current-change="ChangeCurrent"
      >
      </el-pagination>
      <div id="qrcodeBox" ref="qrcode" v-show="qrcodeBoxShow">
        <div
          class="codeBox"
          v-for="(item, index) in shortUrlList"
          :key="index"
          :id="'codeimg' + index"
          ref="qrc"
        >
          <div class="codeImgbox" ref="BoxImgContent" :id="'codeImgbox' + index"></div>
          <div class="codeStation">
            <span class="address storeName">{{ item.address }}</span>
            <span class="storeName">{{ item.name }}</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
批量生成二维码打包,你可以使用以下步骤: 1. 安装 vue-qr 插件:在命令行中运行 `npm install vue-qr --save`,或者在项目目录下运行 `yarn add vue-qr`。 2. 创建一个二维码生成器组件:在 Vue 应用中创建一个新的组件,用于批量生成二维码。在组件中使用 vue-qr 插件来生成二维码。 3. 创建一个数据源:在组件中创建一个数据源,用于存储所有要生成二维码的数据。可以使用数组或对象存储数据。 4. 使用 v-for 指令循环生成二维码:在组件中使用 v-for 指令循环遍历数据源,使用 vue-qr 插件生成二维码,并将生成的二维码添加到页面中。 5. 打包生成的二维码:在组件中添加一个按钮,当用户点击按钮时,使用 jszip 插件将所有二维码打包成一个压缩文件,并将文件下载到本地。 以下是一个简单的示例代码: ```html <template> <div> <div v-for="(data, index) in dataSource" :key="index"> <p>{{ data.name }}</p> <qrcode :value="data.code"></qrcode> </div> <button @click="handleDownload">Download</button> </div> </template> <script> import VueQr from 'vue-qr' import JSZip from 'jszip' import FileSaver from 'file-saver' export default { components: { VueQr }, data() { return { dataSource: [ { name: 'Qrcode 1', code: 'https://www.example.com/1' }, { name: 'Qrcode 2', code: 'https://www.example.com/2' }, { name: 'Qrcode 3', code: 'https://www.example.com/3' } ] } }, methods: { handleDownload() { const zip = new JSZip() this.dataSource.forEach((data, index) => { const imgData = this.$refs[`qrcode${index}`][0].$el.toDataURL() zip.file(`${data.name}.png`, imgData.substr(imgData.indexOf(',') + 1), { base64: true }) }) zip.generateAsync({ type: 'blob' }).then((content) => { FileSaver.saveAs(content, 'qrcodes.zip') }) } } } </script> ``` 在上述示例代码中,我们使用了 vue-qr 插件来生成二维码,使用 jszip 插件将所有二维码打包成一个压缩文件,并使用 file-saver 插件将文件下载到本地。注意,我们使用了 $refs 来获取每个二维码组件的实例,并将实例转换为图片数据进行打包

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值