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