detail.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. <template>
  2. <p class="notice">Travel Shop> {{ productTypeName }} > {{ productName }}</p>
  3. <div class="wrapper flex-between stretch mt-24">
  4. <div class="left">
  5. <div class="swiper-min">
  6. <swiper-container class="swiper-wrapper" autoplay-delay="2000" loop="true">
  7. <swiper-slide v-for="imageUrl in imageContainer.imageList " :key="imageUrl"><v-lazy-image :src="imageUrl" alt="" /></swiper-slide>
  8. </swiper-container>
  9. </div>
  10. <!-- <VueDatePicker v-model="multipleSelectedDate" inline multi-dates /> -->
  11. <datepicker v-if="renderComponent && productTypeId!=LOCALSPECIALTYPRODUCTTYPE" @selected="handleSelectDate" use-utc="true" :disabled-dates="state.disabledDates" v-model="selectedDate" :prevent-disable-date-selection="true" inline="true" :icon-width="40" calendar-class="calendarclass"></datepicker>
  12. </div>
  13. <div class="content">
  14. <p class="title">{{ productName }}</p>
  15. <div class="info" >{{ removeHtmlTag(productDescription).substring(0, 300) }}...</div>
  16. <div class="days flex-start mt-10" v-if="productTypeId!=LOCALSPECIALTYPRODUCTTYPE">
  17. <p>Days:</p>
  18. <span v-if="productTypeId!='d7b95089-e278-4522-8f71-dacac41ba32f'">{{ days-1 }} nights {{ days }} days</span>
  19. <span v-if="productTypeId==='d7b95089-e278-4522-8f71-dacac41ba32f'">{{ days }} days</span>
  20. </div>
  21. <div class="days flex-start stretch mt-10" v-if="productTypeId!=LOCALSPECIALTYPRODUCTTYPE">
  22. <p>Option:</p>
  23. <ul class="options more">
  24. <li :class="{ active: index==activeIndex }" @click="setActiveCate(item, index)" v-for="(item, index) in packageCategories" :key="item">{{ item }}</li>
  25. </ul>
  26. </div>
  27. <p v-if="productTypeId=='d7b95089-e278-4522-8f71-dacac41ba32f' || productTypeId=='3a53caed-b788-4290-896d-7922532ad769' || productTypeId=='e05d07a3-a717-45b8-b009-47a349890e41'" class="pass mt-64">Passengers</p>
  28. <p v-if="productTypeId==HOTELPRODUCTTYPE" class="pass mt-64">Rooms</p>
  29. <div class="count flex-start" v-if="productTypeId!=LOCALSPECIALTYPRODUCTTYPE">
  30. <div class="count-item flex-start">
  31. <p v-if="adultUnitPrice!=0">Adult({{ adultUnitPrice }}/Each)</p>
  32. <p>Adult</p>
  33. <el-input-number min="1" v-model="adultCount"/>
  34. </div>
  35. <div class="count-item flex-start no-mar">
  36. <p v-if="infantUnitPrice!=0">Infant({{ infantUnitPrice }}/Each):</p>
  37. <p>Infant:</p>
  38. <el-input-number min="0" v-model="infantCount" />
  39. <span class="text">(less than 2 years old)</span>
  40. </div>
  41. <div class="count-item flex-start">
  42. <p v-if="childUnitPrice!=0">Child({{ childUnitPrice }}/Each):</p>
  43. <p>Child:</p>
  44. <el-input-number min="0" v-model="childCount"/>
  45. </div>
  46. </div>
  47. <!-- local specialty product type -->
  48. <div v-if="productTypeId===LOCALSPECIALTYPRODUCTTYPE" class="days flex-start stretch mt-10">
  49. <p>Option:</p>
  50. <ul class="options">
  51. <li :class="{ active: index==activeIndex }" @click="setActiveCateForLocalSpecialty(item, index)" v-for="(item, index) in packageCategories" :key="item">{{ item }}</li>
  52. </ul>
  53. </div>
  54. <div v-if="productTypeId===LOCALSPECIALTYPRODUCTTYPE || productTypeId===HOTELPRODUCTTYPE" class="count flex-start">
  55. <div class="count-item flex-start">
  56. <p>Numbers:</p>
  57. <el-input-number min="1" :max="maxNum" v-model="buyCount" />
  58. </div>
  59. </div>
  60. <div class="cart flex-between">
  61. <p>CNY</p>
  62. <p v-if="productTypeId!=LOCALSPECIALTYPRODUCTTYPE && productTypeId!= HOTELPRODUCTTYPE" class="price flex-item">{{ adultCount*adultUnitPrice+childCount*childUnitPrice+infantCount*infantUnitPrice }}</p>
  63. <p v-if="productTypeId==LOCALSPECIALTYPRODUCTTYPE || productTypeId== HOTELPRODUCTTYPE" class="price flex-item">{{ generalPrice*buyCount }}</p>
  64. <button class="pre-book" @click="goPage('/contact')">Pre-Book Consult</button>
  65. <button class="book" @click="collectConfigAndGoPage('book')">Book Now</button>
  66. </div>
  67. </div>
  68. </div>
  69. <div class="intro mt-20">
  70. <div class="wrapper">
  71. <div class="intro-head flex-between">
  72. <!-- <ul class="category flex-start">
  73. <li :class="{active: active === 0}" @click="active = 0">Highlights</li>
  74. <li :class="{active: active === 1}" @click="active = 1">Overview</li>
  75. <li :class="{active: active === 2}" @click="active = 2">Cost</li>
  76. <li :class="{active: active === 3}" @click="active = 3">Refund Policy</li>
  77. </ul> -->
  78. <!-- <button class="book">Book Now</button> -->
  79. </div>
  80. <div class="rich-area mt-8">
  81. <!-- <p class="title">Highlights</p> -->
  82. <div class="main" v-html="productDescription"></div>
  83. </div>
  84. </div>
  85. </div>
  86. </template>
  87. <script setup>
  88. import router from "../../router";
  89. import VLazyImage from "v-lazy-image";
  90. import {AXIOS} from '@/common/http-commons'
  91. import { useRouter } from 'vue-router';
  92. const route = useRoute()
  93. const change = (obj)=>{
  94. console.log('obj',obj)
  95. }
  96. const activeIndex = ref(0)
  97. const date = ref("2021-1-27") //设置日期,若不设置,则默认为今天
  98. const range = [2015,2025] //设置年份范围 默认[2010,2030]
  99. const swiperOptions = {
  100. loop: true,
  101. autoplay: {
  102. delay: 2000,
  103. stopOnLastSlide: false,
  104. disableOnInteraction: true
  105. }
  106. }
  107. function removeHtmlTag(input){
  108. var div = document.createElement("div");
  109. div.innerHTML = input;
  110. var text = div.textContent || div.innerText || "";
  111. return text;
  112. }
  113. function goPage(val){
  114. router.push({path: val})
  115. }
  116. const activeCategory = ref("")
  117. const adultCount = ref(1)
  118. const childCount = ref(0)
  119. const infantCount = ref(0)
  120. const adultUnitPrice = ref(0)
  121. const generalPrice = ref(0)
  122. const childUnitPrice = ref(0)
  123. const infantUnitPrice = ref(0)
  124. const maxNum = ref(1000000)
  125. const active = ref(0)
  126. const buyCount = ref(1)
  127. const productName = ref("")
  128. const productDescription = ref("")
  129. const productTypeId = ref("")
  130. const productTypeName = ref("")
  131. const days = ref("")
  132. const packageCategories = ref([])
  133. const imageList = ref([])
  134. const imageContainer = {imageList:[]}
  135. const skusInGroup = {skus: []}
  136. const filteredSkuIndex = ref([])
  137. const renderComponent = ref(true);
  138. const singleMatchedSku = ref({})
  139. const selectedDate = ref(new Date())
  140. const multipleSelectedDate = ref([])
  141. const totalPrice = ref(0)
  142. const TYPEOFPACKAGEPROP="11cd8b32-c4f6-47db-8b8a-486c992bf43b"
  143. const LOCALSPECIALTYPRODUCTTYPE = "fd264cab-ee8d-4571-a477-03d7e7c090b3";
  144. const HOTELPRODUCTTYPE="a9f5adbe-c09b-49bc-a614-8a1c5d5e5337";
  145. const MAXNUM = "720f4f2e-e114-4003-9806-bc56a9366278";
  146. const PRODUCTIMAGEURLPROP = "2dea54f4-9b9c-413a-8b3a-0caf273283d2"
  147. const DAYSPROP = "8cc865ff-b30f-4f00-b426-9e64418e5100"
  148. const AVAILABLEDATEPROP = "f0b807e5-d1a6-4454-a400-7905a4fea492"
  149. const forceRerender = async () => {
  150. // Remove MyComponent from the DOM
  151. renderComponent.value = false;
  152. // Wait for the change to get flushed to the DOM
  153. await nextTick();
  154. // Add the component back in
  155. renderComponent.value = true;
  156. };
  157. var state = {
  158. disabledDates: {
  159. to: new Date(2023, 3, 15), // Disable all dates up to specific date
  160. from: new Date(2023, 4, 20), // Disable all dates after specific date
  161. dates: [ // Disable an array of dates
  162. new Date(2016, 9, 16),
  163. new Date(2016, 9, 17),
  164. new Date(2016, 9, 18)
  165. ],
  166. preventDisableDateSelection: true
  167. },
  168. }
  169. function getTotalPrice(){
  170. if(productTypeId.value!=LOCALSPECIALTYPRODUCTTYPE && productTypeId.value!= HOTELPRODUCTTYPE){
  171. totalPrice.value = adultCount.value*adultUnitPrice.value+childCount.value*childUnitPrice.value+infantCount.value*infantUnitPrice.value;
  172. console.log("reach abb")
  173. }else{
  174. console.log("reach aba")
  175. totalPrice.value = generalPrice.value*buyCount.value;
  176. }
  177. console.log("this is the total price:")
  178. console.log(totalPrice.value)
  179. return totalPrice.value;
  180. }
  181. function collectConfigAndGoPage(val){
  182. if(singleMatchedSku.value == null){
  183. alert("Not all required config are selected")
  184. return;
  185. }
  186. var params = {}
  187. params.productTypeId = productTypeId.value;
  188. params.productName = productName.value;
  189. params.productSkuId = singleMatchedSku.value['hichinaProductBasicDTO']['skuId'];
  190. params.productSkuGroupId = route.params.skuGroupId;
  191. params.packageCategory = activeCategory.value;
  192. params.productTypeName = productTypeName.value;
  193. params.profileImageUrl = extractAttributeValueFromProductPropertyBag(singleMatchedSku.value, PRODUCTIMAGEURLPROP);
  194. params.totalPrice = getTotalPrice();
  195. //params.totalPrice = 1;
  196. if(productTypeId.value!=LOCALSPECIALTYPRODUCTTYPE){
  197. params.adultCount = adultCount.value;
  198. params.childCount = childCount.value;
  199. params.infantCount = infantCount.value;
  200. }
  201. if(LOCALSPECIALTYPRODUCTTYPE!=productTypeId.value){
  202. params.selectedDate = selectedDate.value.toISOString().split('T')[0];
  203. }
  204. if(productTypeId.value==LOCALSPECIALTYPRODUCTTYPE || productTypeId.value== HOTELPRODUCTTYPE){
  205. params.buyCount = buyCount.value
  206. }
  207. console.log("params collected from product")
  208. console.log(params)
  209. router.push({ name: val, params: params })
  210. }
  211. function setPrice(sku){
  212. console.log("sku in setPrice:")
  213. console.log(sku)
  214. if(sku==null){
  215. if(productTypeId.value == LOCALSPECIALTYPRODUCTTYPE || productTypeId.value == HOTELPRODUCTTYPE){
  216. console.log("001")
  217. generalPrice.value = 0;
  218. }else{
  219. console.log("002")
  220. adultUnitPrice.value = 0
  221. childUnitPrice.value = 0
  222. infantUnitPrice.value = 0
  223. }
  224. }else{
  225. if(productTypeId.value == LOCALSPECIALTYPRODUCTTYPE || productTypeId.value == HOTELPRODUCTTYPE){
  226. console.log("003")
  227. generalPrice.value = extractAttributeValueFromProductPropertyBag(sku,"e16df480-b17d-4442-91c2-d6c30d0d7ab0")
  228. }else{
  229. console.log("004")
  230. adultUnitPrice.value = extractAttributeValueFromProductPropertyBag(sku, "e228b843-e054-41f8-91dd-19663460df54")
  231. childUnitPrice.value = extractAttributeValueFromProductPropertyBag(sku, "c4c845a7-4bef-46d8-a5ad-d72a5464e8b1")
  232. infantUnitPrice.value = extractAttributeValueFromProductPropertyBag(sku, "448406cb-b68f-439e-9da8-148d78ae8404")
  233. }
  234. }
  235. }
  236. function handleSelectDate(dt){
  237. // console.log("dt")
  238. // console.log(dt)
  239. // var normalizedDate = Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate())
  240. // console.log("normalizedDate")
  241. // console.log(normalizedDate)
  242. // check dt falls into which specific skus
  243. // selectedDate.value = dt
  244. console.log("dt")
  245. console.log(dt)
  246. var matchedIndex = -1;
  247. // console.log(filteredSkuIndex.value)
  248. for(var i in filteredSkuIndex.value){
  249. var index = filteredSkuIndex.value[i];
  250. var availableDatesInString = extractAttributeValueFromProductPropertyBag(skusInGroup.skus[index],AVAILABLEDATEPROP);
  251. var dateObjArray = multiDateString2DateObjectArray(availableDatesInString)
  252. console.log("dateObjArray")
  253. console.log(dateObjArray)
  254. if(dateObjArray.some(e => e.getDate() == dt.getDate())){
  255. matchedIndex = index;
  256. break;
  257. }
  258. }
  259. console.log("matchedIndex")
  260. console.log(matchedIndex)
  261. singleMatchedSku.value = skusInGroup.skus[matchedIndex]
  262. maxNum.value = extractAttributeValueFromProductPropertyBag(singleMatchedSku.value, MAXNUM)
  263. console.log("maxNum")
  264. console.log(maxNum.value)
  265. setPrice(singleMatchedSku.value)
  266. }
  267. function compareDate( a, b ) {
  268. if ( a.getDate() < b.getDate() ){
  269. return -1;
  270. }
  271. if ( a.getDate() > b.getDate() ){
  272. return 1;
  273. }
  274. return 0;
  275. }
  276. function multiDateString2DateObjectArray(candidateAvailableDates){
  277. var dateObjArray = []
  278. var datestringArray = candidateAvailableDates.split(";");
  279. for (var i in datestringArray) {
  280. var datestr = datestringArray[i];
  281. if (datestr != null && datestr.length > 0) {
  282. var dateObj = new Date(datestr);
  283. // console.log("...converting string to date:"+ datestr)
  284. // console.log(dateObj)
  285. dateObjArray.push(dateObj);
  286. }
  287. }
  288. return dateObjArray
  289. }
  290. function setCandidateAvailableDates(indexArray){
  291. var candidateAvailableDates = ""
  292. for(var i in indexArray){
  293. var availableDates = extractAttributeValueFromProductPropertyBag(skusInGroup.skus[indexArray[i]],AVAILABLEDATEPROP);
  294. candidateAvailableDates = candidateAvailableDates + availableDates
  295. }
  296. console.log("got all available date string concated: ")
  297. console.log(candidateAvailableDates)
  298. var dateObjArray = multiDateString2DateObjectArray(candidateAvailableDates)
  299. dateObjArray.sort(compareDate);
  300. var minDate = dateObjArray[0]
  301. var maxDate = dateObjArray.slice(-1)[0]
  302. state.disabledDates.to = minDate
  303. var nextDayOfMax = new Date(maxDate)
  304. nextDayOfMax.setDate(nextDayOfMax.getDate()+1)
  305. state.disabledDates.from = nextDayOfMax
  306. var segmentDisabledDates = []
  307. var pointer = new Date(minDate)
  308. // console.log("...reach after pointer...")
  309. // console.log(minDate)
  310. while(pointer<maxDate){
  311. // check contains
  312. if(!dateObjArray.some(e => e.getDate() == pointer.getDate())){
  313. segmentDisabledDates.push(new Date(pointer))
  314. }
  315. // update pointer
  316. pointer.setDate(pointer.getDate() + 1)
  317. }
  318. state.disabledDates.dates = segmentDisabledDates
  319. console.log("before force rerender date picker")
  320. console.log(state.disabledDates)
  321. forceRerender()
  322. }
  323. function getFilteredSkuIndexAndSetActiveValue(item, index){
  324. activeCategory.value = item
  325. filteredSkuIndex.value = []
  326. for(var i in skusInGroup.skus){
  327. var sku = skusInGroup.skus[i];
  328. var selectedSkuPropertyBags = sku['productPropertyBag'].filter((obj) => {
  329. return obj.attributeId == TYPEOFPACKAGEPROP;
  330. });
  331. if(selectedSkuPropertyBags[0].attributeValue == item){
  332. filteredSkuIndex.value.push(i)
  333. }
  334. }
  335. activeIndex.value = index;
  336. }
  337. function setActiveDescription(){
  338. var indexToFilter = filteredSkuIndex.value.length<1?0:filteredSkuIndex.value[0]
  339. productDescription.value = skusInGroup.skus[indexToFilter]['hichinaProductBasicDTO']['productContent'];
  340. }
  341. function setActiveCate(item, index){
  342. getFilteredSkuIndexAndSetActiveValue(item,index)
  343. setCandidateAvailableDates(filteredSkuIndex.value)
  344. setPrice(null)
  345. selectedDate.value = new Date();
  346. singleMatchedSku.value = null;
  347. setActiveDescription()
  348. }
  349. function setActiveCateForLocalSpecialty(item, index){
  350. getFilteredSkuIndexAndSetActiveValue(item,index)
  351. singleMatchedSku.value = skusInGroup.skus[filteredSkuIndex.value[0]];
  352. setPrice(singleMatchedSku.value)
  353. setActiveDescription()
  354. }
  355. function setFlightHotelProductData(inputArray){
  356. setTourProductData(inputArray)
  357. }
  358. function setHotelProductData(inputArray){
  359. setTourProductData(inputArray)
  360. }
  361. function setFligtProductData(inputArray){
  362. setTourProductData(inputArray)
  363. }
  364. function setLocalSpecialtyProductData(inputArray){
  365. packageCategories.value = []
  366. imageList.value = []
  367. for(var index in inputArray){
  368. var packageCat = extractAttributeValueFromProductPropertyBag(inputArray[index], TYPEOFPACKAGEPROP);
  369. if(packageCat!=null){
  370. packageCategories.value.push(packageCat)
  371. }
  372. var url = extractAttributeValueFromProductPropertyBag(inputArray[index], PRODUCTIMAGEURLPROP);
  373. if(url!=null){
  374. imageContainer.imageList.push(url)
  375. }
  376. }
  377. // trick: remove duplicates
  378. packageCategories.value = [...new Set(packageCategories.value)];
  379. // force select the first package category on entering page
  380. setActiveCateForLocalSpecialty(packageCategories.value[0], 0);
  381. }
  382. function setTourProductData(inputArray){
  383. packageCategories.value = []
  384. imageList.value = []
  385. for(var index in inputArray){
  386. var packageCat = extractAttributeValueFromProductPropertyBag(inputArray[index], TYPEOFPACKAGEPROP);
  387. if(packageCat!=null){
  388. packageCategories.value.push(packageCat)
  389. }
  390. var url = extractAttributeValueFromProductPropertyBag(inputArray[index], PRODUCTIMAGEURLPROP);
  391. if(url!=null){
  392. imageContainer.imageList.push(url)
  393. }
  394. // this if means only need to calculate days once because all this property in the same sku group should be same
  395. if(days.value==""){
  396. days.value = extractAttributeValueFromProductPropertyBag(inputArray[index], DAYSPROP);
  397. }
  398. }
  399. // trick: remove duplicates
  400. packageCategories.value = [...new Set(packageCategories.value)];
  401. // force select the first package category on entering page
  402. setActiveCate(packageCategories.value[0], 0);
  403. }
  404. function extractAttributeValueFromProductPropertyBag(inputObject, attrId){
  405. var valArray = inputObject.productPropertyBag.filter((obj) => {
  406. return obj.attributeId == attrId;
  407. });
  408. if(valArray.length>0){
  409. return valArray[0].attributeValue;
  410. }
  411. return null;
  412. }
  413. function processSkuGroups(inputArray){
  414. if(inputArray.length>0){
  415. // productName same within all sku in group
  416. productName.value=inputArray[0]['hichinaProductBasicDTO']['productName'];
  417. //at startup, use the first element's description, can be switched to other later when user clicks a different package category
  418. //productDescription.value=inputArray[0].hichinaProductBasicDTO.productContent;
  419. console.log("here is the product description got:")
  420. console.log(productDescription.value)
  421. productTypeId.value = inputArray[0]['hichinaProductBasicDTO']['productTypeId'];
  422. productTypeName.value = inputArray[0]['hichinaProductBasicDTO']['productTypeName'];
  423. if(productTypeId.value === "3a53caed-b788-4290-896d-7922532ad769"){
  424. // 跟团游,则按照跟团游的页面模板来设置各个参数
  425. setTourProductData(inputArray);
  426. }else if(productTypeId.value === "e05d07a3-a717-45b8-b009-47a349890e41"){
  427. // 机票酒店套餐
  428. setFlightHotelProductData(inputArray)
  429. }else if(productTypeId.value === "d7b95089-e278-4522-8f71-dacac41ba32f"){
  430. // 机票
  431. setFligtProductData(inputArray)
  432. }else if(productTypeId.value === HOTELPRODUCTTYPE){
  433. // 酒店
  434. setHotelProductData(inputArray)
  435. }else if( productTypeId.value === LOCALSPECIALTYPRODUCTTYPE){
  436. // 本地土特产
  437. setLocalSpecialtyProductData(inputArray)
  438. }
  439. }
  440. }
  441. function loadSkusInGroup(){
  442. var params = {}
  443. params.skuGroupId = route.params.skuGroupId
  444. AXIOS.get("/api/public/productsku/bygroupidwithpropertybag", {
  445. params: params,
  446. })
  447. .then(function (response) {
  448. skusInGroup.skus = response.data.data
  449. console.log("this is skusinGroup:")
  450. console.log(skusInGroup.skus)
  451. processSkuGroups(skusInGroup.skus)
  452. })
  453. .catch(function (error) {
  454. console.log(error)
  455. });
  456. }
  457. onMounted(() => {
  458. loadSkusInGroup()
  459. })
  460. </script>
  461. <style scoped lang="scss">
  462. .notice {
  463. height: 48px;
  464. padding-left: 260px;
  465. color: rgba(80, 80, 80, 1);
  466. background-color: rgba(229, 242, 250, 1);
  467. font-size: 14px;
  468. line-height: 48px;
  469. }
  470. .left {
  471. width: 565px;
  472. }
  473. .swiper-min,
  474. .banner {
  475. width: 565px;
  476. height: 297px;
  477. min-width: none !important;
  478. overflow: hidden;
  479. img {
  480. width: 100%;
  481. height: 100%;
  482. }
  483. }
  484. .calendarclass {
  485. width: 100%;
  486. font-size: initial;
  487. :deep(.el-calendar-day) {
  488. height: 80px;
  489. }
  490. }
  491. .content {
  492. flex: 1;
  493. margin-left: 37px;
  494. }
  495. .title {
  496. height: 144px;
  497. color: rgba(80, 80, 80, 1);
  498. font-size: 32px;
  499. }
  500. .info {
  501. padding: 19px 4px;
  502. height: 171px;
  503. color: rgba(80, 80, 80, 1);
  504. background-color: rgba(255, 249, 198, 1);
  505. font-size: 14px;
  506. }
  507. .days {
  508. color: rgba(80, 80, 80, 1);
  509. font-size: 14px;
  510. p {
  511. margin-right: 12px;
  512. width: 104px;
  513. color: rgba(80, 80, 80, 1);
  514. font-size: 24px;
  515. text-align: right;
  516. }
  517. }
  518. .private {
  519. padding-left: 119px;
  520. font-size: 12px;
  521. }
  522. .pass {
  523. height: 27px;
  524. padding-bottom: 41px;
  525. color: rgba(80, 80, 80, 1);
  526. font-size: 18px;
  527. line-height: 27px;
  528. text-align: left;
  529. border-bottom: 1px solid #505050;
  530. }
  531. .count {
  532. flex-wrap: wrap;
  533. padding: 11px 21px;
  534. color: rgba(80, 80, 80, 1);
  535. font-size: 18px;
  536. &-item {
  537. margin-right: 61px;
  538. padding: 6px 0;
  539. p {
  540. margin-right: 31px;
  541. }
  542. }
  543. .el-input-number {
  544. width: 150px;
  545. }
  546. .text {
  547. margin-left: 14px;
  548. color: rgba(80, 80, 80, 1);
  549. font-size: 14px;
  550. }
  551. }
  552. .cart {
  553. margin-top: 21px;
  554. height: 56px;
  555. padding-left: 6px;
  556. color: #2a82e4;
  557. background-color: rgba(233, 233, 233, 1);
  558. font-size: 26px;
  559. line-height: 56px;
  560. .price {
  561. text-align: center;
  562. }
  563. .pre-book {
  564. cursor: pointer;
  565. width: 151px;
  566. height: 100%;
  567. color: rgba(250, 250, 250, 1);
  568. background-color: rgba(255, 141, 26, 1);
  569. font-size: 17px;
  570. border: none;
  571. }
  572. }
  573. .book {
  574. cursor: pointer;
  575. width: 151px;
  576. height: 54px;
  577. color: rgba(243, 242, 242, 1);
  578. background-color: rgba(42, 130, 228, 1);
  579. font-size: 25px;
  580. border: none;
  581. }
  582. .intro {
  583. padding: 24px 0;
  584. background-color: rgba(217, 217, 217, 1);
  585. &-head {
  586. background: white;
  587. }
  588. }
  589. .category {
  590. padding: 15px 0 15px 8px;
  591. color: rgba(60, 60, 60, 1);
  592. font-size: 18px;
  593. text-align: center;
  594. li {
  595. padding: 0 24px;
  596. &.active {
  597. color: rgba(42, 130, 228, 1);
  598. font-size: 18px;
  599. }
  600. }
  601. }
  602. .rich-area {
  603. background: white;
  604. .title {
  605. height: 47px;
  606. padding: 12px 0 8px 32px;
  607. color: rgba(42, 130, 228, 1);
  608. font-size: 18px;
  609. border-bottom: 1px solid #999999;
  610. }
  611. .main {
  612. padding: 32px;
  613. }
  614. }
  615. .options {
  616. display: flex;
  617. justify-content: flex-start;
  618. flex-wrap: wrap;
  619. width: 346px;
  620. li {
  621. margin-bottom: 12px;
  622. margin-right: 43px;
  623. width: 125px;
  624. height: 36px;
  625. color: rgba(80, 80, 80, 1);
  626. background-color: rgba(255, 255, 255, 1);
  627. border: rgba(204, 204, 204, 1) solid 1px;
  628. border-radius: 4px;
  629. font-size: 14px;
  630. line-height:36px;
  631. text-align: left;
  632. cursor: pointer;
  633. }
  634. li.active{
  635. background-color: rgb(165, 201, 107);
  636. }
  637. &.more li {
  638. width: auto;
  639. }
  640. }
  641. </style>