7a7eddcf by zhangmeng

旅游

1 parent b693f3f5
......@@ -697,4 +697,16 @@ export function getVehicleMa1p(params) { // activityId
})
}
// 旅游
export function getGateListByLasId(params) { // scenicDate,lasId
return request({
url: `/ota/scenicConfig/getGateListByLasId`,
method: 'get',
params
})
}
// 旅游
......
<template>
<div>
<div class="box">
<el-card v-loading="loading" class="mt30">
<el-row v-if="form" class="hotel" align="middle" :gutter="20">
<!-- <el-col :span="6">-->
<!-- <img class="w100" :src="fillImgUrl(form.photos?.split(',')[0])"/>-->
<!-- </el-col>-->
<el-col :span="language == 0?16:24">
<h3 class="esp flex">{{ form?.name }}
<div class="starBox ml20">
<img v-for="i in Number(form?.rank||0)" src="@/assets/booking/star.png">
</div>
</h3>
<!-- <div class="tagbox">-->
<!-- <span v-for="(t,index) in form?.label?.split(',')" v-show="index<4">{{ t }}</span>-->
<!-- <a v-show="form?.label?.split(',').length>4">{{ language == 0 ? '更多' : 'MORE' }} ></a>-->
<!-- </div>-->
<!-- top -->
<div class="container top">
<img :src="fillImgUrl(travel.cover)" alt="" class="cover_img">
<div class="info">
<el-icon>
<Clock />
</el-icon>
<span class="mr10">{{ language == 0 ? '开园时间' : 'Opening Time' }}{{ form?.startTime }}{{ form?.workTime }}</span>
<div class="title">{{ travel.name }}</div>
<div class="select_item_box">
<div class="label">
{{ triggerLanguage(language, "时间", "Event Date & Time") }} :
</div>
<div class="info">
<el-icon>
<Phone />
</el-icon>
<span class="mr10">{{ language == 0 ? '联系方式' : 'Contact' }}{{ form?.contact }}</span>
</div>
<div class="info esp">
<el-icon>
<MapLocation />
</el-icon>
<span>{{ form?.address }}</span>
<div class="select_item_box">
<div class="select_item">
<div
v-for="(v, index) in travel.dateList"
:key="index"
:class="[
v== selectForm.scenicDate ? 'tagActive' : 'tag',
]"
@click="select(v)"
>
{{ v }}
</div>
<div v-if="form?.introduction" class="info pointer">
<div :class="showAll?'':'esp_2'" @click="showAll=!showAll" v-html="form.introduction.toString()" />
</div>
</el-col>
</el-row>
<el-empty v-else :image="`/img/order_no.png`" :image-size="228" description="" />
</el-card>
<div class="mt30">
<el-row :gutter="20">
<el-col :span="10">
<div class="imgbox hotelImg">
<el-image
:src="fillImgUrl(form?.photos?.split(',')[0])" fit="cover"
:preview-src-list="form?.photos?.split(',')"
</div>
<div>
<!-- 成人票 -->
<br>
<div v-for="v in ticketList" v-show="v.leftNum!=0" :key="v.id">
<div class="select_item_box">
<div class="label ticket">
{{ v.name }} :
</div>
<div class="rowBox">
<span class="titleTick">
{{
triggerLanguage(language, v.price, v.priceEn)
}}
{{
triggerLanguage(language, '¥/人', '€/person')
}}
</span>
<el-input-number
v-model="v.count" :max="v.leftNum" :min="0" :precision="0" class="inputNumber"
@change="countTotal"
/>
<i class="residue">{{ language == 0 ? '剩余票数' : 'Remaining votes' }}{{ v.leftNum }}</i>
</div>
</el-col>
<el-col :span="14">
<el-row class="h100" :gutter="20">
<el-col v-for="(p,index) in form?.photos?.split(',').slice(1,7)" :key="index" :span="8" class="oddmb">
<div class="imgbox hotelImg">
<el-image :src="fillImgUrl(p)" fit="cover" />
</div>
</el-col>
</el-row>
</el-col>
</el-row>
</div>
<el-card class="mt30 mb60">
<div class="lineHead">
<ul>
<li>
{{ language == 0 ? '选择日期' : 'tickets type' }}
</li>
</ul>
<!-- 价格 -->
<div class="select_item_box">
<div class="label">
{{ triggerLanguage(language, '价格', "Price") }} :
</div>
<div>
<!-- 日期-->
<el-calendar v-model="currentDate" class="mt20" :range="calendarRange">
<template #header="{date}">
<el-row style="width: 100%">
<el-col :lg="7" class="forPc" />
<el-col :lg="10" class="forPc">
<el-row justify="center" align="middle">
<!-- <div class="canBtn"><el-icon><ArrowLeftBold /></el-icon></div>-->
<div class="cTitle">
<!-- <el-date-picker-->
<!-- v-model="value2"-->
<!-- type="daterange"-->
<!-- range-separator="-"-->
<!-- start-placeholder="Start date"-->
<!-- end-placeholder="End date"-->
<!-- format="YYYY-MM-DD"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- size="small"-->
<!-- @change="changee"-->
<!-- />-->
<!-- <el-input readonly :value="date" type="text" size="small" style="width: 280px"></el-input>-->
{{ date }}
</div>
<!-- <div class="canBtn"><el-icon><ArrowRightBold /></el-icon></div>-->
</el-row>
</el-col>
<el-col :lg="7" :xs="24">
<div style="text-align: right;padding-right: 10px">
<el-date-picker
v-model="currentDate1"
type="date"
placeholder="YYYY-MM-DD"
format="YYYY-MM-DD"
:disabled-date="disabledDateRZ"
:clearable="false"
@change="dateChange"
/>
<div class="select_item_box">
<div class="select_item">
<div class="tagActive" style="min-width: 80px">
{{ language == 0 ? '¥' : '€' }} {{ language == 0 ? selectForm.price : selectForm.priceEn }}
</div>
</div>
</div>
<!-- 购票备注-->
<div v-if="matchForm.ticketRemark" class="select_item_box">
<div class="label">
{{
triggerLanguage(language, '购票备注', "Ticket Purchase Note")
}} :
</div>
</el-col>
</el-row>
</template>
<template #date-cell="data">
<div :class="data.data.day==query.currentDate?'primaryDate date':'date'" @click="selectDate(data.data.day)">
{{ data.data.day.slice(8, 10) }}
</div>
</template>
</el-calendar>
<div v-if="matchForm.ticketRemark" class="select_item_box">
<div class="select_item">
{{ matchForm.ticketRemark }}
</div>
</div>
<div class="text-center mt30">
<el-button
style="color: #fff" size="large"
class="w200px btn-lineG" :class="{'forbid':!(!hotTime[0])}" round @click="goOrder"
<div
v-if="endTime<=0" class="btn" style="margin-left: 40px;opacity: 0.5;cursor: not-allowed;margin-top: 10px"
@click="toSelectClosed"
>
<span v-if="btnDisable">{{ language==0?'不在预定时间内':'OUT OF ORDER TIME' }}</span>
<span v-else>{{ language==0?'立即预订':'BOOK NOW' }}</span>
</el-button>
{{
triggerLanguage(language, "售票结束", "Sale closed")
}}
</div>
<div v-else class="btn" style="margin-left: 40px;margin-top: 10px" @click="toSelectSeat()">
{{
triggerLanguage(language, "立即购票", "Buy tickets now")
}}
</div>
</div>
</div>
</div>
<div class="container bottom">
<div style="display: flex">
<div :class="{'bg':active==1}" class="buBg" @click="active=1">{{ language == 0 ? '购票说明' : 'Notice' }}</div>
<div :class="{'bg' :active==2}" class="buBg" @click="active=2">{{
language == 0 ? '购票须知' : 'Instructions'
}}
</div>
</div>
<div v-show="active==1" class="rich_content" v-html="travel.descriptions" />
<div v-show="active==2" class="rich_content" v-html="travel.notice" />
<el-dialog v-model="show" title="" width="1000px">
<div>
<img :src="fillImgUrl(showUrl)" alt="" style="width: 100%">
</div>
</el-card>
</el-dialog>
</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
import { ref, onMounted, computed } from 'vue'
import { useRoute } from 'vue-router'
import { dayjs } from 'element-plus'
import { getScenicById, checkOrderPay } from '@/apiPc/booking'
import { getBaseInfoByActiveId } from '@/apiPc/booking'
import { ref, computed, onMounted } from 'vue'
import * as booking from '@/apiPc/booking'
import { useStorage } from '@vueuse/core/index'
import { ElMessageBox } from 'element-plus'
const currentDate = ref(new Date())
const currentDate1 = ref(new Date())
const calendarRange = ref([dayjs(currentDate.value).toDate(), (dayjs(currentDate.value).toDate())])
import { fillImgUrl } from '/@/utils/ruoyi'
import useUserStore from '/@/store/modules/user'
import { triggerLanguage } from '@/utils/ruoyi'
import { useStorage } from '@vueuse/core/index'
import { useRoute, useRouter } from 'vue-router'
import { getCurrentInstance } from '@vue/runtime-core'
const language = useStorage('language', 0)
const router = useRouter()
const useStore = useUserStore()
const user = computed(() => useUserStore().user)
const route = useRoute()
const form = ref({})
const query = ref({
lasId: route.query.lasId
const router = useRouter()
const show = ref(false)
const showUrl = ref('')
const activeId = ref(route.params.activeId)
const active = ref(1)
const timeData = ref()
const endTime = ref()
const matchForm = ref({})
const selectForm = ref({
latsId: null,
scenicDate: '',
price: '--',
priceEn: '--'
})
const hotTime = ref([])
const showAll = ref(false)
const loading = ref(false)
const formTime = ref({})
const { proxy } = getCurrentInstance()
const travel = ref({})
const ticketList = ref([])
onMounted(() => {
getBaseInfoByActiveId(route.params.cptId).then(res => {
formTime.value = res.data || null
}).catch(err => {
console.log(err)
formTime.value = null
}).finally(() => {
console.log(formTime.value)
getData()
})
getLogexScenicVoById()
})
function getData() {
loading.value = true
getScenicById(route.params.scenicId).then(res => {
loading.value = false
form.value = res.data
// initMap()
}).catch(err => {
console.log(err)
async function getLogexScenicVoById() {
const res = await booking.getLogexScenicVoById({ id: activeId.value })
travel.value = res.data
selectForm.value.latsId = travel.value.id
if (travel.value.dateList && travel.value.dateList.length > 0) {
selectForm.value.scenicDate = travel.value.dateList[0]
await getGateListByLasId()
}
}
async function getGateListByLasId() {
const res = await booking.getGateListByLasId({
latsId: selectForm.value.latsId,
scenicDate: selectForm.value.scenicDate
})
ticketList.value = res.data
for (const v of ticketList.value) {
v.leftNum = v.num - v.orderCount
v.count = 0
}
}
function dateChange() {
currentDate.value = currentDate1.value
calendarRange.value = [dayjs(currentDate.value).toDate(), (dayjs(currentDate.value).toDate())]
function select(v) {
selectForm.value.scenicDate = v
selectForm.value.price = '--'
selectForm.value.priceEn = '--'
getGateListByLasId()
}
function selectDate(date) {
query.value.currentDate = date
currentDate1.value = currentDate.value = dayjs(date).toDate()
console.log(date)
function countTotal() {
let price = 0
let priceEn = 0
for (const val of ticketList.value) {
if (val.count > 0) {
price += val.price * val.count
priceEn += val.priceEn * val.count
val.personArr = [...new Array(val.count).fill({
customerId: '',
name: '',
idcType: '',
idCard: ''
})]
}
}
selectForm.value.price = price
selectForm.value.priceEn = priceEn
}
const btnDisable = computed(() => {
if (formTime.value.scenicStart) {
const curr = currentDate.value.valueOf()
const today = dayjs(dayjs().format('YYYY-MM-DD')).valueOf()
const start = dayjs(formTime.value.scenicStart).valueOf()
const end = dayjs(formTime.value.scenicEnd).valueOf()
if (curr >= start && curr <= end && curr >= today) {
return false
}
async function toSelectSeat() {
if (!user.value) {
useStore.setVisitor()
return
}
return true
})
function goOrder() {
if(btnDisable.value){
if (!selectForm.value.scenicDate) {
await proxy.$modal.confirm(language.value == 0 ? '请选择日期' : 'Please select a date')
return
}
ElMessageBox.confirm(language.value == 0 ? `你当前选择的出行日期为${dayjs(currentDate.value).format('YYYY-MM-DD')}是否确定?` : `Your current check-in time is ${dayjs(currentDate.value).format('YYYY-MM-DD')} Are you sure?`, { type: 'warning' }).then({}).then(() => {
checkOrderPay(6).then(res => {
if (res.data == -100) {
ElMessageBox.confirm(
language.value == 0 ? '你有未支付的旅游预订,是否前往个人中心查看' : 'You already have an unpaid travel order, do you want to go to the personal center to check it?',
language.value == 0 ? '提示' : 'Warning',
{
confirmButtonText: language.value == 1 ? 'Go My Reservation ' : '前往我的预订',
// cancelButtonText: language.value==1?'Continue to book':'继续预订',
type: 'warning'
if (!selectForm.value.price == '--' || selectForm.value.price == '--') {
await proxy.$modal.confirm(language.value == 0 ? '请选择购票数量' : 'Please select the number of tickets to purchase')
return
}
).then((res) => {
console.log(res)
router.push({
await checkOrderPay()
}
async function checkOrderPay() {
const res = await booking.checkOrderPay(8)
if (res.data == -100) {
await proxy.$modal.confirm(language.value == 0 ? '你有未支付的旅游预订,是否前往个人中心查看?' : 'You already have an unpaid travel order, do you want to go to the personal center to check it?')
await router.push({
name: 'myReservation'
})
})
return
}
} else {
goNext()
})
})
}
}
function goNext() {
router.push({
name: 'travelOrder',
params: {
start: dayjs(currentDate.value).format('YYYY-MM-DD')
start: selectForm.value.scenicDate
},
query: {
lasId: query.value.lasId
lasId: selectForm.value.latsId,
item: encodeURIComponent(JSON.stringify(ticketList.value))
}
})
}
function disabledDateRZ(date) {
// 判读今天大与form.value.hqStart
if (formTime.value.scenicStart) {
const today = dayjs().format('YYYY-MM-DD')
if (formTime.value.scenicStart < today) {
return !((date.getTime() >= dayjs(today).valueOf()) && (date.getTime() <= dayjs(formTime.value.scenicEnd).valueOf()))
} else {
return !((date.getTime() >= dayjs(formTime.value.scenicStart).valueOf()) && (date.getTime() <= dayjs(formTime.value.scenicEnd).valueOf()))
}
}
function toSelectClosed() {
ElMessageBox.confirm(language.value == 0 ? '售票结束' : 'Sale closed', language.value == 0 ? '提示' : 'Tips', {
confirmButtonText: language.value == 0 ? '确定' : 'OK',
cancelButtonText: language.value == 0 ? '取消' : 'Cancel',
type: 'warning'
})
}
</script>
<style scoped lang="scss">
.room {
background: #FAFBFD;
margin: 20px 0 0;
padding: 20px;
border: 1px solid #E5E5E5;
<style lang="scss" scoped>
.forWei {
display: none
}
.name {
font-size: 20px;
margin: 0 0 10px;
}
.buBg {
cursor: pointer;
font-size: 18px;
padding: 8px 13px;
border-radius: 5px;
margin-right: 10px;
}
.roomImg {
aspect-ratio: 16/9;
border-radius: 10px;
overflow: hidden;
.bg {
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
color: #fff;
}
img {
.container {
width: 1200px;
margin: 0 auto;
background-color: #fff;
box-shadow: 0 0 46px 0 rgba(1, 16, 64, 0.08);
border-radius: 8px;
box-sizing: border-box;
font-family: SourceHanSansCN, SourceHanSansCN;
padding-bottom: 20px;
}
.top {
display: flex;
padding: 19px;
margin-top: 26px;
.cover_img {
width: 500px;
object-fit: fill;
margin-right: 36px;
}
.info {
padding-top: 12px;
width: 100%;
object-fit: cover;
object-position: center;
height: 100%;
.title {
font-weight: bold;
font-size: 28px;
color: #000000;
line-height: 1.6;
margin-bottom: 15px;
}
.time {
font-weight: 600;
font-size: 16px;
color: #000;
line-height: 24px;
margin-bottom: 16px;
}
.price {
color: #FF8124;
font-size: 24px;
.address {
font-weight: 600;
font-size: 16px;
color: #000;
line-height: 24px;
margin-bottom: 15px;
}
span {
font-size: 36px;
font-family: "DIN Alternate"
.select_item_box {
display: flex;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
.label {
font-weight: 600;
font-size: 16px;
color: #000;
line-height: 24px;
margin-right: 12px;
flex-shrink: 0;
}
.bg-lineg {
margin: auto;
border-radius: 10px;
text-align: center;
padding: 7px 2px 2px;
font-size: 24px;
width: 66px;
.ticket {
height: 40px;
line-height: 40px;
width: 100px;
}
.rowBox {
display: flex;
.titleTick {
color: #493ceb;
cursor: pointer;
font-weight: 600;
font-size: 18px;
margin-right: 30px;
height: 40px;
line-height: 40px;
width: 180px;
//text-align: center;
}
div {
background: #fff;
font-size: 13px;
border-radius: 20px;
padding: 0 10px;
color: #453DEA;
font-weight: 500;
.inputNumber {
height: 35px;
margin: 2.5px;
}
.residue {
height: 40px;
line-height: 40px;
font-size: 14px;
color: orange;
margin-left: 10px;
}
}
.hotel {
h3 {
margin: 0 0 20px;
}
img.w100 {
object-fit: cover;
aspect-ratio: 16/9
.forbid {
opacity: 0.5 !important;
cursor: not-allowed !important;
}
.addr {
font-size: 16px;
color: #929AA0;
.select_item {
display: flex;
flex-wrap: wrap;
gap: 10px;
user-select: none;
.tag_t {
padding: 1px 15px;
font-weight: 400;
font-size: 14px;
color: #493ceb;
border-radius: 6px;
border: 1px solid #453dea;
margin-left: 5px;
}
.tag {
display: flex;
padding: 12px 18px;
background: #eeeeee;
border-radius: 4px;
border: 1px solid #29343c;
font-size: 14px;
color: #4a4a4a;
cursor: pointer;
}
.price {
margin: 0 0 25px;
color: #FF8124;
font-size: 18px;
.tagActive {
display: flex;
padding: 12px 18px;
background: #fff;
border-radius: 4px;
border: 1px solid #493ceb;
font-size: 14px;
color: #493ceb;
cursor: pointer;
}
span {
font-size: 24px;
margin: 0 8px;
font-family: 'DINAlternate-Bold';
font-weight: 600;
.tao {
border: 1px solid #493ceb;
font-size: 14px;
color: #493ceb;
margin-left: 10px;
}
i {
font-style: normal;
color: #929AA0;
.tagDisabled {
padding: 12px 18px;
background: #878787;
border-radius: 4px;
border: 1px solid #29343c;
font-size: 14px;
color: #4a4a4a;
cursor: no-drop;
}
}
}
}
:deep(.button) {
display: block;
height: 55px;
width: auto;
color: #fff;
.btn {
width: 175px;
height: 40px;
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
border-radius: 20px;
line-height: 40px;
text-align: center;
font-weight: 500;
font-size: 16px;
color: #ffffff;
cursor: pointer;
}
}
}
span {
display: block !important;
.bottom {
padding: 50px;
margin-top: 30px;
margin-bottom: 30px;
div {
margin-top: 3px;
.title {
padding: 20px 30px;
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
font-weight: bold;
font-size: 20px;
color: #ffffff;
line-height: 30px;
margin-bottom: 30px;
}
.rich_content {
margin-top: 30px;
:deep(img) {
width: 100% !important;
height: auto !important;
}
}
}
.starBox {
img {
display: inline-block;
margin-right: 4px
@media screen and (max-width: 768px) {
.container {
width: 100%;
}
.forWei {
display: block
}
.top {
//transform: scale(0.5);transform-origin: left top;
.cover_img {
width: 120px;
height: 160px;
margin-right: 15px;
}
}
.tagbox {
margin: 15px 0;
.info {
padding: 0;
a {
color: #AFB5B9;
font-size: 12px;
.title {
font-size: 14px;
margin: 0;
}
span {
border-radius: 13px;
.time, .address, .label, .tip {
font-size: 12px;
padding: 4px 10px;
margin-right: 10px;
font-weight: 400;
}
span:nth-child(4n) {
background: rgba(50, 177, 108, 0.2);
color: rgba(50, 177, 108, 1);
.title, .time, .address, .tip, .select_item_box {
margin-bottom: 3px;
}
span:nth-child(4n+1) {
background: rgba(243, 152, 0, 0.2);
color: rgba(243, 152, 0, 1);
.select_item_box {
.label {
font-size: 12px;
}
span:nth-child(4n+2) {
background: rgba(0, 160, 233, 0.2);
color: rgba(0, 160, 233, 1);
.select_item .tag {
padding: 2px 10px;
font-size: 12px;
}
span:nth-child(4n+3) {
background: rgba(247, 64, 166, 0.2);
color: rgba(247, 64, 166, 1);
.select_item .tagActive {
padding: 2px 10px;
font-size: 12px;
}
}
.mapBox {
position: relative;
overflow: hidden;
height: 200px;
#map {
position: relative;
left: -70px;
width: calc(100% + 160px);
.select_item .tagDisabled {
padding: 2px 10px;
font-size: 12px;
}
}
}
.hotelImg {
border-radius: 10px;
overflow: hidden;
aspect-ratio: 16/9;
img {
object-fit: cover;
object-position: center;
width: 100%;
height: 100%;
.btn {
display: inline-block;
margin: 10px 0 0;
background: linear-gradient(270deg, #493ceb 0%, #8623fc 100%);
border-radius: 20px;
line-height: 40px;
text-align: center;
font-weight: 500;
font-size: 16px;
color: #ffffff;
cursor: pointer;
}
}
}
.bottom {
padding: 0
}
}
.info {
font-weight: 400;
font-size: 14px;
color: #929AA0;
.el-icon {
margin-right: 5px;
}
}
.oddmb:nth-child(2) {
margin-bottom: 20px;
.countDownTitle {
text-align: center;
color: #000;
position: relative;
width: 100%;
left: 0;
font-size: 28px;
}
.forbid {
cursor: not-allowed !important;
filter:grayscale(0.4);opacity: 0.7;
.countDownTitle span {
background: #fff;
padding: 0 10px;
position: relative;
z-index: 1;
}
.forbid:hover {
box-shadow: none;
.countDownTitle::after {
position: absolute;
background: #ccc;
height: 1px;
content: '';
top: 0;
bottom: 0;
margin: auto;
width: 100%;
left: 0;
}
.lineHead{display: flex;justify-content: space-between;}
.el-calendar {
--el-calendar-border: none;
--el-calendar-cell-width: 40px;
.van-count-down {
text-align: center;
--el-text-color-regular: #8E8D94;
:deep(.el-calendar__header) {
margin: 20px 0;
display: flex;
justify-content: center;
padding: 0 0 10px
}
:deep(.el-calendar__body) {
border: 1px solid #F0F0F0;
padding: 0
}
:deep(.el-calendar-table .el-calendar-day) {
padding: 1px;
}
:deep(.el-calendar-table td.is-selected) {
background: transparent;
}
:deep(.el-calendar__button-group) {
display: none;
}
}
:deep(.el-calendar-table thead th) {
padding: 5px 0 0
}
.colon {
display: inline-block;
font-size: 20px;
height: 110px;
line-height: 110px;
margin: 0 8px;
color: #7B7F83;
}
.primaryDate {
.block {
display: inline-block;
opacity: 0.7;
width: 100px;
height: 110px;
line-height: 110px;
color: #fff;
background: linear-gradient(90deg, #8623FC, #453DEA);
}
.date {
margin: auto;
border-radius: 50%;
width: 30px;
height: 30px;
line-height: 30px;
font-size: 35px;
font-weight: bold;
}
border-radius: 10px;
background: url(@/assets/img/djs_bg.png) left;
background-size: 100% 100%;
text-align: center;
}
</style>
......
<template>
<div>
<div class="box">
<el-card v-loading="loading" class="mt30">
<el-row v-if="form" :gutter="20" align="middle" class="hotel">
<!-- <el-col :span="6">-->
<!-- <img class="w100" :src="fillImgUrl(form.photos?.split(',')[0])"/>-->
<!-- </el-col>-->
<el-col :span="language == 0?16:24">
<h3 class="esp flex">{{ form?.name }}
<div class="starBox ml20">
<img v-for="i in Number(form?.rank||0)" src="@/assets/booking/star.png">
</div>
</h3>
<!-- <div class="tagbox">-->
<!-- <span v-for="(t,index) in form?.label?.split(',')" v-show="index<4">{{ t }}</span>-->
<!-- <a v-show="form?.label?.split(',').length>4">{{ language == 0 ? '更多' : 'MORE' }} ></a>-->
<!-- </div>-->
<div class="info">
<el-icon>
<Clock />
</el-icon>
<span class="mr10">{{ language == 0 ? '开园时间' : 'Opening Time' }}{{
form?.startTime
}}{{ form?.workTime }}</span>
</div>
<div class="info">
<el-icon>
<Phone />
</el-icon>
<span class="mr10">{{ language == 0 ? '联系方式' : 'Contact' }}{{ form?.contact }}</span>
</div>
<div class="info esp">
<el-icon>
<MapLocation />
</el-icon>
<span>{{ form?.address }}</span>
</div>
<div v-if="form?.introduction" class="info pointer">
<div :class="showAll?'':'esp_2'" @click="showAll=!showAll" v-html="form.introduction.toString()" />
</div>
</el-col>
</el-row>
<el-empty v-else :image="`/img/order_no.png`" :image-size="228" description="" />
</el-card>
<div class="mt30">
<el-row :gutter="20">
<el-col :span="10">
<div class="imgbox hotelImg">
<el-image
:preview-src-list="form?.photos?.split(',')" :src="fillImgUrl(form?.photos?.split(',')[0])"
fit="cover"
/>
</div>
</el-col>
<el-col :span="14">
<el-row :gutter="20" class="h100">
<el-col v-for="(p,index) in form?.photos?.split(',').slice(1,7)" :key="index" :span="8" class="oddmb">
<div class="imgbox hotelImg">
<el-image :src="fillImgUrl(p)" fit="cover" />
</div>
</el-col>
</el-row>
</el-col>
</el-row>
</div>
<el-card class="mt30 mb60">
<div class="lineHead">
<ul>
<li>
{{ language == 0 ? '选择日期' : 'tickets type' }}
</li>
</ul>
</div>
<div>
<!-- 日期-->
<el-calendar v-model="currentDate" :range="calendarRange" class="mt20">
<template #header="{date}">
<el-row style="width: 100%">
<el-col :lg="7" class="forPc" />
<el-col :lg="10" class="forPc">
<el-row align="middle" justify="center">
<!-- <div class="canBtn"><el-icon><ArrowLeftBold /></el-icon></div>-->
<div class="cTitle">
<!-- <el-date-picker-->
<!-- v-model="value2"-->
<!-- type="daterange"-->
<!-- range-separator="-"-->
<!-- start-placeholder="Start date"-->
<!-- end-placeholder="End date"-->
<!-- format="YYYY-MM-DD"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- size="small"-->
<!-- @change="changee"-->
<!-- />-->
<!-- <el-input readonly :value="date" type="text" size="small" style="width: 280px"></el-input>-->
{{ date }}
</div>
<!-- <div class="canBtn"><el-icon><ArrowRightBold /></el-icon></div>-->
</el-row>
</el-col>
<el-col :lg="7" :xs="24">
<div style="text-align: right;padding-right: 10px">
<el-date-picker
v-model="currentDate1"
:clearable="false"
:disabled-date="disabledDateRZ"
format="YYYY-MM-DD"
placeholder="YYYY-MM-DD"
type="date"
@change="dateChange"
/>
</div>
</el-col>
</el-row>
</template>
<template #date-cell="data">
<div
:class="data.data.day==query.currentDate?'primaryDate date':'date'"
@click="selectDate(data.data.day)"
>
{{ data.data.day.slice(8, 10) }}
</div>
</template>
</el-calendar>
</div>
<div class="text-center mt30">
<el-button
:class="{'forbid':!(!hotTime[0])}" class="w200px btn-lineG"
round size="large" style="color: #fff" @click="goOrder"
>
<span v-if="btnDisable">{{ language == 0 ? '不在预定时间内' : 'OUT OF ORDER TIME' }}</span>
<span v-else>{{ language == 0 ? '立即预订' : 'BOOK NOW' }}</span>
</el-button>
</div>
</el-card>
</div>
</div>
</template>
<script setup>
import { useRouter } from 'vue-router'
import { ref, onMounted, computed } from 'vue'
import { useRoute } from 'vue-router'
import { dayjs } from 'element-plus'
import { getScenicById, checkOrderPay } from '@/apiPc/booking'
import { getBaseInfoByActiveId } from '@/apiPc/booking'
import { useStorage } from '@vueuse/core/index'
import { ElMessageBox } from 'element-plus'
const currentDate = ref(new Date())
const currentDate1 = ref(new Date())
const calendarRange = ref([dayjs(currentDate.value).toDate(), (dayjs(currentDate.value).toDate())])
const language = useStorage('language', 0)
const router = useRouter()
const route = useRoute()
const form = ref({})
const query = ref({
lasId: route.query.lasId
})
const hotTime = ref([])
const showAll = ref(false)
const loading = ref(false)
const formTime = ref({})
onMounted(() => {
getBaseInfoByActiveId(route.params.cptId).then(res => {
formTime.value = res.data || null
}).catch(err => {
console.log(err)
formTime.value = null
}).finally(() => {
console.log(formTime.value)
getData()
})
})
function getData() {
loading.value = true
getScenicById(route.params.scenicId).then(res => {
loading.value = false
form.value = res.data
// initMap()
}).catch(err => {
console.log(err)
})
}
function dateChange() {
currentDate.value = currentDate1.value
calendarRange.value = [dayjs(currentDate.value).toDate(), (dayjs(currentDate.value).toDate())]
}
function selectDate(date) {
query.value.currentDate = date
currentDate1.value = currentDate.value = dayjs(date).toDate()
console.log(date)
}
const btnDisable = computed(() => {
if (formTime.value.scenicStart) {
const curr = currentDate.value.valueOf()
const today = dayjs(dayjs().format('YYYY-MM-DD')).valueOf()
const start = dayjs(formTime.value.scenicStart).valueOf()
const end = dayjs(formTime.value.scenicEnd).valueOf()
if (curr >= start && curr <= end && curr >= today) {
return false
}
}
return true
})
function goOrder() {
if (btnDisable.value) {
return
}
ElMessageBox.confirm(language.value == 0 ? `你当前选择的出行日期为${dayjs(currentDate.value).format('YYYY-MM-DD')}是否确定?` : `Your current check-in time is ${dayjs(currentDate.value).format('YYYY-MM-DD')} Are you sure?`, { type: 'warning' }).then({}).then(() => {
checkOrderPay(6).then(res => {
if (res.data == -100) {
ElMessageBox.confirm(
language.value == 0 ? '你有未支付的旅游预订,是否前往个人中心查看' : 'You already have an unpaid travel order, do you want to go to the personal center to check it?',
language.value == 0 ? '提示' : 'Warning',
{
confirmButtonText: language.value == 1 ? 'Go My Reservation ' : '前往我的预订',
// cancelButtonText: language.value==1?'Continue to book':'继续预订',
type: 'warning'
}
).then((res) => {
console.log(res)
router.push({
name: 'myReservation'
})
})
return
}
goNext()
})
})
}
function goNext() {
router.push({
name: 'travelOrder',
params: {
start: dayjs(currentDate.value).format('YYYY-MM-DD')
},
query: {
lasId: query.value.lasId
}
})
}
function disabledDateRZ(date) {
// 判读今天大与form.value.hqStart
if (formTime.value.scenicStart) {
const today = dayjs().format('YYYY-MM-DD')
if (formTime.value.scenicStart < today) {
return !((date.getTime() >= dayjs(today).valueOf()) && (date.getTime() <= dayjs(formTime.value.scenicEnd).valueOf()))
} else {
return !((date.getTime() >= dayjs(formTime.value.scenicStart).valueOf()) && (date.getTime() <= dayjs(formTime.value.scenicEnd).valueOf()))
}
}
}
</script>
<style lang="scss" scoped>
.room {
background: #FAFBFD;
margin: 20px 0 0;
padding: 20px;
border: 1px solid #E5E5E5;
.name {
font-size: 20px;
margin: 0 0 10px;
}
.roomImg {
aspect-ratio: 16/9;
border-radius: 10px;
overflow: hidden;
img {
width: 100%;
object-fit: cover;
object-position: center;
height: 100%;
}
}
.price {
color: #FF8124;
font-size: 24px;
span {
font-size: 36px;
font-family: "DIN Alternate"
}
}
.bg-lineg {
margin: auto;
border-radius: 10px;
text-align: center;
padding: 7px 2px 2px;
font-size: 24px;
width: 66px;
cursor: pointer;
div {
background: #fff;
font-size: 13px;
border-radius: 20px;
padding: 0 10px;
color: #453DEA;
font-weight: 500;
}
}
}
.hotel {
h3 {
margin: 0 0 20px;
}
img.w100 {
object-fit: cover;
aspect-ratio: 16/9
}
.addr {
font-size: 16px;
color: #929AA0;
font-weight: 400;
}
.price {
margin: 0 0 25px;
color: #FF8124;
font-size: 18px;
span {
font-size: 24px;
margin: 0 8px;
font-family: 'DINAlternate-Bold';
font-weight: 600;
}
i {
font-style: normal;
color: #929AA0;
}
}
}
:deep(.button) {
display: block;
height: 55px;
width: auto;
color: #fff;
span {
display: block !important;
div {
margin-top: 3px;
}
}
}
.starBox {
img {
display: inline-block;
margin-right: 4px
}
}
.tagbox {
margin: 15px 0;
a {
color: #AFB5B9;
font-size: 12px;
}
span {
border-radius: 13px;
font-size: 12px;
padding: 4px 10px;
margin-right: 10px;
font-weight: 400;
}
span:nth-child(4n) {
background: rgba(50, 177, 108, 0.2);
color: rgba(50, 177, 108, 1);
}
span:nth-child(4n+1) {
background: rgba(243, 152, 0, 0.2);
color: rgba(243, 152, 0, 1);
}
span:nth-child(4n+2) {
background: rgba(0, 160, 233, 0.2);
color: rgba(0, 160, 233, 1);
}
span:nth-child(4n+3) {
background: rgba(247, 64, 166, 0.2);
color: rgba(247, 64, 166, 1);
}
}
.mapBox {
position: relative;
overflow: hidden;
height: 200px;
#map {
position: relative;
left: -70px;
width: calc(100% + 160px);
}
}
.hotelImg {
border-radius: 10px;
overflow: hidden;
aspect-ratio: 16/9;
img {
object-fit: cover;
object-position: center;
width: 100%;
height: 100%;
}
}
.info {
font-weight: 400;
font-size: 14px;
color: #929AA0;
.el-icon {
margin-right: 5px;
}
}
.oddmb:nth-child(2) {
margin-bottom: 20px;
}
.forbid {
cursor: not-allowed !important;
filter: grayscale(0.4);
opacity: 0.7;
}
.forbid:hover {
box-shadow: none;
}
.lineHead {
display: flex;
justify-content: space-between;
}
.el-calendar {
--el-calendar-border: none;
--el-calendar-cell-width: 40px;
text-align: center;
--el-text-color-regular: #8E8D94;
:deep(.el-calendar__header) {
justify-content: center;
padding: 0 0 10px
}
:deep(.el-calendar__body) {
border: 1px solid #F0F0F0;
padding: 0
}
:deep(.el-calendar-table .el-calendar-day) {
padding: 1px;
}
:deep(.el-calendar-table td.is-selected) {
background: transparent;
}
:deep(.el-calendar__button-group) {
display: none;
}
:deep(.el-calendar-table thead th) {
padding: 5px 0 0
}
.primaryDate {
color: #fff;
background: linear-gradient(90deg, #8623FC, #453DEA);
}
.date {
margin: auto;
border-radius: 50%;
width: 30px;
height: 30px;
line-height: 30px;
font-weight: bold;
}
}
</style>
......@@ -3,26 +3,27 @@
<div class="box">
<el-card :body-style="{ padding: '0px' }" class="mt20">
<div slot="header">
<div class="bg-lineg">{{ language == 0 ? '旅游服务下单' : 'Hotel booking order' }}</div>
<div class="bg-lineg father">{{ language == 0 ? '旅游服务下单' : 'Hotel booking order' }}
<sapn class="son" @click="handleGo">{{ language == 0 ? '上一步' : 'Back go' }}</sapn>
</div>
</div>
<!-- {{room}}-->
<el-row class="pd20" :gutter="20">
<el-row :gutter="20" class="pd20">
<el-col :span="14">
<div class="border-info">
<el-row class="hotel" align="middle" :gutter="20">
<!-- <el-col :span="6">-->
<!-- <img class="w100" :src="fillImgUrl(form.photos?.split(',')[0])"/>-->
<!-- </el-col>-->
<el-row :gutter="20" align="middle" class="hote ">
<el-col :span="language == 0?16:24">
<h3 class="esp flex">{{ scenicItem?.name }}
<el-tag effect="dark" class="ml20">{{ scenicItem?.rank||0 }}A</el-tag>
<el-tag class="ml20" effect="dark">{{ scenicItem?.rank || 0 }}A</el-tag>
</h3>
<div class="info">
<el-icon>
<Clock />
</el-icon>
<span class="mr10">{{ language == 0 ? '开园时间' : 'Opening Time' }}{{ scenicItem?.startTime }}{{ scenicItem?.workTime }}</span>
<span class="mr10">{{ language == 0 ? '开园时间' : 'Opening Time' }}{{ scenicItem?.startTime }}{{
scenicItem?.workTime
}}</span>
</div>
<div class="info">
<el-icon>
......@@ -42,71 +43,83 @@
<div class="leftboderTT">{{ language == 0 ? '预约信息' : 'Reservation information' }}</div>
<div class="border-rr mt20 pd20">
<el-form ref="formRef" v-loading="loading" :model="form" :label-width="language == 0 ?'120':'160'" :rules="rules">
<el-form
ref="formRef" v-loading="loading" :label-width="language == 0 ?'120':'160'" :model="form"
:rules="rules"
>
<!-- &lt;!&ndash; :disabled-date="disabledDateRZ"&ndash;&gt;-->
<!-- <el-form-item :label="language==0?'选择日期':'Date'" required>-->
<!-- <el-date-picker-->
<!-- v-model="rzRange"-->
<!-- :clearable="false"-->
<!-- :disabled-date="disabledDateRZ"-->
<el-form-item :label="language==0?'选择日期':'Date'" required>
<el-date-picker
v-model="rzRange"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled-date="disabledDateRZ"
:clearable="false"
@change="dateChange"
/>
<div v-if="lform.scenicStart" class="tip">{{ language==0?'可订日期':'Available date' }}{{ lform.scenicStart.slice(0, 10) }} ~ {{ lform.scenicEnd.slice(0, 10) }}</div>
<!-- :picker-options="pickerOptions"-->
</el-form-item>
<el-form-item v-for="(n,i) in gateList" :key="i" :label="language==0? n.name:n.name" prop="count">
<el-input-number v-model="n.count" :min="0" :max="n.leftNum" @change="changeNum(n)" />
<el-popover placement="top-start">
<template #reference>
<el-icon class="ml20"><Warning /></el-icon>
</template>
<div v-html="n.details"></div>
</el-popover>
<div class="red ml20">
<span v-if="language == 0">单价: ¥{{ n.price }}</span>
<span v-else>€ {{ n.priceEn }} / Ticket</span>
</div>
<div class="red ml20">
<span v-if="language == 0">剩余票数:{{ n.leftNum }}</span>
<span v-else>{{ n.leftNum }} sheet remaining </span>
</div>
</el-form-item>
<!-- format="YYYY-MM-DD"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- @change="dateChange"-->
<!-- />-->
<!-- -->
<!-- <div v-if="lform.scenicStart" class="tip">{{-->
<!-- language == 0 ? '可订日期' : 'Available date'-->
<!-- }}{{ lform.scenicStart.slice(0, 10) }} ~ {{ lform.scenicEnd.slice(0, 10) }}-->
<!-- </div>-->
<!-- -->
<!-- &lt;!&ndash; :picker-options="pickerOptions"&ndash;&gt;-->
<!-- </el-form-item>-->
<!-- <el-form-item v-for="(n,i) in gateList" :key="i" :label="language==0? n.name:n.name" prop="count">-->
<!-- <el-input-number v-model="n.count" :max="n.leftNum" :min="0" @change="changeNum(n)" />-->
<!-- <el-popover placement="top-start">-->
<!-- <template #reference>-->
<!-- <el-icon class="ml20">-->
<!-- <Warning />-->
<!-- </el-icon>-->
<!-- </template>-->
<!-- <div v-html="n.details" />-->
<!-- </el-popover>-->
<!-- <div class="red ml20">-->
<!-- <span v-if="language == 0">单价: ¥{{ n.price }}</span>-->
<!-- <span v-else>€ {{ n.priceEn }} / Ticket</span>-->
<!-- </div>-->
<!-- <div class="red ml20">-->
<!-- <span v-if="language == 0">剩余票数:{{ n.leftNum }}</span>-->
<!-- <span v-else>{{ n.leftNum }} sheet remaining </span>-->
<!-- </div>-->
<!-- -->
<!-- </el-form-item>-->
<!-- -->
<div v-if="needPersonNum>0" class="fakeFormItem">
<label v-if="language == 0">需填写{{ needPersonNum }}位游客</label>
<label v-else>Need {{ needPersonNum }} visitors</label>
<div>
<label class="text-warning" v-show="needPersonNum > hasPersonNum && language==0">
还需填写{{ needPersonNum-hasPersonNum }}位游客
<label v-show="needPersonNum > hasPersonNum && language==0" class="text-warning">
还需填写{{ needPersonNum - hasPersonNum }}位游客
</label>
</div>
</div>
<div v-for="(n,i) in gateList" :key="i">
<div v-for="(p,j) in n.personArr" :key="j" class="fakeFormItem personIt">
<label>
<el-icon @click="delPerson(n,j)"><Remove /></el-icon>
{{ n.name }}{{ j+1 }}
<!-- <el-icon @click="delPerson(n,j)">-->
<!-- <Remove />-->
<!-- </el-icon>-->
{{ n.name }}{{ j + 1 }}
</label>
<div v-if="p.name" class="mation">
<div>{{ p.name }}</div>
<span v-if="p.idcType==0">{{language==0?'身份证':'ID number'}}</span>
<span v-if="p.idcType==1">{{language==0?'护照':'Passport'}}</span>
<span v-if="p.idcType==2">{{language==0?'其他':'Other'}}</span>
<span v-if="p.idcType==0">{{ language == 0 ? '身份证' : 'ID number' }}</span>
<span v-if="p.idcType==1">{{ language == 0 ? '护照' : 'Passport' }}</span>
<span v-if="p.idcType==2">{{ language == 0 ? '其他' : 'Other' }}</span>
:{{ p.idCard }}
</div>
<el-icon @click="showAddPerson(n, j,p)" color="#453DEA"><Edit /></el-icon>
<el-icon color="#453DEA" @click="showAddPerson(n, j,p)">
<Edit />
</el-icon>
</div>
</div>
<el-form-item :label="language==0?'联系人':'Contact'" required prop="contacts">
<el-form-item :label="language==0?'联系人':'Contact'" prop="contacts">
<el-input v-model="form.contacts" />
</el-form-item>
<el-form-item :label="language==0?'联系手机':'Contact phone'" required prop="phone">
<el-form-item :label="language==0?'联系手机':'Contact phone'" prop="phone" required>
<el-input v-model="form.phone" />
</el-form-item>
......@@ -118,15 +131,19 @@
<div class="border-rr mt20 pd20 ccitemBox">
<div v-for="(c, index) in gateList" v-show="c.count>0" :key="index" class="ccitem">
{{ c.name }}
<span v-if="language==0">{{ c.count }} * {{ '¥' }}{{ c.price }}</span>
<span v-else>{{ c.count }} * {{ '€' }} {{ c.priceEn }}</span>
<span v-if="language==0">
{{ c.count }} * {{ '¥' }}{{ c.price }}
</span>
<span v-else>{{ c.count }} * {{ '€' }} {{ c.priceEn }}
</span>
</div>
<label>{{ language == 0 ? '共计' : 'Total' }}<span
class="fr bigMoney"
>{{ language == 0 ? '¥' : '€' }} {{ money }}</span></label>
<label>{{ language == 0 ? '共计' : 'Total' }}
<span class="fr bigMoney">
{{ language == 0 ? '¥' : '€' }} {{ money }}
</span>
</label>
</div>
</el-col>
......@@ -134,14 +151,18 @@
</el-card>
<el-card class="mt30">
<el-row justify="space-between" align="middle">
<el-row align="middle" justify="space-between">
<el-col :span="12">
<label>{{ language == 0 ? '共计金额' : 'Total' }}:
<span class=" text-warning"> {{ language == 0 ? '¥' : '€' }}<span class="bigMoney">{{ money }}</span></span>
<span class=" text-warning"> {{ language == 0 ? '¥' : '€' }}<span class="bigMoney">{{
money
}}</span></span>
</label>
</el-col>
<el-col :span="12" class="text-right">
<el-button type="primary" class="btn-lineG w200px" size="large" round @click="submit">{{ language == 0 ?'确认付款':'Book Now' }}</el-button>
<el-button class="btn-lineG w200px" round size="large" type="primary" @click="submit">
{{ language == 0 ? '确认付款' : 'Book Now' }}
</el-button>
</el-col>
</el-row>
</el-card>
......@@ -187,29 +208,53 @@ const rzRange = ref('')
const gateList = ref([])
const money = ref(0)
const choosePersonRef = ref([])
const ticketList = ref([])
const rules = ref({
phone: { required: true, message: language.value == 0 ? '请输入联系电话' : 'Please enter a contact number', trigger: 'blur' }
phone: {
required: true,
message: language.value == 0 ? '请输入联系电话' : 'Please enter a contact number',
trigger: 'blur'
},
contacts: {
required: true,
message: language.value == 0 ? '请输入联人' : 'Please enter a contact',
trigger: 'blur'
}
})
onMounted(() => {
money.value = 0
rzRange.value = route.params.start
gateList.value = ticketList.value = JSON.parse(decodeURIComponent(route.query.item))
console.log(gateList.value)
getScenic()
initDays()
getGate()
countMoney()
checkPersonNum()
// changeNum()
// initDays()
// getGate()
})
function initDays() {
// 可定日期范围
getBaseInfoByActiveId(route.params.cptId).then(res => {
lform.value = res.data
})
}
function getTotal() {
// get
}
function getScenic() {
getScenicById(route.params.scenicId).then(res => {
scenicItem.value = res.data
})
}
function getGate() {
gateList.value = []
loading.value = true
......@@ -259,6 +304,11 @@ const checkPersonNum = () => {
})
}
function getCountInfo() {
// get
}
function changeNum(e) {
checkPersonNum()
......@@ -329,6 +379,10 @@ function submit() {
useUserStore().setReLogin()
return
}
if (!form.value.contacts) {
ElMessage.warning(language.value == 0 ? '请填写联系人' : 'Please fill in the contact person.')
return
}
if (!form.value.phone) {
ElMessage.warning(language.value == 0 ? '请填写手机号' : 'Please fill in the phone number')
return
......@@ -394,9 +448,13 @@ function submit() {
})
}
function handleGo() {
router.go(-1)
}
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.bigMoney {
font-size: 36px !important;
font-family: 'DIN Alternate';
......@@ -463,20 +521,56 @@ function submit() {
.red {
color: #FF8124;
}
.fakeFormItem {
display: flex;
padding: 10px 0;
label{ height: 32px; font-size: var(--el-form-label-font-size); width: 120px;
color: var(--el-text-color-regular); padding: 0 12px 0 0;
line-height: 32px;flex: 0 0 auto;
label {
height: 32px;
font-size: var(--el-form-label-font-size);
width: 120px;
color: var(--el-text-color-regular);
padding: 0 12px 0 0;
line-height: 32px;
flex: 0 0 auto;
display: inline-flex;
justify-content: flex-end;
align-items: center;gap: 10px;white-space: nowrap;}
align-items: center;
gap: 10px;
white-space: nowrap;
}
}
.tip {
font-size: 14px;
color: #666;
padding: 0 10px;
}
.tip{font-size: 14px;color: #666;padding: 0 10px;}
.personIt{display: flex;align-items: center;
.mation{width: 200px;font-size: 12px;
div{font-size: 14px;}
.personIt {
display: flex;
align-items: center;
.mation {
width: 200px;
font-size: 12px;
div {
font-size: 14px;
}
}
}
.father {
position: relative;
}
.son {
position: absolute;
left: 10px;
cursor: pointer;
}
</style>
......
......@@ -172,7 +172,7 @@ function goBooking(n) {
router.push({ path: `/booking/photography/${props.matchId}` })
break
case 8:
// 酒店
// 旅游
router.push({ path: `/booking/travel/${props.matchId}` })
break
}
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!