日期:2026-08-01 状态:已获用户逐节批准
小程序现有两套 Canvas 海报组件:
components/SharePoster.vue(500x750,家庭邀请卡:头像+昵称+邀请码+二维码,暖橙渐变)components/ContentSharePoster.vue(500x800,内容海报:封面+类型标签+标题+二维码,暖橙渐变,全屏遮罩弹窗)需求涉及 5 项分享功能改造,全部为前端改动,后端与数据库零改动。
pages/discover-detail/product-detail/product-detail.vue,当前无分享功能)| 决策点 | 结论 |
|---|---|
| 文章详情「分享」按钮 | 去掉,保留「海报」按钮;微信右上角转发不变(shareMixin 已带邀请码) |
| 海报弹窗交互 | 居中卡片,周边半透明可点击关闭;仅保留「保存到相册」按钮(用户自己发图),去掉「取消」按钮 |
| 海报配色 | 按主维度自动取色(五维色系);无维度数据时默认暖橙 #F97316 |
| 家庭卡「缩小」 | 仅文字缩小 2px,画布尺寸不变 |
| 家庭卡文案 | 「{nickname}邀请你来{familyName}」放二维码上方;家庭名空时退化为「{nickname}邀请你加入浠艾福」 |
| 商品海报内容 | 封面图+名称+价格(+会员价)+邀请码+二维码(扫码进商品详情页) |
| 商品二维码 scene | id=<商品id>&ref=<邀请码>,扫码后商品页解析并自动绑定邀请码 |
| 财富中心入口 | 邀请卡片区域加「分享给好友」按钮 → 家庭邀请卡海报 |
| 方案选型 | A:参数化现有组件,不新建海报引擎 |
ContentSharePoster.vue(文章+商品共用)新增 props:
| Prop | 类型 | 用途 |
|---|---|---|
dimensionCode |
String | 主维度码,驱动配色(body/mind/wisdom/action/wealth) |
summary |
String | 简介文案,标题下方 1-2 行灰字 |
priceText |
String | 价格文案(商品用;文章不传) |
ctaText |
String | 底部 CTA(默认"长按识别二维码 · 查看详情",商品传"查看商品") |
inviteText |
String | 邀请扫码语,二维码上方(如"「昵称」邀请你一起阅读这篇文章") |
配色映射(五维色系):
| 维度 | 主色 | 渐变深一档 | 卡片淡色 |
|---|---|---|---|
| body 身 | #FF8C42 | #EA580C | #FFF7ED |
| mind 心 | #FF6B9D | #DB2777 | #FDF2F8 |
| wisdom 智 | #6366F1 | #4F46E5 | #EEF2FF |
| action 行 | #10B981 | #059669 | #ECFDF5 |
| wealth 富 | #F59E0B | #D97706 | #FFFBEB |
| 默认 | #F97316 | #EA580C | #FFF7ED |
弹窗改造:
@click.self 关闭)布局顺序: 封面图 → 类型标签 → 标题(2行截断)→ 简介(1-2行灰字)→ 邀请语 → 二维码 → 底部 CTA
SharePoster.vue(家庭邀请卡)familyName proppages/article-center/article-detail.vueopen-type="share" 那个),保留「海报」按钮generatePoster() 传新参数:dimensionCode(从 article.dimensionWeights 取权重最高维度)、summary(article.summary)、inviteText(「{昵称}邀请你一起阅读这篇文章」)pages/discover-detail/product-detail/product-detail.vuegetShareQrCode('pages/discover-detail/product-detail/product-detail', 'id=' + id + '&ref=' + referralCode) → 打开 ContentSharePosterdimensionCode(product.dimensionWeights 权重最高维度,空则用 product.domain 映射,再空默认)、coverImage、title、priceText(¥xx 会员¥xx)、ctaText="长按识别二维码 · 查看商品"、inviteText(「{昵称}邀请你一起看看这个好物」,昵称取 uni.getStorageSync('nickname'))shareMixin(拿邀请码)options.query.scene 若含 ref= 则提取邀请码 → autoBindInviteCode(code)pages/promotion/index.vuegetInviteQrCode() → 打开 SharePoster(家庭邀请卡,与邀请页一致,传 familyName)getFamilyMembers() 返回的 data.familyName(页面若无家庭数据则新增调用)pages/profile-extra/family-members.vuethis.familyName 传给 <SharePoster :family-name="familyName">(当前遗漏)点击分享 → getShareQrCode(page, scene) → 后端生成小程序码 base64
→ 打开 ContentSharePoster → 下载封面图 → canvas 绘制 → 显示
→ 保存 → canvasToTempFilePath → saveImageToPhotosAlbum
| 场景 | 处理 |
|---|---|
| 无维度数据 | 默认暖橙 #F97316 |
| summary 空 | 跳过简介行,布局上移 |
| 商品无价格/会员价 | 只显示有的部分 |
| 封面图下载失败 | 现有占位图逻辑保留 |
| 二维码生成失败 | toast 提示,不打开海报 |
| scene 超长 | 后端已有 32 字符截断 |
| 无相册权限 | 现有引导去设置 modal 保留 |
| 家庭名空 | 「{nickname}邀请你加入浠艾福」 |
| 财富中心无邀请码 | 沿用 loadReferralCode 逻辑 |
mvn compile 验证不受影响npm run build:mp-weixin 编译通过 + 真机/开发者工具手测 5 个场景App.vue:不改(商品页自解析 scene)| 文件 | 改动 |
|---|---|
cfc-frontend/components/ContentSharePoster.vue |
参数化 + 配色 + 弹窗改造 |
cfc-frontend/components/SharePoster.vue |
familyName prop + 文案 + 字号-2px |
cfc-frontend/pages/article-center/article-detail.vue |
去分享按钮、传新参数 |
cfc-frontend/pages/discover-detail/product-detail/product-detail.vue |
加分享按钮、海报、scene解析、shareMixin |
cfc-frontend/pages/promotion/index.vue |
加分享给好友按钮、海报 |
cfc-frontend/pages/profile-extra/family-members.vue |
传 familyName |