337 lines
11 KiB
Vue
337 lines
11 KiB
Vue
<template>
|
||
<view v-if="!detail.skuInfoVo" class="gg">
|
||
<u-empty mode="data"></u-empty>
|
||
</view>
|
||
<view v-else class="gg">
|
||
<u-navbar :border-bottom="false" :is-back="true" class="navbar"></u-navbar>
|
||
|
||
<scroll-view class="gg-sv" scroll-y>
|
||
<view class="gg-content">
|
||
<!-- 商品轮播图 -->
|
||
<block v-if="swiperList.length > 0">
|
||
<u-swiper :height="500" :list="swiperList" indicator-pos="bottomRight" mode="number"></u-swiper>
|
||
</block>
|
||
|
||
<!-- 商品缩略图及属性还有价格购买数量的显示 -->
|
||
<view class="u-flex u-type-info-light u-p-20 gg-content-price">
|
||
<view class="u-p-r-20">
|
||
<ListImgItem
|
||
:showBottom="detail.skuInfoVo.skuType === 0 && detail.skuInfoVo.isNewPerson === 1"
|
||
:showLeft="detail.skuInfoVo.skuType === 1"
|
||
:showRight="false"
|
||
:src="detail.skuInfoVo.imgUrl"
|
||
height="120rpx"
|
||
width="120rpx"
|
||
></ListImgItem>
|
||
</view>
|
||
<!-- 区别秒杀商品与一般商品的价格体系 -->
|
||
<!-- 秒杀商品显示 -->
|
||
<block v-if="detail.skuInfoVo.skuType === 1">
|
||
<view>
|
||
<view class="gg-content-price-current u-flex">
|
||
<view>秒杀价格:¥{{ detail.seckillSkuVo.seckillSale }}</view>
|
||
<view class="u-p-l-20">市场价格:¥{{ detail.skuInfoVo.marketPrice }}</view>
|
||
</view>
|
||
<view class="gg-content-price-limit">
|
||
<view>
|
||
限购:{{ detail.seckillSkuVo.seckillLimit }}件 销售:{{ detail.seckillSkuVo.seckillSale }}件
|
||
库存:{{ detail.seckillSkuVo.seckillStock }}件
|
||
</view>
|
||
<view>
|
||
秒杀场次:{{ detail.seckillSkuVo.timeName }} 倒计时:
|
||
<u-count-down ref="seckillCountDown" :timestamp="seckillSeconds" @end="seckillEnd"></u-count-down>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</block>
|
||
<!-- 普通商品显示 -->
|
||
<block v-else>
|
||
<view>
|
||
<view class="gg-content-price-current u-flex">
|
||
<view>当前价格:¥{{ detail.skuInfoVo.price }}</view>
|
||
<view class="u-p-l-20">市场价格:¥{{ detail.skuInfoVo.marketPrice }}</view>
|
||
</view>
|
||
<view class="gg-content-price-limit">
|
||
<view>限购数量:{{ detail.skuInfoVo.perLimit }}件</view>
|
||
</view>
|
||
</view>
|
||
</block>
|
||
</view>
|
||
|
||
<!-- 商品名称 -->
|
||
<view class="u-m-20 u-p-20 gg-content-container">
|
||
<view class="u-flex">{{ detail.skuInfoVo.skuName }}</view>
|
||
</view>
|
||
|
||
<!-- 属性列表 -->
|
||
<view v-if="detail.skuInfoVo.skuAttrValueList.length > 0" class="u-m-20 u-p-20 gg-content-container">
|
||
<view v-for="skuAttrValueItem in detail.skuInfoVo.skuAttrValueList" :key="skuAttrValueItem.id"
|
||
class="u-p-t-5">
|
||
{{ skuAttrValueItem.attrName }}:{{ skuAttrValueItem.attrValue }}
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 活动规则 -->
|
||
<view v-if="detail.activityRuleList.length > 0" class="u-m-20 u-p-20 gg-content-container">
|
||
<view v-for="activityRuleItem in detail.activityRuleList" :key="activityRuleItem.id" class="u-p-t-5">
|
||
{{ activityRuleItem.ruleDesc }}
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 售后与提货地址 -->
|
||
<view class="u-m-20 u-p-20 gg-content-container">
|
||
<view class="u-flex">
|
||
<view class="u-font-sm u-m-r-20 u-type-info">售后无忧</view>
|
||
<view class="u-font-sm u-m-r-20 u-flex-1">
|
||
支持保价
|
||
<text class="u-type-error">・</text>
|
||
极速退款
|
||
<text class="u-type-error">・</text>
|
||
7天无理由退货
|
||
</view>
|
||
<u-icon class="u-m-r-20 u-type-info" name="arrow-right" size="24"></u-icon>
|
||
</view>
|
||
|
||
<view class="u-flex u-m-t-20">
|
||
<view class="u-font-sm u-m-r-20 u-type-info">提货信息</view>
|
||
<view class="u-font-sm u-m-r-20 u-flex-1">
|
||
<view>
|
||
现在下单,
|
||
<text class="u-type-error">明天16:00可提货</text>
|
||
</view>
|
||
<view>提货点:{{ leaderAddressVo.takeName ? leaderAddressVo.takeName : '请设置提货点' }}</view>
|
||
</view>
|
||
<u-icon class="u-m-r-20 u-type-info" name="arrow-right" size="24"></u-icon>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 商品详情图片清单 -->
|
||
<view v-if="skuPosterList.length > 0" class="u-m-20 u-p-20 gg-content-container">
|
||
<image v-for="skuPoster in skuPosterList" :key="skuPoster.id" :src="skuPoster.image"></image>
|
||
</view>
|
||
<u-gap height="30"></u-gap>
|
||
</view>
|
||
</scroll-view>
|
||
|
||
<view class="gg-navigation">
|
||
<view class="navigation">
|
||
<view class="left">
|
||
<view class="item" @click="gotoHome">
|
||
<u-icon :color="$u.color['contentColor']" :size="40" name="home-fill"></u-icon>
|
||
<view class="text u-line-1">首页</view>
|
||
</view>
|
||
<view class="item car">
|
||
<u-badge v-if="skuId !== 0" :count="getProductSkuNum(skuId)" :offset="[-3, -6]" class="car-num"
|
||
type="error"></u-badge>
|
||
<u-icon :color="$u.color['contentColor']" :size="40" name="shopping-cart-fill"></u-icon>
|
||
<view class="text u-line-1">购物车</view>
|
||
</view>
|
||
|
||
<view v-if="detail.couponInfoList.length > 0" class="item car" @click="showCouponInfoList = true">
|
||
<u-badge :count="detail.couponInfoList.length" :offset="[-3, -6]" class="car-num" type="error"></u-badge>
|
||
<u-icon :color="$u.color['contentColor']" :size="40" name="gift-fill"></u-icon>
|
||
<view class="text u-line-1">优惠券</view>
|
||
</view>
|
||
</view>
|
||
<!-- 即将秒杀与加入购物车的显示 -->
|
||
<view v-if="!seckillEnded" class="right u-p-r-10 u-flex">
|
||
<!-- 即将开抢 -->
|
||
<block v-if="getDetail.seckillSkuVo.timeStaus === 3">
|
||
<view class="u-m-r-20 u-line-1 u-flex-1 u-text-center">场次:{{ getDetail.seckillSkuVo.timeName }}</view>
|
||
<view class="buy-disabled btn u-line-1">即将开抢</view>
|
||
</block>
|
||
<!-- 加入购物车 -->
|
||
<block v-else>
|
||
<view class="u-m-r-20 u-line-1 u-flex-1">
|
||
<AddToCart v-if="detail.skuInfoVo.id" :shopDetail="getDetail" :skuId="detail.skuInfoVo.id"></AddToCart>
|
||
</view>
|
||
<view class="buy btn u-line-1">立即购买</view>
|
||
</block>
|
||
</view>
|
||
<!-- 秒杀结束显示 -->
|
||
<view v-else class="right u-p-r-10 u-flex">
|
||
<view class="u-m-r-20 u-line-1 u-flex-1"></view>
|
||
<view class="buy-disabled btn u-line-1">秒杀结束</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<CouponInfoList :couponInfoList="detail.couponInfoList" :showCouponInfoList.sync="showCouponInfoList"
|
||
@getCouponInfo="getCouponInfo"></CouponInfoList>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import {mapState, mapGetters} from 'vuex';
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
detail: {},
|
||
skuId: 0,
|
||
seckillSeconds: 0,
|
||
seckillEnded: false,
|
||
showCouponInfoList: false
|
||
};
|
||
},
|
||
computed: {
|
||
...mapState('pickUpLocationModule', ['leaderAddressVo']),
|
||
...mapGetters('cartModule', ['getProductSkuNum']),
|
||
// 轮播图的获取
|
||
swiperList() {
|
||
let lst = [];
|
||
this.detail &&
|
||
this.detail.skuInfoVo &&
|
||
this.detail.skuInfoVo.skuImagesList.length > 0 &&
|
||
this.detail.skuInfoVo.skuImagesList.forEach(item => {
|
||
lst.push({
|
||
image: item.imgUrl,
|
||
title: item.imgName
|
||
});
|
||
});
|
||
return lst;
|
||
},
|
||
// 商品详情海报图片列表
|
||
skuPosterList() {
|
||
let lst = [];
|
||
this.detail &&
|
||
this.detail.skuInfoVo &&
|
||
this.detail.skuInfoVo.skuPosterList.length > 0 &&
|
||
this.detail.skuInfoVo.skuPosterList.forEach(item => {
|
||
lst.push({
|
||
image: item.imgUrl,
|
||
title: item.imgName
|
||
});
|
||
});
|
||
return lst;
|
||
},
|
||
getDetail() {
|
||
return {...this.detail.skuInfoVo, seckillSkuVo: this.detail.seckillSkuVo};
|
||
}
|
||
},
|
||
methods: {
|
||
async getHomeItemData(skuId) {
|
||
let result = await this.$u.api.getHomeItem({skuId});
|
||
this.detail = result;
|
||
// skuInfoVo 商品信息
|
||
// couponInfoList 优惠券信息
|
||
// activityRuleList 活动信息
|
||
|
||
// 如果是秒杀商品,需要计算倒计时秒数
|
||
if (this.detail.skuInfoVo.skuType === 1) {
|
||
const now = this.$dayjs();
|
||
const endTime = this.$dayjs(this.$dayjs().format('YYYY-MM-DD') + ' ' + this.detail.seckillSkuVo.endTime);
|
||
const seconds = endTime.diff(now, 'second');
|
||
this.seckillSeconds = seconds;
|
||
}
|
||
},
|
||
// 切换首页
|
||
gotoHome() {
|
||
uni.switchTab({
|
||
url: '/pages/index/index'
|
||
});
|
||
return false;
|
||
},
|
||
// 秒杀倒计时结束
|
||
seckillEnd() {
|
||
this.seckillEnded = true;
|
||
},
|
||
// 领取优惠券
|
||
async getCouponInfo(id) {
|
||
try {
|
||
const result = await this.$u.api.getCouponInfo({id});
|
||
const pos = this.detail.couponInfoList.findIndex(item => item.id === id);
|
||
this.$set(this.detail.couponInfoList[pos], 'couponStatus', 1);
|
||
} catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
},
|
||
onLoad(options) {
|
||
let skuId = +options.skuId;
|
||
this.skuId = skuId;
|
||
this.getHomeItemData(skuId);
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.gg {
|
||
height: 100%;
|
||
|
||
&-sv {
|
||
height: calc(100vh - 116rpx - 102rpx);
|
||
}
|
||
|
||
&-content {
|
||
background-color: $u-bg-color;
|
||
|
||
&-price {
|
||
background: linear-gradient(to right, rgb(255, 180, 61), rgb(255, 101, 0));
|
||
}
|
||
|
||
&-container {
|
||
z-index: 9999;
|
||
background-color: #fff;
|
||
border-radius: 25rpx;
|
||
}
|
||
}
|
||
|
||
&-navigation {
|
||
position: fixed;
|
||
bottom: 0;
|
||
width: 100%;
|
||
|
||
.navigation {
|
||
display: flex;
|
||
border: solid 2rpx #f2f2f2;
|
||
background-color: #ffffff;
|
||
padding: 16rpx 0;
|
||
justify-content: space-around;
|
||
|
||
.left {
|
||
display: flex;
|
||
font-size: 20rpx;
|
||
|
||
.item {
|
||
margin: 0 30rpx;
|
||
|
||
&.car {
|
||
text-align: center;
|
||
position: relative;
|
||
|
||
.car-num {
|
||
position: absolute;
|
||
top: -10rpx;
|
||
right: -10rpx;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.right {
|
||
width: 375rpx;
|
||
display: flex;
|
||
font-size: 28rpx;
|
||
align-items: center;
|
||
|
||
.btn {
|
||
line-height: 50rpx;
|
||
padding: 0 30rpx;
|
||
border-radius: 36rpx;
|
||
color: #ffffff;
|
||
}
|
||
|
||
.buy {
|
||
background-color: #ff7900;
|
||
}
|
||
|
||
.buy-disabled {
|
||
background-color: $u-type-info;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style>
|