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>
|