mall-app-b/peach/platform/share.js

182 lines
5.4 KiB
JavaScript
Raw Normal View History

2024-05-10 20:29:20 +08:00
import $store from '@/peach/store'
import $platform from '@/peach/platform'
import $router from '@/peach/router'
import $url from '@/peach/url'
// #ifdef H5
import $wxsdk from '@/peach/libs/sdk-h5-weixin'
// #endif
// 设置分享的平台渠道: 1=H5,2=微信公众号网页,3=微信小程序,4=App
const platformMap = ['H5', 'WechatOfficialAccount', 'WechatMiniProgram', 'App']
// 设置分享方式: 1=直接转发,2=海报,3=复制链接
const fromMap = ['forward', 'poster', 'link']
// 设置分享信息参数
const getShareInfo = (
scene = {
title: '', // 自定义分享标题
desc: '', // 自定义描述
image: '', // 自定义分享图片
params: {}, // 自定义分享参数
},
poster = {
// 自定义海报数据
type: 'user',
}
) => {
let shareInfo = {
title: '', // 分享标题
desc: '', // 描述
image: '', // 分享图片
path: '', // 分享页面+参数
link: '', // 分享Url+参数
query: '', // 分享参数
poster, // 海报所需数据
}
const app = $store('app')
const shareConfig = app.platform.share
// 自动拼接分享用户参数
const query = buildSpmQuery(scene.params)
shareInfo.query = query
// 配置分享链接地址
shareInfo.link = buildSpmLink(query, shareConfig.linkAddress)
// 配置转发参数
if (shareConfig.methods.includes('forward')) {
if (shareConfig.forwardInfo.title === '' || shareConfig.forwardInfo.image === '') {
console.log('请在平台设置中配置转发信息')
}
// 设置自定义分享信息
shareInfo.title = scene.title || shareConfig.forwardInfo.title
shareInfo.image = $url.cdn(scene.image || shareConfig.forwardInfo.image)
shareInfo.desc = scene.desc || shareConfig.forwardInfo.subtitle
shareInfo.path = buildSpmPath(query)
}
return shareInfo
}
// 构造spm分享参数
const buildSpmQuery = (params) => {
const user = $store('user')
let shareId = '0' // 设置分享者用户ID
if (typeof params.shareId === 'undefined') {
if (user.isLogin) {
shareId = user.userInfo.id
}
}
let page = '1' // 页面类型: 1=首页(默认),2=商品,3=拼团商品,4=秒杀商品,5=邀请参团
if (typeof params.page !== 'undefined') {
page = params.page
}
let query = '0' // 设置页面ID: 如商品ID、拼团ID等
if (typeof params.query !== 'undefined') {
query = params.query
}
let platform = platformMap.indexOf($platform.name) + 1
let from = '1'
if (typeof params.from !== 'undefined') {
from = platformMap.indexOf(params.from) + 1
}
//spmParams = ... 可按需扩展
return `spm=${shareId}.${page}.${query}.${platform}.${from}`
}
// 构造页面分享参数
const buildSpmPath = (query) => {
return `/pages/index/index?${query}`
}
// 构造分享链接
const buildSpmLink = (query, linkAddress = '') => {
return `${linkAddress}?${query}`
}
// 解析Spm
const decryptSpm = (spm) => {
const user = $store('user')
let shareParamsArray = spm.split('.')
let shareParams = {
spm,
shareId: 0,
page: '',
query: {},
platform: '',
from: '',
}
let query
shareParams.shareId = shareParamsArray[0]
switch (shareParamsArray[1]) {
case '1':
// 默认首页不跳转
shareParams.page = '/pages/index/index'
break
case '2':
// 普通商品
shareParams.page = '/pages/goods/index'
shareParams.query = {
id: shareParamsArray[2],
}
break
case '3':
// 拼团商品
shareParams.page = '/pages/goods/groupon'
query = shareParamsArray[2].split(',')
shareParams.query = {
id: query[0],
activity_id: query[1],
}
break
case '4':
// 秒杀商品
shareParams.page = '/pages/goods/seckill'
query = shareParamsArray[2].split(',')
shareParams.query = {
id: query[1],
}
break
case '5':
// 参与拼团
shareParams.page = '/pages/activity/groupon/detail'
shareParams.query = {
id: shareParamsArray[2],
}
break
}
shareParams.platform = platformMap[shareParamsArray[3] - 1]
shareParams.from = fromMap[shareParamsArray[4] - 1]
if (shareParams.shareId != 0) {
// 已登录 立即添加分享记录
if (user.isLogin) {
user.addShareLog(shareParams)
} else {
// 未登录 待用户登录后添加分享记录
uni.setStorageSync('shareLog', shareParams)
}
}
if (shareParams.page !== '/pages/index/index') {
$router.go(shareParams.page, shareParams.query)
}
return shareParams
}
// 更新公众号分享sdk
const updateShareInfo = (shareInfo) => {
// #ifdef H5
if ($platform.name === 'WechatOfficialAccount') {
$wxsdk.updateShareInfo(shareInfo)
}
// #endif
}
export default {
getShareInfo,
updateShareInfo,
decryptSpm,
}