5 changed files with 2346 additions and 31 deletions
-
13App.vue
-
68pages_category_page1/goodsModule/components/GoodActivityDetail.vue
-
549pages_category_page1/goodsModule/components/GoodActivityDetail2.vue
-
4pages_category_page1/goodsModule/goodsDetails.vue
-
1743pages_category_page1/goodsModule/goodsDetails2.vue
@ -0,0 +1,549 @@ |
|||||
|
<!-- |
||||
|
* @FileDescription: 商品信息(包括活动信息、优惠券) |
||||
|
* @Author: kahu |
||||
|
* @Date: 2022/11/7 |
||||
|
* @LastEditors: kahu |
||||
|
* @LastEditTime: 2022/11/7 |
||||
|
--> |
||||
|
<template> |
||||
|
<view> |
||||
|
<!-- 商品详情 --> |
||||
|
<swiper |
||||
|
class="goodsImgswiper-box " |
||||
|
:indicator-dots="true" |
||||
|
:autoplay="true" |
||||
|
> |
||||
|
<swiper-item |
||||
|
v-for="(imgItem, index) in productInfo.images" |
||||
|
:key="index" |
||||
|
> |
||||
|
<image |
||||
|
class="goodsImg default-img u-skeleton-fillet" |
||||
|
:src="imgItem" |
||||
|
onerror="this.src='url(https://wechat.hnthee.com/ceres-local-file/image/default.png) no-repeat center';this.οnerrοr=null" |
||||
|
></image> |
||||
|
</swiper-item> |
||||
|
</swiper> |
||||
|
<!-- 分享 --> |
||||
|
<view |
||||
|
class="share-box flex-items-plus" |
||||
|
@click="shareMenuShow" |
||||
|
> |
||||
|
<image |
||||
|
class="share-img" |
||||
|
src="https://ceres.zkthink.com/static/images/shareBut.png" |
||||
|
></image> |
||||
|
<label class="fs24 mar-left-5">分享</label> |
||||
|
</view> |
||||
|
<view class="goodgDes-box flex-start flex-column"> |
||||
|
<view |
||||
|
v-if="skuSelect.activityType === 0" |
||||
|
class="priceBuyNum-box flex-display u-skeleton-fillet flex-sp-between mar-left-30" |
||||
|
> |
||||
|
<view> |
||||
|
<label class="fs36 font-color-C83732">¥</label> |
||||
|
<label class="fs36 fs-bold font-color-C83732 mar-left-10">{{ skuSelect.price || 0 }}</label> |
||||
|
<label class="fs24 font-color-999 discountsPriceLine mar-left-20">¥ |
||||
|
{{ skuSelect.originalPrice || 0 }}</label> |
||||
|
</view> |
||||
|
<label class="fs24 font-color-999">{{ productInfo.users || 0 }}{{$t('common.payticktip')}}</label> |
||||
|
</view> |
||||
|
<view |
||||
|
v-else-if="skuSelect.activityType === 8" |
||||
|
class="sceneMarketingBox" |
||||
|
> |
||||
|
<view class="flex-row-plus flex-items-plus mar-left-30 mar-top-10"> |
||||
|
<label class="fs30 font-color-FFF">¥</label> |
||||
|
<label class="fs42 mar-left-5 font-color-FFF">{{ skuSelect.price || 0 }}</label> |
||||
|
<label class="fs28 mar-left-10 discountsPriceLine font-color-CCC">¥ |
||||
|
{{ skuSelect.originalPrice || 0 }}</label> |
||||
|
</view> |
||||
|
<view class="sceneNameBox">{{ productInfo.sceneName }}</view> |
||||
|
</view> |
||||
|
<view |
||||
|
v-else |
||||
|
class="seckill-box" |
||||
|
> |
||||
|
<view |
||||
|
class="flex-items flex-sp-between" |
||||
|
v-if="skuSelect.activityType === 9 " |
||||
|
> |
||||
|
<view class="vipImg flex-items"> |
||||
|
<image |
||||
|
class="vip-icon" |
||||
|
src="https://ceres.zkthink.com/static/images/vipDetail.png" |
||||
|
mode="" |
||||
|
> |
||||
|
</image> |
||||
|
</view> |
||||
|
<view class="flex-row-plus flex-items-plus mar-left-30 mar-top-10"> |
||||
|
<label class="fs30 font-color-FFF">¥</label> |
||||
|
<label class="fs42 mar-left-5 font-color-FFF">{{ skuSelect.price || 0 }}</label> |
||||
|
<label class="fs28 mar-left-10 discountsPriceLine font-color-999">¥ |
||||
|
{{ skuSelect.originalPrice || 0 }} |
||||
|
</label> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view |
||||
|
v-else |
||||
|
class="flex-items flex-row flex-sp-between" |
||||
|
> |
||||
|
<view class="flex-column-plus"> |
||||
|
<image |
||||
|
v-if="[2,4].includes(skuSelect.activityType)" |
||||
|
class="seckill-icon" |
||||
|
src="https://ceres.zkthink.com/static/images/seckillicon.png" |
||||
|
mode="" |
||||
|
></image> |
||||
|
<image |
||||
|
v-if="[3,5].includes(skuSelect.activityType)" |
||||
|
class="discount-icon" |
||||
|
src="https://ceres.zkthink.com/static/images/discounticon.png" |
||||
|
mode="" |
||||
|
></image> |
||||
|
<image |
||||
|
v-if="skuSelect.activityType === 1" |
||||
|
class="spell-icon" |
||||
|
src="https://ceres.zkthink.com/static/images/spellicon.png" |
||||
|
mode="" |
||||
|
></image> |
||||
|
<view class="flex-row-plus flex-items mar-top-10"> |
||||
|
<label class="fs30 font-color-FFF">¥</label> |
||||
|
<label class="fs42 mar-left-5 font-color-FFF">{{ skuSelect.price || 0 }}</label> |
||||
|
<label class="fs28 mar-left-10 discountsPriceLine font-color-999">¥ |
||||
|
{{ skuSelect.originalPrice || 0 }} |
||||
|
</label> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view |
||||
|
v-if="[1,2,3,4,5].includes(skuSelect.activityType)" |
||||
|
class="countdown flex-column-plus" |
||||
|
> |
||||
|
<view v-if="timeActiveType"> |
||||
|
<label class="fs28">距离结束剩余</label> |
||||
|
<view class="flex-row-plus fs34 flex-items-plus mar-top-10"> |
||||
|
<view class="countdown-box flex-items-plus">{{ activeTimeObj.day }}</view> |
||||
|
<view class="font-color-999">天</view> |
||||
|
<view class="countdown-box flex-items-plus">{{ activeTimeObj.hour }}</view> |
||||
|
<view class="font-color-999">:</view> |
||||
|
<view class="countdown-box flex-items-plus">{{ activeTimeObj.min }}</view> |
||||
|
<view class="font-color-999">:</view> |
||||
|
<view class="countdown-box flex-items-plus">{{ activeTimeObj.sec }}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view v-else> |
||||
|
<label class="fs28 mar-right-20">即将开始:{{ skuSelect.startTime }}</label> |
||||
|
<!-- <view class="fs28 mar-right-20 mar-top-20">{{productInfo.startTime}}</view>--> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="nameContainer"> |
||||
|
<view class="goodsName-box overflowNoDot mar-top-30 mar-left-30 u-skeleton-fillet"> |
||||
|
<label class="goodsName fs32 mar-left-20 ">{{ productInfo.productName }}</label> |
||||
|
</view> |
||||
|
<view |
||||
|
class="collectBox " |
||||
|
@click="handleCollect" |
||||
|
> |
||||
|
<image |
||||
|
v-if="productInfo.ifCollect === 1" |
||||
|
class="store-icon " |
||||
|
src="https://ceres.zkthink.com/static/images/shoucangActive1.png" |
||||
|
></image> |
||||
|
<image |
||||
|
v-else |
||||
|
class="store-icon" |
||||
|
src="https://ceres.zkthink.com/static/images/shoucang2x.png" |
||||
|
> |
||||
|
</image> |
||||
|
<label class="fs22">{{$t('common.collect')}}</label> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view |
||||
|
v-if="markTools.length>0 || shopMarkTools.length>0" |
||||
|
class="activity-box mar-top-10" |
||||
|
@click="couponShowClick" |
||||
|
> |
||||
|
<label class="fs24 font-color-999">优惠</label> |
||||
|
<view class="activity-content mar-left-30 flex-items flex-sp-between flex-row"> |
||||
|
<view |
||||
|
class="fs20 overflow" |
||||
|
style="width: 500rpx;" |
||||
|
> |
||||
|
{{ productInfo.couponSplicing }} |
||||
|
</view> |
||||
|
<view class="flex-items"> |
||||
|
<label class="fs24 font-color-C5AA7B">领券</label> |
||||
|
<image |
||||
|
class="coupon-arrow" |
||||
|
src="https://ceres.zkthink.com/static/img/user/arrow.png" |
||||
|
></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 分享弹出 --> |
||||
|
<u-action-sheet |
||||
|
:list="shareObj.actionList" |
||||
|
v-model="shareObj.actionShow" |
||||
|
@click="handleShareSelect" |
||||
|
></u-action-sheet> |
||||
|
|
||||
|
<shareSpell |
||||
|
ref="shareSpell" |
||||
|
@shareCancel="shareCancel" |
||||
|
:url="shareObj.url" |
||||
|
:img="shareObj.image" |
||||
|
:title="shareObj.title" |
||||
|
> |
||||
|
</shareSpell> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
|
||||
|
<script> |
||||
|
import { TimeFormatting } from "../../../utils/timeUtil"; |
||||
|
import NET from "../../../utils/request"; |
||||
|
import API from "../../../config/api"; |
||||
|
import shareSpell from '../../../component/share.vue' |
||||
|
|
||||
|
export default { |
||||
|
name: "GoodActivityDetail", |
||||
|
components: {shareSpell}, |
||||
|
data() { |
||||
|
return { |
||||
|
// 活动倒计时 |
||||
|
timeDifference: 0, |
||||
|
activeTimeObj: { |
||||
|
day: '00', |
||||
|
hour: '00', |
||||
|
min: '00', |
||||
|
sec: '00' |
||||
|
}, |
||||
|
countdownInterval: null, |
||||
|
// 分享 |
||||
|
shareObj: { |
||||
|
url: '', |
||||
|
image: '', |
||||
|
title: '好友分享了一个很棒的商品', |
||||
|
actionList: [ |
||||
|
{text: '生成分享海报'}, |
||||
|
{text: '邀请好友'} |
||||
|
], |
||||
|
actionShow: false |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
props: { |
||||
|
// 商品信息 |
||||
|
productInfo: { |
||||
|
type: Object, |
||||
|
default: () => ({}) |
||||
|
}, |
||||
|
// 当前选中的sku |
||||
|
skuSelect: { |
||||
|
type: Object, |
||||
|
default: () => ({}) |
||||
|
}, |
||||
|
timeActiveType: { |
||||
|
type: Boolean, |
||||
|
default: () => false |
||||
|
}, |
||||
|
markTools: { |
||||
|
type: Array, |
||||
|
default: () => ([]) |
||||
|
}, |
||||
|
shopMarkTools: { |
||||
|
type: Array, |
||||
|
default: () => ([]) |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
/** |
||||
|
* 初始化活动倒计时 |
||||
|
* @param endTimestamp |
||||
|
*/ |
||||
|
handleGetCountDownNumber(endTimestamp) { |
||||
|
endTimestamp = endTimestamp.substring(0, 19).replace(/-/g, '/'); |
||||
|
// 与当前时间的时间差(秒) |
||||
|
const timeDifference = (new Date(endTimestamp).getTime() - new Date().getTime()) / 1000; |
||||
|
this.timeDifference = timeDifference |
||||
|
this.activeTimeObj = TimeFormatting(timeDifference) |
||||
|
this.handleCountDown() |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 开始倒计时 |
||||
|
*/ |
||||
|
handleCountDown() { |
||||
|
if (this.countdownInterval) { |
||||
|
return |
||||
|
} |
||||
|
this.countdownInterval = setInterval(() => { |
||||
|
if (this.timeDifference <= 0) { |
||||
|
clearInterval(this.countdownInterval) |
||||
|
uni.showToast({ |
||||
|
title: "活动结束", |
||||
|
duration: 2000, |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
this.$emit('activityEnd', 0) |
||||
|
} else { |
||||
|
this.timeDifference-- |
||||
|
this.activeTimeObj = TimeFormatting(this.timeDifference) |
||||
|
} |
||||
|
}, 1000) |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 拉起父组件优惠券 |
||||
|
*/ |
||||
|
couponShowClick() { |
||||
|
this.$emit('couponClick') |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 收藏 |
||||
|
*/ |
||||
|
handleCollect() { |
||||
|
if (this.productInfo.ifCollect === 0) { |
||||
|
NET.request(API.collect, { |
||||
|
productId: parseInt(this.productInfo.productId) |
||||
|
}, 'POST').then(res => { |
||||
|
this.productInfo.ifCollect = 1 |
||||
|
uni.showToast({ |
||||
|
title: this.$t('common.collectsuccess'), |
||||
|
icon: "success" |
||||
|
}) |
||||
|
}) |
||||
|
} else { |
||||
|
NET.request(API.cancelCollect, { |
||||
|
ids: [this.productInfo.productId] |
||||
|
}, 'PUT').then(res => { |
||||
|
this.productInfo.ifCollect = 0 |
||||
|
uni.showToast({ |
||||
|
title: this.$t('common.cancelcollectsuccess'), |
||||
|
icon: "success" |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 海报分享 |
||||
|
*/ |
||||
|
sharePoster() { |
||||
|
let system = undefined |
||||
|
// #ifdef APP-PLUS |
||||
|
system = 1 |
||||
|
// #endif |
||||
|
|
||||
|
// #ifdef H5 |
||||
|
system = 3 |
||||
|
// #endif |
||||
|
|
||||
|
// #ifdef MP-WEIXIN |
||||
|
system = 2 |
||||
|
// #endif |
||||
|
|
||||
|
// #ifdef MP-ALIPAY |
||||
|
system = 4 |
||||
|
// #endif |
||||
|
uni.showLoading({ |
||||
|
mask: true, |
||||
|
title: '请稍候...' |
||||
|
}) |
||||
|
NET.request(API.getSharePic, { |
||||
|
productId: this.productInfo.productId, |
||||
|
shopId: this.productInfo.shopId, |
||||
|
skuId: this.skuSelect.skuId, |
||||
|
terminal: system |
||||
|
}, 'GET').then(res => { |
||||
|
uni.hideLoading() |
||||
|
// 推广商品 |
||||
|
uni.navigateTo({ |
||||
|
url: `/pages_category_page1/distributionModule/shareProduct?shareType=2&productImage=${ this.productInfo.images[0] }&shopId=${ this.productInfo.shopId }&productId=${ this.productInfo.productId }&skuId=${ this.skuSelect.skuId }&productName=${ this.productInfo.productName }&price=${ this.productInfo.price }&headImage=${ res.data.headImage }&shareName=${ res.data.name }&shareImg=${ res.data }` |
||||
|
}); |
||||
|
}).catch(res => { |
||||
|
uni.hideLoading() |
||||
|
}) |
||||
|
}, |
||||
|
shareMenuShow() { |
||||
|
this.shareObj.actionShow = true |
||||
|
}, |
||||
|
shareCancel() { |
||||
|
this.$refs.shareSpell.shareShow = false |
||||
|
}, |
||||
|
handleShareSelect(index) { |
||||
|
if (index === 0) { |
||||
|
this.sharePoster() |
||||
|
} else { |
||||
|
this.shareObj.url = '/pages_category_page1/goodsModule/goodsDetails?shopId=' + this.productInfo.shopId + '&productId=' + this.productInfo.productId + '&skuId=' + this.skuSelect.skuId |
||||
|
this.shareObj.image = this.productInfo.images[0] |
||||
|
this.shareObj.title = `【cereshop】好友分享了一个好物给您!${ this.productInfo.productName } ¥${ this.productInfo.price } ` |
||||
|
this.$refs.shareSpell.shareShow = true |
||||
|
} |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style |
||||
|
lang="scss" |
||||
|
scoped |
||||
|
> |
||||
|
|
||||
|
.goodsImgswiper-box { |
||||
|
width: 750upx; |
||||
|
height: 750upx; |
||||
|
|
||||
|
.goodsImg { |
||||
|
width: 750upx; |
||||
|
height: 750upx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.share-box { |
||||
|
width: 200upx; |
||||
|
height: 60upx; |
||||
|
background-color: #FFFFFF; |
||||
|
border-radius: 30upx 0 0 30upx; |
||||
|
position: absolute; |
||||
|
top: 30upx; |
||||
|
right: 0; |
||||
|
z-index: 99; |
||||
|
|
||||
|
.share-img { |
||||
|
width: 36upx; |
||||
|
height: 36upx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.goodgDes-box { |
||||
|
background-color: #FFFFFF; |
||||
|
width: 100%; |
||||
|
padding-bottom: 25upx; |
||||
|
|
||||
|
.priceBuyNum-box { |
||||
|
width: 677upx; |
||||
|
margin-top: 30upx; |
||||
|
} |
||||
|
|
||||
|
.nameContainer { |
||||
|
display: flex; |
||||
|
|
||||
|
.goodsName-box { |
||||
|
width: 677upx; |
||||
|
height: 85upx; |
||||
|
|
||||
|
.img618-cion { |
||||
|
width: 70upx; |
||||
|
height: 36upx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.collectBox { |
||||
|
width: 80rpx; |
||||
|
margin: 0 30rpx 0 15rpx; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.store-icon { |
||||
|
width: 48upx; |
||||
|
height: 48upx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.discounts-box { |
||||
|
margin-top: 20upx; |
||||
|
|
||||
|
.discounts-text { |
||||
|
margin-left: 10upx; |
||||
|
color: #FF7800; |
||||
|
background-color: #FFE4CC; |
||||
|
padding: 6upx 12upx; |
||||
|
border-radius: 4upx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.activity-box { |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
justify-content: center; |
||||
|
align-items: flex-end; |
||||
|
border-top: 1upx solid #EDEDED; |
||||
|
|
||||
|
.activity-content { |
||||
|
width: 614upx; |
||||
|
padding-top: 20upx; |
||||
|
|
||||
|
.activity-text { |
||||
|
color: #FF7700; |
||||
|
border: 1upx solid #FF7700; |
||||
|
padding: 6upx 23upx; |
||||
|
} |
||||
|
|
||||
|
.coupon-arrow { |
||||
|
width: 16upx; |
||||
|
height: 24upx; |
||||
|
margin-left: 15upx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.seckill-box { |
||||
|
width: 100%; |
||||
|
background: url("https://ceres.zkthink.com/static/images/storeTop_Img.png") no-repeat left top; |
||||
|
padding: 35rpx 30rpx; |
||||
|
|
||||
|
.seckill-icon { |
||||
|
width: 187rpx; |
||||
|
height: 41rpx; |
||||
|
background-size: contain; |
||||
|
} |
||||
|
|
||||
|
.vip-icon { |
||||
|
width: 187rpx; |
||||
|
height: 41rpx; |
||||
|
background-size: contain; |
||||
|
} |
||||
|
|
||||
|
.discount-icon { |
||||
|
width: 187rpx; |
||||
|
height: 41rpx; |
||||
|
background-size: contain; |
||||
|
} |
||||
|
|
||||
|
.spell-icon { |
||||
|
width: 182rpx; |
||||
|
height: 37rpx; |
||||
|
background-size: contain; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.countdown { |
||||
|
text-align: center; |
||||
|
|
||||
|
label { |
||||
|
text-align: center; |
||||
|
color: #CCCCCC; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.countdown-box { |
||||
|
padding: 0 8rpx; |
||||
|
height: 48rpx; |
||||
|
color: #FFEBC4; |
||||
|
background-color: #525252; |
||||
|
margin: 10rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
</style> |
1743
pages_category_page1/goodsModule/goodsDetails2.vue
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue