新数据
Showing
6 changed files
with
756 additions
and
4 deletions
| ... | @@ -278,4 +278,40 @@ li.el-select-dropdown__item { | ... | @@ -278,4 +278,40 @@ li.el-select-dropdown__item { |
| 278 | @media (max-width: 800px) { | 278 | @media (max-width: 800px) { |
| 279 | .box{width: 96%} | 279 | .box{width: 96%} |
| 280 | } | 280 | } |
| 281 | |||
| 282 | .hz-tag{ | ||
| 283 | border-radius: 13px; | ||
| 284 | height: 25px; | ||
| 285 | line-height: 25px; | ||
| 286 | font-size: 12px; | ||
| 287 | font-weight: 400; | ||
| 288 | padding: 0 15px; | ||
| 289 | } | ||
| 290 | .tag1{ | ||
| 291 | background: rgba(50, 177, 108, 0.2); | ||
| 292 | color:rgba(50, 177, 108, 1); | ||
| 293 | } | ||
| 294 | .tag2{ | ||
| 295 | background-color: rgba(243, 152, 0, 0.2); | ||
| 296 | color: #F39800; | ||
| 297 | } | ||
| 298 | .tag3{ | ||
| 299 | background-color: rgba(0, 160, 233, 0.2); | ||
| 300 | color: #00A0E9; | ||
| 301 | } | ||
| 302 | .tag4{ | ||
| 303 | background-color: rgba(247, 64, 166, 0.2); | ||
| 304 | color: #F740A6; | ||
| 305 | } | ||
| 306 | .hz-row{ | ||
| 307 | font-size: 14px; | ||
| 308 | font-weight: 400; | ||
| 309 | color: #929AA0; | ||
| 310 | margin-bottom: 16px; | ||
| 311 | |||
| 312 | } | ||
| 313 | .sign{ | ||
| 314 | color: #493CEB; | ||
| 315 | } | ||
| 316 | |||
| 281 | </style> | 317 | </style> | ... | ... |
src/assets/booking/hz_bg.png
0 → 100644
118 KB
src/assets/booking/hz_text.png
0 → 100644
13.4 KB
| ... | @@ -404,6 +404,12 @@ export const constantRoutes = [ | ... | @@ -404,6 +404,12 @@ export const constantRoutes = [ |
| 404 | meta: { title: 'Makeup Appointment' } | 404 | meta: { title: 'Makeup Appointment' } |
| 405 | }, | 405 | }, |
| 406 | { | 406 | { |
| 407 | path: 'makeUp/:cptId/:id', | ||
| 408 | component: () => import('@/viewsPc/booking/makeUpDetail'), | ||
| 409 | name: 'makeUpDetail', | ||
| 410 | meta: { title: 'Makeup Appointment' } | ||
| 411 | }, | ||
| 412 | { | ||
| 407 | path: 'photography/:cptId', | 413 | path: 'photography/:cptId', |
| 408 | component: () => import('@/viewsPc/booking/photography'), | 414 | component: () => import('@/viewsPc/booking/photography'), |
| 409 | name: 'photography', | 415 | name: 'photography', | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | <div class="banner"> | ||
| 4 | <img src="@/assets/booking/hz_text.png"> | ||
| 5 | </div> | ||
| 3 | <div class="box"> | 6 | <div class="box"> |
| 4 | <el-card class="mt30"></el-card> | 7 | <div class="searchBar"> |
| 8 | <el-input :placeholder="language==0?'请输入关键字搜索':'Search'" v-model="query.name" class="no-border"> | ||
| 9 | </el-input> | ||
| 10 | <el-button size="large" type="primary" class="btn-lineG" icon="search" @click="getList"> | ||
| 11 | {{ language==0?'搜索':'Search' }}</el-button> | ||
| 12 | </div> | ||
| 13 | </div> | ||
| 14 | <div class="box" v-loading="loading"> | ||
| 15 | <el-row style="width: 100%" :gutter="20"> | ||
| 16 | <el-col :span="8" v-for="(h,index) in list" class="mb20" @click="goDetail(h)"> | ||
| 17 | <el-card style="position: relative;"> | ||
| 18 | <img class="w100 hz-img" :src="fillImgUrl(h.photos?.split(',')[0])"/> | ||
| 19 | <div class="yuyue"> | ||
| 20 | 30 个时间段可预约 | ||
| 21 | </div> | ||
| 22 | <div class="hz-text">MANGO美妆工作室</div> | ||
| 23 | <el-row style="width: 100%;margin-bottom: 10px" :gutter="5" justify='space-between'> | ||
| 24 | <div class="hz-tag tag1">专业团体</div> | ||
| 25 | <div class="hz-tag tag2">金牌化妆师</div> | ||
| 26 | <div class="hz-tag tag3">大牌化妆品</div> | ||
| 27 | <div class="hz-tag tag4">连锁</div> | ||
| 28 | </el-row> | ||
| 29 | <div class="hz-row"> | ||
| 30 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"><LocationFilled /></el-icon> | ||
| 31 | 成立 <span class="sign">6</span>年 | | ||
| 32 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"><LocationFilled /></el-icon><span class="sign">12</span>名化妆师 | ||
| 33 | </div> | ||
| 34 | <div class="hz-row"> | ||
| 35 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"><LocationFilled /></el-icon> | ||
| 36 | 1535652837 | ||
| 37 | </div> | ||
| 38 | <div class="hz-row"> | ||
| 39 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"><LocationFilled /></el-icon> | ||
| 40 | {{h.address}} | ||
| 41 | </div> | ||
| 42 | <div style="text-align: center"> | ||
| 43 | <el-button class="btn-lineG w200px" round type="primary" size="large">{{ language==0?'立即预约':'Select' }} ⇀</el-button> | ||
| 44 | </div> | ||
| 45 | </el-card> | ||
| 46 | </el-col> | ||
| 47 | </el-row> | ||
| 5 | 48 | ||
| 49 | <!-- <el-card v-for="(h,index) in list" class="mb20" @click="goDetail(h)">--> | ||
| 50 | <!-- <!– 酒店列表–>--> | ||
| 51 | <!-- <el-row class="hotel" align="middle" :gutter="20">--> | ||
| 52 | <!-- <el-col :span="6">--> | ||
| 53 | <!-- <img class="w100" :src="fillImgUrl(h.photos?.split(',')[0])"/>--> | ||
| 54 | <!-- </el-col>--> | ||
| 55 | <!-- <el-col :span="10">--> | ||
| 56 | <!-- <h3 class="esp">{{h.name}}</h3>--> | ||
| 57 | <!-- <div class="starBox">--> | ||
| 58 | <!-- <img v-for="i in Number(h.starLevel||0)" src="@/assets/booking/star.png">--> | ||
| 59 | <!-- </div>--> | ||
| 60 | <!-- <div class="tagbox">--> | ||
| 61 | <!-- <span v-for="(t,index) in h.label?.split(',')" v-show="index<4">{{t}}</span>--> | ||
| 62 | <!-- <a v-show="h.label?.split(',').length>4">{{ language==0?'更多':'MORE' }} ></a>--> | ||
| 63 | <!-- </div>--> | ||
| 64 | <!-- <p class="esp addr">--> | ||
| 65 | <!-- <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"><LocationFilled /></el-icon>--> | ||
| 66 | <!-- {{h.address}}--> | ||
| 67 | <!-- </p>--> | ||
| 68 | <!-- </el-col>--> | ||
| 69 | <!-- <el-col :span="8" class="text-right">--> | ||
| 70 | <!-- <div class="price">¥<span>{{ h.price }}</span><i v-if="language==0">起</i></div>--> | ||
| 71 | <!-- <el-button class="btn-lineG w200px" round type="primary" size="large">{{ language==0?'立即预约':'Select' }} ⇀</el-button>--> | ||
| 72 | <!-- </el-col>--> | ||
| 73 | <!-- </el-row>--> | ||
| 74 | <!-- </el-card>--> | ||
| 75 | <el-empty v-show="!loading&&list.length==0" :image="`/img/order_no.png`" :image-size="228" description="" /> | ||
| 76 | <div style="height: 50px"></div> | ||
| 6 | </div> | 77 | </div> |
| 7 | 78 | ||
| 8 | </div> | 79 | </div> |
| 9 | </template> | 80 | </template> |
| 10 | 81 | ||
| 11 | <script setup> | 82 | <script setup> |
| 83 | import {onMounted} from "@vue/runtime-core" | ||
| 84 | import * as booking from "@/apiPc/booking" | ||
| 85 | import {useRouter,useRoute} from "vue-router"; | ||
| 86 | import {useStorage} from "@vueuse/core/index"; | ||
| 87 | const router = useRouter() | ||
| 88 | const route = useRoute() | ||
| 89 | const language= useStorage('language',0) | ||
| 90 | const query = ref({ | ||
| 91 | name:'' | ||
| 92 | }) | ||
| 93 | const cptId = ref('') | ||
| 94 | const list = ref([]) | ||
| 95 | const loading = ref(false) | ||
| 96 | onMounted(()=>{ | ||
| 97 | query.value.activityId = route.params.cptId | ||
| 98 | getList() | ||
| 99 | }) | ||
| 12 | 100 | ||
| 101 | function getList() { | ||
| 102 | loading.value = true | ||
| 103 | booking.getHotelList(query.value).then(res=>{ | ||
| 104 | list.value = res.rows | ||
| 105 | loading.value = false | ||
| 106 | }).catch(e=>{ | ||
| 107 | loading.value = false | ||
| 108 | }) | ||
| 109 | } | ||
| 110 | function goDetail(item) { | ||
| 111 | router.push({ | ||
| 112 | name:'makeUpDetail', | ||
| 113 | params:{ | ||
| 114 | id:item.id, | ||
| 115 | }, | ||
| 116 | query:{ | ||
| 117 | id:item.id | ||
| 118 | } | ||
| 119 | |||
| 120 | }) | ||
| 121 | } | ||
| 13 | </script> | 122 | </script> |
| 14 | 123 | ||
| 15 | <style scoped> | 124 | <style scoped lang="scss"> |
| 125 | .hotel{ | ||
| 126 | h3{margin: 0 0 20px;} | ||
| 127 | img.w100{object-fit: cover;aspect-ratio: 16/9} | ||
| 128 | .addr{font-size: 16px;color: #929AA0;font-weight: 400;} | ||
| 129 | .price{margin: 0 0 25px; | ||
| 130 | color: #FF8124;font-size: 18px; | ||
| 131 | span{font-size: 24px;margin: 0 8px;font-family: 'DINAlternate-Bold';font-weight: 600;} | ||
| 132 | i{font-style: normal;color: #929AA0;} | ||
| 133 | } | ||
| 134 | } | ||
| 135 | .banner{height: 140px;background-size: cover;text-align: center; | ||
| 136 | background: url("@/assets/booking/hz_bg.png") center;display: flex;align-items: center; | ||
| 137 | justify-content: center; | ||
| 138 | img{display: block;margin:-30px auto 0;width: auto;} | ||
| 139 | } | ||
| 140 | .searchBar{position: relative;top: -30px; | ||
| 141 | background: #FFFFFF;display: flex;padding: 20px; | ||
| 142 | border-radius: 10px;} | ||
| 143 | .no-border{border: none;background: #F5F7F9; | ||
| 144 | :deep(.el-input__wrapper){border: none;box-shadow: none;background: #F5F7F9;} | ||
| 145 | } | ||
| 146 | .starBox{ | ||
| 147 | img{display: inline-block;margin-right: 4px} | ||
| 148 | } | ||
| 149 | .hz-img{ | ||
| 150 | height: 218px; | ||
| 151 | width: 100%; | ||
| 152 | border-radius: 2px; | ||
| 153 | border: 0; | ||
| 154 | margin-bottom: 20px; | ||
| 155 | } | ||
| 156 | |||
| 157 | .yuyue{ | ||
| 158 | width: 150px; | ||
| 159 | height: 30px; | ||
| 160 | background: #000000; | ||
| 161 | border-radius: 20px 0px 0px 2px; | ||
| 162 | padding-left: 15px; | ||
| 163 | opacity: 0.45; | ||
| 164 | color: #fff; | ||
| 165 | font-size: 14px; | ||
| 166 | line-height: 30px; | ||
| 167 | position: absolute; | ||
| 168 | top: 207px; | ||
| 169 | right:21px; | ||
| 170 | } | ||
| 171 | |||
| 172 | .hz-text{ | ||
| 173 | font-size: 20px; | ||
| 174 | font-weight: 500; | ||
| 175 | color: #000; | ||
| 176 | margin-bottom: 8px; | ||
| 177 | } | ||
| 178 | |||
| 179 | //.hz-tag{ | ||
| 180 | // border-radius: 13px; | ||
| 181 | // height: 25px; | ||
| 182 | // line-height: 25px; | ||
| 183 | // font-size: 12px; | ||
| 184 | // font-weight: 400; | ||
| 185 | // padding: 0 15px; | ||
| 186 | //} | ||
| 187 | //.tag1{ | ||
| 188 | // background: rgba(50, 177, 108, 0.2); | ||
| 189 | // color:rgba(50, 177, 108, 1); | ||
| 190 | //} | ||
| 191 | //.tag2{ | ||
| 192 | // background-color: rgba(243, 152, 0, 0.2); | ||
| 193 | // color: #F39800; | ||
| 194 | //} | ||
| 195 | //.tag3{ | ||
| 196 | // background-color: rgba(0, 160, 233, 0.2); | ||
| 197 | // color: #00A0E9; | ||
| 198 | //} | ||
| 199 | //.tag4{ | ||
| 200 | // background-color: rgba(247, 64, 166, 0.2); | ||
| 201 | // color: #F740A6; | ||
| 202 | //} | ||
| 203 | // | ||
| 204 | //.hz-row{ | ||
| 205 | // font-size: 14px; | ||
| 206 | // font-weight: 400; | ||
| 207 | // color: #929AA0; | ||
| 208 | // margin-bottom: 16px; | ||
| 209 | // .sign{ | ||
| 210 | // color: #493CEB; | ||
| 211 | // } | ||
| 212 | //} | ||
| 213 | |||
| 16 | 214 | ||
| 215 | //.tagbox{margin: 15px 0; | ||
| 216 | // a{color: #AFB5B9;font-size: 12px;} | ||
| 217 | // span{border-radius: 13px;font-size: 12px;padding: 4px 10px;margin-right:10px;font-weight: 400;} | ||
| 218 | // span:nth-child(4n){background: rgba(50, 177, 108, 0.2);color: rgba(50, 177, 108, 1);} | ||
| 219 | // span:nth-child(4n+1){background:rgba(243, 152, 0, 0.2);color: rgba(243, 152, 0, 1);} | ||
| 220 | // span:nth-child(4n+2){background: rgba(0, 160, 233, 0.2);color: rgba(0, 160, 233, 1);} | ||
| 221 | // span:nth-child(4n+3){background: rgba(247, 64, 166, 0.2);color:rgba(247, 64, 166, 1);} | ||
| 222 | //} | ||
| 17 | </style> | 223 | </style> | ... | ... |
src/viewsPc/booking/makeUpDetail.vue
0 → 100644
| 1 | <template> | ||
| 2 | <div> | ||
| 3 | <div class="box"> | ||
| 4 | <el-card> | ||
| 5 | <el-row> | ||
| 6 | <div class="zh-title">Mango美妆工作室</div> | ||
| 7 | <div class="hz-tag tag1">专业团体</div> | ||
| 8 | <div class="hz-tag tag2">金牌化妆师</div> | ||
| 9 | <div class="hz-tag tag3">大牌化妆品</div> | ||
| 10 | <div class="hz-tag tag4">连锁</div> | ||
| 11 | </el-row> | ||
| 12 | <br> | ||
| 13 | <el-row class="hz-row"> | ||
| 14 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"> | ||
| 15 | <LocationFilled/> | ||
| 16 | </el-icon> | ||
| 17 | 成立 <span class="sign">6</span>年 | | ||
| 18 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"> | ||
| 19 | <LocationFilled/> | ||
| 20 | </el-icon> | ||
| 21 | 名化妆师 | | ||
| 22 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"> | ||
| 23 | <LocationFilled/> | ||
| 24 | </el-icon> | ||
| 25 | <span class="sign">12</span>名化妆师 | | ||
| 26 | <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"> | ||
| 27 | <LocationFilled/> | ||
| 28 | </el-icon> | ||
| 29 | <span class="sign">12</span>名化妆师 | ||
| 30 | </el-row> | ||
| 31 | </el-card> | ||
| 32 | <br> | ||
| 33 | <el-row justify='space-between' style="padding: 10px"> | ||
| 34 | <div class="img-header" style="width: 40%"> | ||
| 35 | <div class="card"> | ||
| 36 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 37 | </div> | ||
| 38 | </div> | ||
| 39 | <div class="img-header" style="width: 20%"> | ||
| 40 | <el-row style="height: 50%;"> | ||
| 41 | <el-col :span="12"> | ||
| 42 | <div class="card"> | ||
| 43 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 44 | |||
| 45 | </div> | ||
| 46 | </el-col> | ||
| 47 | <el-col :span="12"> | ||
| 48 | <div class="card"> | ||
| 49 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 50 | |||
| 51 | </div> | ||
| 52 | </el-col> | ||
| 53 | </el-row> | ||
| 54 | <div style="height: 50%;"> | ||
| 55 | <div class="card"> | ||
| 56 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 57 | </div> | ||
| 58 | </div> | ||
| 59 | |||
| 60 | </div> | ||
| 61 | <div class="img-header" style="width: 20%"> | ||
| 62 | <div class="card"> | ||
| 63 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 64 | </div> | ||
| 65 | </div> | ||
| 66 | <div class="img-header" style="width: 20%"> | ||
| 67 | <el-row style="height: 50%"> | ||
| 68 | <el-col :lg="12" :md="8" :sm="12" :xs="24" > | ||
| 69 | <div class="card"> | ||
| 70 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 71 | </div> | ||
| 72 | </el-col> | ||
| 73 | <el-col :span="12"> | ||
| 74 | <div class="card"> | ||
| 75 | <img src="@/assets/dance/banner.png" alt=""> | ||
| 76 | </div> | ||
| 77 | </el-col> | ||
| 78 | </el-row> | ||
| 79 | <div style="height: 50%;"> | ||
| 80 | <div class="card"> | ||
| 81 | <img src="@/assets/dance/banner.png" style="width: 100%;height: 100%" alt=""> | ||
| 82 | <div class="img-hover"> | ||
| 83 | 查看相册 (12) > | ||
| 84 | </div> | ||
| 85 | </div> | ||
| 86 | </div> | ||
| 87 | </div> | ||
| 88 | </el-row> | ||
| 89 | |||
| 90 | <el-card class="mt30" v-loading="loading"> | ||
| 91 | <el-row v-if="form" class="hotel" align="middle" :gutter="20"> | ||
| 92 | <!-- <el-col :span="6">--> | ||
| 93 | <!-- <img class="w100" :src="fillImgUrl(form.photos?.split(',')[0])"/>--> | ||
| 94 | <!-- </el-col>--> | ||
| 95 | <el-col :span="16"> | ||
| 96 | <h3 class="esp flex">{{ form?.name }} | ||
| 97 | <div class="starBox"> | ||
| 98 | <img v-for="i in Number(form?.starLevel||0)" src="@/assets/booking/star.png"> | ||
| 99 | </div> | ||
| 100 | </h3> | ||
| 101 | |||
| 102 | <div class="tagbox"> | ||
| 103 | <span v-for="(t,index) in form?.label?.split(',')" v-show="index<4">{{ t }}</span> | ||
| 104 | <a v-show="form?.label?.split(',').length>4">{{ language == 0 ? '更多' : 'MORE' }} ></a> | ||
| 105 | </div> | ||
| 106 | <div> | ||
| 107 | <el-icon></el-icon> | ||
| 108 | <span class="mr10">{{ language == 0 ? '入住时间' : 'Check-in' }}:{{ form?.checkInTime }}</span> | ||
| 109 | <span>{{ language == 0 ? '离店时间' : 'Check-out' }}:{{ form?.checkOutTime }}</span> | ||
| 110 | </div> | ||
| 111 | <div v-if="form?.introduction" class="flex esp"> | ||
| 112 | <el-icon></el-icon> | ||
| 113 | {{ language == 0 ? '酒店简介' : 'Introduction' }}:<span v-html="form.introduction.toString()"></span> | ||
| 114 | </div> | ||
| 115 | <!-- <p class="esp addr">--> | ||
| 116 | <!-- <el-icon size="16" style="position: relative;top: 2px" color="#929AA0"><LocationFilled /></el-icon>--> | ||
| 117 | <!-- {{form?.address}}--> | ||
| 118 | <!-- </p>--> | ||
| 119 | </el-col> | ||
| 120 | <el-col :span="8" class="text-right"> | ||
| 121 | <div class="mapBox"> | ||
| 122 | <div id="map"></div> | ||
| 123 | </div> | ||
| 124 | </el-col> | ||
| 125 | </el-row> | ||
| 126 | <el-empty v-else :image="`/img/order_no.png`" :image-size="228" description=""/> | ||
| 127 | </el-card> | ||
| 128 | |||
| 129 | <div class="mt30"> | ||
| 130 | <el-row :gutter="20"> | ||
| 131 | <el-col v-for="(p,index) in form?.photos?.split(',')" :span="index==0?12:6"> | ||
| 132 | <div class="imgbox hotelImg"> | ||
| 133 | <img :src="fillImgUrl(p)"> | ||
| 134 | </div> | ||
| 135 | </el-col> | ||
| 136 | </el-row> | ||
| 137 | </div> | ||
| 138 | |||
| 139 | <el-card class="mt30 mb60"> | ||
| 140 | <div class="lineHead"> | ||
| 141 | <ul> | ||
| 142 | <li>{{ language == 0 ? '房型选择' : 'Available Rooms' }}</li> | ||
| 143 | </ul> | ||
| 144 | </div> | ||
| 145 | <div> | ||
| 146 | <div v-for="(r,index) in roomList" :key="index" class="room"> | ||
| 147 | <el-row :gutter="30" align="middle"> | ||
| 148 | <el-col :span="4"> | ||
| 149 | <div class="roomImg"> | ||
| 150 | <img :src="fillImgUrl(r.photo?.split(',')[0])"> | ||
| 151 | </div> | ||
| 152 | </el-col> | ||
| 153 | <el-col :span="14"> | ||
| 154 | <h3 class="name">{{ r.roomType }}</h3> | ||
| 155 | <el-row :gutter="10"> | ||
| 156 | <el-col :span="8">{{ r.area }}m²</el-col> | ||
| 157 | <el-col :span="8" v-show="r.windowFlag==1"> {{ language == 0 ? '有窗' : 'With windows' }}</el-col> | ||
| 158 | <el-col :span="8" v-show="r.windowFlag==0"> {{ language == 0 ? '无窗' : 'Windowless' }}</el-col> | ||
| 159 | <el-col :span="8" v-show="r.bathroomFlag==1"> {{ language == 0 ? '热水洗浴' : 'Shower' }}</el-col> | ||
| 160 | <!-- <text v-show="r.bathroomFlag==0"> </text> --> | ||
| 161 | <el-col :span="8" v-show="r.addBedFlag==1"> {{ language == 0 ? '允许加床' : 'Extra bed' }}</el-col> | ||
| 162 | <el-col :span="8" v-if="r.breakfastNum&&r.breakfastNum > '0'"> | ||
| 163 | {{ r.breakfastNum }}{{ language == 0 ? '份早餐' : ' breakfasts' }} | ||
| 164 | </el-col> | ||
| 165 | <el-col :span="8" v-else>{{ language == 0 ? '无早餐' : 'No breakfast' }}</el-col> | ||
| 166 | </el-row> | ||
| 167 | </el-col> | ||
| 168 | <el-col :span="3"> | ||
| 169 | <div class="price">{{ | ||
| 170 | language == 0 ? '¥' : '€' | ||
| 171 | }}<span>{{ language == 0 ? r.roomPrice : r.roomPriceEn }}</span></div> | ||
| 172 | </el-col> | ||
| 173 | <el-col :span="3"> | ||
| 174 | <div class="bg-lineg" v-if="language==0" @click="goOrder(r)"> | ||
| 175 | 订 | ||
| 176 | <div>{{ language == 0 ? '在线付' : 'Online' }}</div> | ||
| 177 | </div> | ||
| 178 | <el-button v-else class="btn-lineG w100" round type="primary" @click="goOrder(r)">Select</el-button> | ||
| 179 | <!-- <div class="text-center text-primary mt10 fontsize14 pointer" v-if="language == 0">--> | ||
| 180 | <!-- 剩余 {{(r.roomCount - (r.useCount||0)).toFixed()}} 间--> | ||
| 181 | <!-- </div>--> | ||
| 182 | <!-- <div class="text-center text-primary mt10 fontsize14" v-else>--> | ||
| 183 | <!-- {{(r.roomCount - (r.useCount||0)).toFixed()}} Remaining rooms--> | ||
| 184 | <!-- </div>--> | ||
| 185 | </el-col> | ||
| 186 | </el-row> | ||
| 187 | </div> | ||
| 188 | |||
| 189 | <el-empty v-if="roomList.length == 0" :image="`/img/order_no.png`" :image-size="228" description=""/> | ||
| 190 | </div> | ||
| 191 | </el-card> | ||
| 192 | </div> | ||
| 193 | </div> | ||
| 194 | </template> | ||
| 195 | |||
| 196 | <script setup lang="ts"> | ||
| 197 | import {useRouter} from "vue-router"; | ||
| 198 | import {ref, reactive, onMounted} from "vue"; | ||
| 199 | import {useRoute} from "vue-router"; | ||
| 200 | import {getHotelById, getHotelRooms} from "@/apiPc/booking" | ||
| 201 | |||
| 202 | import {useStorage} from "@vueuse/core/index"; | ||
| 203 | import useUserStore from "@/store/modules/user"; | ||
| 204 | |||
| 205 | const user = useUserStore().user | ||
| 206 | const language = useStorage('language', 0) | ||
| 207 | const router = useRouter() | ||
| 208 | const route = useRoute() | ||
| 209 | const form = ref({}) | ||
| 210 | const query = ref({ | ||
| 211 | hotelId: route.query.id | ||
| 212 | }) | ||
| 213 | const loading = ref(false) | ||
| 214 | const roomList = ref([]) | ||
| 215 | const map = ref(null) | ||
| 216 | onMounted(() => { | ||
| 217 | // getData() | ||
| 218 | }) | ||
| 219 | |||
| 220 | function getData() { | ||
| 221 | loading.value = true | ||
| 222 | getHotelById(route.params.hotelId).then(res => { | ||
| 223 | loading.value = false | ||
| 224 | form.value = res.data | ||
| 225 | initMap() | ||
| 226 | }).catch(err => { | ||
| 227 | console.log(err) | ||
| 228 | }) | ||
| 229 | query.value.hotelId = route.query.id | ||
| 230 | getHotelRooms(query.value).then(res => { | ||
| 231 | roomList.value = res.rows | ||
| 232 | }) | ||
| 233 | } | ||
| 234 | |||
| 235 | function initMap() { | ||
| 236 | const TMap = (window as any).TMap | ||
| 237 | var center = new TMap.LatLng(form.value.latitude, form.value.longitude);//设置中心点坐标' | ||
| 238 | var map = new TMap.Map("map", { | ||
| 239 | center: center,//设置地图中心点坐标 | ||
| 240 | zoom: 17, //设置地图缩放级别 | ||
| 241 | }); | ||
| 242 | var infoWindowLocation = new TMap.LatLng(form.value.latitude, form.value.longitude);//创建一个坐标 | ||
| 243 | //创建InfoWindow实例,并进行初始化 | ||
| 244 | var infowindow = new TMap.InfoWindow({ | ||
| 245 | content: form.value.address, //信息窗口内容 | ||
| 246 | position: infoWindowLocation,//显示信息窗口的坐标 | ||
| 247 | map: map, | ||
| 248 | offset: {x: 0, y: -32} | ||
| 249 | }); | ||
| 250 | infowindow.close(); | ||
| 251 | var marker = new TMap.MultiMarker({ | ||
| 252 | map: map, | ||
| 253 | //样式定义 | ||
| 254 | styles: { | ||
| 255 | "myStyle": new TMap.MarkerStyle({ | ||
| 256 | "anchor": {x: 16, y: 32} | ||
| 257 | }) | ||
| 258 | }, | ||
| 259 | //点标记数据数组 | ||
| 260 | geometries: [{ | ||
| 261 | "id": "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id | ||
| 262 | // "styleId": 'myStyle', //指定样式id | ||
| 263 | "position": new TMap.LatLng(form.value.latitude, form.value.longitude), //点标记坐标位置 | ||
| 264 | "properties": {//自定义属性 | ||
| 265 | "title": form.value.name | ||
| 266 | } | ||
| 267 | } | ||
| 268 | ] | ||
| 269 | }) | ||
| 270 | marker.on("click", function (evt) { | ||
| 271 | //设置infoWindow | ||
| 272 | infowindow.open(); //打开信息窗 | ||
| 273 | infowindow.setPosition(evt.geometry.position);//设置信息窗位置 | ||
| 274 | }) | ||
| 275 | } | ||
| 276 | |||
| 277 | function goOrder(room) { | ||
| 278 | if (!user) { | ||
| 279 | useUserStore().setReLogin() | ||
| 280 | return | ||
| 281 | } | ||
| 282 | router.push({ | ||
| 283 | name: 'hotelOrder', | ||
| 284 | params: { | ||
| 285 | roomId: room.id | ||
| 286 | }, | ||
| 287 | query: { | ||
| 288 | room: encodeURIComponent(JSON.stringify(room)), | ||
| 289 | hotelName: form.value.name, | ||
| 290 | checkInTime: form.value.checkInTime | ||
| 291 | } | ||
| 292 | }) | ||
| 293 | } | ||
| 294 | </script> | ||
| 295 | |||
| 296 | <style scoped lang="scss"> | ||
| 297 | .room { | ||
| 298 | background: #FAFBFD; | ||
| 299 | margin: 20px 0 0; | ||
| 300 | padding: 20px; | ||
| 301 | border: 1px solid #E5E5E5; | ||
| 302 | |||
| 303 | .name { | ||
| 304 | font-size: 20px; | ||
| 305 | margin: 0 0 10px; | ||
| 306 | } | ||
| 307 | |||
| 308 | .roomImg { | ||
| 309 | aspect-ratio: 16/9; | ||
| 310 | border-radius: 10px; | ||
| 311 | overflow: hidden; | ||
| 312 | |||
| 313 | img { | ||
| 314 | width: 100%; | ||
| 315 | object-fit: cover; | ||
| 316 | object-position: center; | ||
| 317 | height: 100%; | ||
| 318 | } | ||
| 319 | } | ||
| 320 | |||
| 321 | .price { | ||
| 322 | color: #FF8124; | ||
| 323 | font-size: 24px; | ||
| 324 | |||
| 325 | span { | ||
| 326 | font-size: 36px; | ||
| 327 | font-family: "DIN Alternate" | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 331 | .bg-lineg { | ||
| 332 | margin: auto; | ||
| 333 | border-radius: 10px; | ||
| 334 | text-align: center; | ||
| 335 | padding: 7px 2px 2px; | ||
| 336 | font-size: 24px; | ||
| 337 | width: 66px; | ||
| 338 | cursor: pointer; | ||
| 339 | |||
| 340 | div { | ||
| 341 | background: #fff; | ||
| 342 | font-size: 13px; | ||
| 343 | border-radius: 20px; | ||
| 344 | padding: 0 10px; | ||
| 345 | color: #453DEA; | ||
| 346 | font-weight: 500; | ||
| 347 | } | ||
| 348 | } | ||
| 349 | } | ||
| 350 | |||
| 351 | .zh-title { | ||
| 352 | font-size: 24px; | ||
| 353 | font-weight: 500; | ||
| 354 | margin-right: 25px; | ||
| 355 | } | ||
| 356 | |||
| 357 | |||
| 358 | .hotel { | ||
| 359 | h3 { | ||
| 360 | margin: 0 0 20px; | ||
| 361 | } | ||
| 362 | |||
| 363 | img.w100 { | ||
| 364 | object-fit: cover; | ||
| 365 | aspect-ratio: 16/9 | ||
| 366 | } | ||
| 367 | |||
| 368 | .addr { | ||
| 369 | font-size: 16px; | ||
| 370 | color: #929AA0; | ||
| 371 | font-weight: 400; | ||
| 372 | } | ||
| 373 | |||
| 374 | .price { | ||
| 375 | margin: 0 0 25px; | ||
| 376 | color: #FF8124; | ||
| 377 | font-size: 18px; | ||
| 378 | |||
| 379 | span { | ||
| 380 | font-size: 24px; | ||
| 381 | margin: 0 8px; | ||
| 382 | font-family: 'DINAlternate-Bold'; | ||
| 383 | font-weight: 600; | ||
| 384 | } | ||
| 385 | |||
| 386 | i { | ||
| 387 | font-style: normal; | ||
| 388 | color: #929AA0; | ||
| 389 | } | ||
| 390 | } | ||
| 391 | } | ||
| 392 | |||
| 393 | .starBox { | ||
| 394 | img { | ||
| 395 | display: inline-block; | ||
| 396 | margin-right: 4px | ||
| 397 | } | ||
| 398 | } | ||
| 399 | |||
| 400 | .tagbox { | ||
| 401 | margin: 15px 0; | ||
| 402 | |||
| 403 | a { | ||
| 404 | color: #AFB5B9; | ||
| 405 | font-size: 12px; | ||
| 406 | } | ||
| 407 | |||
| 408 | span { | ||
| 409 | border-radius: 13px; | ||
| 410 | font-size: 12px; | ||
| 411 | padding: 4px 10px; | ||
| 412 | margin-right: 10px; | ||
| 413 | font-weight: 400; | ||
| 414 | } | ||
| 415 | |||
| 416 | span:nth-child(4n) { | ||
| 417 | background: rgba(50, 177, 108, 0.2); | ||
| 418 | color: rgba(50, 177, 108, 1); | ||
| 419 | } | ||
| 420 | |||
| 421 | span:nth-child(4n+1) { | ||
| 422 | background: rgba(243, 152, 0, 0.2); | ||
| 423 | color: rgba(243, 152, 0, 1); | ||
| 424 | } | ||
| 425 | |||
| 426 | span:nth-child(4n+2) { | ||
| 427 | background: rgba(0, 160, 233, 0.2); | ||
| 428 | color: rgba(0, 160, 233, 1); | ||
| 429 | } | ||
| 430 | |||
| 431 | span:nth-child(4n+3) { | ||
| 432 | background: rgba(247, 64, 166, 0.2); | ||
| 433 | color: rgba(247, 64, 166, 1); | ||
| 434 | } | ||
| 435 | } | ||
| 436 | |||
| 437 | .mapBox { | ||
| 438 | position: relative; | ||
| 439 | overflow: hidden; | ||
| 440 | height: 200px; | ||
| 441 | |||
| 442 | #map { | ||
| 443 | position: relative; | ||
| 444 | left: -70px; | ||
| 445 | width: calc(100% + 160px); | ||
| 446 | } | ||
| 447 | } | ||
| 448 | |||
| 449 | .hotelImg { | ||
| 450 | border-radius: 10px; | ||
| 451 | overflow: hidden; | ||
| 452 | aspect-ratio: 16/9; | ||
| 453 | |||
| 454 | img { | ||
| 455 | object-fit: cover; | ||
| 456 | object-position: center; | ||
| 457 | width: 100%; | ||
| 458 | height: 100%; | ||
| 459 | } | ||
| 460 | |||
| 461 | } | ||
| 462 | |||
| 463 | .sign { | ||
| 464 | padding-top: 2px; | ||
| 465 | } | ||
| 466 | |||
| 467 | .img-header { | ||
| 468 | height: 270px; | ||
| 469 | |||
| 470 | img { | ||
| 471 | border-radius: 10px; | ||
| 472 | width: 100%; | ||
| 473 | height: 100%; | ||
| 474 | } | ||
| 475 | |||
| 476 | } | ||
| 477 | |||
| 478 | .card { | ||
| 479 | padding: 10px; | ||
| 480 | width: 100%; | ||
| 481 | height: 100%; | ||
| 482 | position: relative; | ||
| 483 | img{object-fit: cover} | ||
| 484 | } | ||
| 485 | |||
| 486 | .img-hover{ | ||
| 487 | position: absolute; | ||
| 488 | top: 0; | ||
| 489 | left: 0; | ||
| 490 | background-color: rgb(0,0,0,.5); | ||
| 491 | color: #fff; | ||
| 492 | font-size: 18px; | ||
| 493 | font-weight: 400; | ||
| 494 | width: 100%; | ||
| 495 | height: 100%; | ||
| 496 | line-height: 115px; | ||
| 497 | text-align: center; | ||
| 498 | border-radius: 10px; | ||
| 499 | |||
| 500 | //display: none; | ||
| 501 | } | ||
| 502 | |||
| 503 | |||
| 504 | </style> |
-
Please register or sign in to post a comment