245 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			245 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Vue
		
	
	
	
| 
								 | 
							
								<!--
							 | 
						||
| 
								 | 
							
								 * @Descripttion: 
							 | 
						||
| 
								 | 
							
								 * @version: 
							 | 
						||
| 
								 | 
							
								 * @Author: kBank
							 | 
						||
| 
								 | 
							
								 * @Date: 2022-12-13 15:02:12
							 | 
						||
| 
								 | 
							
								-->
							 | 
						||
| 
								 | 
							
								<template>
							 | 
						||
| 
								 | 
							
								  <view>
							 | 
						||
| 
								 | 
							
								    <!-- 海报 -->
							 | 
						||
| 
								 | 
							
								    <view class="popup"
							 | 
						||
| 
								 | 
							
								          v-show="popShow">
							 | 
						||
| 
								 | 
							
								      <view class="all"
							 | 
						||
| 
								 | 
							
								            id="qrCodeDiv"
							 | 
						||
| 
								 | 
							
								            ref="qrCodeDiv">
							 | 
						||
| 
								 | 
							
								        <canvas :style="{ width: canvasW + 'px', height: canvasH + 'px' }"
							 | 
						||
| 
								 | 
							
								                canvas-id="myCanvas"
							 | 
						||
| 
								 | 
							
								                id="myCanvas"></canvas>
							 | 
						||
| 
								 | 
							
								      </view>
							 | 
						||
| 
								 | 
							
								      <view class="btn"
							 | 
						||
| 
								 | 
							
								            @click="savePosterPath()">保存到手机</view>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    </view>
							 | 
						||
| 
								 | 
							
								    <!-- 模态框 -->
							 | 
						||
| 
								 | 
							
								    <view class="mask"
							 | 
						||
| 
								 | 
							
								          v-show="popShow"
							 | 
						||
| 
								 | 
							
								          @tap="popShow = false"></view>
							 | 
						||
| 
								 | 
							
								    <!-- 底部弹框 -->
							 | 
						||
| 
								 | 
							
								    <u-action-sheet :actions="list"
							 | 
						||
| 
								 | 
							
								                    :closeOnClickOverlay="true"
							 | 
						||
| 
								 | 
							
								                    @close="closeIsShow"
							 | 
						||
| 
								 | 
							
								                    @select="selectClick"
							 | 
						||
| 
								 | 
							
								                    :show="isShow"></u-action-sheet>
							 | 
						||
| 
								 | 
							
								  </view>
							 | 
						||
| 
								 | 
							
								</template>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script>
							 | 
						||
| 
								 | 
							
								import { qrCode } from '@/config/goods.js'
							 | 
						||
