From eab43d467f2875765fe402816ca511e38ec4c4ab Mon Sep 17 00:00:00 2001 From: RyRh <3123294924@qq.com> Date: Fri, 4 Sep 2026 16:44:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QRcode.jpg | Bin 0 -> 43655 bytes pages/product-detail/product-detail.css | 29 +++ pages/product-detail/product-detail.vue | 316 ++++++++++++++++++++++++ static/images/detail/qrcode.png | Bin 0 -> 2467 bytes 4 files changed, 345 insertions(+) create mode 100644 QRcode.jpg create mode 100644 static/images/detail/qrcode.png diff --git a/QRcode.jpg b/QRcode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12db5fbeaacfe6ae58bdb26dc804a99e09aa4ddb GIT binary patch literal 43655 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 HckF)wy7nn5 literal 0 HcmV?d00001 diff --git a/pages/product-detail/product-detail.css b/pages/product-detail/product-detail.css index 6259eb7..242e8c8 100644 --- a/pages/product-detail/product-detail.css +++ b/pages/product-detail/product-detail.css @@ -53,3 +53,32 @@ height: 12rpx; /* 6px */ background: #f5f5f5; } + +/* 底部操作区:生成分享图按钮 */ +.share-footer { + padding: 24rpx 20rpx; + padding-bottom: calc(24rpx + env(safe-area-inset-bottom)); + background: #ffffff; +} +.share-btn { + height: 88rpx; + display: flex; + align-items: center; + justify-content: center; + background: #ff6800; + border-radius: 44rpx; + font-size: 30rpx; + font-weight: 500; + color: #ffffff; +} + +/* 生成分享图用的画布(uni-app CanvasContext 旧版接口,跨端): + 固定定位移出可视区,仅用于绘制导出; + CSS 尺寸为设计稿(750x1200,比例约 2.5:4)的一半,绘制时 scale(0.5),导出时再按像素密度放大 */ +.share-canvas { + position: fixed; + left: -9999px; + top: 0; + width: 375px; + height: 600px; +} diff --git a/pages/product-detail/product-detail.vue b/pages/product-detail/product-detail.vue index 752cd65..5e6e9eb 100644 --- a/pages/product-detail/product-detail.vue +++ b/pages/product-detail/product-detail.vue @@ -92,6 +92,14 @@ + + + + + + @@ -535,6 +543,314 @@ export default { selectCraft(value) { this.selectedCraft = value this.syncPriceByVariant() + }, + + /** + * 底部按钮:生成分享图 + * 流程:加载产品首图 + 本地小程序码 → CanvasContext 绘制 → 导出图片 → 预览 + */ + generateShareImage() { + if (this._generating) return + this._generating = true + uni.showLoading({ title: '生成中...', mask: true }) + this.drawShareImage() + }, + + /** + * 绘制分享图并导出预览(uni-app CanvasContext 旧版接口,跨端) + * 整图固定比例 2.5 : 4(750 x 1200):上半部分产品图(右下角叠小程序码), + * 下方 名称/颜色点/尺码/价格;文字区高度自适应,剩余空间全部给产品图区 + * 画布组件 CSS 尺寸为其一半(375x600),绘制前 scale(0.5),导出时按像素密度放大 + */ + async drawShareImage() { + try { + const ctx = uni.createCanvasContext('shareCanvas', this) + + // ===== 设计稿逻辑尺寸(1 逻辑单位 = 画布 CSS 像素 × 2)===== + const W = 750 + const H = 1200 // 整图固定 750 x 1200,比例约 2.5 : 4 + const PAD = 32 // 页边距 + const IMG_W = 686 // 产品图区宽(圆角,高按剩余空间自适应) + const NAME_FONT = 'bold 36px sans-serif' + const NAME_LH = 50 // 名称行高 + const DOT_SIZE = 30 // 颜色点直径 + + // 名称折行(measureText 为同步测量,与缩放无关,直接测即可) + ctx.font = NAME_FONT + const nameLines = this.wrapNameLines(ctx, this.product.name || '—', IMG_W, 2) + const sizeText = this.sizes.length + ? this.sizes[0] + ' - ' + this.sizes[this.sizes.length - 1] + : '' + const hasDots = this.colors.length > 0 + + // 自下而上排文字区:价格 → 尺码 → 颜色点 → 名称,剩余高度全部给产品图区 + const priceBaseline = H - 36 // 底部留白 36 + let y = priceBaseline - 62 // 价格块顶部 + let sizeTop = 0 + if (sizeText) { + sizeTop = y - 20 - 38 + y = sizeTop + } + let dotsTop = 0 + if (hasDots) { + dotsTop = y - 20 - DOT_SIZE + y = dotsTop + } + const nameTop = y - 24 - nameLines.length * NAME_LH + const imgBottom = nameTop - 26 + const IMG_H = imgBottom - PAD // 产品图区高 + + // 画布组件 CSS 尺寸为设计稿一半,绘制统一缩放 0.5 + ctx.scale(0.5, 0.5) + + // ===== 加载产品首图信息(真实宽高用于 aspectFit)===== + // 小程序码为代码包内静态资源,drawImage 直接支持包内路径,无需 getImageInfo 转换; + // H5 下仍预热一次(触发浏览器缓存),确保 drawImage 内部加载即时完成 + const [productImg] = await Promise.all([ + this.loadImageInfo(this.productImages[0] || ''), + this.loadImageInfo('/static/images/detail/qrcode.png') + ]) + + // 白底铺满画布(jpg 导出透明区域会变黑,需全画布垫白) + ctx.setFillStyle('#ffffff') + ctx.fillRect(0, 0, W, H) + + // ===== 产品图区:圆角矩形 + 灰底 + 图片 aspectFit 居中 ===== + ctx.setFillStyle('#f2f2f2') + this.pathRoundRect(ctx, PAD, PAD, IMG_W, IMG_H, 24) + ctx.fill() + // 优先用 getImageInfo 的真实宽高做 aspectFit; + // 获取失败(如未配置 downloadFile 域名)时回退直接画网络图,按 3:4 估算宽高 + const drawPath = productImg ? productImg.path : this.productImages[0] || '' + const imgW = productImg ? productImg.width : 3 + const imgH = productImg ? productImg.height : 4 + if (drawPath) { + ctx.save() + this.pathRoundRect(ctx, PAD, PAD, IMG_W, IMG_H, 24) + ctx.clip() + const s = Math.min(IMG_W / imgW, IMG_H / imgH) + const dw = imgW * s + const dh = imgH * s + ctx.drawImage(drawPath, PAD + (IMG_W - dw) / 2, PAD + (IMG_H - dh) / 2, dw, dh) + ctx.restore() + } + + // ===== "新"角标(图区左上角)===== + ctx.setFillStyle('#00b578') + this.pathRoundRect(ctx, PAD + 20, PAD + 20, 68, 68, 14) + ctx.fill() + ctx.setFillStyle('#ffffff') + ctx.font = 'bold 36px sans-serif' + ctx.textAlign = 'center' + ctx.textBaseline = 'middle' + ctx.fillText('新', PAD + 20 + 34, PAD + 20 + 36) + ctx.textAlign = 'left' + ctx.textBaseline = 'alphabetic' + + // ===== 小程序码:白底圆角衬底,叠在产品图区右下角 ===== + // 代码包内静态资源直接用包内路径绘制(drawImage 原生支持; + // getImageInfo 对包内路径在部分基础库/工具上会失败,导致二维码被跳过) + const qrBg = 200 + const qrX = PAD + IMG_W - qrBg - 16 + const qrY = PAD + IMG_H - qrBg - 16 + ctx.setFillStyle('#ffffff') + this.pathRoundRect(ctx, qrX, qrY, qrBg, qrBg, 14) + ctx.fill() + ctx.drawImage('/static/images/detail/qrcode.png', qrX + 10, qrY + 10, 180, 180) + + // ===== 名称(最多两行,已折好行)===== + ctx.setFillStyle('#1a1a1a') + ctx.font = NAME_FONT + nameLines.forEach((line, i) => { + ctx.fillText(line, PAD, nameTop + i * NAME_LH + 33) + }) + + // ===== 颜色点 ===== + if (hasDots) { + ctx.setLineWidth(1) + this.colors.slice(0, 8).forEach((c, i) => { + ctx.beginPath() + ctx.arc(PAD + 15 + i * 44, dotsTop + 15, 15, 0, Math.PI * 2) + ctx.setFillStyle(c.value || '#e0e0e0') + ctx.fill() + ctx.setStrokeStyle('rgba(0, 0, 0, 0.08)') + ctx.stroke() + }) + } + + // ===== 尺码(首 - 尾)===== + if (sizeText) { + ctx.setFillStyle('#808080') + ctx.font = '28px sans-serif' + ctx.fillText(sizeText, PAD, sizeTop + 28) + } + + // ===== 价格(符号/小数 32px,整数 60px,共用一条基线)===== + const p = this.product.price || {} + ctx.setFillStyle('#ff0000') + let px = PAD + ctx.font = '32px sans-serif' + ctx.fillText(p.symbol || '¥', px, priceBaseline) + px += ctx.measureText(p.symbol || '¥').width + 2 + ctx.font = 'bold 60px sans-serif' + ctx.fillText(p.integer || '0', px, priceBaseline) + px += ctx.measureText(p.integer || '0').width + 2 + ctx.fillText(p.decimal || '', px, priceBaseline) + + // ===== 一次性渲染到画布,完成后导出 ===== + ctx.draw(false, () => { + // #ifdef H5 + this.exportShareImageH5() + return + // #endif + // #ifdef MP-WEIXIN + const dpr = this.getPixelRatio() + uni.canvasToTempFilePath({ + canvasId: 'shareCanvas', + x: 0, + y: 0, + width: W / 2, + height: H / 2, + destWidth: (W / 2) * dpr, + destHeight: (H / 2) * dpr, + fileType: 'jpg', + quality: 0.9, + success: (res) => { + uni.previewImage({ urls: [res.tempFilePath] }) + }, + fail: (err) => { + console.error('[share canvasToTempFilePath fail]', err) + uni.showToast({ title: '生成失败', icon: 'none' }) + }, + complete: () => { + this._generating = false + uni.hideLoading() + } + }, this) + // #endif + }) + } catch (e) { + this._generating = false + uni.hideLoading() + console.error('[drawShareImage error]', e) + uni.showToast({ title: '生成失败', icon: 'none' }) + } + }, + + /** + * 加载图片信息(本地可绘制路径 + 原始宽高),供旧版 CanvasContext.drawImage 使用: + * - 微信小程序:uni.getImageInfo,远程图先下载为本地临时路径 + * - H5:跨域远程图转 blob 同源地址,避免画布被污染导致无法导出 + */ + loadImageInfo(src) { + return new Promise((resolve) => { + if (!src) return resolve(null) + // #ifdef MP-WEIXIN + uni.getImageInfo({ + src: src, + success: (info) => resolve(info), + fail: () => resolve(null) + }) + // #endif + // #ifdef H5 + const isSameOrigin = src.indexOf('//') === -1 || src.indexOf(location.host) !== -1 + const probe = (url) => { + const img = new Image() + img.onload = () => resolve({ path: url, width: img.naturalWidth, height: img.naturalHeight }) + img.onerror = () => resolve(null) + img.src = url + } + if (isSameOrigin) return probe(src) + const xhr = new XMLHttpRequest() + xhr.open('GET', src) + xhr.responseType = 'blob' + xhr.onload = () => { + if (xhr.response) probe(URL.createObjectURL(xhr.response)) + else resolve(null) + } + xhr.onerror = () => resolve(null) + xhr.send() + // #endif + }) + }, + + /** + * H5 导出:取真实 canvas 元素 toDataURL 预览 + * (画布 CSS 尺寸 375x600 与内容一致,整图即所得,已垫白) + */ + exportShareImageH5() { + try { + const el = + document.querySelector('.share-canvas canvas') || document.querySelector('.share-canvas') + if (!el || !el.toDataURL) throw new Error('canvas not found') + uni.previewImage({ urls: [el.toDataURL('image/jpeg', 0.9)] }) + } catch (e) { + console.error('[exportShareImageH5 error]', e) + uni.showToast({ title: '生成失败', icon: 'none' }) + } finally { + this._generating = false + uni.hideLoading() + } + }, + + /** + * 屏幕像素密度(导出图片放大倍数) + */ + getPixelRatio() { + try { + return uni.getSystemInfoSync().pixelRatio || 2 + } catch (e) { + return 2 + } + }, + + /** + * 圆角矩形路径(用 arc 画四角,兼容旧版 CanvasContext,无 arcTo 依赖) + */ + pathRoundRect(ctx, x, y, w, h, r) { + ctx.beginPath() + ctx.moveTo(x + r, y) + ctx.lineTo(x + w - r, y) + ctx.arc(x + w - r, y + r, r, -Math.PI / 2, 0) + ctx.lineTo(x + w, y + h - r) + ctx.arc(x + w - r, y + h - r, r, 0, Math.PI / 2) + ctx.lineTo(x + r, y + h) + ctx.arc(x + r, y + h - r, r, Math.PI / 2, Math.PI) + ctx.lineTo(x, y + r) + ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5) + ctx.closePath() + }, + + /** + * 中文按字符折行:最多 maxLines 行,溢出时行尾补 "..."(保证不超宽) + */ + wrapNameLines(ctx, text, maxWidth, maxLines) { + const chars = String(text).split('') + const lines = [] + let line = '' + let overflow = false + for (let i = 0; i < chars.length; i++) { + const test = line + chars[i] + if (line && ctx.measureText(test).width > maxWidth) { + if (lines.length === maxLines - 1) { + overflow = true + break + } + lines.push(line) + line = chars[i] + } else { + line = test + } + } + if (line && lines.length < maxLines) lines.push(line) + if (overflow && lines.length === maxLines) { + let last = lines[maxLines - 1] + while (last && ctx.measureText(last + '...').width > maxWidth) { + last = last.slice(0, -1) + } + lines[maxLines - 1] = last + '...' + } + return lines } }, computed: { diff --git a/static/images/detail/qrcode.png b/static/images/detail/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..f1ad134e0b4d43af32291e29dbb56c941013b8cd GIT binary patch literal 2467 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 literal 0 HcmV?d00001