uniapp生成二维码、扫描、分享

一、前端生成二维码
1、import uQRCode from './uqrcode.js' 引入
2、结构

<template>
    <view class="main_box">
        <canvas canvas-id="qrcode" style="width: 450rpx; height: 450rpx;"></canvas>
    </view>
</template>

3、数据

data() {
            return {
                id: '123456'  //用户id
            }
},

4、生成方法

toJSON() {},  //不加会报错
async loadList() {
                await uQRCode.make({
                    canvasId: 'qrcode',
                    componentInstance: this,
                    text: this.id,
                    size: uni.upx2px(450),
                    margin: 20,
                    backgroundColor: '#ffffff', //背景颜色
                    foregroundColor: '#000000',
                    fileType: 'jpg',
                    correctLevel: uQRCode.defaults.correctLevel,
                }).then(res => {
                    console.log(res)
                })
            }

5、扫描方法

            const _this = this;
            uni.scanCode({
                // scanType: ['qrCode'],   扫描的类型
                success(res) {
                    //这里即拿到了扫描出的数据
                     _this.code = res.result;
                },
                fail(err) {
                    console.log('扫码失败', err);
                },
                complete(end) {
                       console.log('扫码结束',end)
                }
            });

二、后端生成,前端绘制圆角矩形卡片
1、结构

<canvas canvas-id="card" :style="{ width: windowWidth + 'px', height: windowHeight + 'px' }"></canvas>

2、数据

data() {
        return {
            windowWidth: 0,
            windowHeight: 0,
            url: '',
                        headPortrait:''
        };
    },

3、初始化数据

getRange() {
            let { windowWidth, windowHeight } = uni.getSystemInfoSync();
            this.windowHeight = windowHeight;
            this.windowWidth = windowWidth;
        },

4、调用接口,获取返回值

//转化图片
this.base64ToSrc(res.data.result, src => {
        this.initCanvas(src);
                        });
//将base64转化
base64ToSrc: function(base64Data, callback) {
            // base64 转格式图片
            base64ToPath('data:image/png;base64,' + base64Data)
                .then(path => {
                    callback(path);
                })
                .catch(error => {
                    console.error(error);
                });
        },

5、

let ctx = uni.createCanvasContext('card')
            // 绘画图片
                let sp_left = this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(66));
                
                let x = 0,
                 y = 0,
                 w = this.windowWidth,
                 h = this.windowHeight,
                 r = 10
                ctx.beginPath()
                // 因为边缘描边存在锯齿,最好指定使用 transparent 填充
                ctx.setFillStyle('transparent')
                ctx.setStrokeStyle('transparent')
                // 左上角
                ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5)
                ctx.setFillStyle('#3F72F1');
                    ctx.fill();
                            
                // border-top
                ctx.moveTo(x + r, y)
                ctx.lineTo(x + w - r, y)
                ctx.lineTo(x + w, y + r)
                // 右上角
                ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2)
                ctx.setFillStyle('#3F72F1');
                    ctx.fill();
                            
                // // border-right
                ctx.lineTo(x + w, y + h - r)
                ctx.lineTo(x + w - r, y + h)
                // // 右下角
                ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5)
                ctx.setFillStyle('#ffffff');
                    ctx.fill();
                            
                // // border-bottom
                ctx.lineTo(x + r, y + h)
                ctx.lineTo(x, y + h - r)
                // // 左下角
                ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI)
                ctx.setFillStyle('#ffffff');
                    ctx.fill();
                // // border-left
                ctx.lineTo(x, y + r)
                ctx.lineTo(x + r, y)
                            
                // 这里是使用 fill 还是 stroke都可以,二选一即可,但是需要与上面对应
                // ctx.fill()
                // ctx.stroke()
                ctx.closePath()
                // 剪切
                ctx.clip()
                ctx.restore()
                // ctx.setFillStyle('#ffffff');
                // ctx.strokeStyle = "#ffffff"
                ctx.fillStyle = "#ffffff";
                ctx.fill();
                ctx.fillRect(
                 this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(337)),
                 this.computedPoorWidth(25),
                 this.computedPoorWidth(337),
                 this.computedPoorWidth(500)
                );
                let path = 'https://dev.gchshi.com/patient/images/reproduction/share_head.png'
                ctx.drawImage(path, 0, this.computedPoorWidth(0), this.windowWidth, this.computedPoorWidth(100));
            
                ctx.drawImage(this.headPortrait, sp_left, this.computedPoorWidth(50), this.computedPoorWidth(66), this.computedPoorWidth(66));
                // 头像

                // 二维码
                sp_left = this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(100));
                ctx.drawImage(this.url, sp_left, this.computedPoorWidth(205), this.computedPoorWidth(100), this.computedPoorWidth(110));

                sp_left = this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(200));

                ctx.setFontSize(18);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('black');
                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                ctx.fillText('名字', sp_left, this.computedPoorWidth(140));
                ctx.setFontSize(12);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('#666666');
                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                ctx.fillText('标题一', sp_left, this.computedPoorWidth(170));
                sp_left = this.computedSpaceBetween(this.windowWidth, 35);

                ctx.stroke();
                ctx.setFontSize(18);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('black');
                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                // ctx.fillText('标题二', sp_left, this.computedPoorWidth(210));

                ctx.setFontSize(14);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('#999999');

                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                // ctx.fillText('标题三', sp_left, this.computedPoorWidth(240));

                // ctx.setFontSize(12);
                // ctx.setTextAlign('center');
                // ctx.setTextBaseline('top');
                // ctx.setFillStyle('#525157');

                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                ctx.fillText('标题四', sp_left, this.computedPoorWidth(345));
                // ctx.fillText('标题五', sp_left, this.computedPoorWidth(405));
                ctx.draw();

