微信小程序实现分销海报

微信小程序分销海报

 

1、简介:

  用户生成属于自己的海报,其他人扫码此图片上的二维码,进入相应的小程序页面,同时带上相关的参数 parent_id 从而绑定上下级关系;

2、例如海报:

3、分销海报包含了:

  1、海报背景(可选择更换);

  2、个人二维码;

  3、用户个人信息;姓名、头像等

  4、海报长按保存功能;

4、实现原理:

  海报图、以及个人二维码(扫码可跳转小程序固定一个页面)由后台接口返回两张图片;前台使用canvas将此海报绘制出来;

5、html代码

<canvas class="mycanvas" canvas-id="myCanvas" :style="{height: canvasHeight + 'px',width: canvasWidth+ 'px'}" 
  @longtap="getAuthAndSaveImg"> </canvas>

6、js代码:

  注意:canvas将图片绘制,必须将网络图片下载到本地,或者使用本地图片也是可以的

 export default {
        data() {
            return {
                cardData:'',
                avatarImg: '',     // 用户头像
                avatarContent: '', // 文字
                codeUrl: '',        // 二维码图片
                canvasWidth: 0,     // 画布大小
                canvasHeight: 0,
                codeTestPicBg: ''   // 背景图
            }
        },
        onLoad() {
            this.loadImg();
        },
        methods: {
            // 生成确定画布大小
            loadImg(){
                let that = this;
                // 获取系统信息
                wx.getSystemInfo({
                    success: function (res) {   
                        that.canvasWidth = res.windowWidth * 1;
                        that.canvasHeight = res.windowHeight * 1;
                        that.getAvatarImgurl();
                    }
                });
                
            },
            
            // 获取用户信息
            getAvatarImgurl(){
                let that = this;
                uni.getStorage({
                    key: 'scopeUserInfo',
                    success: function (res) {
                        that.avatarImg = res.data.avatarUrl;
                        that.avatarContent = '您的好友' + res.data.nickName + '为您分享!'
                        that.downloadAvar();
                    }
                });
            },
            
            // 下载用户头像
            downloadAvar(){
                let that = this;
                wx.downloadFile({
                    url: that.avatarImg,
                    success: function (res) {
                        that.avatarImg = res.tempFilePath
                        wx.hideLoading();
                        that.getTempFile();
                    },
                    fail: function (err) {
                        wx.showToast({
                            title: "下载头像败,稍后重试!",
                            icon: "none",
                            duration: 5000
                        });
                    }
                });
            },
            
            // 获取CODE吗
            getTempFile: function () {
                let that = this;
                request.post(that.websiteUrl + '/api/v4/drp/create/applet/code',{
                    goods_id: 0,
                    scene: '' + 0 + '&' + this.drpdata.shop_info.user_id,
                    shop_id: this.drpdata.shop_info.id
                }).then(res=>{
                    //继续生成商品的小程序码
                    that.downloadCodepic(res.data.url);
                })
            },
            
            // 下载code码
            downloadCodepic(url){
                let that = this;
                wx.downloadFile({
                 url: 'https://' + url,
                 success: function (res) {
                     that.codeUrl = res.tempFilePath
                     wx.hideLoading();
                     that.downloadBgCard();
                 },
                 fail: function (err) {
                     wx.showToast({
                         title: "下载二维码失败,稍后重试!",
                         icon: "none",
                         duration: 5000
                     });
                 }
                });
            },
            
            // 下载背景图
            downloadBgCard(){
                let that = this;
                wx.downloadFile({
                 url: 'https://feiquanshijie-oss.oss-cn-hangzhou.aliyuncs.com/data/attached/qrcode/themes/20130815061226_k3jWZ.png?v=1582584928',
                 success: function (res) {
                     console.log(res)
                     that.codeTestPicBg = res.tempFilePath
                     wx.hideLoading();
                     //生成数据
                     that.setCanvas();
                 },
                 fail: function (err) {
                     wx.showToast({
                         title: "下载背景图失败,稍后重试!",
                         icon: "none",
                         duration: 5000
                     });
                 }
                });
            },
            
            // 绘制画布
            setCanvas() {
                let that = this;
                let ctx = wx.createCanvasContext("myCanvas");
                ctx.rect(
                    0,
                    0,
                    that.canvasWidth,
                    that.canvasHeight
                );
                ctx.setFillStyle("#fff");
                ctx.fill();
                
                // 背景图片
                ctx.drawImage(
                    '../../../static/card_bg.png',
                    0,
                    0,
                    that.canvasWidth,
                    that.canvasHeight
                );
                
                // 用户图片
                ctx.drawImage(
                    that.avatarImg,
                    30,
                    40,
                    50,
                    50
                );
                
                that.drawFont(ctx, that.avatarContent, 100, 70,0,0,0,17,14,'#000');
                that.drawFont(ctx, '长按保存图片', 140, 25,0,0,0,17,14,'#333');
                
                // code图片
                ctx.drawImage(
                    // that.codeUrl,
                    '../../../static/123860applet.png',
                    that.canvasWidth/3,
                    that.canvasWidth/3,
                    that.canvasWidth/3,
                    that.canvasWidth/3
                );
                
                
                ctx.globalCompositeOperation = "source-over";
                ctx.draw(); //绘制到canvas
            },
            
            // 长安图片
            getAuthAndSaveImg(){
                let _this = this;
                wx.getSetting({
                    success(res) {
                        if (res.authSetting['scope.writePhotosAlbum']) {
                            _this.saveShareImg();
                        } else if (res.authSetting['scope.writePhotosAlbum'] === undefined) {
                            wx.authorize({
                                scope: 'scope.writePhotosAlbum',
                                success() {
                                    _this.saveShareImg();
                                },
                                fail(){
                                    wx.showToast({
                                        title: '您没有授权,无法保存到相册',
                                        icon: 'none',
                                        duration: 2000
                                    })
                                }
                            })
                        }else {
                            uni.openSetting({
                                success(res) {
                                    if (res.authSetting['scope.writePhotosAlbum']) {
                                        _this.saveShareImg();
                                    }else{
                                        wx.showToast({
                                            title:'您没有授权,无法保存到相册',
                                            icon:'none',
                                            duration: 2000
                                        })
                                    }
                                }
                            })
                        }
                    }
                })
            },
            
            //点击保存到相册
            saveShareImg: function () {
                var that = this;
                wx.showLoading({
                    title: '正在保存',
                    mask: true,
                })
                setTimeout(function () {
                    wx.canvasToTempFilePath({
                        canvasId: 'myCanvas',
                        fileType: 'jpg',
                        success: function (res) {
                            wx.hideLoading();
                            var tempFilePath = res.tempFilePath;
                            wx.saveImageToPhotosAlbum({
                                filePath: tempFilePath,
                                success(res) {
                                    wx.showModal({
                                        content: '图片已保存到相册,赶紧晒一下吧~',
                                        showCancel: false,
                                        confirmText: '好的',
                                        confirmColor: '#333',
                                        success: function (res) {
                                            
                                        },
                                        fail: function (res) { 
                                            wx.showToast({
                                                title: '系统繁忙,请稍后重新尝试!',
                                                icon: 'none',
                                                duration: 2000
                                            })
                                        }
                                    })
                                },
                                fail: function (res) {
                                    wx.showToast({
                                        title: res.errMsg,
                                        icon: 'none',
                                        duration: 2000
                                    })
                                }
                            })
                        }
                    });
                }, 1000);
            },
            
            // 设置文字大小,并填充颜色。
            drawFont: function (ctx, contentTitle, x, y, x1, y1,x2,y2,fontSize,color) {
                let that = this;
                let str = contentTitle;
                let firstline;
                ctx.setFontSize(fontSize);
                ctx.setFillStyle(color);
                ctx.fillText(firstline, x + x1, y + y1);
                
            },
        },
    }

7、上下级关系处理:

  例如扫码后跳转商城首页,那么在首页的onload 事件中,拿到 e ,便能拿到相应的传递的参数,例如:parent_id

onLoad(e) {
    if(e.parent_id){
        this.user_id = e.parent_id;
        uni.setStorageSync('isplatformUserID', this.user_id);
    }
            
},

8、canvas两个图片重叠时显示的方法——globalCompositeOperation

猜你喜欢

转载自www.cnblogs.com/haonanZhang/p/12363640.html
今日推荐