护理区域生成二维码功能

This commit is contained in:
yangjun 2025-07-25 14:19:48 +08:00
parent 45a0a86b2f
commit 6a34074404
3 changed files with 121 additions and 0 deletions

View File

@ -0,0 +1,104 @@
<template>
<div class="qr-code-container">
<canvas ref="qrCanvas" ></canvas>
<button @click="downloadQR">下载二维码</button>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import QRCode from 'qrcode';
const props = defineProps({
text: { type: String, required: true }, //
logoUrl: { type: String, default: '' }, // Logo URL
size: { type: Number, default: 200 }, //
logoSize: { type: Number, default: 20 }, // Logo
margin: { type: Number, default: 1 }, //
});
const qrCanvas = ref(null);
// Logo
const generateQR = async () => {
try {
// 1.
await QRCode.toCanvas(qrCanvas.value, props.text, {
width: props.size,
margin: props.margin,
color: {
dark: '#000000', //
light: '#ffffff' //
}
});
// 2. Logo
if (props.logoUrl) {
const canvas = qrCanvas.value;
const ctx = canvas.getContext('2d');
// Logo
const logoImg = new Image();
logoImg.src = props.logoUrl;
logoImg.crossOrigin = 'Anonymous'; //
//
logoImg.onerror = () => {
console.error('图片加载失败!请检查 URL 或跨域设置:', props.logoUrl);
};
logoImg.onload = () => {
// Logo
const logoPos = (props.size - props.logoSize) / 2;
// Logo
ctx.fillStyle = '#ffffff';
ctx.fillRect(logoPos, logoPos, props.logoSize, props.logoSize);
// Logo
ctx.drawImage(logoImg, logoPos, logoPos, props.logoSize, props.logoSize);
};
}
} catch (err) {
console.error('生成二维码失败:', err);
}
};
//
const downloadQR = () => {
const originalCanvas = qrCanvas.value;
const scale = 4; //
// Canvas
const hdCanvas = document.createElement('canvas');
hdCanvas.width = originalCanvas.width * scale;
hdCanvas.height = originalCanvas.height * scale;
// Canvas
const ctx = hdCanvas.getContext('2d');
ctx.imageSmoothingEnabled = false; // 齿
ctx.drawImage(originalCanvas, 0, 0, hdCanvas.width, hdCanvas.height);
// ctx.drawImage(
// originalCanvas,
// 0, 0,
// originalCanvas.width, originalCanvas.height, //
// -280, -280,
// hdCanvas.width*2 -50, hdCanvas.height*2-50 //
// );
//
const link = document.createElement('a');
link.download = props.text+'-ewm.png';
link.href = hdCanvas.toDataURL('image/png');
link.click();
};
//
onMounted(generateQR);
</script>
<style scoped>
.qr-code-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
</style>

View File

@ -30,6 +30,12 @@ export const columns: BasicColumn[] = [
align: "center",
dataIndex: 'status_dictText',
},
{
title: '二维码',
align: "center",
dataIndex: 'ewm',
width:150
},
];
// 高级查询数据

View File

@ -68,6 +68,15 @@
<template v-else-if="column.key === 'nuName'">
<a @click="handleWlsb(record)">{{text}}</a>
</template>
<template v-else-if="column.key === 'ewm'">
<QRCodeWithLogo
:text="record.nuId"
:logoUrl="logoUrl"
:size="150"
:logoSize="40"
/>
</template>
</template>
</BasicTable>
<!-- 表单区域 -->
@ -93,7 +102,9 @@
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';
import { useMessage } from '/@/hooks/web/useMessage';
import QRCodeWithLogo from './EwmImage.vue';
const logoUrl = 'https://www.focusnu.com/devops/resource/img/logo.png'; // Logo URL
const { createMessage } = useMessage();