【业务实战】批量生成二维码并打成压缩包

批量生成二维码并打成压缩包

功能简介

场景

需要制作一批二维码图片,其中二维码需要配套的文字解释,并生成图片下载。

解决方案

二维码生成使用qrcode即可,然后需要配套的将文字与二维码合成一个div,再通过html2canvas转换成图片,再进行下载,由于数量不定,一次性下载多个图片不符合人类习惯操作,所以选择使用jszip进行压缩,将其打包成压缩包下载,几个方案的demo我都放在下面了。(ps:临时起意想写写编程记录,一个功能拆分了三篇文章,大家按需获取就可以啦)
批量生成二维码demo下载
html2canvas使用demo文章
qrcode使用demo文章

代码实现

html

	<!DOCTYPE html>
	<html>
		<head>
			<meta charset="UTF-8">
		</head>
		<script type="text/javascript" src="./jquery.min.js"></script>
		<script type="text/javascript" src="./qrcode.min.js"></script>
		<script type="text/javascript" src="./bluebird.js"></script>
		<script type="text/javascript" src="./html2canvas.min.js"></script>
		<script type="text/javascript" src="./jszip.min.js"></script>
		<script type="text/javascript" src="./FileSaver.js"></script>
		<script src="./packaging.js"></script>
		<body>
			<!-- 这个可以理解为实际界面的整个界面 -->
			<div id="container" style="width: calc(100vw - 50px);height: calc(100vh - 50px);">
				<!-- 做一个满屏幕大小的界面(实战场景实际为表格、或者直接是个界面) -->
				<div style="width: 100%;height: 800px;background-color: #ffffff;z-index: 2500;">
					这是一个整体的界面,需要生成多少个不同的二维码:
					<input type="number" id="input" value="100">
					<button onClick="makeCode()">测试按钮</button>
				</div>
			</div>
			
		</body>
		<script>
		</script>
	</html>

js

//zip压缩原型
var zip
//名字去重列表
var nameList = {}

function makeCode() {
	//初始化
	nameList = {}
	zip = null
	zip = new JSZip()
	// 获取外部容器
	const divBox = document.getElementById('container')
	// 异步使用for循环顺序执行正常
	for (let i = 0; i < (document.getElementById('input').value + 0); i++) {
		// 随机值
		const key = Math.random() * 100000000000000000
		// 制作一个div
		let div = document.createElement('div')
		// 将div放入外部容器
		divBox.appendChild(div)
		// 唯一id
		div.id = `id${i}`
		// style主要是为了使多个div重叠,且不出问题(ps:将单双数的二维码大小区分开)
		div.style = `width: 324px;height: ${i%2?200:350}px;background-color: white;position:absolute;z-index: -1`
		//创造一个二维码div
		let qrcodeDiv = document.createElement('div')
		qrcodeDiv.id = `qrcode${i}`
		div.appendChild(qrcodeDiv)
		qrcodeDiv.style = `margin-top: 8px;width: 324px;height:${i%2?150:300}px;display:flex;justify-content:center ;align-items:center ;`
		var qrcode = new QRCode(qrcodeDiv, {
			width: i%2?150:300,
			height: i%2?150:300
		});
		// 生成二维码
		qrcode.makeCode(key);
		// 创造一个key值div
		let keyDiv = document.createElement('div')
		div.appendChild(keyDiv)
		keyDiv.style = `margin-top: 8px;width: 324px;height:40px;text-align:center;font-size:14px;color:#1890ff`
		keyDiv.innerHTML = key
		// 把需要传的值做好
		const data = {
			id: `#id${i}`,
			name: `${key}.png`,
			over:i === (document.getElementById('input').value - 1)
		}
		// 执行多元下载方法
		transition(data)
	}
}

function transition(data) {
	html2canvas($(data.id), {
		onrendered: function(canvas) {
			var dataUrl = canvas.toDataURL('image/png', 1.0);
			var imgdata = dataUrl.split(',')
			// 将base64位文件放入压缩包
			setFile(data.name, imgdata[1], 1, data.name)
			// 判断为最后一个打包下载
			if (data.over) {
				zip.generateAsync({
						type: 'blob'
					})
					.then(function(content) {
						saveAs(content, "二维码合集.zip")
					})
			}
			//删除原来的div
			document.getElementById(data.id.split('#')[1]).outerHTML = ''
		}
	})
}

// 文件名去重(压缩包内不能有重复名字的文件,不然会覆盖)
function setFile(name, imgdata, i, oldName) {
	if (nameList[name]) {
	    //名字重复则在后面加(数字)
		var newName = oldName.split('.png')[0] + `(${i}).png`
		var newI = i + 1
		//递归执行
		setFile(newName, imgdata, newI, oldName)
	} else {
	    //名字不重复则名字加入名字除重列表
		nameList[name] = true
		zip.file(name, imgdata, {
			base64: true
		})
	}
}

效果图

二维码不打马赛克过不了审!
图1

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
批量生成二维码并打包,你可以使用以下步骤: 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 来获取每个二维码组件的实例,并将实例转换为图片数据进行打包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值