|
@ -0,0 +1,283 @@ |
|
|
|
|
|
<template> |
|
|
|
|
|
<view class="promotion"> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<navbar title="二维码" |
|
|
|
|
|
bgColor="#A3D250" |
|
|
|
|
|
color="#fff" |
|
|
|
|
|
leftClick @leftClick="$utils.navigateBack" /> |
|
|
|
|
|
|
|
|
|
|
|
<view class="promotion-card"> |
|
|
|
|
|
<!-- <view class="user-info"> --> |
|
|
|
|
|
<!-- <image class="image" :src="userInfo.headImage" mode="widthFix"></image> --> |
|
|
|
|
|
<!-- <image class="image" src="../../static/logo.png" mode="widthFix"></image> --> |
|
|
|
|
|
<!-- <view class="user-name">{{ userInfo.nickName }}</view> --> |
|
|
|
|
|
<!-- <view class="user-name">湖南第一深情</view> --> |
|
|
|
|
|
<!-- </view> --> |
|
|
|
|
|
<!-- <view class="invitation-code-img"> |
|
|
|
|
|
<image |
|
|
|
|
|
style="width: 400rpx;" |
|
|
|
|
|
:src="imagePath" mode="widthFix"></image> |
|
|
|
|
|
</view> --> |
|
|
|
|
|
|
|
|
|
|
|
<image style="width: 100%;" :src="imagePath" mode="widthFix"></image> |
|
|
|
|
|
|
|
|
|
|
|
<!-- <view class="invitation-code">加油站: {{ title }}</view> --> |
|
|
|
|
|
<canvas id="myCanvas" type="2d" canvas-id="firstCanvas1"></canvas> |
|
|
|
|
|
</view> |
|
|
|
|
|
<view class="btns"> |
|
|
|
|
|
<view class="btn" |
|
|
|
|
|
@click="preservationImg(imagePath)">保存</view> |
|
|
|
|
|
<!-- <view class="btn">立即邀请</view> --> |
|
|
|
|
|
</view> |
|
|
|
|
|
</view> |
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
|
import { mapState } from 'vuex' |
|
|
|
|
|
export default { |
|
|
|
|
|
name: 'Promotion', |
|
|
|
|
|
computed: { |
|
|
|
|
|
...mapState(['userInfo']), |
|
|
|
|
|
}, |
|
|
|
|
|
data() { |
|
|
|
|
|
return { |
|
|
|
|
|
url: '', |
|
|
|
|
|
title: '123123', |
|
|
|
|
|
baseUrl: 'https://dianpin-img.xzaiyp.top/', |
|
|
|
|
|
canvas: {}, |
|
|
|
|
|
imagePath: '', |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
onShow() { |
|
|
|
|
|
this.getQrCode() |
|
|
|
|
|
this.$store.commit('getUserInfo') |
|
|
|
|
|
}, |
|
|
|
|
|
methods: { |
|
|
|
|
|
getQrCode() { |
|
|
|
|
|
this.$api('getInviteCode', res => { |
|
|
|
|
|
if (res.code == 200) { |
|
|
|
|
|
this.url = res.result.url |
|
|
|
|
|
this.title = res.result.name |
|
|
|
|
|
this.draw() |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
}, |
|
|
|
|
|
draw() { |
|
|
|
|
|
|
|
|
|
|
|
uni.showLoading({ |
|
|
|
|
|
title: "拼命绘画中..." |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
wx.createSelectorQuery() |
|
|
|
|
|
.select('#myCanvas') // 绘制的canvas的id |
|
|
|
|
|
.fields({ |
|
|
|
|
|
node: true, |
|
|
|
|
|
size: true |
|
|
|
|
|
}) |
|
|
|
|
|
.exec((res) => { |
|
|
|
|
|
const canvas = res[0].node |
|
|
|
|
|
// 渲染上下文 |
|
|
|
|
|
const ctx = canvas.getContext('2d') |
|
|
|
|
|
// Canvas 画布的实际绘制宽高 |
|
|
|
|
|
const width = res[0].width |
|
|
|
|
|
const height = res[0].height |
|
|
|
|
|
// 初始化画布大小 |
|
|
|
|
|
const dpr = wx.getWindowInfo().pixelRatio |
|
|
|
|
|
|
|
|
|
|
|
//根据dpr调整 |
|
|
|
|
|
// dpr 2 4 |
|
|
|
|
|
// 3 6 |
|
|
|
|
|
let Ratio = dpr * 2 |
|
|
|
|
|
console.log("bug", dpr) |
|
|
|
|
|
canvas.width = width * dpr |
|
|
|
|
|
canvas.height = height * dpr |
|
|
|
|
|
|
|
|
|
|
|
this.canvas = canvas |
|
|
|
|
|
ctx.scale(dpr, dpr) |
|
|
|
|
|
ctx.clearRect(0, 0, width, height) |
|
|
|
|
|
|
|
|
|
|
|
ctx.fillStyle = '#fff' |
|
|
|
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height) |
|
|
|
|
|
|
|
|
|
|
|
//用户图片 |
|
|
|
|
|
// const image = canvas.createImage() |
|
|
|
|
|
// image.onload = () => { |
|
|
|
|
|
// ctx.drawImage(image, 30, 18, 40, 40) |
|
|
|
|
|
// } |
|
|
|
|
|
// image.src = '/public/img/wechar_1.png' |
|
|
|
|
|
// image.src = this.userInfo.headImage |
|
|
|
|
|
ctx.fillStyle = 'black' |
|
|
|
|
|
ctx.font = '22px PingFangSC-regular'; |
|
|
|
|
|
|
|
|
|
|
|
let s = this.title || '加油站' |
|
|
|
|
|
|
|
|
|
|
|
ctx.fillText(s, canvas.width / Ratio - s.length * 11, 50); |
|
|
|
|
|
|
|
|
|
|
|
//二维码图片 |
|
|
|
|
|
const coderImage = canvas.createImage() |
|
|
|
|
|
coderImage.src = this.baseUrl + this.url |
|
|
|
|
|
coderImage.onload = () => { |
|
|
|
|
|
ctx.drawImage(coderImage, |
|
|
|
|
|
canvas.width / Ratio - 240 / 2, 100, 240, 240) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 绘制完成后存储路径 |
|
|
|
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
wx.canvasToTempFilePath({ |
|
|
|
|
|
x: 0, |
|
|
|
|
|
y: 0, |
|
|
|
|
|
width: this.canvas.width, |
|
|
|
|
|
height: this.canvas.height, |
|
|
|
|
|
canvas, |
|
|
|
|
|
success: (res) => { |
|
|
|
|
|
var tempFilePath = res.tempFilePath; |
|
|
|
|
|
this.imagePath = tempFilePath |
|
|
|
|
|
uni.hideLoading() |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
}, 600); |
|
|
|
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
}, |
|
|
|
|
|
back() { |
|
|
|
|
|
uni.navigateBack(-1) |
|
|
|
|
|
}, |
|
|
|
|
|
preservationImg(img) { |
|
|
|
|
|
let that = this |
|
|
|
|
|
uni.authorize({ |
|
|
|
|
|
/* scope.writePhotosAlbum 类型是保存到相册 */ |
|
|
|
|
|
scope: 'scope.writePhotosAlbum', |
|
|
|
|
|
success() { |
|
|
|
|
|
/* 已授权进入 */ |
|
|
|
|
|
/* 保存图片到相册方法方法 */ |
|
|
|
|
|
that.imgApi(img); |
|
|
|
|
|
}, |
|
|
|
|
|
complete(res) { |
|
|
|
|
|
/* 判断如果没有授权就打开设置选项让用户重新授权 */ |
|
|
|
|
|
uni.getSetting({ |
|
|
|
|
|
success(res) { |
|
|
|
|
|
if (!res.authSetting['scope.writePhotosAlbum']) { |
|
|
|
|
|
/* 打开设置的方法 */ |
|
|
|
|
|
that.openInstall(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
imgApi(image) { |
|
|
|
|
|
/* 获取图片的信息 */ |
|
|
|
|
|
uni.getImageInfo({ |
|
|
|
|
|
src: image, |
|
|
|
|
|
success: function(image) { |
|
|
|
|
|
/* 保存图片到手机相册 */ |
|
|
|
|
|
uni.saveImageToPhotosAlbum({ |
|
|
|
|
|
filePath: image.path, |
|
|
|
|
|
success: function() { |
|
|
|
|
|
uni.showModal({ |
|
|
|
|
|
title: '保存成功', |
|
|
|
|
|
content: '图片已成功保存到相册', |
|
|
|
|
|
showCancel: false |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
complete(res) { |
|
|
|
|
|
console.log(res); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped> |
|
|
|
|
|
.promotion { |
|
|
|
|
|
width: 100%; |
|
|
|
|
|
height: 100vh; |
|
|
|
|
|
background-color: $uni-color; |
|
|
|
|
|
.promotion-card { |
|
|
|
|
|
width: 90%; |
|
|
|
|
|
margin: 100rpx auto 0rpx auto; |
|
|
|
|
|
box-shadow: 0rpx 0rpx 15rpx rgba(0, 0, 0, .2); |
|
|
|
|
|
border-radius: 15rpx; |
|
|
|
|
|
padding: 40rpx 30rpx; |
|
|
|
|
|
box-sizing: border-box; |
|
|
|
|
|
background-color: #fff; |
|
|
|
|
|
|
|
|
|
|
|
.user-info { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
.image { |
|
|
|
|
|
width: 80rpx; |
|
|
|
|
|
height: 80rpx; |
|
|
|
|
|
border-radius: 50%; |
|
|
|
|
|
margin-right: 10rpx; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.user-name { |
|
|
|
|
|
font-size: 30rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.invitation-code-img { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
margin: 100rpx 0rpx; |
|
|
|
|
|
|
|
|
|
|
|
.image { |
|
|
|
|
|
width: 30%; |
|
|
|
|
|
border-radius: 50%; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.invitation-code { |
|
|
|
|
|
text-align: center; |
|
|
|
|
|
color: #818181; |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.btns { |
|
|
|
|
|
position: fixed; |
|
|
|
|
|
left: 0; |
|
|
|
|
|
bottom: 0; |
|
|
|
|
|
width: 100%; |
|
|
|
|
|
height: 120rpx; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
background: #fff; |
|
|
|
|
|
font-size: 28rpx; |
|
|
|
|
|
color: $uni-color; |
|
|
|
|
|
.btn { |
|
|
|
|
|
flex: 1; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
|
|
|
|
|
|
&:nth-child(2) { |
|
|
|
|
|
background: orange; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#myCanvas { |
|
|
|
|
|
position: fixed; |
|
|
|
|
|
left: 100%; |
|
|
|
|
|
/* visibility: hidden */ |
|
|
|
|
|
/* visibility: hidden; */ |
|
|
|
|
|
/* margin-top: 100rpx; */ |
|
|
|
|
|
margin: 68rpx auto; |
|
|
|
|
|
width: 750rpx; |
|
|
|
|
|
height: 750rpx; |
|
|
|
|
|
/* line-height: 20px; */ |
|
|
|
|
|
background-color: rgba(255, 255, 255, 1); |
|
|
|
|
|
text-align: center; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |