From ecc81b9b31f6b4f6d3481942b0084e7a3776baf8 Mon Sep 17 00:00:00 2001 From: jing <1683105490@qq.com> Date: Fri, 23 Oct 2026 10:44:03 +0800 Subject: [PATCH] =?UTF-8?q?chore=EF=BC=9A=E6=88=91=E7=9A=84=E5=90=8D?= =?UTF-8?q?=E7=89=87=E7=BB=84=E4=BB=B6=E5=8F=91=E9=80=81=E5=90=8D=E7=89=87?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components-diy/diy-card-mini.vue | 211 ++++++++++++++++++++++++++++- tests/diy-card-detail-jump.test.js | 15 +- 2 files changed, 217 insertions(+), 9 deletions(-) diff --git a/components-diy/diy-card-mini.vue b/components-diy/diy-card-mini.vue index 7f567a5..3a14b36 100644 --- a/components-diy/diy-card-mini.vue +++ b/components-diy/diy-card-mini.vue @@ -108,11 +108,37 @@ - - + + {{ detailBtnText || '发送名片' }} + + + + + + 分享名片 + 客户打开链接即可查看名片并留言留资 + + + + {{ (card && card.wap_url) || '' }} + + 复制链接 + + 浏览器分享 + + + 保存二维码 + + + + 长按二维码也可保存到相册 + 长按二维码可保存到相册 + 点击「保存二维码」存入相册 + + @@ -134,7 +160,7 @@ export default { emptyActionText: { type: String, default: '' }, }, data() { - return { expanded: false }; + return { expanded: false, showShare: false }; }, computed: { c() { @@ -297,6 +323,14 @@ export default { // 蓝色顶带底色: 名片主题渐变(精选名片 show 同款) return this.$util.objToStyle({ background: themeGradient(this.card) }); }, + shareBtnStyle() { + // 分享抽屉主按钮(复制链接): 主题色 + const theme = (this.card && this.card.theme_color) || CardTokens.color.primary; + return this.$util.objToStyle({ + background: theme, + border: '2rpx solid ' + theme, + }); + }, avatarStyle() { return this.$util.objToStyle({ background: avatarBg(this.card) }); }, @@ -368,8 +402,58 @@ export default { onAct(act) { this.$emit('act', act); }, - onDetail() { - this.$emit('detail', this.card); + + /* ---------- 分享名片抽屉(「发送名片」弹出; 版式/逻辑与精选名片 show 完全同款) ---------- */ + openCardShare() { + this.showShare = true; + }, + closeShare() { + this.showShare = false; + }, + copyCardLink() { + const url = (this.card && this.card.wap_url) || ''; + if (!url) { + uni.showToast({ title: '名片链接未返回,请稍后重试', icon: 'none' }); + return; + } + uni.setClipboardData({ + data: url, + success: () => uni.showToast({ title: '链接已复制', icon: 'success' }), + }); + }, + // H5: 优先 navigator.share(移动浏览器), 不支持则复制链接兜底 + h5CardShare() { + // #ifdef H5 + const url = (this.card && this.card.wap_url) || ''; + if (navigator && typeof navigator.share === 'function' && url) { + navigator.share({ + title: ((this.card && this.card.name) || '我的名片') + '的名片', + url: url + }).catch(() => {}); + return; + } + // #endif + this.copyCardLink(); + }, + // 小程序/鸿蒙: 下载二维码后存相册(长按图片也可存, 抽屉底部有提示) + saveCardQr() { + const qrUrl = (this.card && this.card.qr_url) || ''; + if (!qrUrl) return; + uni.downloadFile({ + url: this.$util.img(qrUrl), + success: res => { + if (res.statusCode !== 200 || !res.tempFilePath) { + uni.showToast({ title: '二维码下载失败', icon: 'none' }); + return; + } + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => uni.showToast({ title: '已保存到相册', icon: 'success' }), + fail: () => uni.showToast({ title: '保存失败,请授权相册权限', icon: 'none' }), + }); + }, + fail: () => uni.showToast({ title: '二维码下载失败', icon: 'none' }), + }); }, /** 二维码点击 → 预览名片(进详情页; qrTapPreview 开关控制, 默认开) */ onQrTap() { @@ -809,4 +893,119 @@ export default { transform: none; } } + +/* 分享名片抽屉(「发送名片」弹出; 与精选名片 show 同款, 复刻 detail.vue share-sheet) */ +.cs-mask { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 100; +} + +.cs-sheet { + position: fixed; + left: 0; + right: 0; + bottom: 0; + background-color: #ffffff; + border-radius: 24rpx 24rpx 0 0; + padding: 20rpx 32rpx 40rpx; + z-index: 101; + transform: translateY(100%); + transition: transform 0.25s; + + &.cs-sheet-show { + transform: translateY(0); + } + + .ss-bar { + width: 36rpx; + height: 4rpx; + border-radius: 2rpx; + background-color: #e3e7ee; + margin: 0 auto 20rpx; + } + + .ss-title { + font-size: 32rpx; + font-weight: 600; + color: #1a1f36; + text-align: center; + } + + .ss-sub { + font-size: 24rpx; + color: #9aa4b8; + text-align: center; + margin: 8rpx 0 24rpx; + } + + .ss-qr-box { + display: flex; + justify-content: center; + margin-bottom: 20rpx; + + .ss-qr { + width: 320rpx; + height: 320rpx; + } + } + + .ss-link { + font-size: 22rpx; + color: #9aa4b8; + background-color: #f6f7f9; + border-radius: 8rpx; + padding: 14rpx 20rpx; + margin-bottom: 24rpx; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + .ss-btns { + display: flex; + justify-content: space-between; + + .ss-btn { + flex: 1; + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: 28rpx; + color: #333; + border: 1rpx solid #dcdfe6; + border-radius: 12rpx; + margin: 0; + padding: 0; + background-color: transparent; + overflow: visible; + + &::after { + border: none; + } + + & + .ss-btn { + margin-left: 20rpx; + } + } + + /* 主按钮颜色走 shareBtnStyle 内联(主题色), 此处只兜底默认蓝 */ + .ss-btn-main { + background-color: #119dff; + border-color: #119dff; + color: #ffffff; + } + } + + .ss-tip { + text-align: center; + font-size: 22rpx; + color: #b8c0cc; + margin-top: 20rpx; + } +} diff --git a/tests/diy-card-detail-jump.test.js b/tests/diy-card-detail-jump.test.js index 8fd430d..84dc0ee 100644 --- a/tests/diy-card-detail-jump.test.js +++ b/tests/diy-card-detail-jump.test.js @@ -94,10 +94,19 @@ test('mini: showDetailBtn 默认开(历史配置无此字段时也显示, 开箱 assert.match(miniSrc, /flagOn\(this\.c\.showDetailBtn,\s*true\)/); }); -test('mini: 存在全宽主按钮节点并 emit detail', () => { +test('mini: 存在全宽主按钮节点并弹分享抽屉(2026-10-23 参考图定稿, 与精选 show 同款)', () => { assert.match(miniSrc, /class="mini-detail"/); - assert.match(miniSrc, /@tap\.stop="onDetail"/); - assert.match(miniSrc, /this\.\$emit\('detail',\s*this\.card\)/); + // 主按钮点击 → 弹「分享名片」抽屉(不再 emit detail 跳详情) + assert.match(miniSrc, /@tap\.stop="openCardShare"/); + assert.match(miniSrc, /openCardShare\(\)\s*\{\s*this\.showShare = true;/); + // 抽屉版式与 show 同款: 标题/副文案/二维码/复制链接 + assert.match(miniSrc, /分享名片<\/view>/); + assert.match(miniSrc, /客户打开链接即可查看名片并留言留资/); + assert.match(miniSrc, /class="ss-btn ss-btn-main" :style="shareBtnStyle" @tap="copyCardLink"/); + // 遮罩关闭 + H5 分享/小程序存码方法齐备 + assert.match(miniSrc, /class="cs-mask" v-if="showShare" @tap="closeShare"/); + assert.match(miniSrc, /h5CardShare\(\)/); + assert.match(miniSrc, /saveCardQr\(\)/); }); test('mini: 主按钮文案可配(detailBtnText, 面板改字即生效)', () => {