jiangchengfeiyi-xiaochengxu/pages/store-home/ProductDetails/ProductDetails.vue

474 lines
11 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="flex-col page" :style="{ backgroundImage: 'url(' + bkgPubilcPath + ')' }">
<!-- <image
mode="aspectFit"
class="self-stretch image"
:src="goodObject.goodImg"
/> -->
<swiper class="swiper-box">
<swiper-item v-for="(item,index) in imgArr" :key="index" >
<image mode="aspectFill" class="self-stretch image" :src="publicPath + item" @tap="previewImage(index)"></image>
</swiper-item>
</swiper>
<view class="flex-col self-stretch section_2">
<view class="self-start group">
<text class="font text_2">¥</text>
<text class="text">{{ goodObject.price.toFixed(2) }}</text>
<text class="discountsText">限时优惠{{ coupon.toFixed(2) }}元</text>
</view>
<view class="flex-row justify-between items-center self-stretch group_2">
<text class="text_4">{{ goodObject.name }}</text>
<view class="flex-row items-center group_3" v-if="festivalName !== '无'">
<image
class="image_2" mode="aspectFill"
:src="publicPath + festivalUrl"
/>
<text class="font text_3 ml-5">{{ festivalName }}限定</text>
</view>
</view>
<view class="self-stretch divider view"></view>
<view class="flex-col self-stretch group_4">
<text class="self-stretch font_2">
商品简介:{{ goodObject.intro }}
<br/>
</text>
</view>
<view class="self-stretch divider view_2"></view>
<view class="flex-row items-center self-stretch group_5">
<text class="font text_5">商品标签:</text>
<view class="flex-col justify-start items-center text-wrapper ml-8" v-for="(item,index) in labelList" :key="index">
<text class="font_3 text_6">#{{ item }}</text>
</view>
</view>
</view>
<view class="book-selected">
<rich-text :nodes="richTextcontent"></rich-text>
</view>
<!-- <view class="flex-col self-stretch section_3">
<text class="self-start font_4 text_10">用户须知</text>
<text class="self-start font text_11">1.发货后不接受退货不接受7天无理由退货</text>
<text class="self-start font text_12">2.商品购买后无法自主退款需联系客服进行退款处理</text>
<text class="self-stretch font_2 text_13">
3.定制款商品购买后不接受退货退款包售后需要录制开箱视频并且开箱视频需要从拆包装开始
</text>
<text class="self-start font text_14">4.商品售罄后的款式也可以重新预定需等待并联系客服</text>
<text class="self-start font text_15">5.定制商品的具体发货日期根据制作团队制作情况而定</text>
<text class="self-start font text_16">6.只售后邮寄破损</text>
</view> -->
<!-- <image
class="self-start image_3"
:src="goodObject.detailImg"
/> -->
<view class="flex-row items-center self-stretch section_4">
<button class="flex-col items-center" style="background-color: #ffffff;" open-type="contact" bindcontact="handleContact" session-from="sessionFrom">
<image
class="image_4"
:src="storeHomeUrl + '/ProductDetails/lxkf.png'"
/>
<text class="text_19 mt-3">客服</text>
</button>
<view class="flex-row flex-1 ml-34">
<view class="flex-col justify-start items-center text-wrapper_4" @click="loadPop">
<text class="font_4 text_17">加入购物车</text>
</view>
<view class="flex-col justify-start items-center text-wrapper_5 ml-9" @click="jump_buy">
<text class="font_4 text_18">立即购买</text>
</view>
</view>
</view>
</view>
<uni-popup ref="popup" background-color="#fff">
<view>
<addProduct></addProduct>
</view>
</uni-popup>
</template>
<script setup >
import {nextTick, onMounted, onUnmounted, ref} from 'vue'
import { onLoad , onShow } from "@dcloudio/uni-app";
import { getFonts } from '../../../common/globalFont';
import { baseUrl } from '../../../api/request';
import emitter from '../../../utils/emitter'
import addProduct from '../../Shopping-cart/component/addProduct.vue';
import { dealResult } from '../../../common/globalFunction';
import { storeHomeUrl,bkgPubilcPath } from '../../../common/globalImagesUrl';
import { publicPath } from '../../../common/globalImagesUrl';
const popup = ref(null) //弹窗对象
const goodObject = ref({}) //商品对象
const idInfo = ref(0) //发送到下一页的商品id
const userInfo = ref({}) //用户信息
const labelList = ref([]) //标签
const imgArr = ref([]) //商品图片数组
const coupon = ref(0) //当前商品可用的优惠卷
const cookie = wx.getStorageSync('cookie')
const richTextcontent = ref('')
const bkgUrl = ref(storeHomeUrl + '/ProductDetails/bkg.png')
const festivalName = ref('')
const festivalUrl = ref('')
//转换上一页面传来的商品
onLoad((options) => {
getFonts()
getProduct(JSON.parse(options.gid)) //页面加载的时候获取商品信息
})
onShow(()=>{
userInfo.value = wx.getStorageSync('userInfo') //获取用户信息
})
const closeHandler = () => {
close()
}
onMounted(()=>{
emitter.on('close', closeHandler)
})
onUnmounted(() => {
emitter.off('close', closeHandler)
})
const getProduct = async (gid) =>{ //根据商品获取商品信息
const res = await uni.request({
url: baseUrl + '/goods/getById',
method: 'POST',
data: { id: gid },
header: {
cookie
}
})
console.log('请求请求--->',res.data);
if(res.data.code === 1) {
goodObject.value = res.data.data
richTextcontent.value = goodObject.value.richText
console.log(richTextcontent.value)
imgArr.value = res.data.data.goodImg.split(';') //将后端传来的图片字符串转为图片数组
labelList.value = goodObject.value.label.split(';') //分割字符串,生成标签数组
labelList.value = labelList.value.filter((s)=>{ //使用filter将最后一个空值去掉
return s
})
idInfo.value = goodObject.value.id
festivalName.value = goodObject.value.festivalName.split(';')[0]
festivalUrl.value = goodObject.value.festivalName.split(';')[1]
console.log('=================>', festivalUrl.value)
}
}
const loadPop =()=>{
popup.value.open('bottom') //从底部弹出
emitter.emit('product',goodObject.value)
}
//关闭弹窗
const close =()=>{
nextTick(() => {
if (popup.value) {
popup.value.close()
}
})
}
//将商品对象发送到下一个页面
const jump_buy = async ()=> {
let res = await checkGeneralGood()
if (!dealResult(res)) return
uni.navigateTo({
url: '../../../pages/order/singleGoodOrder/singleGoodOrder?cartInfo=' + JSON.stringify(idInfo.value)
})
}
//点击查看图片详情方法
const previewImage = (index) => {
console.log(index);
uni.previewImage({
current: index,
urls: imgArr.value
})
}
const checkGeneralGood = async () => {
const res = await uni.request({
url: baseUrl + '/goods/checkGeneralGood',
method: 'POST',
header: {
cookie
},
data: {
id: idInfo.value
}
})
return res
}
</script>
<style lang="scss" scoped>
.book-selected {
background-color: #ffffff;
border-radius: 18.75rpx;
width: 726rpx;
height: 100%;
padding: 20rpx;
margin: 20rpx auto 160rpx;
}
button::after {
border: none;
}
.ml-5 {
margin-left: 9.38rpx;
}
.mt-3 {
margin-top: 5.63rpx;
}
.ml-9 {
margin-left: 16.88rpx;
}
.page {
background-size: 100% 100%;
background-repeat: no-repeat;
height: 100%;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
}
.image {
width: 100%;
height: 100%;
}
.section_2 {
padding-left: 18.75rpx;
padding-top: 19.2rpx;
background-color: #ffffff;
border-radius: 18.75rpx;
width: 726rpx;
margin: 0 auto;
}
.group {
margin-left: 14.16rpx;
line-height: 30.06rpx;
}
.font {
font-size: 26.25rpx;
font-family: 'FangZhengFonts';
line-height: 25.84rpx;
color: #323232;
}
.text_2 {
color: #ff0000;
line-height: 16.91rpx;
}
.text {
color: #ff0000;
font-size: 45rpx;
font-family: 'FangZhengFonts';
line-height: 30.06rpx;
}
.group_2 {
margin-top: 19.11rpx;
}
.text_4 {
color: #323232;
font-size: 33.75rpx;
font-family: 'FangZhengFonts';
line-height: 32.7rpx;
}
.group_3 {
margin-right: 19.63rpx;
}
.image_2 {
width: 43.75rpx;
height: 43.75rpx;
border-radius: 50%;
}
.text_3 {
font-size: 28.13rpx;
line-height: 27.24rpx;
}
.divider {
background-color: #cdcdcd;
height: 1.88rpx;
}
.view {
margin-right: 41.27rpx;
margin-top: 18.28rpx;
}
.group_4 {
padding: 10.56rpx 1rpx 32.04rpx 0;
}
.font_2 {
font-size: 26.25rpx;
font-family: 'FangZhengFonts';
line-height: 31.88rpx;
color: #323232;
}
.view_2 {
margin-right: 41.27rpx;
}
.group_5 {
padding: 16.88rpx 0 20.63rpx;
}
.text_5 {
color: #323232;
line-height: 24.62rpx;
}
.text-wrapper {
padding: 7.26rpx 10rpx 10.31rpx 10rpx;
background-color: #fbdedf;
border-radius: 9.38rpx;
// width: 90rpx;
height: 39.38rpx;
}
.font_3 {
font-size: 22.5rpx;
font-family: 'FangZhengFonts';
line-height: 21.71rpx;
color: #323232;
}
.text_6 {
line-height: 21.81rpx;
}
.text-wrapper_2 {
padding: 7.35rpx 0 10.31rpx;
background-color: #fbdedf;
border-radius: 9.38rpx;
height: 39.38rpx;
}
.text_7 {
margin-left: 11.78rpx;
margin-right: 8.83rpx;
}
.text-wrapper_1 {
padding: 9.22rpx 0 9.15rpx;
background-color: #fbdedf;
border-radius: 9.38rpx;
width: 105rpx;
height: 39.38rpx;
}
.text_8 {
line-height: 21rpx;
}
.text-wrapper_3 {
padding: 9.13rpx 0 8.27rpx;
background-color: #fbdedf;
border-radius: 9.38rpx;
width: 105rpx;
height: 39.38rpx;
}
.text_9 {
line-height: 21.98rpx;
}
.section_3 {
margin-top: 35.63rpx;
padding: 18.51rpx 11.72rpx 43.29rpx;
background-color: #ffffff;
border-radius: 18.75rpx;
}
.font_4 {
font-size: 30rpx;
font-family: 'FangZhengFonts';
color: #ffffff;
}
.text_10 {
color: #323232;
line-height: 28.01rpx;
text-decoration: underline;
}
.text_11 {
margin-left: 10.14rpx;
margin-top: 21.23rpx;
line-height: 25.74rpx;
}
.text_12 {
margin-left: 9.53rpx;
margin-top: 19.46rpx;
line-height: 25.54rpx;
}
.text_13 {
margin: 16.44rpx 15.69rpx 0 9.62rpx;
}
.text_14 {
margin-left: 9.41rpx;
margin-top: 21.36rpx;
}
.text_15 {
margin-left: 9.62rpx;
margin-top: 24.9rpx;
line-height: 25.63rpx;
}
.text_16 {
margin-left: 10.14rpx;
margin-top: 23.01rpx;
}
.image_3 {
margin: 20.88rpx 0 120rpx;
width: 100vw;
height: 100vw;
}
.section_4 {
position: fixed;
left: 0;
right: 0;
bottom: 0;
margin-top: 31.88rpx;
padding: 13.13rpx 26.25rpx 16.88rpx;
background-color: #ffffff;
}
.image_4 {
width: 46.88rpx;
height: 46.88rpx;
}
.text_19 {
color: #9d2624;
font-size: 22.5rpx;
font-family: Open Sans;
line-height: 20.72rpx;
}
.text-wrapper_4 {
padding: 20.38rpx 0 22.63rpx;
flex: 1 1 283.13rpx;
background-color: #e79ea1;
border-radius: 93.75rpx;
height: 71.25rpx;
}
.text_17 {
line-height: 28.24rpx;
}
.text-wrapper_5 {
padding: 20.51rpx 0 22.97rpx;
flex: 1 1 283.13rpx;
background-color: #c35c5d;
border-radius: 93.75rpx;
height: 71.25rpx;
}
.text_18 {
line-height: 27.77rpx;
}
.swiper-box {
width: 100%;
height: calc(150vw * 9 / 16);
}
.discountsText {
color: #ff0000;
font-size: 25rpx;
font-family: 'FangZhengFonts';
line-height: 30.06rpx;
margin-left: 20rpx
}
@import url(../../../common/css/global.css);
</style>