123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- <template>
- <view class="invitePoster-box">
- <GloableLoading />
- <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 class="saveposter-but flex-items-plus mar-top-50" @click="savePoster(1)">
- 保存海报
- </view>
- <!-- #endif -->
- <!-- #ifdef H5 -->
- <view class="saveposter-but flex-items-plus mar-top-50" @click="savePoster(2)">
- 预览海报
- </view>
- <!-- #endif -->
- </view>
- <view class="bor-reu-8 pad-bot-30 canvas-box">
- <canvas id="posterCanvas" style="width: 375px; height: 560px;" canvas-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:"生成图片中..."
- // })
- const 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:"图片生成中..."
- // })
- const 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() {
- const that = this
- // #ifndef MP-WEIXIN
- uni.getImageInfo({
- src: that.data.headImage,
- success(image) {
- that.headImage = image.path
- uni.getImageInfo({
- src: that.data.image,
- success(image2) {
- that.image = image2.path
- uni.getImageInfo({
- src: that.qrcode,
- success(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(image2) {
- that.image = image2.path
- uni.getImageInfo({
- src: that.qrcode,
- success(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 = ''; let 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) => {
- const 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(res) {
- const 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>
|