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