| | |
| | | <el-space fill> |
| | | <el-alert type="warning" show-icon :closable="false"> |
| | | <p>"请输入设备编号后才能使用不然无法定位到数据来源:</p> |
| | | <p>也可以选择二维码图片识别</p> |
| | | </el-alert> |
| | | <el-form-item label="设备编号"> |
| | | <el-input v-model="deviceCode" /> |
| | | </el-form-item> |
| | | </el-space> |
| | | </el-form> |
| | | <video ref="video" width="300" height="300" autoplay></video> |
| | | <div> |
| | | <input type="file" pattern="选取二维码" accept="image/*" @change="onFileChange" /> |
| | | <input type="text" v-model="codeResult" placeholder="扫描结果将会显示在这里"> |
| | | </div> |
| | | </span> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="centerDialogVisible = false">取消</el-button> |
| | | <el-button type="primary" @click="shaoma"> |
| | | 扫码录入 |
| | | </el-button> |
| | | <el-button type="primary" @click="saveSet"> |
| | | 确认 |
| | | </el-button> |
| | |
| | | ElMessage.warning('请先输入设备编号') |
| | | } |
| | | } |
| | | function captureFrame() { |
| | | if (!video.value) return; |
| | | const onFileChange=(event: Event) =>{ |
| | | const inputElement = event.target as HTMLInputElement; |
| | | if (!inputElement.files || inputElement.files.length === 0) return; |
| | | |
| | | const file = inputElement.files[0]; |
| | | const reader = new FileReader(); |
| | | |
| | | reader.onload = function(e) { |
| | | if (e.target && typeof e.target.result === 'string') { |
| | | const img = document.createElement('img'); |
| | | img.src = e.target.result; |
| | | img.onload = function() { |
| | | const canvas = document.createElement('canvas'); |
| | | const context = canvas.getContext('2d'); |
| | | if (!context || !video.value) return; |
| | | |
| | | canvas.width = video.value.videoWidth; |
| | | canvas.height = video.value.videoHeight; |
| | | context.drawImage(video.value, 0, 0, canvas.width, canvas.height); |
| | | const imageData = context.getImageData(0, 0, canvas.width, canvas.height); |
| | | |
| | | // 解析二维码 |
| | | canvas.width = img.width; |
| | | canvas.height = img.height; |
| | | const ctx = canvas.getContext('2d'); |
| | | if (ctx) { |
| | | ctx.drawImage(img, 0, 0); |
| | | const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); |
| | | const code = jsQR(imageData.data, imageData.width, imageData.height); |
| | | if (code) { |
| | | codeResult.value = code.data; |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | }; |
| | | |
| | | // 定期捕获帧 |
| | | setTimeout(captureFrame, 500); |
| | | } |
| | | const startCamera=async()=> { |
| | | if (video.value) { |
| | | try { |
| | | stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }); |
| | | if (video.value) { |
| | | video.value.srcObject = stream; |
| | | video.value.play(); |
| | | |
| | | // 开始捕获帧 |
| | | captureFrame(); |
| | | } |
| | | } catch (e) { |
| | | console.error("无法访问摄像头", e); |
| | | } |
| | | } |
| | | reader.readAsDataURL(file); |
| | | } |
| | | const shaoma=()=>{ |
| | | startCamera() |
| | | } |
| | | watch( |
| | | () => deviceData.value.设备变化, |