xc-app/pages/product/detail.vue

669 lines
14 KiB
Vue
Raw Permalink 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>
<scroll-view scroll-y="true" class="shop-detail-page" :style="{'height':show ? '100vh' : 'auto','overflow':show ? 'hidden' : 'auto'}">
<view class="go-back" :style="{'top':`${statusBarHeight + 20}px`}" @click="goBack">
<image src="@/static/index/fh.png" mode="" class="back-img"></image>
</view>
<swiper class="swiper" circular indicator-dots>
<swiper-item v-for="(item,index) in detailData.rollingImagesResource" :key="index" class="swiper-item">
<view class="swiper-img" :style="{'backgroundImage':`url(${item.url})`}"></view>
</swiper-item>
</swiper>
<view class="main">
<view class="detail">
<view class="detail-header">
<view class="header-price">
<view class="point">
<image src="@/static/mine/jf.png" mode="" class="ponit-img"></image>
{{detailData.mallPoint||''}}
</view>
<view class="shu"></view>
<view class="old-price">
¥{{detailData.price.settlement||0}}
</view>
</view>
<view class="fee">快递:免运费</view>
</view>
<view class="name">
{{detailData.name||''}}
</view>
<!-- <view class="detail-price">
<view class="price">
¥ <view class="price-val">{{detailData.price.sale||0}}</view>
</view>
<view class="shu"></view>
<view class="point">
<image src="@/static/mine/jf.png" mode="" class="ponit-img"></image>
{{detailData.mallPoint||''}}
</view>
</view>
<view class="old-price">
¥{{detailData.price.settlement||0}}
</view>
<view class="name">
{{detailData.name||''}}
</view> -->
</view>
</view>
<view class="sub-title">商品详情</view>
<view style="padding: 0 22rpx 140rpx 22rpx;">
<template v-for="(item,index) in detailData.detailImagesResource">
<image :src="item.url" mode="widthFix" :key="index" style="width: 100%;"></image>
</template>
</view>
<view class="footer" v-if="!footerType">
<image src="@/static/index/sc.png" mode="" v-if="detailData.favorite" @click="collect" class="collect-img"></image>
<image src="@/static/index/sc-n.png" mode="" v-if="!detailData.favorite" @click="collect" class="collect-img"></image>
<view class="footer-buy" @click="buy">立即购买</view>
</view>
<image src="https://box-mall.oss-cn-hangzhou.aliyuncs.com/static/shop/top.png" mode="" class="go-top" @click="goTop" v-if="scroll > 50"></image>
<popup-view v-model="show" mode="bottom" border-radius="15" zIndex="1">
<view class="popup-main">
<view class="popup-header">
<image :src="detailData.coverResource.url" mode="" class="popup-header-img"></image>
<view class="popup-info">
<view class="popup-info-name">{{detailData.name}}</view>
<view class="popup-info-price">
<view class="popup-clover">
<image src="@/static/mine/jf.png" mode="" class="clover-img"></image>
{{detailData.mallPoint}}
</view>
<view class="popup-price">
<text class="popup-symbol">¥</text>{{detailData.price.sale}}
</view>
</view>
</view>
</view>
<view class="popup-footer">
<view class="footer-num">
<view class="footer-info">
购买数量
</view>
<view class="item-step">
<image src="@/static/mine/sub.png" class="item-sub" mode="" @click="sub"></image>
<view class="item-num">{{quantity}}</view>
<image src="@/static/mine/add.png" class="item-add" mode="" @click="add"></image>
</view>
</view>
<view class="now-buy" @click="confirmBuy">立即支付</view>
</view>
</view>
</popup-view>
<!-- 所有页面的弹框 -->
<page-popup page="/pages/product/detail"></page-popup>
</scroll-view>
</template>
<script>
import { myMixins } from "@/mixins/mixins.js";
import { productDetailApi,favorItemApi,delFavorItemApi } from '@/API/product.js'
var statusBarHeight = uni.getSystemInfoSync().statusBarHeight
export default {
mixins: [myMixins],
data() {
return {
statusBarHeight,
id:"",
show: false, //立即购买弹框
quantity:1,
detailData:{
detailImages:"",
price:{},
coverResource:{}
},//商品详情
scroll:0,
footerType:"",//是否现实底部
}
},
onLoad(opation) {
this.id = opation.id
this.footerType = opation.footer ? opation.footer : ''
this.getDetail()
// this.getdeliveryFee()
},
onPageScroll(res){
this.scroll = res.scrollTop
},
methods: {
// 获取详情
getDetail(){
uni.showLoading()
productDetailApi({id:this.id}).then(res => {
uni.hideLoading()
if(res.code === 200){
res.data.rollingImagesResource.unshift(res.data.coverResource)
this.detailData = res.data
}else{
this.$api.msg(res.message)
}
}).catch(err => {
uni.hideLoading()
})
},
goBack() {
uni.navigateBack()
},
// 滚动到顶部
goTop() {
uni.pageScrollTo({
duration: 300,
scrollTop: 0 // number number number
});
},
// 是否收藏
collect() {
uni.showLoading()
if(this.detailData.favorite){
delFavorItemApi({productId:this.detailData.id}).then(res => {
uni.hideLoading()
if(res.code === 200){
this.$api.msg('取消收藏')
this.getDetail()
}else{
this.$api.msg(res.message)
}
}).catch(err => {
uni.hideLoading()
})
}else{
favorItemApi({productId:this.detailData.id}).then(res => {
uni.hideLoading()
if(res.code === 200){
this.$api.msg('收藏成功')
this.getDetail()
}else{
this.$api.msg(res.message)
}
}).catch(err => {
uni.hideLoading()
})
}
},
// 减
sub(){
if(this.quantity === 1){
this.$api.msg("不能小于1");
return;
}
if(this.quantity > 1){
this.quantity--
}
},
// 加
add(){
this.quantity++
},
// 立即购买弹框
buy() {
this.show = true
},
// 确认购买
confirmBuy(){
// 清空购买地址
uni.removeStorageSync('address')
this.show = false;
uni.navigateTo({
url:`/pages/order/confirm?id=${this.id}&quantity=${this.quantity}`
})
},
}
}
</script>
<style>
uni-toast {
z-index: 10000 !important;
}
</style>
<style lang="scss" scoped>
page{
background-image: url('@/static/index/bg.png');
background-size: 100%;
}
.shop-detail-page {
// height: 100%;
// overflow: auto;
// padding-bottom: 140rpx;
.go-back {
position: fixed;
left: 32rpx;
width: 24rpx;
height: 40rpx;
z-index: 999;
width: 55rpx;
height: 55rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background-color: rgba(0,0,0,0.5);
.back-img{
width: 14rpx;
height: 26rpx;
}
}
.swiper {
width: 100%;
height: 616rpx;
z-index: 1;
.swiper-item {
width: 100%;
height: 100%;
z-index: 1;
.swiper-img {
width: 100%;
height: 100%;
background-position: 50%;
background-repeat: no-repeat;
background-size: 100%;
z-index: 1;
}
}
}
.main{
width: 706rpx;
height: 227rpx;
margin-left: 22rpx;
position: relative;
.detail{
position: absolute;
width: 706rpx;
top: -60rpx;
background: #FFFFFF;
box-shadow: 0px 14rpx 31rpx 9rpx rgba(222,222,222,0.26);
border-radius: 10rpx;
// z-index: 100;
padding: 41rpx 28rpx 61rpx 29rpx;
.detail-header{
display: flex;
align-items: center;
justify-content: space-between;
.header-price{
display: flex;
align-items: center;
.point{
display: flex;
align-items: center;
font-weight: bold;
font-size: 42rpx;
color: #EF4235;
height: 50rpx;
.ponit-img{
margin-right: 12rpx;
width: 32rpx;
height: 34rpx;
}
}
.shu{
width: 1rpx;
height: 33rpx;
margin: 0 15rpx;
border-left: 1px solid #D3D3D3;
}
.old-price{
display: flex;
align-items: flex-end;
height: 50rpx;
font-weight: 300;
font-size: 20rpx;
color: #888888;
text-decoration: line-through;
}
}
.fee{
font-size: 24rpx;
color: #888888;
}
}
.detail-price{
display: flex;
align-items: center;
.price{
font-size: 32rpx;
color: #FF6256;
.price-val{
display: inline-block;
font-size: 49rpx;
font-weight: bold;
color: #FF6256;
margin-left: 4rpx;
}
}
}
.name{
margin-top: 30rpx;
font-weight: bold;
font-size: 28rpx;
color: #333333;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
.sub-title{
font-weight: bold;
font-size: 28rpx;
color: #333333;
padding: 37rpx 0 27rpx 53rpx;
}
.shop-info {
padding: 20rpx 32rpx 10rpx 32rpx;
background-color: #fff;
.info-price {
border-bottom: 1px solid #F0F0F0;
padding-bottom: 12rpx;
display: flex;
align-items: center;
justify-content: space-between;
.price {
display: flex;
align-items: center;
.now-price {
font-family: YouSheBiaoTiHei;
color: #FB2B50;
font-size: 32rpx;
.price-num {
font-size: 52rpx;
}
}
.old-price {
margin-left: 30rpx;
font-size: 24rpx;
color: #999;
text-decoration: line-through;
}
}
.clover {
display: flex;
align-items: center;
font-size: 24rpx;
color: #3AD4C6;
.clover-img {
margin-right: 6rpx;
width: 36rpx;
height: 36rpx;
}
}
}
.footer-sc-view{
display: flex;
justify-content: space-between;
padding: 30rpx 0 20rpx 0;
// justify-content: flex-end;
.shop-name {
width: 580rpx;
// margin-top: 30rpx;
font-size: 28rpx;
font-weight: bold;
color: #333333;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.footer-sc{
// margin-top: 10rpx;
display: block;
width: 40rpx;
height: 40rpx;
}
}
.freight {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 70rpx;
font-size: 24rpx;
color: #999;
}
}
.heng {
width: 100%;
height: 24rpx;
background-color: #F0F1F5;
}
.footer {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 100rpx;
background-color: #fff;
padding: 0 17rpx 0 64rpx;
display: flex;
align-items: center;
justify-content: space-between;
.collect-img{
width: 39rpx;
height: 37rpx;
}
.footer-buy {
width: 565rpx;
height: 63rpx;
background: linear-gradient(90deg, #EF4033 0%, #FF9F98 100%);
border-radius: 32rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 23rpx;
color: #FFFFFF;
}
}
.go-top {
position: fixed;
bottom: 190rpx;
right: 32rpx;
z-index: 9;
width: 74rpx;
height: 76rpx;
}
.popup-main {
padding: 30rpx 22rpx;
// padding: 32rpx 32rpx 0rpx 32rpx;
z-index: 9991;
// max-height: 900rpx;
// position: relative;
.popup-header {
display: flex;
align-items: center;
height: 158rpx;
.popup-header-img {
width: 158rpx;
height: 158rpx;
border-radius: 10rpx;
}
.popup-info {
margin-left: 25rpx;
.popup-info-name {
width: 482rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-weight: bold;
font-size: 28rpx;
color: #333333;
}
.popup-info-price {
margin-top: 60rpx;
display: flex;
align-items: center;
.popup-price {
display: flex;
align-items: center;
font-weight: 300;
font-size: 16rpx;
color: #888888;
margin-left: 20rpx;
height: 50rpx;
display: flex;
align-items: flex-end;
padding-bottom: 8rpx;
text-decoration: line-through;
.popup-symbol {
// font-size: 20rpx;
}
}
.popup-clover {
display: flex;
align-items: center;
font-weight: bold;
font-size: 42rpx;
color: #EF4235;
height: 50rpx;
.clover-img {
width: 32rpx;
height: 34rpx;
margin-right: 6rpx;
}
}
}
}
}
.popup-title {
color: #333333;
font-weight: 800;
font-size: 28rpx;
margin-top: 48rpx;
margin-bottom: 24rpx;
}
.specification-list{
// display: flex;
// align-items: center;
// flex-wrap: wrap;
width: 100%;
max-height: 600rpx;
margin-bottom: 50rpx;
padding-bottom: 220rpx;
overflow-y: auto;
.specification-item {
z-index: 9999;
display: inline-block;
padding: 0 64rpx;
// width: 200rpx;
height: 56rpx;
line-height: 56rpx;
border: 2rpx solid #B3B3BE;
border-radius: 28rpx;
// display: flex;
// align-items: center;
// justify-content: center;
font-size: 24rpx;
color: #B3B3BE;
margin-right: 32rpx;
margin-bottom: 32rpx;
}
.specification-item-active {
border: 2rpx solid #333333;
color: #333333;
}
}
.popup-footer{
z-index: 9999;
background-color: #fff;
// padding-bottom: 20rpx;
margin-top: 30rpx;
.footer-num{
// display: flex;
// align-items: center;
// justify-content: space-between;
z-index: 9999;
margin-top: 20rpx;
.footer-info{
display: flex;
align-items: center;
font-size: 28rpx;
font-weight: 800;
color: #333333;
.footer-info-num{
margin-left: 10rpx;
font-size: 24rpx;
color: #999999;
font-weight: 400;
}
}
.item-step {
margin-top: 17rpx;
z-index: 9999;
display: flex;
align-items: center;
.item-sub {
width: 41rpx;
height: 41rpx;
}
.item-num {
width: 78rpx;
font-size: 28rpx;
color: #333333;
display: flex;
align-items: center;
justify-content: center;
}
.item-add {
width: 41rpx;
height: 41rpx;
}
}
}
.now-buy{
z-index: 9999;
margin-top: 46rpx;
width: 706rpx;
height: 88rpx;
background: linear-gradient(90deg, #EF4033 0%, #FF9F98 100%);
border-radius: 44rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #FFFFFF;
}
}
}
}
</style>