<template> <view class="flex-col page"> <view class="flex-col self-stretch"> <view class="flex-col self-stretch group"> <view class="flex-row justify-between group_2"> <view class="flex-row items-end group_3"> <image class="image-wrapper" :src="productInfo.goodImg"></image> <view class="flex-col items-start relative group_5 ml-13"> <view class="group_6"> <text class="font text_2">¥</text> <text class="text">{{ productInfo.price }}</text> </view> <!-- <text class="font_2 text_3">请选择</text> --> <text class="font_2 pos_2">最大人数:0</text> <!-- <text class="font_2 pos">场次</text> --> </view> </view> <view class="flex-col group_4"> <image class="self-end image_2" src="https://carbon2.obs.cn-north-4.myhuaweicloud.com:443/feiyi%2Ftest%2F0%2FTZQhzAYT-close.png" /> <view class="flex-row self-stretch mt-63"> <image class="image_3" src="https://carbon2.obs.cn-north-4.myhuaweicloud.com:443/feiyi%2Ftest%2F0%2FnKMzaToH-short.png" @click="short()" /> <view class="flex-col justify-start items-center text-wrapper ml-2"><text class="text_4">{{ classNum }}</text></view> <image class="image_4 ml-2" src="https://carbon2.obs.cn-north-4.myhuaweicloud.com:443/feiyi%2Ftest%2F0%2FhvzZoTdm-add.png" @click="add()" /> </view> </view> </view> <view class="flex-row justify-between items-center section"> <text class="font text_5">参加日期:{{ selected.date }}</text> <text class="font_2 text_6">当前预约人数:10</text> </view> </view> <view class="self-stretch divider view"></view> <text class="self-start font_3 text_7">选择预约时间</text> <view class="section_1"> <scroll-view scroll-x="true"> <view class="flex-row items-baseline group_1"> <text :style="{ color: item.color }" class="font_4 text_8" v-for="(item, index) in bookTimeList" :key="index" @click="chooseDate(index)"> {{ weekDay(item.specificDate) }}{{ item.specificDate.substring(5,10) }} </text> </view> </scroll-view> </view> </view> <view class="flex-row justify-start self-center grid"> <!-- 时间段数组小于等于2的情况 --> <view class="flex-1 list_temp" v-if="timeSlotList.length <= 2"> <view class="flex-col justify-start relative" v-for="(item, index) in timeSlotList" :key="index" @click="chooseTimeSlot(index)"> <view :style="{ backgroundColor: item.color }" class="section_3" ></view> <text class="font_5 text_12 pos_temp3">{{ item.timeSlot }}</text> <text class="font_3 pos_temp5">可预约</text> </view> </view> <!-- 时间段数组大于三才显示 --> <view class="flex-1 list_2" v-if="timeSlotList.length >= 3"> <view class="flex-col justify-start relative" v-for="(item, index) in timeSlotList" :key="index" @click="chooseTimeSlot(index)"> <view class="section_3" :style="{ backgroundColor: item.color }"></view> <text class="font_5 text_12 pos_3">{{ item.timeSlot }}</text> <!-- 缺当前预约人数 --> <text class="font_3 pos_5">可预约</text> </view> </view> </view> <view class="flex-col self-stretch group_7"> <view class="flex-row justify-between section_4"> <text class="font_3 text_13">预约时间</text> <text class="font_3 text_14">{{ selected.date }} {{ selected.time }}</text> </view> <view class="divider mt-9"></view> </view> <view class="flex-col items-start self-center section_5"> <text class="font_6">购买须知:本次课程活动最少需要到达5人才</text> <text class="font_6 text_1">能进行授课</text> </view> <view class="flex-col justify-start items-center self-stretch section_6"> <view class="flex-row section_7"> <text class="font_4 text_15">加入购物车</text> <!-- <text class="font_4 text_16 ml-21">买</text> --> </view> </view> </view> </template> <script setup> import { onMounted, ref } from 'vue' import { onLoad } from "@dcloudio/uni-app"; import { baseUrl } from '../../../api/request'; import { weekDay } from '../../../common/global'; const cookie = wx.getStorageSync("cookie") //请求头 const father = defineProps(['pid']) const pid = ref(0) //商品id const productInfo = ref({}) //商品对象 const bookTimeList = ref([]) //日期数组 const timeSlotList = ref([]) //时间段数组 const selected = ref({ //选中的日期+时间 date: '', time: '', minNum: 0, maxNum: 0 }) const classNum = ref(1) //课程数量 const flag = ref(0) onLoad((options)=>{ }) onMounted( async ()=>{ await getProduct() //每次加载都先选第一个 await chooseDate(0) await chooseTimeSlot(0) }) const chooseDate = (index) => { //选中后要改变颜色和切换日期 selected.value.date = bookTimeList.value[index].specificDate selected.value.time = '' classNum.value = 1 //切换了时间就初始化 bookTimeList.value.forEach((item)=>{ if(item != bookTimeList.value[index]) { item.color = '#000000' } else { bookTimeList.value[index].color = '#C35C5D' } }) timeSlotList.value = bookTimeList.value[index].timePeriodVOList //将当前日期下的时间段赋值 console.log('选中下日期时间段--->',bookTimeList.value[index].timePeriodVOList); } const chooseTimeSlot =(index) => { //选中后要改变颜色和切换时间段 selected.value.time = timeSlotList.value[index].timeSlot selected.value.maxNum = timeSlotList.value[index].maxNumber classNum.value = 1 //切换了时间就初始化 timeSlotList.value.forEach((item)=>{ if(item != timeSlotList.value[index]) { item.color = '#FFFFFF' } else { item.color = '#FBDEDF' } }) } const getProduct = async ()=>{ //获取商品信息 pid.value = father.pid //父组件传来的商品id const res = await uni.request({ url: baseUrl + '/goods/service/list/id', method: 'POST', data:{ id: pid.value }, header: { cookie } }) console.log('后端传来的商品信息--->',res.data.data); if(res.data.code === 1 ) { productInfo.value = res.data.data bookTimeList.value = res.data.data.appointmentDateVOList } console.log('商品信息--->',productInfo.value); console.log('日期+时间段信息--->',bookTimeList.value); } const short =()=> { //减少购买课程数量 if( selected.value.maxNum === 0 ) { uni.showToast({ icon: 'error', title: '请先选择时间段', duration: 1000 }) return; } if(classNum.value > 1) { classNum.value -= 1 } } const add =()=> { //传入当前课程最大人数 if( selected.value.maxNum === 0 ) { uni.showToast({ icon: 'error', title: '请先选择时间段', duration: 1000 }) return; } if(classNum.value < selected.value.maxNum) { classNum.value += 1 } } </script> <style lang="scss" scoped> .ml-13 { margin-left: 24.38rpx; } .mt-63 { margin-top: 118.13rpx; } .mt-9 { margin-top: 16.88rpx; } .ml-21 { margin-left: 39.38rpx; } .page { padding-top: 28.13rpx; background-color: #ffffff; border-radius: 37.5rpx 37.5rpx 0rpx 0rpx; width: 100%; overflow-y: auto; overflow-x: hidden; height: 100%; } .group { padding-bottom: 9.38rpx; } .group_2 { padding: 0 30rpx; } .group_3 { margin-bottom: 5.01rpx; } .image-wrapper { border-radius: 5.63rpx; // background-image: url('https://ide.code.fun/api/image?token=677b3b47797f850011f57419&name=f41b64b57071affd8eecfaa15a455af2.png'); background-size: 100% 100%; background-repeat: no-repeat; width: 195rpx; height: 204.38rpx; } .group_5 { margin-bottom: 5.29rpx; padding-bottom: 48.86rpx; width: 157.8rpx; } .group_6 { margin-left: 17.51rpx; line-height: 29.7rpx; } .font { font-size: 37.5rpx; font-family: FZSongKeBenXiuKaiS-R-GB; } .text_2 { color: #c35c5d; line-height: 24.17rpx; } .text { color: #c35c5d; font-size: 45rpx; font-family: FZSongKeBenXiuKaiS-R-GB; line-height: 29.7rpx; } .font_2 { font-size: 26.25rpx; font-family: FZSongKeBenXiuKaiS-R-GB; line-height: 31.88rpx; color: #818181; } .text_3 { margin-top: 21.26rpx; } .pos_2 { position: absolute; left: 0; bottom: 0; } .pos { position: absolute; right: 0; bottom: 28.03rpx; } .group_4 { margin-top: 5.63rpx; width: 176.25rpx; } .image_2 { margin-right: 20.63rpx; width: 37.5rpx; height: 37.5rpx; } .image_3 { border-radius: 9.38rpx 0rpx 0rpx 9.38rpx; width: 45.21rpx; height: 48.13rpx; } .text-wrapper { padding: 14.74rpx 0 14.66rpx; background-color: #ffffff; width: 58.41rpx; height: 48.13rpx; } .text_4 { color: #323232; font-size: 26.25rpx; font-family: Open Sans; line-height: 18.73rpx; } .image_4 { border-radius: 0rpx 9.38rpx 9.38rpx 0rpx; width: 45.21rpx; height: 48.13rpx; } .section { padding: 30.53rpx 21.86rpx 30.36rpx; background-color: #ffffff; border-radius: 28.13rpx; } .text_5 { color: #000000; line-height: 36.62rpx; } .text_6 { margin-right: 16.14rpx; line-height: 25.43rpx; } .divider { background-color: #d9d9d9; height: 1.88rpx; } .view { margin-left: 20.63rpx; margin-right: 26.27rpx; } .font_3 { font-size: 30rpx; font-family: FZSongKeBenXiuKaiS-R-GB; line-height: 27.07rpx; color: #000000; } .text_7 { margin-left: 29.31rpx; margin-top: 29.89rpx; line-height: 28.01rpx; } .section_1 { padding: 30rpx 0; background-color: #FBDEDF; border-radius: 10rpx; align-self: stretch; margin: 26.47rpx 28.13rpx 0 28.13rpx; } .group_1 { margin-left: 11.78rpx; margin-right: 14.83rpx; } .font_4 { // font-size: 30rpx; font-family: FZSongKeBenXiuKaiS-R-GB; line-height: 27.07rpx; color: #000000; } .text_8 { line-height: 27.3rpx; margin-left: 30rpx; } .grid { margin-top: 60rpx; width: 605.63rpx; } .list_2 { height: 228.75rpx; display: grid; grid-template-rows: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 54rpx; column-gap: 102rpx; overflow-y: auto; overflow-x: hidden; } //处理时间段数组长度小于2的情况 .list_temp { height: 105.75rpx; display: grid; grid-template-rows: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 54rpx; column-gap: 102rpx; overflow-y: auto; overflow-x: hidden; } .pos_temp3 { position: absolute; left: 50%; top: 52.99rpx; transform: translateX(-50%); } .pos_temp5 { position: absolute; left: 74.53rpx; bottom: -14.94rpx; } .group_temp7 { margin-top: 97.5rpx; padding: 0 22.5rpx; } //到这里结束 .section_3 { background-image: url('https://carbon2.obs.cn-north-4.myhuaweicloud.com:443/feiyi%2Ftest%2F0%2FkDkwyiFc-border.png'); background-color: #ffffff; border-radius: 26rpx; background-size: 100% 100%; background-repeat: no-repeat; height: 90rpx; } .font_5 { font-size: 30rpx; font-family: FZSongKeBenXiuKaiS-R-GB; line-height: 20.04rpx; color: #000000; } .text_12 { width: 150rpx; } .pos_3 { position: absolute; left: 50%; top: 16.99rpx; transform: translateX(-50%); } .pos_5 { position: absolute; left: 74.53rpx; bottom: 12.06rpx; } .group_7 { margin-top: 60rpx; padding: 0 22.5rpx; } .section_4 { margin-left: 20.63rpx; margin-right: 9.38rpx; // padding: 12.66rpx 13.54rpx 76.65rpx 16.29rpx; background-color: #ffffff; } .text_13 { line-height: 28.01rpx; } .text_14 { line-height: 28.84rpx; } .section_5 { margin: 54.38rpx 0 100rpx 0; padding: 32.23rpx 10.56rpx 91.29rpx 17.57rpx; background-color: #fff2f2f5; border-radius: 18.75rpx; } .font_6 { font-size: 30rpx; font-family: FZSongKeBenXiuKaiS-R-GB; line-height: 35.63rpx; color: #323232; } .text_1 { margin-left: 2.12rpx; } .section_6 { position: fixed; left: 0; right: 0; bottom: 0; // margin-left: 15rpx; // margin-top: 88.13rpx; padding: 16.88rpx 0; } .section_7 { padding: 26.14rpx 0 25.07rpx; background-color: #fbdedf; border-radius: 46.88rpx; width: 618.75rpx; } .text_15 { // margin-left: 260.94rpx; margin: 0 auto; line-height: 27.54rpx; } .text_16 { line-height: 27.54rpx; } .text_8:first-child { margin-left: 0rpx; } @import url(../../../common/css/global.css); </style>