多租户商城-商户小程序端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

475 lines
15 KiB

<template>
<view class="invitePoster-box">
<gloable-loading />
<view class="poster-box flex-items-plus flex-column">
<image
class="header-img mar-top-10"
:src="data.headImage"
></image>
<label class="mar-top-30">发现一件好物快来和我一起拼</label>
<image
class="poster-img mar-top-50"
:src="data.image"
></image>
<view class="flex-row-plus flex-sp-between mar-top-40">
<view class="flex-column-plus">
<label class="title-lab fs28">{{ data.productName }}</label>
<view class="spellNum flex-items-plus font-color-C5AA7B mar-top-30 fs24">{{ data.person }}人团</view>
<view class="flex-row-plus mar-top-20 flex-items">
<label class="font-color-C5AA7B fs24">¥</label>
<label class="font-color-C5AA7B fs36 mar-left-5">{{ data.price }}</label>
<label class="font-color-999 fs26 mar-left-20">原价¥{{ data.originalPrice }}</label>
</view>
</view>
<view class="flex-column-plus flex-items-plus">
<image
style="width: 180upx;height: 180upx;"
:src="qrcode"
></image>
<label class="font-color-666">扫描二维码</label>
</view>
</view>
<!-- #ifndef H5 -->
<view
@click="savePoster(1)"
class="saveposter-but flex-items-plus mar-top-50"
>保存海报
</view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view
@click="savePoster(2)"
class="saveposter-but flex-items-plus mar-top-50"
>预览海报
</view>
<!-- #endif -->
</view>
<view class="bor-reu-8 pad-bot-30 canvas-box">
<canvas
style="width: 375px; height: 560px;"
canvas-id="posterCanvas"
id="posterCanvas"
></canvas>
</view>
</view>
</template>
<script>
import GloableLoading from "../../components/diyLoading";
import { base64ToPath } from 'image-tools'
const NET = require('../../utils/request')
const API = require('../../config/api')
export default {
components: {GloableLoading},
data() {
return {
data: {},
canvasWidth: 0,
codeImg: '',
codeImg2: '',
headImage: '',
image: '',
qrcode: '',
qrcodeimg: '',
loadingQrcode: true
};
},
onLoad(options) {
this.data = JSON.parse(options.data)
this.getShare()
},
methods: {
savePoster(type) {
if (this.loadingQrcode) {
uni.showToast({
icon: "none",
title: "请稍等,正在生成二维码..."
})
return
}
this.$showLoading()
if (type == 1) {
// uni.showLoading({
// mask: true,
// title:"生成图片中..."
// })
let that = this
setTimeout(() => {
// #ifdef H5 || MP-WEIXIN || APP-PLUS
uni.canvasToTempFilePath({ //把画布转化成临时文件进行保存
fileType: 'png', // 保存成的文件类型
quality: 0, // 图片质量
canvasId: 'posterCanvas', // 画布ID
success: (res) => {
this.$hideLoading()
that.saveDownload(res.tempFilePath)
},
fail: () => {
uni.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
})
this.$hideLoading()
// uni.hideLoading();
}
})
// #endif
// #ifdef MP-ALIPAY
const CanvasContext = my.createCanvasContext('posterCanvas');
CanvasContext.toTempFilePath({
success: (res) => {
my.saveImage({
url: res.apFilePath,
success: res => {
// uni.hideLoading();
this.$hideLoading()
uni.showToast({
title: '图片保存成功~',
duration: 2000
})
},
fail: err => {
this.$hideLoading()
console.error('saveImage err', err)
},
})
},
fail: () => {
this.$hideLoading()
uni.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
})
// uni.hideLoading();
}
})
// #endif
}, 5000)
} else if (type == 2) {
// uni.showLoading({
// mask: true,
// title:"图片生成中..."
// })
let that = this
setTimeout(() => {
uni.canvasToTempFilePath({ //把画布转化成临时文件进行保存
fileType: 'png', // 保存成的文件类型
quality: 0, // 图片质量
canvasId: 'posterCanvas', // 画布ID
success: (res) => {
uni.downloadFile({
url: res.tempFilePath,//网络路径,下载下来
success: (res1) => {
this.$hideLoading()
if (res1.statusCode === 200) {
// uni.hideLoading();
uni.showModal({
title: '提示',
content: '长按即可保存图片',
confirmText: "确定",
cancelText: '取消',
success: (res) => {
if (res.confirm) {
uni.previewImage({
current: res1.tempFilePath, // 当前显示图片的http链接
urls: [res1.tempFilePath] // 需要预览的图片http链接列表
})
}
}
})
}
}
})
},
fail: (err) => {
this.$hideLoading()
uni.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
})
}
})
}, 5000)
}
},
saveDownload(file) {
const that = this
// uni.showLoading({
// mask: true,
// title:"图片保存中..."
// })
this.$showLoading()
uni.getImageInfo({
src: file,
success: (res1) => {
// 2-保存图片至相册
uni.saveImageToPhotosAlbum({ // 存成图片至手机
filePath: res1.path, //画布保存的图片临时文件
success: (res2) => {
this.$hideLoading()
// uni.hideLoading();
uni.showToast({
title: '图片保存成功~',
duration: 2000
})
},
fail: (res3) => {
this.$hideLoading()
if (res3.errMsg === 'saveImageToPhotosAlbum:fail auth deny') {
// that.$store.dispatch('SetPhoneShow', 1)
uni.showToast({
title: '保存失败,请检查是否授权小程序保存图片!',
duration: 3000,
icon: 'none'
})
} else {
uni.showToast({
title: '保存失败,稍后再试',
duration: 2000,
icon: 'none'
})
}
// uni.hideLoading();
}
})
}
})
},
getShare() {
NET.request(API.getShare,
{
collageId: this.data.collageId,
orderId: this.data.orderId,
productId: this.data.productId,
skuId: this.data.skuId,
type: 0
},
"GET").then(res => {
// #ifndef MP-WEIXIN
this.qrcode = res.data.qrcode
// #endif
// #ifdef MP-WEIXIN
this.qrcode = res.data.xcxQrcode
// #endif
this.getCanvas()
this.loadingQrcode = false
}).catch(res => {
})
},
getCanvas() {
let that = this
// #ifndef MP-WEIXIN
uni.getImageInfo({
src: that.data.headImage,
success: function (image) {
that.headImage = image.path
uni.getImageInfo({
src: that.data.image,
success: function (image2) {
that.image = image2.path
uni.getImageInfo({
src: that.qrcode,
success: function (image3) {
that.qrcodeimg = image3.path
setTimeout(() => {
var ctx = uni.createCanvasContext('posterCanvas')
ctx.setFillStyle('#FFFFFF')
ctx.fillRect(0, 0, 375, 560)
// ctx.drawImage(that.data.headImage, 0, 0, 150, 100)
that.drawRound(ctx, 25, 160, 28, that.headImage)
ctx.setFontSize(14)
ctx.setFillStyle('#333333')
ctx.fillText('发现一件好物,快来和我一起拼', 89, 120)
ctx.drawImage(that.image, 25, 150, 310, 200)
ctx.setFontSize(14)
ctx.setFillStyle('#333333')
ctx.fillText(that.data.productName, 40, 390)
ctx.setFontSize(14)
ctx.setFillStyle('#C5AA7B')
ctx.fillText(that.data.person + '人团', 40, 430)
ctx.setFontSize(24)
ctx.setFillStyle('#C5AA7B')
ctx.fillText('¥' + that.data.price, 40, 470)
ctx.setFontSize(14)
ctx.setFillStyle('#999999')
ctx.fillText('原价:¥' + that.data.originalPrice, 120, 468)
ctx.drawImage(that.qrcodeimg, 245, 370, 80, 80)
ctx.setFontSize(14)
ctx.setStrokeStyle('#666666')
ctx.fillText('扫描二维码', 250, 468)
ctx.draw()
}, 1500)
}
});
}
});
}
});
// #endif
// #ifdef MP-WEIXIN
uni.getImageInfo({
src: that.data.image,
success: function (image2) {
that.image = image2.path
uni.getImageInfo({
src: that.qrcode,
success: function (image3) {
that.qrcodeimg = image3.path
setTimeout(() => {
var ctx = uni.createCanvasContext('posterCanvas')
ctx.setFillStyle('#FFFFFF')
ctx.fillRect(0, 0, 375, 560)
// ctx.drawImage(that.data.headImage, 0, 0, 150, 100)
// that.drawRound(ctx, 25, 160, 28, that.headImage)
ctx.setFontSize(14)
ctx.setFillStyle('#333333')
ctx.fillText('发现一件好物,快来和我一起拼', 89, 120)
ctx.drawImage(that.image, 25, 150, 310, 200)
ctx.setFontSize(14)
ctx.setFillStyle('#333333')
let newStr = '',startPartIndex = 0
for (let i = 0; i < that.data.productName.length; i++) {
if(i%14=== 0){
newStr += (that.data.productName.slice(startPartIndex,i) + '\n')
startPartIndex = i
}
if(i === that.data.productName.length-1) newStr += that.data.productName.slice(startPartIndex)
}
const productNameArr = newStr.split('\n').filter(item=>item);
productNameArr.forEach((productNameItem,productNameIndex)=>{
let y = 390 + (productNameIndex * 22 )
ctx.fillText(productNameItem, 40, y)
})
ctx.setFontSize(14)
ctx.setFillStyle('#C5AA7B')
ctx.fillText(that.data.person + '人团', 40, 430 + ((productNameArr.length - 1 )* 22))
ctx.setFontSize(24)
ctx.setFillStyle('#C5AA7B')
ctx.fillText('¥' + that.data.price, 40, 470 + ((productNameArr.length-1) * 22))
ctx.setFontSize(14)
ctx.setFillStyle('#999999')
ctx.fillText('原价:¥' + that.data.originalPrice, 120, 468+((productNameArr.length-1) * 22))
ctx.drawImage(that.qrcodeimg, 245, 370+ (productNameArr.length-1) * 22, 80, 80)
ctx.setFontSize(14)
ctx.setStrokeStyle('#666666')
ctx.fillText('扫描二维码', 250, 468 + (productNameArr.length-1) * 22)
ctx.draw()
}, 1500)
}
});
}
});
// #endif
},
exportImg() {
uni.canvasToTempFilePath({
fileType: "jpg",
canvasId: 'couponQrcode',
success: function (res) {
let that = this
// 在H5平台下,tempFilePath 为 base64
// #ifndef H5
that.codeImg = res.tempFilePath
// #endif
// #ifdef H5
base64ToPath(res.tempFilePath).then(path => {
that.codeImg = path
}).catch(error => {
console.error(error)
});
// #endif
}
})
},
drawRound(ctx, r, x, y, img) {
ctx.save() // 保存之前的
var r = r // 半径*屏幕分辨率比例
var d = 2 * r // 直径
var cx = x + r // 圆弧坐标x
var cy = y + r // 圆弧坐标 y
ctx.arc(cx, cy, r, 0, 2 * Math.PI)
ctx.clip() // 裁剪
ctx.drawImage(img, x, y, d, d) // 画头像
ctx.restore() // 返回上一状态
},
}
}
</script>
<style lang="scss">
.qrcode {
padding: 0upx 0 20upx 0;
display: flex;
align-items: center;
justify-content: center;
}
.title {
text-align: center;
}
.canvas-box {
position: absolute;
top: -88888rpx;
}
page {
background-color: #F7F7F7;
}
.invitePoster-box {
.bor-reu-8 {
border-radius: 8rpx;
}
.poster-box {
background-color: #FFFFFF;
margin: 30rpx 30rpx;
width: 690rpx;
padding: 40rpx 34rpx;
border-radius: 8rpx;
.header-img {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
}
.poster-img {
width: 100%;
height: 414rpx;
}
.title-lab {
width: 400rpx;
}
.spellNum {
background-color: #FFEDDF;
border-radius: 22rpx;
width: 144rpx;
height: 44rpx;
}
.code-img {
width: 142rpx;
height: 142rpx;
}
.saveposter-but {
border-radius: 5rpx;
background-color: #C5AA7B;
color: #FFFFFF;
width: 420rpx;
height: 66rpx;
}
}
}
</style>