Files
huangjingfen/pro_v3.5.1/view/uniapp/pages/goods/goodsShare/index.vue

615 lines
17 KiB
Vue
Raw Normal View History

<template>
<view :style="colorStyle">
<view class="px-20">
<view class="w-full bg--w111-fff rd-24rpx p-24 mt-24"v-show="showCardOne">
<view class='flex-y-center'>
<text class="iconfont icon-icon_WeChat_1 fs-36"></text>
<text class="fs-30 lh-42rpx fw-500 pl-8">方式一商品卡片分享</text>
</view>
<view class="mt-24 w-full h-256 bg--w111-f9f9f9 rd-12rpx relative bg-cover" :style="[shareCardBg]">
<view class="flex-y-center card-site">
<image :src="mpData.logo_url" class="site-logo"></image>
<text class="site-name line1">{{mpData.site_name}}</text>
</view>
<image :src="storeInfo.image" class="w-210 h-168 card-center-image" mode="aspectFill"></image>
<!-- -->
</view>
<!-- #ifdef MP-WEIXIN -->
<button class="w-full bg-gradient h-80 rd-40rpx flex-center fs-28 text--w111-fff mt-24" open-type="share" hover-class="none">分享商品卡片</button>
<!-- #endif -->
<!-- #ifdef APP || H5 -->
<view class="w-full bg-gradient h-80 rd-40rpx flex-center fs-28 text--w111-fff mt-24" @tap="cardShare">分享商品卡片</view>
<!-- #endif -->
</view>
<view class="w-full bg--w111-fff rd-24rpx p-24 mt-32">
<view class="flex-between-center">
<view class='flex-y-center'>
<image src="../static/share_picture.png" class="w-36 h-36"></image>
<text class="fs-30 lh-42rpx fw-500 pl-8">方式{{showCardOne ? '二' : '一'}}商品图片分享</text>
</view>
<text class="iconfont fs-28 text--w111-666"
v-if="storeInfo.slider_image.length > 1"
:class="isGrid ? 'icon-a-ic_Imageandtextsorting' : 'icon-a-ic_Picturearrangement'"
@tap="()=>{isGrid = !isGrid}"></text>
</view>
<view v-if="storeInfo.slider_image.length == 1">
<view class="mt-24 flex-x-center" >
<view class="load-box poster-img" v-show="!posterImage"></view>
<image v-show="posterImage" :src="posterImage" @tap="proviewPhoto(0)" class="poster-img" mode="aspectFill"></image>
</view>
<view class="w-full flex-between-center">
<!-- #ifdef MP-WEIXIN || APP-PLUS -->
<view class="w-full bg-gradient h-80 rd-40rpx flex-center fw-500 fs-28 text--w111-fff mt-24" @tap="savePoster">保存商品海报图片</view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view class="w-full bg-gradient h-80 rd-40rpx flex-center fs-28 text--w111-fff mt-24" @tap="proviewPhoto(0)">保存分享</view>
<!-- #endif -->
</view>
</view>
<view v-else>
<view class="mt-24" v-show="!isGrid">
<scroll-view scroll-x="true" class="white-nowrap vertical-middle w-full" show-scrollbar="false">
<view class="inline-block mr-16" v-show="!posterImage">
<view class="load-box w-192 h-192 rd-8rpx"></view>
</view>
<view class="inline-block mr-16" v-for="(item,index) in productSwiper" :key="index">
<view class="w-192 h-192 relative text--w111-fff" @tap="proviewPhoto(index)">
<image :src="item.pic" class="w-full h-full rd-8rpx"
:class="{'b-e': item.isQrcode}" mode="aspectFill"></image>
<view class="qr-tag flex-center fs-18 text--w111-fff" v-if="posterImage && item.isQrcode">二维码推广图</view>
<!-- #ifdef MP-WEIXIN || APP-PLUS -->
<text class="iconfont fs-36 select-icon"
:class="item.select ? 'icon-a-ic_CompleteSelect' : 'icon-ic_unselect'" @tap.stop="selectPic(item)"></text>
<!-- #endif -->
</view>
</view>
</scroll-view>
</view>
<view class="w-full grid-column-3 grid-gap-16rpx mt-24" v-show="isGrid">
<view class="load-box w-full h-210 rd-12rpx" v-show="!posterImage"></view>
<view class="w-full h-210 relative text--w111-fff"
:class="{'b-e rd-12rpx': item.isQrcode}"
v-for="(item,index) in productSwiper" :key="index"
@tap="proviewPhoto(index)">
<image :src="item.pic" class="w-full h-full rd-12rpx"
mode="aspectFill"></image>
<view class="qr-tag flex-center fs-18 text--w111-fff" v-if="posterImage && item.isQrcode">二维码推广图</view>
<!-- #ifdef MP-WEIXIN || APP-PLUS -->
<text class="iconfont fs-36 select-icon"
:class="item.select ? 'icon-a-ic_CompleteSelect' : 'icon-ic_unselect'"
@tap.stop="selectPic(item)"></text>
<!-- #endif -->
</view>
</view>
<view class="w-full flex-between-center">
<!-- #ifdef MP-WEIXIN || APP-PLUS -->
<view class="w-320 h-80 rd-40rpx flex-center fs-26 view-border fw-500 font-num mt-24" @tap="savePhoto('pic')">保存选中图片</view>
<view class="w-320 bg-gradient h-80 rd-40rpx flex-center fw-500 fs-28 text--w111-fff mt-24" @tap="savePhoto('poster')">保存商品海报图片</view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view class="w-full bg-gradient h-80 rd-40rpx flex-center fs-28 text--w111-fff mt-24" @tap="proviewPhoto(0)">保存分享</view>
<!-- #endif -->
</view>
</view>
</view>
<view class="w-full bg--w111-fff rd-24rpx p-24 mt-24">
<view class='flex-y-center'>
<image src="../static/share_text.png" class="w-36 h-36"></image>
<text class="fs-30 lh-42rpx fw-500 pl-8">方式{{showCardOne ? '三' : '二'}}文案分享</text>
</view>
<!-- #ifdef MP-WEIXIN -->
<view class="mt-24 bg--w111-f9f9f9 rd-12rpx p-16 fs-26 lh-36rpx space-line">
{{storeInfo.share_content || storeInfo.store_name}}
<text><br/>{{shortLink}}</text>
</view>
<!-- #endif -->
<!-- #ifdef H5 || APP-PLUS -->
<view class="mt-24 bg--w111-f9f9f9 rd-12rpx p-16 fs-26 lh-36rpx space-line">
{{storeInfo.share_content || storeInfo.store_name}}
<text><br/>{{codeVal}}</text>
</view>
<!-- #endif -->
<view class="w-full flex-between-center">
<view class="w-320 h-80 rd-40rpx flex-center fs-26 view-border fw-500 font-num mt-24" @tap="copyShare(0)">仅复制链接</view>
<view class="w-320 bg-gradient h-80 rd-40rpx flex-center fw-500 fs-28 text--w111-fff mt-24" @tap="copyShare(1)">复制文案及链接</view>
</view>
</view>
<view class="pb-safe">
<view class="h-80"></view>
</view>
</view>
<!-- #ifdef H5 || APP-PLUS -->
<zb-code ref="qrcode" onval loadMake :show="codeShow" cid="1" :val="codeVal" @result="qrR" />
<!-- #endif -->
<canvas class="canvas" canvas-id="myCanvas" v-if="canvasStatus"></canvas>
</view>
</template>
<script>
import colors from "@/mixins/color";
import {HTTP_REQUEST_URL} from '@/config/app';
import { getProductDetail, getProductCode, getShortLinkApi } from "@/api/store.js";
import { getUserInfo, userShare } from '@/api/user.js';
import { toLogin } from '@/libs/login.js';
import { mapGetters } from 'vuex';
import zbCode from '@/components/zb-code/zb-code.vue'
export default {
data() {
return {
imgHost: HTTP_REQUEST_URL,
id: 0,
canvasStatus: false,
//二维码参数
codeShow: false,
codeVal: "", // 要生成的二维码值
shareQrcode: 0,
PromotionCode: '',
followCode: '',
siteName: '', //商城名称
posterTitle: '',
themeColor: '#e93323',
fontColor: '#e93323',
posterImage: '', //海报路径
storeImage: '', //海报产品图
isDown: true,
posterImageStatus: false,
storeInfo:{
slider_image: []
},
productSwiper: [],
showCardOne: true,
shortLink: '',
isGrid: true,
mpData:{}
};
},
components: { zbCode },
computed:{
...mapGetters(['isLogin', 'uid']),
shareCardBg(){
return {
backgroundImage: 'url('+this.imgHost+'/statics/images/promoter/promoter_group9.png'+')'
}
},
},
mixins: [colors],
onLoad(options) {
// #ifdef H5
this.showCardOne = this.$wechat.isWeixin() ? true : false;
// #endif
if (!options.id) {
return this.$util.Tips({
title: '缺少参数无法查看商品'
}, {
tab: 3
});
}
this.id = options.id || 0;
this.getInfo();
// #ifdef MP-WEIXIN
this.mpData = uni.getStorageSync('BASIC_CONFIG');
this.getShortLink();
// #endif
},
onReady: function() {
this.isNodes++;
let uid = this.isLogin ? this.$store.state.app.uid : ''
// #ifdef H5
this.codeVal = window.location.origin + '/pages/goods_details/index?id=' + this.id +
'&spid=' + uid
// #endif
// #ifdef APP-PLUS
this.codeVal = HTTP_REQUEST_URL + '/pages/goods_details/index?id=' + this.id +
'&spid=' + uid
// #endif
},
methods:{
async getInfo(){
let res = await getProductDetail(this.id, {promotions_type: 0});
let storeInfo = res.data.storeInfo;
this.$set(this, 'storeInfo', storeInfo);
this.$set(this, 'shareQrcode', res.data.share_qrcode);
this.$set(this, 'siteName', res.data.site_name);
this.$set(this, 'posterTitle', res.data.product_poster_title);
this.productSwiper = storeInfo.slider_image.map(item=>{
return {
pic: item,
select: false,
isQrcode: false,
}
})
setTimeout(()=>{
this.goPoster();
},500)
},
getShortLink(){
getShortLinkApi(this.id).then(res=>{
this.shortLink = res.data.code;
}).catch(err=>{
return this.$util.Tips({
title: err
});
})
},
copyShare(type){
let that = this;
let shareText = this.storeInfo.share_content || this.storeInfo.store_name;
let copyText = '';
// #ifdef MP-WEIXIN
copyText = type == 1 ? shareText + ' ' + this.shortLink : this.shortLink;
// #endif
// #ifdef APP-PLUS || H5
copyText = type == 1 ? shareText + ' ' + this.codeVal : this.codeVal;
// #endif
uni.setClipboardData({
data: copyText,
success:()=>{
uni.showToast({
title: '复制成功,快去分享吧',
icon: 'none'
})
}
})
},
qrR(res) {
// #ifdef H5
if (!this.$wechat.isWeixin() || this.shareQrcode != '1') {
this.PromotionCode = res;
this.followCode = ''
}
// #endif
// #ifdef APP-PLUS
this.PromotionCode = res;
// #endif
},
//替换安全域名
setDomain: function(url) {
url = url ? url.toString() : '';
//本地调试打开,生产请注销
if (url.indexOf('https://') > -1) return url;
else return url.replace('http://', 'https://');
},
//图片转符合安全域名路径
downloadFileImage(url) {
url = this.setDomain(url)
return new Promise((resolve, reject) => {
let that = this;
uni.downloadFile({
url: url,
success: function(res) {
resolve(res.tempFilePath);
},
fail: function(err) {
console.error(err.errMsg);
}
});
})
},
async goPoster() {
let that = this;
let storeImage = await this.downloadFileImage(this.storeInfo.image);
let posterbackgd = await this.downloadFileImage(this.imgHost + '/statics/images/product/posterbackgd.png');
// #ifdef MP-WEIXIN
// 小程序端获取小程序码
let res = await getProductCode(that.id);
if(!res.data.code){
return that.$util.Tips({
title: '小程序二维码需要发布正式版后才能获取到'
});
}
let PromotionCode = await this.downloadFileImage(res.data.code)
// #endif
// #ifdef H5
let PromotionCode = '';
if(this.$wechat.isWeixin()){
// 公众号端获取公众号二维码
let res = await getProductCode(that.id);
PromotionCode = await this.downloadFileImage(res.data.code)
}else{
// h5端获取本地生成的二维码
PromotionCode = this.PromotionCode;
}
// #endif
// #ifdef APP-PLUS
let PromotionCode = this.PromotionCode;
// #endif
that.$set(that, 'canvasStatus', true);
let arr2 = [posterbackgd, storeImage, PromotionCode];
that.$nextTick(function() {
setTimeout(()=>{
that.$util.PosterCanvas(that.fontColor, that.themeColor, that.siteName,arr2,
that.storeInfo.store_name,
that.storeInfo.price,
that.storeInfo.ot_price,
that.posterTitle,
function(tempFilePath) {
that.$set(that, 'posterImage', tempFilePath);
that.$set(that, 'posterImageStatus', true);
that.$set(that, 'canvasStatus', false);
that.productSwiper.unshift({
pic:tempFilePath,
select: false,
isQrcode:true
})
});
},1000)
})
},
cardShare(){
// #ifdef H5
this.ShareInfo();
uni.showToast({
title: '请点击右上角三个点进行分享',
icon: 'none'
})
// #endif
// #ifdef APP-PLUS
this.appShare();
// #endif
},
//#ifdef H5
ShareInfo() {
let data = this.storeInfo;
if (this.$wechat.isWeixin()) {
let configAppMessage = {
desc: data.store_info,
title: data.store_name,
link: '/pages/goods_details/index?id=' + this.id + '&spid=' + this.uid,
imgUrl: data.image
};
this.$wechat.wechatEvevt([
'updateAppMessageShareData',
'updateTimelineShareData',
'onMenuShareAppMessage',
'onMenuShareTimeline'
], configAppMessage).then(res => {}).catch(err => {});
}
},
//#endif
appShare() {
let that = this;
uni.share({
provider: "weixin",
scene: 'WXSceneSession',
type: 0,
href: `${HTTP_REQUEST_URL}/pages/goods_details/index?id=${that.id}&spid=${that.uid}`,
title: that.storeInfo.store_name,
summary: that.storeInfo.store_info,
imageUrl: that.storeInfo.small_image,
success: function(res) {
},
fail: function(err) {
uni.showToast({
title: '分享失败',
icon: 'none',
duration: 2000
})
}
});
},
selectPic(item){
item.select = !item.select;
},
savePhoto(type){
// #ifdef MP-WEIXIN
let that = this;
uni.getSetting({
success(res){
if (!res.authSetting['scope.writePhotosAlbum']) {
uni.authorize({
scope: 'scope.writePhotosAlbum',
success() {
if(type == 'poster'){
that.savePoster()
}else{
that.mpSave();
}
}
});
}else{
if(type == 'poster'){
that.savePoster()
}else{
that.mpSave();
}
}
}
})
// #endif
// #ifdef APP-PLUS
if(type == 'poster'){
this.savePoster()
}else{
this.mpSave();
}
// #endif
},
mpSave(){
let that = this;
let arr = this.productSwiper.filter(val => val.select);
let picLength = arr.length; // 要下载的总条数
let index = 0;
uni.showLoading({
title: '图片下载中',
mask: true
});
for (let i = 0; i < arr.length; i++) {
if(arr[i].isQrcode){
this.savePoster();
}else{
uni.downloadFile({
url: arr[i].pic,
success: function(res) {
var temp = res.tempFilePath
uni.saveImageToPhotosAlbum({
filePath: temp,
success(res1) {
index++;
// 全部下载完后触发
if (index == picLength) {
uni.hideLoading()
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
}
},
fail: function(res) {
uni.hideLoading()
that.$util.Tips({
title: '保存失败'
});
}
})
},
fail(err) {
uni.hideLoading()
}
})
}
}
},
savePoster(){
let that = this;
uni.saveImageToPhotosAlbum({
filePath: that.posterImage,
success(res1) {
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
},
fail: function(res) {
that.$util.Tips({
title: '保存失败'
});
}
})
},
proviewPhoto(index){
let list = this.productSwiper.map(item=> item.pic);
uni.previewImage({
current: index,
urls: list
});
},
},
// #ifdef MP
onShareAppMessage: function() {
let that = this;
userShare();
return {
title: that.storeInfo.store_name || '',
imageUrl: that.storeInfo.image || '',
path: '/pages/goods_details/index?id=' + that.id + '&spid=' + that.uid
};
},
onShareTimeline() {
let that = this;
userShare();
return {
title: that.storeInfo.store_name || '',
imageUrl: that.storeInfo.image || '',
path: '/pages/goods_details/index?id=' + that.id + '&spid=' + that.uid
};
},
// #endif
}
</script>
<style lang="scss">
.icon-icon_WeChat_1{
color: rgba(11, 190, 36, 1);
}
.h-256{
height: 256rpx;
}
.bg-cover{
background-size: cover;
}
.card-site{
position: absolute;
left: 50%;
top: 24rpx;
transform: translateX(-50%);
width: 210rpx;
.site-logo{
width: 18rpx;
height: 18rpx;
border-radius: 50%;
}
.site-name{
width: 152rpx;
font-size: 18rpx;
color: #727272;
line-height: 16rpx;
padding-left: 4rpx;
}
}
.card-center-image{
position: absolute;
left: 50%;
top: 48rpx;
transform: translateX(-50%);
}
.poster-img{
width: 254rpx;
height: 438rpx;
border-radius: 12rpx;
border: 1rpx solid #EEEEEE;
}
.load-box{
animation: looming-gray 1s infinite linear;
background-color: #e3e3e3;
}
.view-border{
border: 1px solid var(--view-theme);
}
.icon-a-ic_CompleteSelect{
color: var(--view-theme);
}
.space-line{
white-space: pre-line
}
.select-icon{
position: absolute;
top: 12rpx;
right: 12rpx;
}
.b-e{
border: 1rpx solid #EEEEEE;
}
.qr-tag{
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 40rpx;
border-radius: 0 0 8rpx 8rpx;
background-color: rgba(0, 0, 0, 0.5);
}
.canvas {
position: fixed;
top: -1300px;
left: 0;
width: 750px;
height: 1300px;
}
@keyframes looming-gray {
0% {
background-color: #e3e3e3aa;
}
50% {
background-color: #e3e3e3;
}
100% {
background-color: #e3e3e3aa;
}
}
</style>