Преглед на файлове

Fix 修复优化二维码下载

Yue преди 3 седмици
родител
ревизия
ce8024ebf5

+ 1 - 0
UI/VB.VUE/package.json

@@ -32,6 +32,7 @@
 		"echarts": "^5.4.3",
 		"element-plus": "^2.3.9",
 		"file-saver": "^2.0.5",
+		"html2canvas": "^1.4.1",
 		"jsencrypt": "^3.3.2",
 		"jsqr": "^1.4.0",
 		"min-dash": "^4.1.1",

+ 40 - 21
UI/VB.VUE/src/views/base/chickenCage/index.vue

@@ -3,7 +3,7 @@ import apis from "@a"
 import dayjs from "dayjs"
 import { Vue3NextQrcode } from "vue3-next-qrcode"
 const tableRef = ref()
-const modalRef = ref() 
+const modalRef = ref()
 const coopOptions = ref([])
 const cageNumPrefix = computed(() => {
 	if (!form.value.chickenCoopId) {
@@ -258,12 +258,29 @@ function handleQrCode(row) {
 	qrModalRef.value.show()
 }
 function handleDownloadQr(id: string) {
-	let myImg = document.querySelector("#" + id+' img') as HTMLImageElement
-	let url = myImg?.src
-	let a = document.createElement("a")
-	a.href = url
-	a.download = `${qrModalData.value.cageNum}笼号二维码`
-	a.click()
+	// 获取整个元素,包括标题和二维码
+	const element = document.querySelector("#" + id) as HTMLElement
+	if (!element) return
+
+	// 使用html2canvas将整个元素转换为图片
+	import("html2canvas").then((html2canvas) => {
+		html2canvas.default(element).then((canvas) => {
+			// 将canvas转换为图片blob
+			canvas.toBlob((blob) => {
+				if (!blob) return
+
+				// 创建下载链接
+				const url = URL.createObjectURL(blob)
+				const a = document.createElement("a")
+				a.href = url
+				a.download = `${qrModalData.value.cageNum}笼号二维码`
+				document.body.appendChild(a)
+				a.click()
+				document.body.removeChild(a)
+				URL.revokeObjectURL(url)
+			})
+		})
+	})
 }
 // function handlePrintQr(id: string) {
 // 	const printContent = document.querySelector("#" + id)
@@ -376,24 +393,26 @@ function handleDownloadQr(id: string) {
 		</VbDataTable>
 		<VbModal
 			v-model:modal="qrModalRef"
-			title="签到二维码"
+			title="笼号二维码"
 			:confirm-btn="false"
 			:close-btn-class="'btn btn-danger'"
 			append-to-body>
 			<template #body>
-				<div
-					id="qr"
-					class="w-100 w-100 d-flex flex-column justify-content-center align-items-center">
-					<span class="fs-5 fw-bold my-5 qr-title">{{ qrModalData?.cageNum }} 笼号二维码</span>
-					<Vue3NextQrcode
-						:text="qrCode.text"
-						:size="qrCode.size"
-						:color-dark="qrCode.colorDark"
-						:logo-image="qrCode.logo"
-						:logo-scale="0.15"
-						:logo-margin="0"
-						:logo-corner-radius="20"
-						:margin="20" />
+				<div class="w-100 d-flex justify-content-center align-items-center">
+					<div id="qr" class="d-flex flex-column align-items-center">
+						<span class="fs-5 fw-bold mt-5 mb-0 qr-title">
+							{{ qrModalData?.cageNum }} 笼号二维码
+						</span>
+						<Vue3NextQrcode
+							:text="qrCode.text"
+							:size="qrCode.size"
+							:color-dark="qrCode.colorDark"
+							:logo-image="qrCode.logo"
+							:logo-scale="0.15"
+							:logo-margin="0"
+							:logo-corner-radius="20"
+							:margin="20" />
+					</div>
 				</div>
 				<div class="text-center">
 					<el-button type="primary" class="mx-5 w-150px" @click="handleDownloadQr('qr')">

+ 39 - 19
UI/VB.VUE/src/views/device/inspection/index.vue

@@ -299,13 +299,31 @@ function handleQrCode(row) {
 	qrModalRef.value.show()
 }
 function handleDownloadQr(id: string) {
-	let myImg = document.querySelector("#" + id ) as HTMLImageElement
-	let url = myImg?.src
-	let a = document.createElement("a")
-	a.href = url
-	a.download = `${qrModalData.value.taskName}签到二维码`
-	a.click()
+	// 获取整个元素,包括标题和二维码
+	const element = document.querySelector("#" + id) as HTMLElement
+	if (!element) return
+
+	// 使用html2canvas将整个元素转换为图片
+	import("html2canvas").then((html2canvas) => {
+		html2canvas.default(element).then((canvas) => {
+			// 将canvas转换为图片blob
+			canvas.toBlob((blob) => {
+				if (!blob) return
+
+				// 创建下载链接
+				const url = URL.createObjectURL(blob)
+				const a = document.createElement("a")
+				a.href = url
+				a.download = `${qrModalData.value.taskName}签到二维码`
+				document.body.appendChild(a)
+				a.click()
+				document.body.removeChild(a)
+				URL.revokeObjectURL(url)
+			})
+		})
+	})
 }
+
 // function handlePrintQr(id: string) {
 // 	const printContent = document.querySelector("#" + id)
 // 	if (!printContent) return
@@ -463,19 +481,21 @@ onMounted(() => {
 			:close-btn-class="'btn btn-danger'"
 			append-to-body>
 			<template #body>
-				<div
-					id="qr"
-					class="w-100 w-100 d-flex flex-column justify-content-center align-items-center">
-					<span class="fs-5 fw-bold my-5 qr-title">{{ qrModalData?.taskName }} 签到二维码</span>
-					<Vue3NextQrcode
-						:text="qrCode.text"
-						:size="qrCode.size"
-						:color-dark="qrCode.colorDark"
-						:logo-image="qrCode.logo"
-						:logo-scale="0.15"
-						:logo-margin="0"
-						:logo-corner-radius="20"
-						:margin="20" />
+				<div class="w-100 d-flex justify-content-center align-items-center">
+					<div id="qr" class="d-flex flex-column align-items-center">
+						<span class="fs-5 fw-bold mt-5 mb-0 qr-title">
+							{{ qrModalData?.taskName }} 签到二维码
+						</span>
+						<Vue3NextQrcode
+							:text="qrCode.text"
+							:size="qrCode.size"
+							:color-dark="qrCode.colorDark"
+							:logo-image="qrCode.logo"
+							:logo-scale="0.15"
+							:logo-margin="0"
+							:logo-corner-radius="20"
+							:margin="20" />
+					</div>
 				</div>
 				<div class="text-center">
 					<el-button type="primary" class="mx-5 w-150px" @click="handleDownloadQr('qr')">

+ 57 - 38
UI/VB.VUE/src/views/experiment/sample/_sample.vue

@@ -65,25 +65,25 @@ const opts = reactive({
 			{ field: "sampleStatus", name: "样品状态", visible: true, isSort: false, width: 120 },
 			{ field: "actions", name: `操作`, width: 150 }
 		] as any[],
-		queryParams: {
-			sampleName: undefined,
-			batchId: undefined,
-			chickenId: undefined,
-			electronicId: undefined,
-			description: undefined,
-			sampleType: undefined,
-			sampleStatus: props.status
-		},
-		searchFormItems: [
-			{
-				field: "sampleName",
-				label: "样本名称",
-				class: "w-100",
-				required: false,
-				placeholder: "请输入样本名称",
-				component: "I",
-				listeners: {
-					keyup: (e: KeyboardEvent) => {
+	queryParams: {
+		sampleName: undefined,
+		batchId: undefined,
+		chickenId: undefined,
+		electronicId: undefined,
+		description: undefined,
+		sampleType: undefined,
+		sampleStatus: props.status
+	},
+	searchFormItems: [
+		{
+			field: "sampleName",
+			label: "样本名称",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入样本名称",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
 					if (e.code == "Enter") {
 						handleQuery()
 					}
@@ -359,12 +359,29 @@ function handleQrCode(row) {
 	qrModalRef.value.show()
 }
 function handleDownloadQr(id: string) {
-	let myImg = document.querySelector("#" + id) as HTMLImageElement
-	let url = myImg?.src
-	let a = document.createElement("a")
-	a.href = url
-	a.download = `${qrModalData.value.taskName}签到二维码`
-	a.click()
+	// 获取整个元素,包括标题和二维码
+	const element = document.querySelector("#" + id) as HTMLElement
+	if (!element) return
+
+	// 使用html2canvas将整个元素转换为图片
+	import("html2canvas").then((html2canvas) => {
+		html2canvas.default(element).then((canvas) => {
+			// 将canvas转换为图片blob
+			canvas.toBlob((blob) => {
+				if (!blob) return
+
+				// 创建下载链接
+				const url = URL.createObjectURL(blob)
+				const a = document.createElement("a")
+				a.href = url
+				a.download = `${qrModalData.value.sampleName}样品二维码`
+				document.body.appendChild(a)
+				a.click()
+				document.body.removeChild(a)
+				URL.revokeObjectURL(url)
+			})
+		})
+	})
 }
 
 const detailRef = ref()
@@ -571,19 +588,21 @@ function handlePreviewPdf(file: string) {
 			:close-btn-class="'btn btn-danger'"
 			append-to-body>
 			<template #body>
-				<div
-					id="qr"
-					class="w-100 w-100 d-flex flex-column justify-content-center align-items-center">
-					<span class="fs-5 fw-bold my-5 qr-title">{{ qrModalData?.sampleName }} 样品二维码</span>
-					<Vue3NextQrcode
-						:text="qrCode.text"
-						:size="qrCode.size"
-						:color-dark="qrCode.colorDark"
-						:logo-image="qrCode.logo"
-						:logo-scale="0.15"
-						:logo-margin="0"
-						:logo-corner-radius="20"
-						:margin="20" />
+				<div class="w-100 d-flex justify-content-center align-items-center">
+					<div id="qr" class="d-flex flex-column align-items-center">
+						<span class="fs-5 fw-bold mt-5 mb-0 qr-title">
+							{{ qrModalData?.sampleName }} 样品二维码
+						</span>
+						<Vue3NextQrcode
+							:text="qrCode.text"
+							:size="qrCode.size"
+							:color-dark="qrCode.colorDark"
+							:logo-image="qrCode.logo"
+							:logo-scale="0.15"
+							:logo-margin="0"
+							:logo-corner-radius="20"
+							:margin="20" />
+					</div>
 				</div>
 				<div class="text-center">
 					<el-button type="primary" class="mx-5 w-150px" @click="handleDownloadQr('qr')">