Files
2021-04-01 00:05:57 +08:00

814 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view :class="[posterImageStatus ? 'noscroll product-con' : 'product-con']" v-show="domStatus">
<product-con-swiper :imgUrls="imgUrls"></product-con-swiper>
<view class="tui-pro-detail">
<view class="tui-product-title tui-border-radius">
<view class="tui-price__box">
<view class="tui-pro-pricebox tui-padding">
<view class="tui-pro-price">
<view>
<text>¥</text>
<text class="tui-price">{{ formatPrice(storeInfo.price, 0) }}</text>
<text>.{{ formatPrice(storeInfo.price, 1) }}</text>
</view>
<view class="tui-original-price tui-white__gray" v-text="'¥' + storeInfo.price"></view>
</view>
<view class="tui-sold tui-white__gray">
<text>已抢{{ storeInfo.sales }}件</text>
<tui-tag v-if="seckillStatus != 2" type="white" plain size="24rpx" padding="8rpx" :scaleMultiple="0.94">限时秒杀</tui-tag>
</view>
</view>
<view class="tui-right__box">
<image v-if="seckillStatus == 2" src="https://www.thorui.cn/images/mall/img_seckillgood_seckill.png" class="tui-seckill__img" mode="widthFix"></image>
<tui-button v-if="seckillStatus == 2" type="danger" disabled shape="circle" width="140rpx" height="42rpx" :size="24">{{ seckillStatus == 1 ? '活动已结束' : '即将开抢' }}</tui-button>
<text v-if="seckillStatus != 2" class="tui-color-red">距结束还剩:</text>
<count-down :isDay="false" :tipText="' '" :dayText="' '" :hourText="' : '" :minuteText="' : '" :secondText="' '" :datatime="datatime"></count-down>
</view>
</view>
<view class="tui-pro-titbox">
<view class="tui-pro-title">{{ storeInfo.title }}</view>
</view>
<view class="tui-padding">
<view class="tui-sale-info tui-size tui-gray">
<view>库存:{{ storeInfo.stock }}</view>
<view>月销{{ storeInfo.sales }}</view>
</view>
</view>
</view>
</view>
<!-- 规格 -->
<view class="attribute acea-row row-between-wrapper" @click="selecAttrTap">
<view>
<text>{{ attrTxt }}</text>
<text class="atterTxt">{{ attrValue }}</text>
</view>
<view class="iconfont icon-jiantou"></view>
</view>
<view class="product-intro">
<view class="title">产品介绍</view>
<view class="conter" v-html="storeInfo.description"></view>
</view>
<!-- 操作栏 -->
<view style="height: 100rpx"></view>
<!--底部操作栏-->
<view class="tui-operation">
<view class="tui-operation-left tui-col-5">
<!-- #ifdef MP-WEIXIN -->
<button class="tui-operation-item" hover-class="tui-opcity" :hover-stay-time="150">
<view class="iconfont icon-kefu"></view>
<view class="tui-operation-text tui-scale-small">客服</view>
</button>
<!-- #endif -->
<view class="tui-operation-item" hover-class="tui-opcity" :hover-stay-time="150" @click="setCollect" v-if="userCollect">
<view class="iconfont icon-shoucang1"></view>
<view class="tui-operation-text tui-scale-small">收藏</view>
</view>
<view class="tui-operation-item" hover-class="tui-opcity" :hover-stay-time="150" @click="setCollect" v-if="!userCollect">
<view class="iconfont icon-shoucang"></view>
<view class="tui-operation-text tui-scale-small">收藏</view>
</view>
</view>
<view class="tui-operation-right tui-right-flex tui-col-7 tui-btnbox-4" v-if="seckillStatus == 1 && storeInfo.num > 0 && storeInfo.stock > 0">
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="warning" shape="circle" @click="openAlone">单独购买</tui-button>
</view>
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="danger" shape="circle" @click="tapBuy">立即购买</tui-button>
</view>
</view>
<view class="tui-operation-right tui-right-flex tui-col-7 tui-btnbox-4" v-if="seckillStatus == 1 && storeInfo.num <= 0 && storeInfo.stock <= 0">
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="warning" shape="circle" disabled>已售罄</tui-button>
</view>
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="danger" shape="circle" @click="openAlone">原价购买</tui-button>
</view>
</view>
<view class="tui-operation-right tui-right-flex tui-col-7 tui-btnbox-4" v-if="seckillStatus == 2">
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="warning" shape="circle" disabled>即将开始</tui-button>
</view>
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="danger" shape="circle" @click="openAlone">原价购买</tui-button>
</view>
</view>
<view class="tui-operation-right tui-right-flex tui-col-7 tui-btnbox-4" v-if="seckillStatus == 0">
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="warning" shape="circle" disabled>活动已结束</tui-button>
</view>
<view class="tui-flex-1">
<tui-button height="68rpx" :size="26" type="danger" shape="circle" @click="openAlone">原价购买</tui-button>
</view>
</view>
</view>
<ProductWindow v-on:changeFun="changeFun" :attr="attr" :cartNum="cartNum"></ProductWindow>
<StorePoster v-on:setPosterImageStatus="setPosterImageStatus" :posterImageStatus="posterImageStatus" :posterData="posterData"></StorePoster>
</view>
</template>
<style scoped lang="less">
.noscroll {
height: 100%;
overflow: hidden;
}
</style>
<script>
import ProductConSwiper from '@/components/ProductConSwiper'
import CountDown from '@/components/CountDown'
import ProductWindow from '@/components/ProductWindow'
import StorePoster from '@/components/StorePoster'
import { getSeckillDetail } from '@/api/activity'
import { postCartAdd } from '@/api/store'
import { imageBase64 } from '@/api/public'
import { getCoupon, getCollectAdd, getCollectDel, getUserInfo } from '@/api/user'
const NAME = 'SeckillDetails'
export default {
name: 'SeckillDetails',
components: {
ProductConSwiper,
CountDown,
ProductWindow,
StorePoster,
},
props: {},
data: function() {
return {
seckillStatus: '',
domStatus: false,
posterData: {
image: '',
title: '',
price: '',
code: '',
},
posterImageStatus: false,
action: '',
imgUrls: [],
storeInfo: [],
replyCount: 0,
reply: [],
cartNum: 1,
attrTxt: '请选择',
productValue: [],
attrValue: '',
attr: {
cartAttr: false,
productAttr: [],
productSelect: {},
},
datatime: 0,
userCollect: false,
}
},
onShow: function() {
this.mountedStart()
},
methods: {
formatPrice(price, index) {
console.log(price)
if (price) {
return price.split('.')[index]
}
return ''
},
onShareAppMessage: function() {
return {
title: this.storeInfo.title,
imageUrl: this.storeInfo.image,
path: 'pages/activity/GoodsSeckill/index?id=' + this.storeInfo.id + '&spread=' + uni.getStorageSync('uid') + '&pageType=good&codeType=routine',
success(res) {
uni.showToast({
title: '分享成功',
})
},
fail(res) {
uni.showToast({
title: '分享失败',
icon: 'none',
})
},
}
},
openAlone: function() {
this.$yrouter.push({
path: '/pages/shop/GoodsCon/index',
query: {
id: this.storeInfo.productId,
},
})
// this.$yrouter.replace({ path: "/detail/" + this.storeInfo.productId });
},
routerGo(item) {
this.$yrouter.push({
path: '/pages/user/CustomerList/index',
})
},
//收藏商品
setCollect: function() {
let that = this,
id = that.storeInfo.id,
category = 'product'
if (that.userCollect) {
getCollectDel(id, category).then(function() {
that.userCollect = !that.userCollect
})
} else {
getCollectAdd(id, category).then(function() {
that.userCollect = !that.userCollect
})
}
},
mountedStart: function() {
var that = this
console.log(this)
let id = that.$yroute.query.id
this.seckillStatus = that.$yroute.query.status
that.datatime = parseInt(that.$yroute.query.time)
getSeckillDetail(id).then(res => {
that.userCollect = res.data.userCollect
res.data.storeInfo.description = res.data.storeInfo.description.replace(/\<img/gi, '<img style="max-width:100%;height:auto;"')
that.$set(that.attr, 'productAttr', res.data.productAttr)
that.$set(that, 'productValue', res.data.productValue)
that.$set(that, 'storeInfo', res.data.storeInfo)
that.$set(that, 'imgUrls', res.data.storeInfo.sliderImageArr)
that.$set(that, 'replyCount', res.data.replyCount)
that.$set(that, 'reply', res.data.reply)
that.posterData.image = that.storeInfo.image_base
that.updateTitle()
if (that.storeInfo.title.length > 30) {
that.posterData.title = that.storeInfo.title.substring(0, 30) + '...'
} else {
that.posterData.title = that.storeInfo.title
}
that.posterData.price = that.storeInfo.price
that.posterData.code = that.storeInfo.code_base
// that.setProductSelect();
that.domStatus = true
that.DefaultSelect()
})
},
updateTitle() {
// document.title = this.storeInfo.title || this.$yroute.meta.title;
},
setPosterImageStatus: function() {
// var sTop = document.body || document.documentElement;
// sTop.scrollTop = 0;
this.posterImageStatus = !this.posterImageStatus
},
DefaultSelect: function() {
let productAttr = this.attr.productAttr
let value = []
for (let i = 0; i < productAttr.length; i++) {
this.$set(productAttr[i], 'index', 0)
value.push(productAttr[i].attrValueArr[0])
}
//sort();排序函数:数字-英文-汉字;
let productSelect = this.productValue[value.sort().join(',')]
console.log(productSelect)
if (productSelect && productAttr.length) {
this.$set(this.attr.productSelect, 'store_name', this.storeInfo.title)
this.$set(this.attr.productSelect, 'image', productSelect.image)
this.$set(this.attr.productSelect, 'price', productSelect.seckillPrice)
this.$set(this.attr.productSelect, 'stock', productSelect.seckillStock)
this.$set(this.attr.productSelect, 'unique', productSelect.unique)
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'attrValue', value.sort().join(','))
this.$set(this, 'attrTxt', '已选择')
} else if (!productSelect && productAttr.length) {
this.$set(this.attr.productSelect, 'store_name', this.storeInfo.title)
this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
this.$set(this.attr.productSelect, 'price', this.storeInfo.seckillPrice)
this.$set(this.attr.productSelect, 'stock', 0)
this.$set(this.attr.productSelect, 'unique', '')
this.$set(this.attr.productSelect, 'cart_num', 0)
this.$set(this, 'attrValue', '')
this.$set(this, 'attrTxt', '请选择')
} else if (!productSelect && !productAttr.length) {
this.$set(this.attr.productSelect, 'store_name', this.storeInfo.title)
this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
this.$set(this.attr.productSelect, 'price', this.storeInfo.seckillPrice)
this.$set(this.attr.productSelect, 'stock', this.storeInfo.seckillStock)
this.$set(this.attr.productSelect, 'unique', this.storeInfo.unique || '')
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'attrValue', '')
this.$set(this, 'attrTxt', '请选择')
}
},
//将父级向子集多次传送的函数合二为一;
changeFun: function(opt) {
if (typeof opt !== 'object') opt = {}
let action = opt.action || ''
let value = opt.value === undefined ? '' : opt.value
this[action] && this[action](value)
},
changeattr: function(res) {
var that = this
that.attr.cartAttr = res
},
// ChangeCartNum: function (res) {
// var that = this;
// if (res) {
// if (that.attr.productSelect.cart_num < that.storeInfo.seckillStock) {
// that.attr.productSelect.cart_num += 1;
// this.cartNum += 1;
// console.log(this.cartNum)
// }
// } else {
// if (that.attr.productSelect.cart_num > 1) {
// that.attr.productSelect.cart_num -= 1;
// this.cartNum -= 1;
// }
// }
// },
ChangeCartNum: function(changeValue) {
//changeValue:是否 加|减
//获取当前变动属性
let productSelect = this.productValue[this.attrValue]
//如果没有属性,赋值给商品默认库存
if (productSelect === undefined && !this.attr.productAttr.length) {
productSelect = this.attr.productSelect
}
//无属性值即库存为0不存在加减
if (productSelect === undefined) return
let stock = productSelect.stock || 0
let num = this.attr.productSelect
if (changeValue) {
num.cart_num++
if (num.cart_num > stock) {
this.$set(this.attr.productSelect, 'cart_num', stock)
this.$set(this, 'cartNum', stock)
} else {
this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
this.$set(this, 'cartNum', num.cart_num)
}
} else {
num.cart_num--
if (num.cart_num < 1) {
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'cartNum', 1)
} else {
this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
this.$set(this, 'cartNum', num.cart_num)
}
}
},
//选择属性;
ChangeAttr: function(res) {
// 修改了规格
let productSelect = this.productValue[res.value]
if (productSelect) {
this.attr.productAttr[res.indexw].index = res.indexn
this.$set(this.attr.productSelect, 'image', productSelect.image)
this.$set(this.attr.productSelect, 'price', productSelect.seckillPrice)
this.$set(this.attr.productSelect, 'stock', productSelect.seckillStock)
this.$set(this.attr.productSelect, 'unique', productSelect.unique)
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'attrValue', res.value)
this.$set(this, 'attrTxt', '已选择')
} else {
this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
this.$set(this.attr.productSelect, 'price', this.storeInfo.seckillPrice)
this.$set(this.attr.productSelect, 'stock', 0)
this.$set(this.attr.productSelect, 'unique', '')
this.$set(this.attr.productSelect, 'cart_num', 0)
this.$set(this, 'attrValue', '')
this.$set(this, 'attrTxt', '请选择')
}
},
selecAttrTap: function() {
this.attr.cartAttr = true
this.isOpen = true
},
tapBuy: function() {
var that = this
if (that.attr.cartAttr == false) {
that.attr.cartAttr = !this.attr.attrcartAttr
} else {
var data = {}
data.productId = that.storeInfo.productId
data.cartNum = that.attr.productSelect.cart_num
data.uniqueId = that.attr.productSelect.unique
data.secKillId = that.storeInfo.id
data.new = 1
postCartAdd(data)
.then(res => {
that.$yrouter.push({
path: '/pages/order/OrderSubmission/index',
query: {
id: res.data.cartId,
},
})
})
.catch(err => {
uni.showToast({
title: err.msg || err.response.data.msg || err.response.data.message,
icon: 'none',
duration: 2000,
})
})
}
},
},
}
</script>
<style scoped lang="less">
.product-con .nav {
padding: 0 0.2 * 100rpx;
}
.product-con .footer .bnt .buy.bg-color-hui {
background: #ccc;
}
/*内容 部分*/
.tui-padding {
padding: 0 30rpx;
box-sizing: border-box;
}
.tui-ml-auto {
margin-left: auto;
}
/* #ifdef H5 */
.tui-ptop {
padding-top: 44px;
}
/* #endif */
.tui-size {
font-size: 24rpx;
line-height: 24rpx;
}
.tui-gray {
color: #999;
}
.tui-white__gray {
color: rgba(255, 255, 255, 0.8);
font-weight: normal;
font-size: 26rpx;
}
.tui-color-red {
color: #eb0909;
}
.tui-border-radius {
border-bottom-left-radius: 24rpx;
border-bottom-right-radius: 24rpx;
overflow: hidden;
}
.tui-radius-all {
border-radius: 24rpx;
overflow: hidden;
}
.tui-mtop {
margin-top: 26rpx;
}
.tui-pro-detail {
box-sizing: border-box;
color: #333;
}
.tui-product-title {
background: #fff;
padding-bottom: 30rpx;
}
.tui-price__box {
width: 100%;
height: 130rpx;
display: flex;
}
.tui-pro-pricebox {
width: 540rpx;
height: 130rpx;
display: flex;
flex-direction: column;
justify-content: center;
color: #ffffff;
font-size: 26rpx;
line-height: 26rpx;
background: linear-gradient(-30deg, #ff1f2e, #f52c6c);
flex-shrink: 0;
}
.tui-pro-price {
display: flex;
align-items: flex-end;
}
.tui-price {
font-size: 44rpx;
line-height: 42rpx;
}
.tui-sold {
width: 100%;
height: 44rpx;
padding-left: 4rpx;
display: flex;
align-items: flex-end;
justify-content: space-between;
}
.tui-original-price {
font-size: 26rpx;
line-height: 26rpx;
padding: 0 20rpx;
box-sizing: border-box;
text-decoration: line-through;
}
.tui-right__box {
flex: 1;
background-color: #ffe5e5;
font-size: 24rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.tui-right__box text {
text-align: center;
padding-bottom: 12rpx;
}
.tui-seckill__img {
width: 146rpx;
height: 26rpx;
margin-bottom: 16rpx;
}
.tui-pro-titbox {
font-size: 32rpx;
font-weight: 500;
position: relative;
padding: 0 150rpx 0 30rpx;
box-sizing: border-box;
}
.tui-pro-title {
padding-top: 20rpx;
}
.tui-share-btn {
display: block;
background: transparent;
margin: 0;
padding: 0;
border-radius: 0;
border: 0;
}
.tui-share-btn::after {
border: 0;
}
.tui-share-box {
display: flex;
align-items: center;
}
.tui-share-position {
position: absolute;
right: 0;
top: 30rpx;
}
.tui-share-text {
padding-left: 8rpx;
}
.tui-sub-title {
padding: 20rpx 0;
line-height: 32rpx;
}
.tui-sale-info {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: 30rpx;
}
.tui-discount-box {
background: #fff;
}
.tui-list-cell {
width: 100%;
position: relative;
display: flex;
align-items: center;
font-size: 26rpx;
line-height: 26rpx;
padding: 36rpx 30rpx;
box-sizing: border-box;
}
.tui-right {
position: absolute;
right: 30rpx;
top: 30rpx;
}
.tui-top40 {
top: 40rpx !important;
}
.tui-bold {
font-weight: bold;
}
.tui-list-cell::after {
content: '';
position: absolute;
border-bottom: 1rpx solid #eaeef1;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
bottom: 0;
right: 0;
left: 126rpx;
}
.tui-last::after {
border-bottom: 0 !important;
}
.tui-flex-center {
display: flex;
align-items: center;
}
.tui-cell-title {
width: 66rpx;
padding-right: 30rpx;
flex-shrink: 0;
}
.tui-promotion-box {
display: flex;
align-items: center;
padding: 10rpx 0;
width: 80%;
}
.tui-promotion-box text {
width: 70%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tui-basic-info {
background: #fff;
}
.tui-addr-box {
width: 76%;
}
.tui-addr-item {
padding: 10rpx;
line-height: 34rpx;
}
.tui-guarantee {
background: #fdfdfd;
display: flex;
flex-wrap: wrap;
padding: 20rpx 30rpx 30rpx 30rpx;
font-size: 24rpx;
}
.tui-guarantee-item {
color: #999;
padding-right: 30rpx;
padding-top: 10rpx;
}
.tui-pl {
padding-left: 4rpx;
}
.tui-col-7 {
width: 58.33333333%;
}
.tui-col-5 {
width: 41.66666667%;
}
.tui-operation {
width: 100%;
height: 100rpx;
background: rgba(255, 255, 255, 0.98);
position: fixed;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 100;
bottom: 0;
left: 0;
padding-bottom: env(safe-area-inset-bottom);
}
.tui-safearea-bottom {
width: 100%;
height: env(safe-area-inset-bottom);
}
.tui-operation::before {
content: '';
position: absolute;
top: 0;
right: 0;
left: 0;
border-top: 1rpx solid #eaeef1;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
.tui-operation-left {
display: flex;
align-items: center;
}
.tui-operation-item {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
position: relative;
background: none;
padding: 0;
border: 0;
line-height: 1em;
&:after {
display: none;
}
.tui-operation-text {
margin-top: 9rpx;
line-height: 1em;
}
}
.tui-operation-text {
font-size: 22rpx;
color: #333;
}
.tui-opacity {
opacity: 0.5;
}
.tui-scale-small {
transform: scale(0.9);
transform-origin: center center;
}
.tui-operation-right {
height: 100rpx;
padding-top: 0;
padding: 0 12rpx;
box-sizing: border-box;
}
.tui-right-flex {
display: flex;
align-items: center;
justify-content: center;
}
.tui-flex-1 {
flex: 1;
padding: 6rpx;
}
.tui-img__clock {
width: 30rpx;
height: 30rpx;
margin-right: 8rpx;
}
</style>