515 lines
12 KiB
JavaScript
515 lines
12 KiB
JavaScript
|
/* eslint-disable */
|
|||
|
// #ifdef APP-PLUS
|
|||
|
let alphaBg, shareMenu;
|
|||
|
// 关闭弹窗
|
|||
|
export const closeShare = function () {
|
|||
|
alphaBg && alphaBg.close();
|
|||
|
alphaBg && shareMenu.close();
|
|||
|
};
|
|||
|
|
|||
|
// 复制
|
|||
|
function onCopy(item, shareInfo, callback) {
|
|||
|
let copyInfo =
|
|||
|
shareInfo.shareUrl || shareInfo.shareContent || shareInfo.shareImg;
|
|||
|
if (copyInfo) {
|
|||
|
uni.setClipboardData({
|
|||
|
data: copyInfo,
|
|||
|
success: () => {
|
|||
|
uni.showToast({
|
|||
|
title: '已复制到剪贴板',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
callback && callback(item);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 更多
|
|||
|
function onMore(item, shareInfo, callback) {
|
|||
|
plus.share.sendWithSystem(
|
|||
|
{
|
|||
|
type: 'text',
|
|||
|
title: shareInfo.shareTitle || '',
|
|||
|
href: shareInfo.shareUrl || '',
|
|||
|
content: shareInfo.shareContent || ''
|
|||
|
},
|
|||
|
function (res) {
|
|||
|
callback && callback(item);
|
|||
|
},
|
|||
|
function (err) {
|
|||
|
console.log(err);
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
// 分享
|
|||
|
function onShare(item, shareInfo, callback) {
|
|||
|
if (shareInfo.type == undefined) {
|
|||
|
shareInfo.type = item.type;
|
|||
|
}
|
|||
|
let shareObj = {
|
|||
|
provider: item.provider,
|
|||
|
type: shareInfo.type,
|
|||
|
success: res => {
|
|||
|
callback && callback(item);
|
|||
|
console.log('success:' + JSON.stringify(res));
|
|||
|
},
|
|||
|
fail: err => {
|
|||
|
console.log('分享失败,参数缺失 fail:' + JSON.stringify(err));
|
|||
|
}
|
|||
|
};
|
|||
|
if (shareInfo.shareTitle) {
|
|||
|
shareObj.title = shareInfo.shareTitle;
|
|||
|
} else if (item.provider == 'qq') {
|
|||
|
uni.showToast({
|
|||
|
title: '缺失分享的标题',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
if (shareInfo.type == 0 || item.provider == 'qq') {
|
|||
|
if (shareInfo.shareUrl) {
|
|||
|
shareObj.href = shareInfo.shareUrl;
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '缺失分享的地址',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
if ([0, 1, 3, 4].includes(shareInfo.type)) {
|
|||
|
if (shareInfo.shareContent) {
|
|||
|
shareObj.summary = shareInfo.shareContent;
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '缺失分享的描述',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
if ([0, 2, 5].includes(shareInfo.type)) {
|
|||
|
if (shareInfo.shareImg) {
|
|||
|
shareObj.imageUrl = shareInfo.shareImg;
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '缺失分享的图片',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
if ([3, 4].includes(shareInfo.type)) {
|
|||
|
if (shareInfo.mediaUrl) {
|
|||
|
shareObj.mediaUrl = shareInfo.mediaUrl;
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '缺失分享的音视频地址',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
if (shareInfo.type == 5) {
|
|||
|
if (shareInfo.appId && shareInfo.appPath && shareInfo.appWebUrl) {
|
|||
|
shareObj.miniProgram = {
|
|||
|
id: shareInfo.appId,
|
|||
|
path: shareInfo.appPath,
|
|||
|
webUrl: shareInfo.appWebUrl
|
|||
|
};
|
|||
|
if (shareInfo.appType) {
|
|||
|
shareObj.miniProgram.type = shareInfo.appType;
|
|||
|
}
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
title: '缺失分享小程序的参数',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (item.scene) {
|
|||
|
shareObj.scene = item.scene;
|
|||
|
}
|
|||
|
uni.share(shareObj);
|
|||
|
}
|
|||
|
|
|||
|
let otherShareList = [
|
|||
|
{
|
|||
|
icon: '/static/share/icon_copy.png',
|
|||
|
text: '复制',
|
|||
|
provider: 'copy',
|
|||
|
onClick: onCopy
|
|||
|
},
|
|||
|
{
|
|||
|
icon: '/static/share/icon_more.png',
|
|||
|
text: '更多',
|
|||
|
provider: 'more',
|
|||
|
onClick: onMore
|
|||
|
}
|
|||
|
];
|
|||
|
let platformShareList = [];
|
|||
|
// 获取服务商支持的分享
|
|||
|
uni.getProvider({
|
|||
|
service: 'share',
|
|||
|
success: function (res) {
|
|||
|
if (res.provider.includes('sinaweibo')) {
|
|||
|
platformShareList = [
|
|||
|
{
|
|||
|
icon: '/static/share/icon_weibo.png',
|
|||
|
text: '新浪微博',
|
|||
|
onClick: onShare,
|
|||
|
provider: 'sinaweibo',
|
|||
|
type: 0
|
|||
|
}
|
|||
|
].concat(platformShareList);
|
|||
|
}
|
|||
|
if (res.provider.includes('qq')) {
|
|||
|
platformShareList = [
|
|||
|
{
|
|||
|
icon: '/static/share/icon_qq.png',
|
|||
|
text: 'QQ',
|
|||
|
onClick: onShare,
|
|||
|
provider: 'qq',
|
|||
|
type: 1
|
|||
|
}
|
|||
|
].concat(platformShareList);
|
|||
|
}
|
|||
|
if (res.provider.includes('weixin')) {
|
|||
|
platformShareList = [
|
|||
|
{
|
|||
|
icon: '/static/share/icon_weixin.png',
|
|||
|
text: '微信好友',
|
|||
|
onClick: onShare,
|
|||
|
provider: 'weixin',
|
|||
|
scene: 'WXSceneSession',
|
|||
|
type: 0
|
|||
|
},
|
|||
|
{
|
|||
|
icon: '/static/share/icon_pengyouquan.png',
|
|||
|
text: '朋友圈',
|
|||
|
onClick: onShare,
|
|||
|
provider: 'weixin',
|
|||
|
scene: 'WXSenceTimeline',
|
|||
|
type: 0
|
|||
|
},
|
|||
|
{
|
|||
|
icon: '/static/share/ic_xiaochengxu.png',
|
|||
|
text: '小程序',
|
|||
|
onClick: onShare,
|
|||
|
provider: 'weixin',
|
|||
|
scene: 'WXSceneSession',
|
|||
|
type: 5
|
|||
|
}
|
|||
|
].concat(platformShareList);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// 根据type类型过滤掉不支持的平台
|
|||
|
function platformFilter(data) {
|
|||
|
console.log(data);
|
|||
|
let platformList = [];
|
|||
|
let supportList = [
|
|||
|
['weixin', 'sinaweibo'],
|
|||
|
['weixin', 'sinaweibo', 'qq'],
|
|||
|
['weixin', 'sinaweibo', 'qq'],
|
|||
|
['weixin', 'qq'],
|
|||
|
['weixin', 'sinaweibo'],
|
|||
|
['weixin']
|
|||
|
];
|
|||
|
let currentSupport = [];
|
|||
|
if (data.type >= 0 && data.type <= 5) {
|
|||
|
currentSupport = supportList[data.type];
|
|||
|
}
|
|||
|
console.log('platformShareList', platformShareList);
|
|||
|
platformShareList.forEach(item => {
|
|||
|
if (data.type >= 0 && data.type <= 5) {
|
|||
|
if (currentSupport.includes(item.provider)) {
|
|||
|
if (item.provider == 'weixin') {
|
|||
|
if (item.text == '小程序') {
|
|||
|
if (data.type == 5) {
|
|||
|
platformList.push(item);
|
|||
|
}
|
|||
|
} else if (data.type !== 5) {
|
|||
|
platformList.push(item);
|
|||
|
}
|
|||
|
} else {
|
|||
|
platformList.push(item);
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (item.provider == 'weixin') {
|
|||
|
if (item.text == '小程序') {
|
|||
|
if (data.appId && data.appPath) {
|
|||
|
platformList.push(item);
|
|||
|
}
|
|||
|
} else {
|
|||
|
platformList.push(item);
|
|||
|
}
|
|||
|
} else {
|
|||
|
platformList.push(item);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
return platformList.concat(otherShareList);
|
|||
|
}
|
|||
|
|
|||
|
// 数据处理
|
|||
|
function dataFactory(shareInfo = {}) {
|
|||
|
let config = {
|
|||
|
...shareInfo
|
|||
|
};
|
|||
|
config.shareUrl = shareInfo.shareUrl || '';
|
|||
|
config.shareContent = shareInfo.shareContent || '分享的描述';
|
|||
|
config.shareImg = shareInfo.shareImg || '分享的图片';
|
|||
|
return config;
|
|||
|
}
|
|||
|
|
|||
|
export default function (shareInfo, callback) {
|
|||
|
shareInfo = dataFactory(shareInfo);
|
|||
|
// 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心
|
|||
|
let screenWidth = plus.screen.resolutionWidth;
|
|||
|
//以360px宽度屏幕为例,上下左右边距及2排按钮边距留25像素,图标宽度55像素,同行图标间的间距在360宽的屏幕是30px,但需要动态计算,以此原则计算4列图标分别的left位置
|
|||
|
//图标下的按钮文字距离图标5像素,文字大小12像素
|
|||
|
//底部取消按钮高度固定为44px
|
|||
|
//TODO 未处理横屏和pad,这些情况6个图标应该一排即可
|
|||
|
let marginTop = 25, //上间距
|
|||
|
marginLeft = 25, //左间距
|
|||
|
iconWidth = 55, //图标宽宽
|
|||
|
iconHeight = 55, //图标高度
|
|||
|
icontextSpace = 10, //图标与文字间距
|
|||
|
textHeight = 12; //文字大小
|
|||
|
let left1 = (marginLeft / 360) * screenWidth;
|
|||
|
let colNumber = Math.floor(screenWidth / (iconWidth + marginLeft));
|
|||
|
let i =
|
|||
|
(screenWidth - (iconWidth + marginLeft) * colNumber - marginLeft) /
|
|||
|
(colNumber + 1);
|
|||
|
let initMargin = marginLeft + i;
|
|||
|
let itemWidth = iconWidth + initMargin;
|
|||
|
let itemHeight = iconHeight + icontextSpace + textHeight + marginTop;
|
|||
|
let textTop = iconHeight + icontextSpace;
|
|||
|
alphaBg = new plus.nativeObj.View('alphaBg', {
|
|||
|
//先创建遮罩层
|
|||
|
top: '0px',
|
|||
|
left: '0px',
|
|||
|
height: '100%',
|
|||
|
width: '100%',
|
|||
|
backgroundColor: 'rgba(0,0,0,0.5)'
|
|||
|
});
|
|||
|
alphaBg.addEventListener('click', function () {
|
|||
|
//处理遮罩层点击
|
|||
|
alphaBg.close();
|
|||
|
shareMenu.close();
|
|||
|
});
|
|||
|
let shareList = platformFilter(shareInfo);
|
|||
|
shareMenu = new plus.nativeObj.View('shareMenu', {
|
|||
|
//创建底部图标菜单
|
|||
|
bottom: '0px',
|
|||
|
left: '0px',
|
|||
|
height:
|
|||
|
Math.ceil(shareList.length / colNumber) * itemHeight +
|
|||
|
marginTop +
|
|||
|
44 +
|
|||
|
1 +
|
|||
|
'px',
|
|||
|
width: '100%',
|
|||
|
backgroundColor: 'rgb(255,255,255)'
|
|||
|
});
|
|||
|
//绘制底部图标菜单的内容
|
|||
|
shareMenu.draw([
|
|||
|
{
|
|||
|
tag: 'rect', //菜单顶部的分割灰线
|
|||
|
color: '#e7e7e7',
|
|||
|
position: {
|
|||
|
top: '0px',
|
|||
|
height: '1px'
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
tag: 'font',
|
|||
|
id: 'sharecancel', //底部取消按钮的文字
|
|||
|
text: '取消分享',
|
|||
|
textStyles: {
|
|||
|
size: '14px'
|
|||
|
},
|
|||
|
position: {
|
|||
|
bottom: '0px',
|
|||
|
height: '44px'
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
tag: 'rect', //底部取消按钮的顶部边线
|
|||
|
color: '#e7e7e7',
|
|||
|
position: {
|
|||
|
bottom: '45px',
|
|||
|
height: '1px'
|
|||
|
}
|
|||
|
}
|
|||
|
]);
|
|||
|
shareList.map((v, k) => {
|
|||
|
let time = new Date().getTime();
|
|||
|
let row = Math.floor(k / colNumber);
|
|||
|
let col = k % colNumber;
|
|||
|
let item = [
|
|||
|
{
|
|||
|
src: v.icon,
|
|||
|
id: Math.random() * 1000 + time,
|
|||
|
tag: 'img',
|
|||
|
position: {
|
|||
|
top: row * itemHeight + marginTop,
|
|||
|
left: col * itemWidth + initMargin,
|
|||
|
width: iconWidth,
|
|||
|
height: iconWidth
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
text: v.text,
|
|||
|
id: Math.random() * 1000 + time,
|
|||
|
tag: 'font',
|
|||
|
textStyles: {
|
|||
|
size: textHeight
|
|||
|
},
|
|||
|
position: {
|
|||
|
top: row * itemHeight + textTop,
|
|||
|
left: col * itemWidth + initMargin,
|
|||
|
width: iconWidth,
|
|||
|
height: iconWidth
|
|||
|
}
|
|||
|
}
|
|||
|
];
|
|||
|
shareMenu.draw(item);
|
|||
|
});
|
|||
|
shareMenu.addEventListener('click', function (e) {
|
|||
|
//处理底部图标菜单的点击事件,根据点击位置触发不同的逻辑
|
|||
|
if (e.screenY > plus.screen.resolutionHeight - 44) {
|
|||
|
//点击了底部取消按钮
|
|||
|
alphaBg.close();
|
|||
|
shareMenu.close();
|
|||
|
} else if (e.clientX < 5 || e.clientX > screenWidth - 5 || e.clientY < 5) {
|
|||
|
//屏幕左右边缘5像素及菜单顶部5像素不处理点击
|
|||
|
} else {
|
|||
|
//点击了图标按钮
|
|||
|
let x = e.clientX;
|
|||
|
let y = e.clientY;
|
|||
|
let colIdx = Math.floor(x / itemWidth);
|
|||
|
let rowIdx = Math.floor(y / itemHeight);
|
|||
|
let tapIndex = colIdx + rowIdx * colNumber;
|
|||
|
shareList[tapIndex].onClick(shareList[tapIndex], shareInfo, callback);
|
|||
|
}
|
|||
|
});
|
|||
|
alphaBg.show();
|
|||
|
shareMenu.show();
|
|||
|
return {
|
|||
|
close: function () {
|
|||
|
alphaBg && alphaBg.close();
|
|||
|
alphaBg && shareMenu.close();
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
// #endif
|
|||
|
|
|||
|
/**
|
|||
|
* 获取分享海报
|
|||
|
* @param array store 海报素材
|
|||
|
* @param string store_name 素材文字
|
|||
|
* @param string price 价格
|
|||
|
* @param function successFn 回调函数
|
|||
|
*
|
|||
|
*
|
|||
|
*/
|
|||
|
export const PosterCanvas = (store, successCallBack) => {
|
|||
|
uni.showLoading({
|
|||
|
title: '海报生成中',
|
|||
|
mask: true
|
|||
|
});
|
|||
|
getImageInfo([store.image, store.code]).then(res => {
|
|||
|
let contentHh = 48 * 1.3
|
|||
|
const ctx = uni.createCanvasContext('myCanvas')
|
|||
|
ctx.clearRect(0, 0, 0, 0);
|
|||
|
const WIDTH = 747
|
|||
|
const HEIGHT = 1326;
|
|||
|
ctx.fillStyle = "#FFFFFF";
|
|||
|
ctx.fillRect(0, 0, WIDTH, HEIGHT);
|
|||
|
ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH);
|
|||
|
ctx.drawImage(res[1].path, 40, 1064, 200, 200);
|
|||
|
ctx.save();
|
|||
|
let r = 90;
|
|||
|
let d = r * 2;
|
|||
|
let cx = 40;
|
|||
|
let cy = 990;
|
|||
|
ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI);
|
|||
|
ctx.clip();
|
|||
|
ctx.restore();
|
|||
|
ctx.setTextAlign('center');
|
|||
|
ctx.setFontSize(48);
|
|||
|
ctx.setFillStyle('#000');
|
|||
|
ctx.fillText(store.title, WIDTH / 2, 810 + contentHh);
|
|||
|
ctx.setTextAlign('center')
|
|||
|
ctx.setFontSize(32);
|
|||
|
ctx.setFillStyle('red');
|
|||
|
ctx.fillText('¥' + store.price, WIDTH / 2, 985);
|
|||
|
ctx.setTextAlign('center')
|
|||
|
ctx.setFontSize(22);
|
|||
|
ctx.setFillStyle('#333333');
|
|||
|
ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167);
|
|||
|
ctx.save();
|
|||
|
ctx.draw(true, () => {
|
|||
|
uni.canvasToTempFilePath({
|
|||
|
canvasId: 'myCanvas',
|
|||
|
fileType: 'png',
|
|||
|
destWidth: WIDTH,
|
|||
|
destHeight: HEIGHT,
|
|||
|
success: function (res) {
|
|||
|
uni.hideLoading();
|
|||
|
successCallBack && successCallBack(res.tempFilePath);
|
|||
|
},
|
|||
|
fail: function (error) {
|
|||
|
console.log(error)
|
|||
|
},
|
|||
|
|
|||
|
})
|
|||
|
});
|
|||
|
|
|||
|
})
|
|||
|
|
|||
|
// uni.getImageInfo({
|
|||
|
// src: store.image,
|
|||
|
// fail: function (res) {
|
|||
|
// uni.showToast({
|
|||
|
// title: '海报生成失败',
|
|||
|
// icon: "none",
|
|||
|
// duration: 2000
|
|||
|
// });
|
|||
|
// },
|
|||
|
// success: function (res) {
|
|||
|
|
|||
|
// }
|
|||
|
// })
|
|||
|
}
|
|||
|
const getImageInfo = (images) => {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
let imageAry = {}
|
|||
|
images.map((item, index) => {
|
|||
|
uni.getImageInfo({
|
|||
|
src: item,
|
|||
|
fail: function (res) {
|
|||
|
imageAry[index] = null
|
|||
|
if (imageAry.length == images.length) {
|
|||
|
resolve(imageAry)
|
|||
|
}
|
|||
|
},
|
|||
|
success: function (res) {
|
|||
|
imageAry[index] = res
|
|||
|
if (Object.keys(imageAry).length == images.length) {
|
|||
|
resolve(imageAry)
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
})
|
|||
|
})
|
|||
|
}
|