| 
								 | 
							
								export default {
							 | 
						||
| 
								 | 
							
								  data() {
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								      bgImg:
							 | 
						||
| 
								 | 
							
								        'https://sea-buck.oss-cn-beijing.aliyuncs.com/test/resources/share.jpg',
							 | 
						||
| 
								 | 
							
								      postImg: '',
							 | 
						||
| 
								 | 
							
								      goodImg: '',
							 | 
						||
| 
								 | 
							
								      canvasW: 320, // 画布宽
							 | 
						||
| 
								 | 
							
								      canvasH: 480, // 画布高
							 | 
						||
| 
								 | 
							
								      popShow: false,
							 | 
						||
| 
								 | 
							
								      isShow: false,
							 | 
						||
| 
								 | 
							
								      list: [
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          name: '生成海报',
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								      ],
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  methods: {
							 | 
						||
| 
								 | 
							
								    selectClick() {
							 | 
						||
| 
								 | 
							
								      this.popShow = true
							 | 
						||
| 
								 | 
							
								      this.isShow = false
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    closeIsShow() {
							 | 
						||
| 
								 | 
							
								      this.isShow = false
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    // 点击分享
							 | 
						||
| 
								 | 
							
								    openImg(item) {
							 | 
						||
| 
								 | 
							
								      this.isShow = true
							 | 
						||
| 
								 | 
							
								      this.toShare(item)
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    toShare(item) {
							 | 
						||
| 
								 | 
							
								      let pkId = item.pkId
							 | 
						||
| 
								 | 
							
								      this.goodImg = item.cover1
							 | 
						||
| 
								 | 
							
								      qrCode({
							 | 
						||
| 
								 | 
							
								        codeType: 1,
							 | 
						||
| 
								 | 
							
								        waresId: pkId,
							 | 
						||
| 
								 | 
							
								      }).then((res) => {
							 | 
						||
| 
								 | 
							
								        this.postImg = res.data
							 | 
						||
| 
								 | 
							
								        this.toCanvas()
							 | 
						||
| 
								 | 
							
								        // this.popShow = true
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    async toCanvas() {
							 | 
						||
| 
								 | 
							
								      // 背景图片
							 | 
						||
| 
								 | 
							
								      let imgBg = await this.storyImg(this.bgImg)
							 | 
						||
| 
								 | 
							
								      // 商品图片
							 | 
						||
| 
								 | 
							
								      let imggoodList = await this.storyImg(this.goodImg)
							 | 
						||
| 
								 | 
							
								      // 二维码
							 | 
						||
| 
								 | 
							
								      let imgPost = await this.storyImg(this.postImg)
							 | 
						||
| 
								 | 
							
								      setTimeout(() => {
							 | 
						||
| 
								 | 
							
								        var ctx = uni.createCanvasContext('myCanvas', this)
							 | 
						||
| 
								 | 
							
								        ctx.drawImage(imgBg, 0, 0, this.canvasW, this.canvasH) //插入图片
							 | 
						||
| 
								 | 
							
								        ctx.drawImage(imggoodList, 95, 175, 130, 130)
							 | 
						||
| 
								 | 
							
								        ctx.drawImage(imgPost, 239, 392, 65, 65)
							 | 
						||
| 
								 | 
							
								        ctx.draw(true, (ret) => {})
							 | 
						||
| 
								 | 
							
								      }, 100)
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    //获取图片缓存地址
							 | 
						||
| 
								 | 
							
								    storyImg(img) {
							 | 
						||
| 
								 | 
							
								      return new Promise((reslove, reject) => {
							 | 
						||
| 
								 | 
							
								        uni.getImageInfo({
							 | 
						||
| 
								 | 
							
								          src: img,
							 | 
						||
| 
								 | 
							
								          success: (res) => {
							 | 
						||
| 
								 | 
							
								            reslove(res.path)
							 | 
						||
| 
								 | 
							
								          },
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    // 保存相册
							 | 
						||
| 
								 | 
							
								    savePosterPath() {
							 | 
						||
| 
								 | 
							
								      let that = this
							 | 
						||
| 
								 | 
							
								      uni.getSetting({
							 | 
						||
| 
								 | 
							
								        success(res) {
							 | 
						||
| 
								 | 
							
								          console.log('res', res)
							 | 
						||
| 
								 | 
							
								          if (!res.authSetting['scope.writePhotosAlbum']) {
							 | 
						||
| 
								 | 
							
								            uni.authorize({
							 | 
						||
| 
								 | 
							
								              scope: 'scope.writePhotosAlbum',
							 | 
						||
| 
								 | 
							
								              success() {
							 | 
						||
| 
								 | 
							
								                // 同意授权
							 | 
						||
| 
								 | 
							
								                that.saveLocal()
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              fail() {
							 | 
						||
| 
								 | 
							
								                console.log('拒绝过授权')
							 | 
						||
| 
								 | 
							
								                uni.showModal({
							 | 
						||
| 
								 | 
							
								                  title: '授权提示',
							 | 
						||
| 
								 | 
							
								                  content: '是否允许获取保存相册权限',
							 | 
						||
| 
								 | 
							
								                  success: (res) => {
							 | 
						||
| 
								 | 
							
								                    if (res.confirm) {
							 | 
						||
| 
								 | 
							
								                      // 点击确定,则调用相册授权
							 | 
						||
| 
								 | 
							
								                      uni.openSetting({
							 | 
						||
| 
								 | 
							
								                        success(set) {
							 | 
						||
| 
								 | 
							
								                          if (set.authSetting['scope.writePhotosAlbum']) {
							 | 
						||
| 
								 | 
							
								                            uni.showToast({
							 | 
						||
| 
								 | 
							
								                              title: '授权成功',
							 | 
						||
| 
								 | 
							
								                            })
							 | 
						||
| 
								 | 
							
								                          } else {
							 | 
						||
| 
								 | 
							
								                            uni.showToast({
							 | 
						||
| 
								 | 
							
								                              title: '请确定已打开保存权限',
							 | 
						||
| 
								 | 
							
								                              icon: 'none',
							 | 
						||
| 
								 | 
							
								                            })
							 | 
						||
| 
								 | 
							
								                          }
							 | 
						||
| 
								 | 
							
								                        },
							 | 
						||
| 
								 | 
							
								                      })
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                  },
							 | 
						||
| 
								 | 
							
								                })
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								          } else {
							 | 
						||
| 
								 | 
							
								            // 受过全
							 | 
						||
| 
								 | 
							
								            that.saveLocal()
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    saveLocal() {
							 | 
						||
| 
								 | 
							
								      console.log('d')
							 | 
						||
| 
								 | 
							
								      // canvas转图片
							 | 
						||
| 
								 | 
							
								      uni.canvasToTempFilePath({
							 | 
						||
| 
								 | 
							
								        canvasId: 'myCanvas',
							 | 
						||
| 
								 | 
							
								        success: function (res) {
							 | 
						||
| 
								 | 
							
								          console.log('res', res)
							 | 
						||
| 
								 | 
							
								          // // 保存相册
							 | 
						||
| 
								 | 
							
								          uni.saveImageToPhotosAlbum({
							 | 
						||
| 
								 | 
							
								            filePath: res.tempFilePath,
							 | 
						||
| 
								 | 
							
								            success: function () {
							 | 
						||
| 
								 | 
							
								              console.log('save success')
							 | 
						||
| 
								 | 
							
								              uni.showToast({
							 | 
						||
| 
								 | 
							
								                title: '已保存在本地相册',
							 | 
						||
| 
								 | 
							
								                icon: 'none',
							 | 
						||
| 
								 | 
							
								              })
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            fail: function () {
							 | 
						||
| 
								 | 
							
								              uni.showToast({
							 | 
						||
| 
								 | 
							
								                title: '保存失败',
							 | 
						||
| 
								 | 
							
								                icon: 'none',
							 | 
						||
| 
								 | 
							
								              })
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        fail: function (err) {
							 | 
						||
| 
								 | 
							
								          console.log('err', err)
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								      },this)
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<style lang="scss" scoped>
							 | 
						||
| 
								 | 
							
								.popup {
							 | 
						||
| 
								 | 
							
								  position: fixed;
							 | 
						||
| 
								 | 
							
								  z-index: 9999;
							 | 
						||
| 
								 | 
							
								  top: 50%;
							 | 
						||
| 
								 | 
							
								  left: 50%;
							 | 
						||
| 
								 | 
							
								  transform: translate(-50%, -50%);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.btn {
							 | 
						||
| 
								 | 
							
								  width: 320px;
							 | 
						||
| 
								 | 
							
								  padding: 20rpx 0;
							 | 
						||
| 
								 | 
							
								  text-align: center;
							 | 
						||
| 
								 | 
							
								  margin-top: 60rpx;
							 | 
						||
| 
								 | 
							
								  background: #fbb61e;
							 | 
						||
| 
								 | 
							
								  color: #fff;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.toSave {
							 | 
						||
| 
								 | 
							
								  color: #fff;
							 | 
						||
| 
								 | 
							
								  text-align: center;
							 | 
						||
| 
								 | 
							
								  font-size: 30rpx;
							 | 
						||
| 
								 | 
							
								  margin-top: 60rpx;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.all {
							 | 
						||
| 
								 | 
							
								  width: 320px;
							 | 
						||
| 
								 | 
							
								  height: 480px;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.bgImg {
							 | 
						||
| 
								 | 
							
								  position: relative;
							 | 
						||
| 
								 | 
							
								  width: 100%;
							 | 
						||
| 
								 | 
							
								  height: 100%;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.goodsImg {
							 | 
						||
| 
								 | 
							
								  width: 260rpx;
							 | 
						||
| 
								 | 
							
								  height: 260rpx;
							 | 
						||
| 
								 | 
							
								  position: absolute;
							 | 
						||
| 
								 | 
							
								  top: 50%;
							 | 
						||
| 
								 | 
							
								  left: 50%;
							 | 
						||
| 
								 | 
							
								  transform: translate(-50%, -50%);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.qrImg {
							 | 
						||
| 
								 | 
							
								  width: 120rpx;
							 | 
						||
| 
								 | 
							
								  height: 120rpx;
							 | 
						||
| 
								 | 
							
								  position: absolute;
							 | 
						||
| 
								 | 
							
								  bottom: 96rpx;
							 | 
						||
| 
								 | 
							
								  right: 62rpx;
							 | 
						||
| 
								 | 
							
								  border-radius: 50%;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								.mask {
							 | 
						||
| 
								 | 
							
								  width: 100%;
							 | 
						||
| 
								 | 
							
								  position: fixed;
							 | 
						||
| 
								 | 
							
								  top: 0;
							 | 
						||
| 
								 | 
							
								  left: 0;
							 | 
						||
| 
								 | 
							
								  z-index: 999;
							 | 
						||
| 
								 | 
							
								  height: 100vh;
							 | 
						||
| 
								 | 
							
								  background: rgba(0, 0, 0, 80%);
							 | 
						||
| 
								 | 
							
								  overflow: hidden;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</style>
							 |