9 changed files with 298 additions and 11 deletions
@ -0,0 +1,251 @@ |
|||
<template> |
|||
<div class="page bgc-f4f4f4"> |
|||
<label class="backlab" @click="back()"></label> |
|||
<div class="video-show" /> |
|||
<video id="video" ref="video" class="video vjs-fluid" autoplay /> |
|||
<span class="change" @click="change"> |
|||
<i class="el-icon-refresh" /> |
|||
</span> |
|||
</div> |
|||
</template> |
|||
|
|||
<!-- import Vconsolefrom from 'vconsole'; --> |
|||
<!-- new Vconsolefrom(); --> |
|||
|
|||
<script> |
|||
// 看到这个没,这个是一个小插件,能在手机上打开控制台,你打印的控制台信息和报错都能在这显示,具体方法自己百度 |
|||
import Vconsole from "vconsole"; |
|||
import { BrowserMultiFormatReader } from "@zxing/library"; |
|||
import {szyptGetToken} from '../../api/Home'; |
|||
import wx from 'weixin-js-sdk'; |
|||
export default { |
|||
name: "QrCodeSearch", |
|||
components: {}, |
|||
data() { |
|||
return { |
|||
loadingShow: false, |
|||
// 这个就是从@zxing/library导出来的方法,new一个实例 |
|||
codeReader: new BrowserMultiFormatReader(), |
|||
// 这个,用来储存扫码得到的结果 |
|||
textContent: null, |
|||
// 这个,就是当前调用的摄像头的索引,为什么是6,我会在后面说的 |
|||
num: 6, |
|||
// 这个就是扫描到的摄像头的数量 |
|||
videoLength: "" |
|||
}; |
|||
}, |
|||
created() { |
|||
// 让我们调用这个方法尝试打开摄像头 |
|||
this.openScan(); |
|||
// new Vconsole(); |
|||
}, |
|||
methods: { |
|||
// 开打开打 |
|||
openScan() { |
|||
let that = this; |
|||
let fullUrl = window.location.href; |
|||
let code = fullUrl.substring(fullUrl.indexOf('code=')+5, fullUrl.indexOf('&state=')); |
|||
let paramUrl = window.location.href.split("#")[0]; |
|||
let param = { code: code, url: paramUrl }; |
|||
szyptGetToken(param,success =>{ |
|||
let resMsg = success.data; |
|||
console.log(resMsg); |
|||
wx.config({ |
|||
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 |
|||
debug: false, |
|||
// 必填,公众号的唯一标识 |
|||
appId: resMsg.corpid, |
|||
// 必填,生成签名的时间戳 |
|||
timestamp: resMsg.timestamp, |
|||
// 必填,生成签名的随机串 |
|||
nonceStr: resMsg.nonceStr, |
|||
// 必填,签名,见附录1 |
|||
signature: resMsg.signature, |
|||
// 必填,需要使用的JS接口列表,所有JS接口列表见附录2 |
|||
jsApiList: ["scanQRCode"], |
|||
}); |
|||
wx.ready(() => { |
|||
//微信扫一扫请求操作 |
|||
this.ClickScan() |
|||
}); |
|||
wx.error((res) => { |
|||
console.log("获取失败"); |
|||
}); |
|||
},error =>{}); |
|||
}, |
|||
ClickScan() { |
|||
wx.scanQRCode({ |
|||
needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, |
|||
scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有 |
|||
success: (res) => { |
|||
// 页面跳转 |
|||
console.log("=========== 扫码返回 ===========") |
|||
console.log(res) |
|||
this.$router.push({ |
|||
path:"/enterpriseScanPreview", |
|||
query:{ |
|||
enterpriseNumber: res.resultStr |
|||
} |
|||
}) |
|||
}, |
|||
cancel: (res) => { |
|||
console.log('err', res); |
|||
}, |
|||
}); |
|||
}, |
|||
//这就是在openScan里调的另一个方法,传入想调用的摄像头id和摄像头数量 |
|||
decodeFromInputVideoFunc(firstDeviceId, length) { |
|||
const that = this; |
|||
that.codeReader.reset(); // 重置 |
|||
that.textContent = null; // 重置 |
|||
// 看不懂不重要,打印出来自己琢磨琢磨 |
|||
that.codeReader.decodeFromInputVideoDeviceContinuously( |
|||
firstDeviceId, |
|||
"video", |
|||
(result, err) => { |
|||
that.textContent = null; |
|||
// 扫描成功 这个result就是扫描结果,长啥样自己打印出来看看 |
|||
if (result) { |
|||
that.textContent = result; |
|||
// 这里写你要对扫描结果做什么,我这里扫描出来的是个网址,写的页面跳转 |
|||
if (that.textContent) { |
|||
setTimeout(() => { |
|||
this.$router.push({ |
|||
path:"/enterpriseScanPreview", |
|||
query:{ |
|||
enterpriseNumber: that.textContent |
|||
} |
|||
}) |
|||
// 记得重置,不然在微信里用会有问题 |
|||
that.textContent = null; |
|||
that.codeReader && that.codeReader.reset(); |
|||
}, 100); |
|||
} |
|||
} |
|||
// 扫描失败,我这里是直接找下一个摄像头,其实可以不写 |
|||
if (err && !err) { |
|||
this.num++; |
|||
setTimeout(() => { |
|||
that.tipShow = false; |
|||
}, 2000); |
|||
if (this.num <= length) { |
|||
that.openScan(); |
|||
} |
|||
console.error(err); |
|||
} |
|||
} |
|||
); |
|||
}, |
|||
// 点击切换前后摄像头 |
|||
change() { |
|||
const that = this; |
|||
if (this.videoLength > 2) { |
|||
if (this.num < 2) { |
|||
this.num = 6; |
|||
} else { |
|||
this.num = 1; |
|||
} |
|||
that.textContent = null; |
|||
that.codeReader && that.codeReader.reset(); |
|||
that.openScan(); |
|||
} else { |
|||
if (that.num === 0) { |
|||
that.num = 1; |
|||
} else { |
|||
that.num = 0; |
|||
} |
|||
that.textContent = null; |
|||
that.codeReader && that.codeReader.reset(); |
|||
that.openScan(); |
|||
} |
|||
}, |
|||
back(){ |
|||
this.$router.go(-1); |
|||
}, |
|||
|
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
|
|||
<style scoped> |
|||
.backlab { |
|||
position: absolute; |
|||
z-index: 999999; |
|||
top: 0.5rem; |
|||
left: 0.35rem; |
|||
padding-left: 0; |
|||
width: 0.6rem; |
|||
height: 0.6rem; |
|||
background: url(../../assets/images/icon_arbw.png) no-repeat left 40% center; |
|||
background-size: auto 50%; |
|||
background-color: rgba(255, 255, 255, .2); |
|||
border: 1px solid rgba(255, 255, 255, .7); |
|||
border-radius: 50%; |
|||
} |
|||
.video { |
|||
width: 100vw; |
|||
height: 100vh; |
|||
z-index: 1; |
|||
} |
|||
.video-show { |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
width: 70vw; |
|||
height: 70vw; |
|||
z-index: 2; |
|||
background: linear-gradient(to left, #fff, #fff) left top no-repeat, |
|||
linear-gradient(to bottom, #fff, #fff) left top no-repeat, |
|||
linear-gradient(to left, #fff, #fff) right top no-repeat, |
|||
linear-gradient(to bottom, #fff, #fff) right top no-repeat, |
|||
linear-gradient(to left, #fff, #fff) left bottom no-repeat, |
|||
linear-gradient(to bottom, #fff, #fff) left bottom no-repeat, |
|||
linear-gradient(to left, #fff, #fff) right bottom no-repeat, |
|||
linear-gradient(to left, #fff, #fff) right bottom no-repeat; |
|||
background-size: 2px 20px, 20px 2px, 2px 20px, 20px 2px; |
|||
} |
|||
.tip { |
|||
width: 10vw; |
|||
height: 10vw; |
|||
background-color: rgb(45, 236, 45); |
|||
border: 1px solid #ffffff; |
|||
border-radius: 50%; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
z-index: 10; |
|||
} |
|||
|
|||
.bgc-f4f4f4 { |
|||
background-color: #363636; |
|||
} |
|||
|
|||
.page { |
|||
position: relative; |
|||
overflow-y: auto; |
|||
position: relative; |
|||
height: 100vh; |
|||
} |
|||
.change { |
|||
z-index: 100; |
|||
position: fixed; |
|||
bottom: 40px; |
|||
left: 50%; |
|||
transform: translateX(-50%); |
|||
color: #fff; |
|||
text-align: center; |
|||
background-color: #fff; |
|||
width: 50px; |
|||
height: 50px; |
|||
border-radius: 50%; |
|||
line-height: 60px; |
|||
/* align-content: center; */ |
|||
} |
|||
.el-icon-refresh { |
|||
color: #000; |
|||
font-size: 25px; |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue