From 241d7531a0d5d6702e6c254c72a1b6feed86794f Mon Sep 17 00:00:00 2001 From: xuxueyang <xuxy@fengyuntec.com> Date: 星期四, 10 十月 2024 16:30:47 +0800 Subject: [PATCH] update --- pages.json | 8 - sub_pages/partner/partner-info/partner-code-v2.vue | 2 sub_pages/partner/partner-info/hj-placard/shareImages.vue | 292 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 293 insertions(+), 9 deletions(-) diff --git a/pages.json b/pages.json index f716fba..99ba70c 100644 --- a/pages.json +++ b/pages.json @@ -308,14 +308,6 @@ } }, { - "path": "partner-info/partner-code-v2", - "style": { - "navigationBarTitleText": "合伙人推广二维码", - "enablePullDownRefresh": false - } - }, - - { "path": "order-manage/order-manage", "style": { "navigationBarTitleText": "订单管理", diff --git a/sub_pages/partner/partner-info/hj-placard/shareImages.vue b/sub_pages/partner/partner-info/hj-placard/shareImages.vue new file mode 100644 index 0000000..6f84159 --- /dev/null +++ b/sub_pages/partner/partner-info/hj-placard/shareImages.vue @@ -0,0 +1,292 @@ +<template> + <view style="position: fixed;z-index: -9999;"> + <canvas id="myQrcode" :canvas-id="canvasID" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}"></canvas> + <view v-if="qrCode == ''"> + <QRCode ref="qrcode" /> + </view> + </view> +</template> + +<script> + import QRCode from "../qr_code/qrcode.vue" + var _this; + export default { + name: 'canvas-images', + props: { + // canvasID 等同于 canvas-id + canvasID: { + Type: String, + default: 'myQrcode' + }, + canvasWidth: { // 画布宽度 + Type: 'int', + default: 375 + }, + canvasHeight: { // 画布高度 + Type: 'int', + default: 650 + }, + shareTitle: { // 分享标题 + Type: 'String', + default: '我是这张图片的标题' + }, + goodsTitle: { // 商品宣传标题 + Type: 'String', + default: '' + }, + goodsTitle2: { // 商品宣传标题 + Type: 'String', + default: '' + }, + + shareImage: { // 分享图片 + Type: 'String', + default: '' + }, + qrSize: { // 二维码大小 + Type: 'int', + default: 100 + }, + qrUrl: { // 生成二维码的链接 + Type: 'String', + default: 'https://ext.dcloud.net.cn/plugin?id=5747' + } + }, + components: { + QRCode + }, + data() { + return { + qrCode: '', // 二维码 + localImgPath: '', + canvas: undefined + } + }, + mounted() { + _this = this; + }, + methods: { + // downloadImg() { + // let that = this + // const query = uni.createSelectorQuery() + // console.log('canvasID',this.canvasID) + // query.select('#myQrcode') + // .fields({ + // node: true, + // size: true + // }) + // .exec((res) => { + // console.log('query',res) + // var canvas = res[0].node + // uni.canvasToTempFilePath({ + // canvasId: this.canvasID, + // canvas: canvas, + // x: 0, + // y: 0, + // width: this.canvasWidth, + // height: this.canvasHeight, + // destWidth: this.canvasWidth, + // destHeight: this.canvasHeight, + // success(res) { + // console.log('二维码临时路径:', res.tempFilePath) + // uni.saveImageToPhotosAlbum({ + // filePath: res.tempFilePath, + // success: function() { + // console.log('save success'); + // uni.showToast({ + // title: '保存成功' + // }) + // }, + // fail(res) { + // console.error(res) + // uni.showToast({ + // title: '保存失败。', + // icon: 'error' + // }) + // } + // }) + // }, + // fail(res) { + // console.error('fail', res) + + // uni.showToast({ + // title: '保存失败', + // icon: 'error' + // }) + // } + // }) + + // }) + + // }, + + // 创建二维码 + canvasCreate() { + this.localImgPath = this.shareImage + console.log('this.shareImage', this.shareImage) + if (this.shareImage && this.shareImage.startsWith('https://')) { + uni.getImageInfo({ + src: _this.shareImage, + success(res) { + console.log('getImageInfo res', res) + _this.localImgPath = res.path + _this.$refs.qrcode.make({ + size: _this.qrSize, + text: _this.qrUrl + }) + .then(res => { + // 返回的res与uni.canvasToTempFilePath返回一致 + // console.log(res) + _this.qrCode = res.tempFilePath; + _this.onCanvas(); + }); + }, + fail(error) { + this.$message.showToast('加载图片错误') + } + }) + } else { + _this.$refs.qrcode.make({ + size: _this.qrSize, + text: _this.qrUrl + }) + .then(res => { + // 返回的res与uni.canvasToTempFilePath返回一致 + // console.log(res) + _this.qrCode = res.tempFilePath; + _this.onCanvas(); + }); + } + + + }, + // 画图 + async onCanvas() { + uni.showLoading({ + title: "分享图片生成中..." + }); + const ctx = uni.createCanvasContext(_this.canvasID, _this); + // 设置 canvas 背景色 + ctx.setFillStyle('#FFFFFF'); + ctx.fillRect(0, 0, _this.canvasWidth, _this.canvasHeight); + ctx.setFillStyle('#000000'); + // 背景图片 + //需要下载图片 + + if (_this.localImgPath) { + console.log('localImgPath', _this.localImgPath) + ctx.drawImage(_this.localImgPath, 20, 20, 335, 500); + } + // ctx.setFontSize(18); + // ctx.setTextAlign('center'); + // ctx.fillText(_this.shareTitle, _this.canvasWidth / 2, 30); + // 左边标题 + ctx.setTextAlign('left') + ctx.setFontSize(22) + _this.writeTextOnCanvas(ctx, 20, 21, _this.goodsTitle, 20, 560); + ctx.setTextAlign('left') + ctx.setFontSize(16) + _this.writeTextOnCanvas(ctx, 20, 21, _this.goodsTitle2, 20, 585); + // 设置虚线 + // ctx.setStrokeStyle('#333333'); + // ctx.setLineDash([5, 10], 2); + // ctx.beginPath(); + // ctx.moveTo(220, 340); + // ctx.lineTo(220, 420); + // ctx.stroke(); + // 二维码 + ctx.drawImage(_this.qrCode, 250, 520, 100, 100); + // ctx.draw(); + + // 延迟后渲染至canvas上 + let pic = await _this.setTime(ctx) + _this.$emit('success', pic); + }, + /** + * @param {Object} ctx_2d getContext("2d") 对象 + * @param {int} lineheight 段落文本行高 + * @param {int} bytelength 设置单字节文字一行内的数量 + * @param {string} text 写入画面的段落文本 + * @param {int} startleft 开始绘制文本的 x 坐标位置(相对于画布) + * @param {int} starttop 开始绘制文本的 y 坐标位置(相对于画布) + */ + writeTextOnCanvas(ctx_2d, lineheight, bytelength, text, startleft, starttop) { + // 获取字符串的真实长度(字节长度) + function getTrueLength(str) { + var len = str.length, + truelen = 0; + for (var x = 0; x < len; x++) { + if (str.charCodeAt(x) > 128) { + truelen += 2; + } else { + truelen += 1; + } + } + return truelen; + } + // 按字节长度截取字符串,返回substr截取位置 + function cutString(str, leng) { + var len = str.length, + tlen = len, + nlen = 0; + for (var x = 0; x < len; x++) { + if (str.charCodeAt(x) > 128) { + if (nlen + 2 < leng) { + nlen += 2; + } else { + tlen = x; + break; + } + } else { + if (nlen + 1 < leng) { + nlen += 1; + } else { + tlen = x; + break; + } + } + } + return tlen; + } + for (var i = 1; getTrueLength(text) > 0; i++) { + var tl = cutString(text, bytelength); + ctx_2d.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), startleft, (i - 1) * lineheight + + starttop); + text = text.substr(tl); + } + }, + // 彻底改成同步 防止拿到的图片地址为空 + setTime(ctx) { + return new Promise((resole, err) => { + setTimeout(() => { + ctx.draw(false, async () => { + let pic = await _this.getNewPic(); + resole(pic) + }); + }, 600) + }) + }, + // 获取新的图片地址 + getNewPic() { + return new Promise((resolve, errs) => { + setTimeout(() => { + uni.canvasToTempFilePath({ + canvasId: _this.canvasID, + quality: 1, + complete: (res) => { + // 在H5平台下,tempFilePath 为 base64 + // 关闭showLoading + uni.hideLoading(); + // 储存海报地址 也是分享的地址 + resolve(res.tempFilePath) + } + }, _this); + }, 200) + }) + }, + }, + mounted() { + _this = this; + } + } +</script> \ No newline at end of file diff --git a/sub_pages/partner/partner-info/partner-code-v2.vue b/sub_pages/partner/partner-info/partner-code-v2.vue index efb3659..a469eb3 100644 --- a/sub_pages/partner/partner-info/partner-code-v2.vue +++ b/sub_pages/partner/partner-info/partner-code-v2.vue @@ -15,7 +15,7 @@ </template> <script> - import shareImages from '@/components/hj-placard/shareImages.vue' + import shareImages from './hj-placard/shareImages.vue' export default { components: { shareImages -- Gitblit v1.9.3