412 lines
8.0 KiB
Vue
412 lines
8.0 KiB
Vue
|
<template>
|
|||
|
<view :class="modal?'show-qrcode':'hide-qrcode'">
|
|||
|
<view class="box-qrcode" :style="{'margin-left': marginLeft + 'px'}" @longtap="longtapCode">
|
|||
|
<!-- style="width: 550rpx;height: 550rpx;" -->
|
|||
|
|
|||
|
<canvas class="canvas-qrcode" :style="style_w_h" :canvas-id="qrcode_id">
|
|||
|
|
|||
|
<!-- #ifndef MP -->
|
|||
|
<view v-if="modal&&is_themeImg" :style="style_w_h" class="box-img-qrcode">
|
|||
|
<image :style="style_w_h_img" mode="scaleToFill" :src="themeImg"></image>
|
|||
|
</view>
|
|||
|
<!-- #endif -->
|
|||
|
|
|||
|
</canvas>
|
|||
|
|
|||
|
<!-- <image mode="scaleToFill" :src="imagePath"></image> -->
|
|||
|
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
var qr_we = require("./qrcode_wx.js");
|
|||
|
const qrCode = require('./weapp-qrcode.js')
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
isAndroid : false ,
|
|||
|
show: true,
|
|||
|
imagePath: '',
|
|||
|
// qrcode_id: 'qrcode_id',
|
|||
|
marginLeft: 0,
|
|||
|
//一般的安卓app只需加30就能显示全
|
|||
|
//苹果app的不加就能显示全,加了就要弄margin-left
|
|||
|
//有些安卓app显示不全
|
|||
|
add_num : 30 ,
|
|||
|
add_num_key : 'rectify_code_key',
|
|||
|
}
|
|||
|
},
|
|||
|
props: {
|
|||
|
modal: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
url: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
height: {
|
|||
|
type: Number,
|
|||
|
default: 260
|
|||
|
},
|
|||
|
width: {
|
|||
|
type: Number,
|
|||
|
default: 260
|
|||
|
},
|
|||
|
themeColor: {
|
|||
|
type: String,
|
|||
|
default: '#333333',
|
|||
|
},
|
|||
|
qrcode_id: {
|
|||
|
type: String,
|
|||
|
default: 'qrcode_id',
|
|||
|
},
|
|||
|
is_themeImg: {
|
|||
|
type: Boolean,
|
|||
|
default: false,
|
|||
|
},
|
|||
|
themeImg: {
|
|||
|
type: String,
|
|||
|
default: 'https://cdn.pixabay.com/photo/2016/11/29/13/24/balloons-1869816__340.jpg',
|
|||
|
},
|
|||
|
h_w_img: {
|
|||
|
type: Number,
|
|||
|
default: 30
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
},
|
|||
|
watch:{
|
|||
|
|
|||
|
},
|
|||
|
computed: {
|
|||
|
style_w_h() {
|
|||
|
return this.set_style_w_h();
|
|||
|
},
|
|||
|
style_w_h_img() {
|
|||
|
let that = this;
|
|||
|
var height = parseInt(that.h_w_img);
|
|||
|
var width = parseInt(that.h_w_img);
|
|||
|
var style = '';
|
|||
|
if (height > 0) {
|
|||
|
style = `height:${height*2}rpx;`;
|
|||
|
}
|
|||
|
if (width > 0) {
|
|||
|
style += `width:${width*2}rpx;z-index: 2;`;
|
|||
|
}
|
|||
|
|
|||
|
return style;
|
|||
|
},
|
|||
|
},
|
|||
|
created: function() {
|
|||
|
let that = this;
|
|||
|
try {
|
|||
|
//app苹果二维码不居中
|
|||
|
//#ifndef MP
|
|||
|
let isAndroid = false ;
|
|||
|
const res = uni.getSystemInfoSync();
|
|||
|
if(res.platform == 'android'){
|
|||
|
isAndroid = true ;
|
|||
|
}else{
|
|||
|
isAndroid = false ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (!isAndroid) {
|
|||
|
that.marginLeft = 46;
|
|||
|
}
|
|||
|
|
|||
|
that.isAndroid = isAndroid ;
|
|||
|
try {
|
|||
|
const add_num = uni.getStorageSync(that.add_num_key);
|
|||
|
if (add_num) {
|
|||
|
that.add_num = add_num;
|
|||
|
}
|
|||
|
|
|||
|
} catch (e) {
|
|||
|
// error
|
|||
|
|
|||
|
}
|
|||
|
// #endif
|
|||
|
|
|||
|
} catch (e) {
|
|||
|
// error
|
|||
|
}
|
|||
|
|
|||
|
//#ifdef MP
|
|||
|
//that.marginLeft = 40;
|
|||
|
// #endif
|
|||
|
|
|||
|
},
|
|||
|
methods: {
|
|||
|
set_style_w_h(){
|
|||
|
|
|||
|
let that = this;
|
|||
|
var height = parseInt(that.height);
|
|||
|
var width = parseInt(that.width);
|
|||
|
var style = '';
|
|||
|
var height = height*2 ;
|
|||
|
var width = width*2 ;
|
|||
|
|
|||
|
//#ifndef MP
|
|||
|
var add = that.add_num ;
|
|||
|
|
|||
|
height += add;
|
|||
|
width += add;
|
|||
|
// #endif
|
|||
|
|
|||
|
if (height > 0) {
|
|||
|
style = `height:${height}rpx;`;
|
|||
|
}
|
|||
|
if (width > 0) {
|
|||
|
style += `width:${width}rpx;`;
|
|||
|
}
|
|||
|
|
|||
|
return style;
|
|||
|
},
|
|||
|
hideQrcode() {
|
|||
|
this.$emit("hideQrcode")
|
|||
|
},
|
|||
|
// 二维码生成工具
|
|||
|
crtQrCode() {
|
|||
|
let that = this;
|
|||
|
//#ifndef MP
|
|||
|
new qrCode(that.qrcode_id, {
|
|||
|
text: this.url,
|
|||
|
width: that.width,
|
|||
|
height: that.height,
|
|||
|
colorDark: that.themeColor,//#333333
|
|||
|
colorLight: "#FFFFFF",
|
|||
|
correctLevel: qrCode.CorrectLevel.H,
|
|||
|
})
|
|||
|
// #endif
|
|||
|
//#ifdef MP
|
|||
|
that.createQrCode(this.url, that.qrcode_id, that.width, that.height,that.themeColor,that.is_themeImg,that.themeImg,that.h_w_img);
|
|||
|
// #endif
|
|||
|
|
|||
|
//that.createQrCode(this.url, that.qrcode_id, that.width, that.height);
|
|||
|
},
|
|||
|
//#ifdef MP
|
|||
|
|
|||
|
createQrCode: function(url, canvasId, cavW, cavH,cavColor,haveImg,imgurl,imgsize) {
|
|||
|
//调用插件中的draw方法,绘制二维码图片
|
|||
|
qr_we.api.draw(url, canvasId, cavW, cavH,cavColor,haveImg,imgurl,imgsize, this, this.canvasToTempImage);
|
|||
|
// setTimeout(() => { this.canvasToTempImage();},100);
|
|||
|
|
|||
|
},
|
|||
|
|
|||
|
// #endif
|
|||
|
//获取临时缓存照片路径,存入data中
|
|||
|
canvasToTempImage: function() {
|
|||
|
var that = this;
|
|||
|
},
|
|||
|
saveImage: function() {
|
|||
|
var that = this;
|
|||
|
uni.canvasToTempFilePath({
|
|||
|
canvasId: that.qrcode_id,
|
|||
|
success: function(res) {
|
|||
|
var tempFilePath = res.tempFilePath;
|
|||
|
// console.log(tempFilePath);
|
|||
|
that.imagePath = tempFilePath;
|
|||
|
|
|||
|
//保存到相册
|
|||
|
// uni.saveFile({
|
|||
|
// tempFilePath: tempFilePath,
|
|||
|
// success: function (res2) {
|
|||
|
// var savedFilePath = res2.savedFilePath;
|
|||
|
|
|||
|
|
|||
|
// }
|
|||
|
// });
|
|||
|
uni.saveImageToPhotosAlbum({
|
|||
|
filePath : tempFilePath ,
|
|||
|
success: function (res3) {
|
|||
|
uni.showModal({
|
|||
|
title: '提示',
|
|||
|
content: '保存成功',
|
|||
|
confirmText: '确定',
|
|||
|
showCancel: false,
|
|||
|
confirmColor: '#33CCCC',
|
|||
|
success(res4) {
|
|||
|
|
|||
|
}
|
|||
|
})
|
|||
|
},
|
|||
|
});
|
|||
|
},
|
|||
|
fail: function(res) {
|
|||
|
// console.log(res);
|
|||
|
}
|
|||
|
}, that);
|
|||
|
},
|
|||
|
//微信小程序支持:长按二维码,提示是否保存相册
|
|||
|
//安卓APP长按校正二维码
|
|||
|
longtapCode(){
|
|||
|
var that = this;
|
|||
|
|
|||
|
//#ifndef MP
|
|||
|
uni.showModal({
|
|||
|
title: '校正二维码',
|
|||
|
content: '二维码是否异常',
|
|||
|
confirmText: '确定',
|
|||
|
confirmColor: '#33CCCC',
|
|||
|
success(res) {
|
|||
|
if (res.confirm) {
|
|||
|
that.rectify_code();
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
// #endif
|
|||
|
|
|||
|
//#ifdef MP-WEIXIN
|
|||
|
uni.showModal({
|
|||
|
title: '提示',
|
|||
|
content: '是否保存到相册',
|
|||
|
confirmText: '确定',
|
|||
|
confirmColor: '#33CCCC',
|
|||
|
success(res) {
|
|||
|
if (res.confirm) {
|
|||
|
that.saveImage();
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
// #endif
|
|||
|
},
|
|||
|
//安卓有些手机不正常,长按可选择矫正
|
|||
|
rectify_code(){
|
|||
|
var that = this;
|
|||
|
let add_num = that.add_num ;
|
|||
|
add_num += 30 ;
|
|||
|
that.add_num = add_num;
|
|||
|
that.crtQrCode();//重新生成才会立即覆盖
|
|||
|
try {
|
|||
|
//第一次长按校正设置了就不用在设置
|
|||
|
uni.setStorage({
|
|||
|
key: that.add_num_key,
|
|||
|
data: add_num,
|
|||
|
success: function() {
|
|||
|
|
|||
|
}
|
|||
|
});
|
|||
|
} catch (e) {
|
|||
|
// error
|
|||
|
|
|||
|
}
|
|||
|
},
|
|||
|
},
|
|||
|
mounted() {}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped lang="scss">
|
|||
|
// .qrcode-box {
|
|||
|
// position: fixed;
|
|||
|
// left: 0;
|
|||
|
// top: 0;
|
|||
|
// right: 0;
|
|||
|
// bottom: 0;
|
|||
|
// height: 100vh;
|
|||
|
// width: 100vw;
|
|||
|
// background-color: rgba(59, 59, 59, 0.6);
|
|||
|
// // opacity: 0.8;
|
|||
|
// text-align: center;
|
|||
|
// display: flex;
|
|||
|
// align-items: center;
|
|||
|
// display: none;
|
|||
|
|
|||
|
// .qrcode-item {
|
|||
|
// flex: 1;
|
|||
|
// position: relative;
|
|||
|
// text-align: center;
|
|||
|
|
|||
|
// .item-box {
|
|||
|
// width: 90%;
|
|||
|
// margin: auto;
|
|||
|
// display: inline-block;
|
|||
|
// margin-top: 30%;
|
|||
|
// padding-bottom: 30rpx;
|
|||
|
|
|||
|
// // animation: show 0.7s;
|
|||
|
// .title {
|
|||
|
// font-size: 46rpx;
|
|||
|
// text-align: center;
|
|||
|
// margin-bottom: 24rpx;
|
|||
|
// }
|
|||
|
|
|||
|
// .canvas {
|
|||
|
// margin: auto;
|
|||
|
// display: inline-block;
|
|||
|
// margin: auto;
|
|||
|
// }
|
|||
|
|
|||
|
// background-color: #FFFFFF;
|
|||
|
// }
|
|||
|
|
|||
|
// }
|
|||
|
// }
|
|||
|
.box-qrcode{
|
|||
|
text-align: center;
|
|||
|
position: relative;
|
|||
|
.box-img-qrcode{
|
|||
|
position: absolute;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
z-index: 2;
|
|||
|
}
|
|||
|
}
|
|||
|
image{
|
|||
|
width: 60upx;
|
|||
|
height: 60upx;
|
|||
|
border-radius: 50%;
|
|||
|
|
|||
|
}
|
|||
|
.canvas-qrcode {
|
|||
|
|
|||
|
margin: auto;
|
|||
|
display: inline-block;
|
|||
|
float: left;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
.opacity-qrcode {
|
|||
|
opacity: 0;
|
|||
|
display: block;
|
|||
|
}
|
|||
|
|
|||
|
.show-qrcode {
|
|||
|
display: block;
|
|||
|
animation: fade 0.7s;
|
|||
|
|
|||
|
// -moz-animation: fade 0.5s; /* Firefox */
|
|||
|
// -webkit-animation: fade 0.5s; /* Safari 和 Chrome */
|
|||
|
// -o-animation: fade 0.5s;
|
|||
|
}
|
|||
|
|
|||
|
.hide-qrcode {
|
|||
|
animation: hide 0.7s;
|
|||
|
}
|
|||
|
|
|||
|
@keyframes fade {
|
|||
|
from {
|
|||
|
opacity: 0.8;
|
|||
|
}
|
|||
|
|
|||
|
to {
|
|||
|
opacity: 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
@keyframes hide {
|
|||
|
from {
|
|||
|
opacity: 1;
|
|||
|
}
|
|||
|
|
|||
|
to {
|
|||
|
opacity: 0;
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|