三、保存图片,分享朋友,分享朋友圈
1、保存图片

        // 保存图片
        saveImage: function() {
            uni.showLoading({ title: '正在生成图片...' });
            uni.canvasToTempFilePath({
                x: 0,
                y: 0,
                width: this.windowWidth,
                height: this.windowHeight,
                canvasId: 'card',
                success: res => {
                    uni.saveImageToPhotosAlbum({
                        filePath: res.tempFilePath,
                        success: data => {
                            showToast({
                                title: '已保存至手机相册',
                                icon: 'none'
                            });
                            uni.hideLoading();
                        },
                        fail: err => {
                            console.log(err);
                        },
                        complete: () => {
                            uni.hideLoading();
                        }
                    });
                }
            });
        },

2、分享朋友

        // 分享到微信好友
        shareWeixin() {
            uni.showLoading({
                title: '努力加载中'
            });
            uni.share({
                provider: 'weixin',
                scene: 'WXSceneSession',
                type: 5,
                imageUrl: '',//png地址
                title: '',
                miniProgram: {
                    id: '',
                    path: '',
                    type: 0,
                    webUrl: ''
                },
                success: ret => {
                    showToast({
                        title: '分享成功',
                        icon: 'none'
                    });
                    uni.hideLoading();
                }
            });
        },
        

3、分享到朋友圈

        // 分享到微信朋友圈
        shareTimeline() {
            uni.showLoading({ title: '正在生成图片...' });
            uni.canvasToTempFilePath({
                x: 0,
                y: 0,
                width: this.windowWidth,
                height: this.windowHeight,
                canvasId: 'card',
                success: res => {
                    uni.saveImageToPhotosAlbum({
                        filePath: res.tempFilePath,
                        success: data => {
                            uni.share({
                                provider: 'weixin',
                                scene: 'WXSenceTimeline',
                                type: 2,
                                imageUrl: res.tempFilePath,
                                success: function(res) {
                                    showToast({
                                        title: '分享成功',
                                        icon: 'none'
                                    });
                                    uni.hideLoading();
                                },
                                fail: function(err) {
                                    console.log(err);
                                }
                            });
                        },
                        fail: err => {
                            console.log(err);
                        },
                        complete: () => {
                            uni.hideLoading();
                        }
                    });
                }
            });
        }
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容