<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="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(()=>{ limitedTimeOffer() 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(';') //将后端传来的图片字符串转为图片数组 imgArr.value = imgArr.value.map((e)=>{ return publicPath + e }) 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(url); uni.previewImage({ current: index, urls: imgArr.value }) } const limitedTimeOffer = async () => { //查询限时优惠接口 const res = await uni.request({ url: baseUrl + '/global/query/coupon/price', method: 'GET', header: { cookie } }) console.log('res--->',res.data); if(res.data.code === 1) { coupon.value = res.data.data } } 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: auto; 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: 100vh; 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>