You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1193 lines
44 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div
  3. class="service-content tw-mb-[60px] tw-grid tw-grid-cols-1 tw-gap-[30px] md:tw-mb-[100px] xl:tw-px-[60px] xl:tw-max-w-screen-xl xl:tw-mx-auto xl:tw-grid-cols-[auto_364px]">
  4. <mobileFixTopBar ref="stickySwiper" :fixBar="fixBar" :currStep="currStep" :list="fixBarList"></mobileFixTopBar>
  5. <section class="step sercion-1 tw-w-full md:tw-px-[30px] xl:tw-px-0 xl:tw-col-span-2">
  6. <div class="tw-mt-[20px] md:tw-mb-[11px] md:tw-mt-[40px]">
  7. <Breadcrumbs></Breadcrumbs>
  8. </div>
  9. <div v-if="content.banners.length" class="tw-w-full">
  10. <slideshow :banners="content.banners"></slideshow>
  11. </div>
  12. </section>
  13. <section class="sercion-2 tw-px-[30px] md:tw-px-[30px] xl:tw-px-0 xl:tw-col-start-1 xl:tw-row-start-2">
  14. <h1 class="t16 tw-mb-[18px] md:t24">{{ content.name }}</h1>
  15. <div v-if="content.supplier"
  16. class="supplier tw-flex tw-items-center tw-mb-[20px] tw-text-base-primary t14 md:tw-mb-[30px] md:t16 md:tw-font-normal">
  17. <img :src="content.supplier.logo" class="tw-max-w-[40px] md:tw-max-w-[80px]" />
  18. <div class="t14 tw-font-normal tw-ml-[10px] md:t18 md:tw-font-normal">
  19. {{ content.supplier.brand }}
  20. </div>
  21. </div>
  22. <div class="editor-styleguide tw-text-base-primary" v-html="content.highlights"></div>
  23. </section>
  24. <section
  25. class="sercion-3 tw-grid tw-grid-cols-1 tw-gap-[30px] md:tw-gap-[40px] md:tw-px-[30px] xl:tw-px-0 xl:tw-col-start-1 xl:tw-row-start-3">
  26. <div ref="packageOptions" id="packageOptions" class="step">
  27. <div class="tw-px-[30px] md:tw-px-0">
  28. <h2 class="title-icon-left t16 tw-mb-[20px] md:t24">
  29. {{ $t("Package Options") }}
  30. </h2>
  31. <p class="text-slate-600 t12 md:t16">{{ $t("Select the exhibition you want to attend, and add the storage and delivery service of exhibits or truck pickup service") }}</p>
  32. </div>
  33. <div class="tw-w-full tw-bg-neutrals-100 tw-px-[20px] tw-py-[30px] md:tw-p-[30px] tw-rounded-[20px]">
  34. <div class="">
  35. <div class="group tw-mb-[40px] tw-px-[20px] tw-py-[30px] tw-rounded-[20px] tw-bg-white">
  36. <h3 class="t14 tw-font-bold tw-mb-[30px] md:t16 tw-block">
  37. {{ $t("Select Exhibition") }}
  38. </h3>
  39. <selectExhibition ref="ref_selectExhibition" :selectYearList="selectYearList" :selectMonthList="selectMonthList"></selectExhibition>
  40. </div>
  41. <div class="group tw-mb-[20px] tw-p-[20px] tw-rounded-[20px] tw-bg-white">
  42. <h3 class="t14 tw-font-bold tw-mb-[20px] md:t16 tw-block">
  43. {{ $t("Select exhibition hall service") }}
  44. </h3>
  45. <div class="tw-mb-[20px]">
  46. <p class="tw-text-neutrals-500 tw-font-normal md:t16">{{ $t("Storage service of exhibits in the exhibition hall, and assistance in transportation to the designated booth") }}</p>
  47. </div>
  48. <selectExhibitionService v-for="(item,index) in selectExhibitionServiceList"
  49. :key="item.id" :ref="'ref_selectExhibitionitem'+item.id" @ChangeCosts="ChangeCosts($event)"
  50. :selectQuantityList="selectQuantityList"
  51. :selectPackageList="selectPackageList"
  52. :typeGroupList="typeGroupList"
  53. :sort="index+1"
  54. :show = "item.id == showServiceItem"
  55. @delExhibitionService="delExhibitionService(item.id)">
  56. </selectExhibitionService>
  57. <v-btn outlined class="tw-rounded-[16px] remove-upper tw-border-primary-2 tw-text-primary-1 tw-flex tw-items-center"
  58. style="padding: 24px 10px" width="100%" @click="addExhibitionService">
  59. <v-img max-width="20" class="tw-mr-[8px]" :src="require(`@/assets/svg/new.svg`)"></v-img>
  60. <span class="t18 tw-font-normal">{{ $t("New exhibit specifications") }}</span>
  61. </v-btn>
  62. </div>
  63. <div v-show="showCardItem" class="group tw-mb-[20px] tw-p-[20px] tw-rounded-[20px] tw-bg-white">
  64. <div class="tw-flex tw-justify-between tw-items-center">
  65. <h3 class="t14 tw-font-bold tw-mb-[20px] md:t16">
  66. {{ $t("Select truck pickup service") }}
  67. </h3>
  68. <v-img v-show="pickupServiceShow" max-width="18" max-height="19" class="tw-mr-[8px] tw-cursor-pointer" :src="require(`@/assets/svg/delete_default.svg`)" @click="deletePickupSerivce()"></v-img>
  69. </div>
  70. <div class="tw-mb-[20px]">
  71. <p class="tw-text-neutrals-500 tw-font-normal md:t16">{{ $t("Pick up the goods at the designated place and transport them to the exhibition hall") }}</p>
  72. </div>
  73. <div v-show="pickupServiceShow">
  74. <div>
  75. <quantitySelectGroup ref="ref_quantitySelectGroup" :label="'Select quantity'" :quantitySelectList="quantitySelectList" @ChangeCosts="ChangeCosts($event)">
  76. </quantitySelectGroup>
  77. </div>
  78. <h3 class="t14 tw-font-bold tw-mb-[20px] md:t16 tw-block">
  79. {{ $t("Fill in the picking information") }}<span class="required t12 md:t14">*</span>
  80. </h3>
  81. <pickupInformation :selectAddressList="selectAddressList" ref="ref_pickupService" @ChangeCosts="ChangeCosts($event)"></pickupInformation>
  82. </div>
  83. <v-btn v-show="pickupServiceShow==false" outlined class="tw-rounded-[16px] remove-upper tw-border-primary-2 tw-text-primary-1 t18"
  84. style="padding: 24px 10px" width="100%" @click="pickupServiceShow = true">
  85. <v-img max-width="20" class="tw-mr-[8px]" :src="require(`@/assets/svg/new.svg`)"></v-img>
  86. <span class="t18 tw-font-normal">{{ $t("New pickup service") }}</span>
  87. </v-btn>
  88. </div>
  89. <div class="md:tw-flex md:tw-justify-between md:tw-items-center">
  90. <div class="tw-flex tw-justify-between tw-items-start md:tw-w-full md:tw-basis-10/12">
  91. <div class="tw-flex tw-flex-col tw-justify-center">
  92. <div class="tw-flex tw-items-center tw-mb-[8px] md:tw-mb-0">
  93. <div class="tw-body-4 tw-text-neutrals-900 tw-mr-[10px] md:t24">
  94. ${{ finalPrice }} {{ currencyName }}
  95. </div>
  96. </div>
  97. <!-- <div class="tw-hidden tw-body-4 tw-text-neutrals-600 md:tw-hidden">
  98. Deposit fee: $5 {{ currency }} (10%)
  99. </div> -->
  100. </div>
  101. <like></like>
  102. </div>
  103. <button
  104. class="tw-transition tw-btn-md tw-text-white tw-border tw-border-solid tw-border-primary-default tw-bg-primary-default tw-py-[8.5px] tw-mt-[20px] tw-w-full tw-rounded-xl md:tw-mt-0 md:tw-ml-[36px] md:tw-w-auto md:tw-basis-2/12 disabled:tw-bg-neutral-100 disabled:tw-text-base-disable disabled:tw-border-neutral-200"
  105. @click="bookNow" :disabled="btnDisabled">
  106. {{ $t("Book Now") }}
  107. </button>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <div id="serviceDetails" class="serviceDetails step">
  113. <div class="tw-px-[30px] md:tw-px-0">
  114. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  115. {{ $t("Service Details") }}
  116. </h2>
  117. <div v-for="(item,index) in expenseRules" :key="index">
  118. <h3 class="t16 tw-mb-[20px] md:18 xl:t18 xl:tw-font-bold tw-pl-[10px]">
  119. {{ index+1 }}.&nbsp;{{ item.ItemName }}
  120. </h3>
  121. <table class="tablecss" width="100%" v-if="item.ItemType=='01'">
  122. <thead class="tw-bg-[#343434]">
  123. <tr>
  124. <th class="tw-text-[#fefefe]">{{$t('Weight')}}</th>
  125. <th class="tw-text-[#fefefe]">{{$t('Price (NT $, tax included)')}}</th>
  126. </tr>
  127. </thead>
  128. <tbody>
  129. <template v-if="item.StackerCostRules && item.StackerCostRules.length>0">
  130. <tr v-for="item2 in item.StackerCostRules" :key="item2.Guid">
  131. <td width="50%">{{item2.Weight_Min}}{{$t('More than tons to')}}{{item2.Weight_Max}}{{$t('Less than tons')}}</td>
  132. <td width="50%">{{item2.Price}}<span v-if="item2.PricingMode=='N'">{{$t('NTD/piece')}}</span><span v-else>{{$t('NTD/ton')}}</span></td>
  133. </tr>
  134. </template>
  135. </tbody>
  136. </table>
  137. <div ref="details" class="editor-styleguide tw-text-base-primary t14 md:t16 md:tw-font-normal"
  138. v-html="item.ExpensesMemo"></div>
  139. </div>
  140. <!-- <div v-if="content.details.length < 800">
  141. <div ref="details" class="editor-styleguide tw-text-base-primary t14 md:t16 md:tw-font-normal"
  142. v-html="content.details"></div>
  143. </div>
  144. <div v-else>
  145. <div :class="[
  146. button.details ? 'seeMore-hide' : 'seeMore-show',
  147. 'editor-styleguide tw-text-base-primary tw-transition t14 md:t16 md:tw-font-normal',
  148. ]" ref="details" v-html="content.details"></div>
  149. <button v-show="seeMore.details" :class="[
  150. 'seeMore tw-transition tw-btn-md tw-text-primary-1 tw-border tw-border-solid tw-border-primary-1 tw-px-[30px] tw-py-[8.5px] tw-mt-[20px] tw-w-full tw-rounded-xl hover:tw-bg-primary-3 xl:hover:tw-bg-transparent xl:tw-border-none',
  151. button.details ? '' : 'open',
  152. ]" @click="opendetail()">
  153. {{ $t(seeMoreDetailsText) }}
  154. </button>
  155. </div> -->
  156. </div>
  157. </div>
  158. <div id="cancellationPolicy" class="cancellationPolicy step tw-px-[30px] md:tw-px-0">
  159. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  160. {{ $t("Cancellation Policy") }}
  161. </h2>
  162. <div v-if="content.cancellation_policy.length < 800">
  163. <div ref="cancellation_policy" class="editor-styleguide tw-text-base-primary t14 md:t16 md:tw-font-normal"
  164. v-html="content.cancellation_policy">
  165. </div>
  166. </div>
  167. <div v-else>
  168. <div :class="[
  169. button.cancellation_policy ? 'seeMore-hide' : 'seeMore-show',
  170. 'editor-styleguide tw-text-base-primary tw-transition t14 md:t16 md:tw-font-normal',
  171. ]" ref="cancellation_policy" v-html="content.cancellation_policy"></div>
  172. <button v-show="seeMore.cancellation_policy" :class="[
  173. 'seeMore tw-transition tw-btn-md tw-text-primary-1 tw-border tw-border-solid tw-border-primary-1 tw-px-[30px] tw-py-[8.5px] tw-mt-[20px] tw-w-full tw-rounded-xl hover:tw-bg-primary-3 xl:hover:tw-bg-transparent xl:tw-border-none',
  174. button.cancellation_policy ? '' : 'open',
  175. ]" @click="openCancellationPolicy()">
  176. {{ $t(seeMoreCancellationPolicyText) }}
  177. </button>
  178. </div>
  179. </div>
  180. <div id="faq" ref="faq" class="step tw-px-[30px] md:tw-px-0">
  181. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  182. {{ $t("FAQ") }}
  183. </h2>
  184. <faq :faq="content.faq" class="tw-z-[8]"></faq>
  185. </div>
  186. <div id="contactUs" class="step tw-px-[30px] md:tw-px-0">
  187. <h2 class="title-icon-left t16 tw-mb-[20px] md:t20 xl:tw-font-bold">
  188. {{ $t("Contact Us") }}
  189. </h2>
  190. <div class="tw-body-3 tw-text-base-primary tw-mb-[20px]">
  191. 886-2-2725-5000
  192. </div>
  193. <div class="tw-body-3 tw-text-base-primary">info@showeasy.com</div>
  194. </div>
  195. <div :class="[
  196. 'tw-bg-white tw-flex tw-flex-cols tw-justify-between tw-items-center tw-px-[30px] tw-py-[16px] tw-w-full',
  197. fixBar
  198. ? 'tw-fixed tw-left-[0px] tw-bottom-[0px] tw-z-[8] tw-shadow-[1px_0px_2px_rgba(0,0,0,0.25)]'
  199. : 'tw-hidden',
  200. ]">
  201. <div :class="[
  202. 'tw-flex tw-flex-col tw-justify-between tw-items-start tw-grow md:tw-w-full md:tw-flex-row md:tw-items-center',
  203. ]">
  204. <div class="tw-flex tw-items-center tw-mb-[12px] md:tw-mb-0">
  205. <div class="t16 tw-text-neutrals-900 tw-mr-[10px] md:t20 md:tw-mr-0">
  206. ${{ finalPrice }} {{ currencyName }}
  207. </div>
  208. </div>
  209. <div class="tw-flex tw-justify-center tw-items-center tw-w-full md:tw-w-fit">
  210. <like></like>
  211. <button
  212. class="tw-transition tw-whitespace-nowrap tw-body-4 tw-text-white tw-border tw-border-solid tw-border-primary-default tw-bg-primary-default tw-ml-[22px] tw-px-[24px] tw-py-[8.5px] tw-rounded-xl tw-w-full md:tw-body-2 md:tw-min-w-[130px] md:tw-max-w-[130px] md:tw-mt-0 disabled:tw-bg-neutral-100 disabled:tw-text-base-disable disabled:tw-border-neutral-200"
  213. @click="bookNow" :disabled="btnDisabled">
  214. {{ $t("Book Now") }}
  215. </button>
  216. </div>
  217. </div>
  218. </div>
  219. </section>
  220. <section
  221. class="sercion-4 tw-px-[30px] tw-grid tw-grid-cols-1 tw-gap-[40px] tw-z-[8] md:tw-px-[30px] xl:tw-px-0 xl:tw-col-start-1 xl:tw-row-start-4">
  222. <detailsModal :detail="content.details"></detailsModal>
  223. <cancellationPolicyModal :cancellationPolicy="content.cancellation_policy"></cancellationPolicyModal>
  224. </section>
  225. <section class="sercion-5 tw-hidden md:tw-px-[30px] xl:tw-px-0 xl:tw-block xl:tw-row-start-2 xl:tw-row-end-5">
  226. <div class="tw-mb-[40px]">
  227. <sidebarSelectOption :totalPrice="finalPrice" :currency="currencyName" :confirmationTime="content.confirmationTime">
  228. </sidebarSelectOption>
  229. </div>
  230. <sideBarMenu :fixBarList="fixBarList" :currStep="currStep"></sideBarMenu>
  231. </section>
  232. <loading :isLoading="isLoading"></loading>
  233. </div>
  234. </template>
  235. <script>
  236. import Breadcrumbs from "@/components/Breadcrumbs";
  237. import slideshow from "@/components/swiper/serviceContent.vue";
  238. import detailsModal from "@/components/service/contentModal/DetailsModal.vue";
  239. import cancellationPolicyModal from "@/components/service/contentModal/cancellationPolicyModal.vue";
  240. import selectExhibition from "@/components/service/content/selectExhibition.vue";
  241. import selectExhibitionService from "@/components/service/content/selectExhibitionService.vue";
  242. import quantitySelectGroup from "@/components/service/content/quantitySelectGroup.vue";
  243. import pickupInformation from "@/components/service/content/pickupInformation.vue";
  244. import faq from "@/components/service/content/faq.vue";
  245. import sidebarSelectOption from "@/components/service/content/sidebarSelectOption.vue";
  246. import sideBarMenu from "@/components/service/content/sideBarMenu.vue";
  247. import Swiper from "swiper/bundle";
  248. import { scrollama } from "scrollama";
  249. import mobileFixTopBar from "@/components/swiper/mobileFixTopBar.vue";
  250. import like from "@/components/newComponent/like/like.vue";
  251. import { filterData,dateIsInWeekend } from "~/utils/common";
  252. import loading from "@/components/newComponent/loading/loading.vue";
  253. export default {
  254. name: 'ServiceContent',
  255. layout: "login",
  256. auth: false,
  257. components: {
  258. Swiper,
  259. scrollama,
  260. Breadcrumbs,
  261. slideshow,
  262. detailsModal,
  263. cancellationPolicyModal,
  264. selectExhibition,
  265. selectExhibitionService,
  266. quantitySelectGroup,
  267. pickupInformation,
  268. faq,
  269. sidebarSelectOption,
  270. sideBarMenu,
  271. mobileFixTopBar,
  272. like,
  273. loading,
  274. },
  275. data() {
  276. return {
  277. isLoading: false,
  278. showCardItem: false,
  279. pickupServiceShow: false,
  280. apiUrl: process.env.SERVICE_CONSOLE,
  281. btnDisabled: process.env.ENV == 'production',
  282. currStep: null,
  283. stickySwiper: null,
  284. content: {
  285. banners: [],
  286. country: null,
  287. city: null,
  288. name: "",
  289. highlights: '',
  290. details: '',
  291. cancellation_policy: "",
  292. saved: false,
  293. confirmation_time: 24,
  294. supplier: {
  295. logo: require('/assets/img/Footer.png'),
  296. brand: 'ShowEasy'
  297. },
  298. available_sections: null,
  299. timeStatus: 'active',
  300. dateStatus: 'active',
  301. times: [{
  302. start_time: '2023-02-06',
  303. end_time: '2023-03-06',
  304. },{
  305. start_time: '2023-02-06',
  306. end_time: '2023-03-06',
  307. },{
  308. start_time: '2023-02-06',
  309. end_time: '2023-03-06',
  310. }],
  311. start: '2023-02-06',
  312. end: '2023-06-06',
  313. faq: [],
  314. confirmationTime: '',
  315. additionalServices: [
  316. {
  317. name: '司機英文服務'
  318. },{
  319. name: '兒童安全座椅'
  320. },{
  321. name: '增加一個停靠點'
  322. },{
  323. name: '協助飯店入住(每個人,限接機)'
  324. }
  325. ],
  326. },
  327. list: [],
  328. choicesIndex: 0,
  329. countrycode: [],
  330. regionName: [],
  331. elementHeight: {
  332. details: null,
  333. cancellation_policy: null,
  334. faq: null,
  335. },
  336. seeMore: {
  337. details: true,
  338. cancellation_policy: true,
  339. },
  340. button: {
  341. details: true,
  342. cancellation_policy: true,
  343. },
  344. offset: {
  345. packageOptions: 0,
  346. faq: 0,
  347. },
  348. contentId: "",
  349. packageId: "",
  350. packageName: "",
  351. window: {
  352. width: 0,
  353. },
  354. fixBar: false,
  355. fixBarList: [
  356. { id: "packageOptions", title: "Package Options", show: true },
  357. { id: "serviceDetails", title: "Service Details", show: true },
  358. { id: "cancellationPolicy", title: "Cancellation Policy", show: true },
  359. { id: "faq", title: "FAQ", show: true },
  360. { id: "contactUs", title: "Contact Us", show: true },
  361. ],
  362. activePackage: 0,
  363. totalPrice: 0,
  364. additionTotalPrice: [],
  365. customPlanPrice: [],
  366. selectDates: '',
  367. typeGroupList: [],
  368. selectQuantityList: [],
  369. selectYearList: [],
  370. selectMonthList: [],
  371. selectAddressList: [],
  372. selectExhibitionServiceList: [{id: 0,show: true}],
  373. selectPackageList: [],
  374. quantitySelectList: [],
  375. deliveryType: '',
  376. expenseRules: [],
  377. finalPrice: "0",
  378. showServiceItem: 0,
  379. currencyName: '',
  380. };
  381. },
  382. async created() {
  383. this.isLoading = true;
  384. let arr = [];
  385. for(let i=1;i<11;i++){
  386. let target = {
  387. id: i+"",
  388. name: i+"",
  389. };
  390. arr.push(target);
  391. }
  392. let query = this.$route.query;
  393. if(query && query.MinPrice!=null && query.MinPrice!="null"){
  394. this.finalPrice = query.MinPrice+"";
  395. }
  396. if(query && query.CurrencyName){
  397. this.currencyName = decodeURIComponent(query.CurrencyName)+"";
  398. }
  399. this.selectQuantityList = arr;
  400. await this.getBanners();
  401. await this.getServiceData();
  402. await this.getExtensionYear();
  403. await this.getExtensionMonth();
  404. // await this.getExhibitions();
  405. await this.getQuantitySelects();
  406. await this.getServiceItems();
  407. await this.getReceivingCitys();
  408. // await this.getFaq();
  409. await this.getPackages();
  410. await this.getInfoItem();
  411. // await this.addViewCount();
  412. // await this.getYouMightLikeData();
  413. // await this.getRegionName();
  414. // await this.getCountryCode();
  415. if (process.browser) {
  416. window.addEventListener("resize", this.handleResize);
  417. }
  418. this.handleResize();
  419. this.isLoading = false;
  420. },
  421. mounted() {
  422. let vm = this;
  423. vm.contentId = vm.$route.params.id;
  424. vm.offset.packageOptions = vm.$refs.packageOptions.offsetTop;
  425. vm.offset.faq = vm.$refs.faq.offsetTop;
  426. vm.$nextTick(function () {
  427. // instantiate the scrollama
  428. const scrollama = require("scrollama");
  429. const scroller = scrollama();
  430. // setup the instance, pass callback functions
  431. scroller
  432. .setup({
  433. step: ".service-content .step",
  434. offset: 0.6,
  435. })
  436. .onStepEnter((response) => {
  437. // { element, index, direction }
  438. vm.currStep = response.element.id;
  439. let fb_messenger = document.querySelector(".fb_dialog_content");
  440. if (response.index > 3) {
  441. vm.$refs.stickySwiper.slideTo(4);
  442. } else {
  443. vm.$refs.stickySwiper.slideTo(0);
  444. }
  445. if (response.index >= 1 && response.index < 6) {
  446. vm.fixBar = true;
  447. if (fb_messenger) {
  448. fb_messenger.classList.add("hasBar");
  449. }
  450. } else {
  451. vm.fixBar = false;
  452. if (fb_messenger) {
  453. fb_messenger.classList.remove("hasBar");
  454. }
  455. }
  456. })
  457. .onStepExit((response) => {
  458. // { element, index, direction }
  459. vm.currStep = response.element.id;
  460. let fb_messenger = document.querySelector(".fb_dialog_content");
  461. if (response.index >= 1 && response.index < 6) {
  462. vm.fixBar = true;
  463. if (fb_messenger) {
  464. fb_messenger.classList.add("hasBar");
  465. }
  466. } else {
  467. vm.fixBar = false;
  468. if (fb_messenger) {
  469. fb_messenger.classList.remove("hasBar");
  470. }
  471. }
  472. });
  473. })
  474. },
  475. computed: {
  476. currency() {
  477. return this.$store.getters.getCurrency;
  478. },
  479. seeMoreDetailsText() {
  480. if (this.button.details == false) {
  481. return "See less";
  482. } else {
  483. return "See more";
  484. }
  485. },
  486. seeMoreCancellationPolicyText() {
  487. if (this.button.cancellation_policy == false) {
  488. return "See less";
  489. } else {
  490. return "See more";
  491. }
  492. },
  493. // finalPrice() {
  494. // let option = 0;
  495. // let custom = 0;
  496. // let addition = 0;
  497. // if (this.additionTotalPrice) {
  498. // this.additionTotalPrice.forEach((item) => {
  499. // addition += Number(item.total);
  500. // });
  501. // }
  502. // if (this.customPlanPrice) {
  503. // this.customPlanPrice.forEach((item) => {
  504. // custom += Number(item.total);
  505. // });
  506. // }
  507. // if (this.totalPrice) {
  508. // this.totalPrice.forEach((item) => {
  509. // option += Number(item.total);
  510. // });
  511. // }
  512. // if (this.currency == 'USD') {
  513. // return Number(addition + custom + option).toFixed(2).toLocaleString();
  514. // } else {
  515. // return Number(addition + custom + option).toLocaleString();
  516. // }
  517. // },
  518. },
  519. watch: {
  520. currency: {
  521. handler: function () {
  522. this.getServiceData();
  523. // this.getPackages();
  524. },
  525. },
  526. // activePackage: {
  527. // handler: function (newVal, oldVal) {
  528. // if (newVal !== oldVal) {
  529. // this.customPlanPrice = [];
  530. // this.totalPrice = [];
  531. // }
  532. // },
  533. // },
  534. // choicesIndex: {
  535. // handler: function (newVal, oldVal) {
  536. // if (newVal !== oldVal) {
  537. // this.customPlanPrice = [];
  538. // this.totalPrice = [];
  539. // }
  540. // },
  541. // }
  542. },
  543. destroyed() {
  544. if (process.browser) {
  545. window.removeEventListener("resize", this.handleResize);
  546. }
  547. },
  548. methods: {
  549. async getBanners() {
  550. await this.$axios.get(`/trending/api/Onsite/BannerFiles?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  551. .then((response) => {
  552. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  553. let data = response.data.DATA.rel
  554. if(data.length>0){
  555. this.content.banners = data.map((item) => {
  556. return {
  557. banner_id: item.FileID,
  558. image: item.FilePath,
  559. };
  560. });
  561. }
  562. }
  563. })
  564. .catch((error) => console.log(error));
  565. },
  566. async getExtensionYear() {
  567. await this.$axios.get(`/trending/api/Onsite/ExtensionYear?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  568. .then((response) => {
  569. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  570. let data = response.data.DATA.rel
  571. if(data.length>0){
  572. this.selectYearList = data.map((item) => {
  573. return {
  574. id: item.ArgumentID,
  575. name: item.ArgumentValue,
  576. };
  577. });
  578. }
  579. }
  580. })
  581. .catch((error) => console.log(error));
  582. },
  583. async getExtensionMonth() {
  584. await this.$axios.get(`/trending/api/Onsite/ExtensionMonth?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  585. .then((response) => {
  586. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  587. let data = response.data.DATA.rel
  588. if(data.length>0){
  589. this.selectMonthList = data.map((item) => {
  590. return {
  591. id: item.ArgumentID,
  592. name: item.ArgumentValue,
  593. };
  594. });
  595. }
  596. }
  597. })
  598. .catch((error) => console.log(error));
  599. },
  600. async getServiceItems() {
  601. this.showCardItem = false;
  602. await this.$axios
  603. .get(`trending/api/Onsite/ServiceItems?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  604. .then((response) => {
  605. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  606. let data = response.data.DATA.rel
  607. if(data.length>0){
  608. this.typeGroupList = data.map((item) => {
  609. if(item.ItemType=="02"){
  610. this.showCardItem = true;
  611. }
  612. return {
  613. package_id: item.ArgumentID,
  614. name: item.ArgumentValue,
  615. itemType: item.ItemType
  616. };
  617. });
  618. }
  619. }
  620. })
  621. .catch((error) => console.log(error));
  622. },
  623. // async getFaq() {
  624. // await this.$axios
  625. // .get(
  626. // `${this.apiUrl}/user-services/faqs?service_id=${this.$route.params.id}&lang_code=${this.$i18n.localeProperties["langQuery"]}`
  627. // )
  628. // .then((res) => {
  629. // this.content.faq = res.data;
  630. // })
  631. // .catch((error) => console.log(error));
  632. // },
  633. async getPackages() {
  634. await this.$axios
  635. .get(`trending/api/Onsite/PackingTypes?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  636. .then((response) => {
  637. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  638. let data = response.data.DATA.rel
  639. if(data.length>0){
  640. this.selectPackageList = data.map((item) => {
  641. return {
  642. id: item.ArgumentID,
  643. name: item.ArgumentValue,
  644. };
  645. });
  646. }
  647. }
  648. })
  649. .catch((error) => console.log(error));
  650. },
  651. async getQuantitySelects() {
  652. await this.$axios
  653. .get(`trending/api/Onsite/TruckTypes?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  654. .then((response) => {
  655. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  656. let data = response.data.DATA.rel
  657. if(data.length>0){
  658. this.quantitySelectList = data;
  659. }
  660. }
  661. })
  662. .catch((error) => console.log(error));
  663. },
  664. async getReceivingCitys() {
  665. await this.$axios
  666. .get(`trending/api/Onsite/ReceivingCitys?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  667. .then((response) => {
  668. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  669. let data = response.data.DATA.rel
  670. if(data.length>0){
  671. this.selectAddressList = data.map((item) => {
  672. return {
  673. id: item.ArgumentID,
  674. name: item.ArgumentValue,
  675. };
  676. });
  677. }
  678. }
  679. })
  680. .catch((error) => console.log(error));
  681. },
  682. async getServiceData() {
  683. await this.$axios
  684. .get(`/trending/api/Onsite/Info?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  685. .then((response) => {
  686. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  687. let data = response.data.DATA.rel
  688. if(data){
  689. this.content.name = data.ServiceName;
  690. this.content.highlights = data.Features;
  691. this.content.details = data.Details;
  692. this.content.cancellation_policy = data.CancelPolicy;
  693. this.content.faq = data.FQAs;
  694. this.content.confirmationTime = data.ConfirmDays;
  695. }
  696. }
  697. // this.content.country = res.data.country;
  698. // this.content.city = res.data.city;
  699. // this.content.highlights = res.data.highlights;
  700. // this.content.details = res.data.details;
  701. // this.content.cancellation_policy = res.data.cancellation_policy;
  702. // this.content.supplier = res.data.supplier;
  703. // this.content.available_sections = res.data.available_sections;
  704. // this.content.times = res.data.available_sections.times;
  705. // this.content.timeStatus = res.data.available_sections.time_status;
  706. // this.content.dateStatus = res.data.available_sections.date_status;
  707. // this.content.start = res.data.available_sections.start;
  708. // this.content.end = res.data.available_sections.end;
  709. // this.content.payment_currency = res.data.payment_currency;
  710. // this.content.confirmationTime = res.data.confirmation_time.toString();
  711. })
  712. .catch((error) => console.log(error));
  713. },
  714. async getInfoItem() {
  715. await this.$axios
  716. .get(`/trending/api/Onsite/InfoItem?Lang=${this.$i18n.localeProperties["langQuery"]}&ServiceID=${this.$route.params.id}`)
  717. .then((response) => {
  718. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  719. let data = response.data.DATA.rel
  720. if(data.length>0){
  721. this.expenseRules = data;
  722. }
  723. }
  724. })
  725. .catch((error) => console.log(error));
  726. },
  727. async addViewCount() {
  728. let Obj = {
  729. service_id: `${this.$route.params.id}`,
  730. lang_code: `${this.$i18n.localeProperties["langQuery"]}`,
  731. add_number: 1,
  732. };
  733. await this.$axios
  734. .put(`${this.apiUrl}/user-services/view-counts`, Obj)
  735. .then((res) => { })
  736. .catch((error) => console.log(error));
  737. },
  738. opendetail() {
  739. if (this.window.width >= 1366) {
  740. this.button.details = !this.button.details;
  741. } else {
  742. this.$modal.show("Details");
  743. }
  744. },
  745. openCancellationPolicy() {
  746. if (this.window.width >= 1366) {
  747. this.button.cancellation_policy = !this.button.cancellation_policy;
  748. } else {
  749. this.$modal.show("cancellationPolicy");
  750. }
  751. },
  752. handleResize() {
  753. if (process.browser) {
  754. this.window.width = window.innerWidth;
  755. }
  756. },
  757. bookNow() {
  758. let validators = this.$refs.ref_selectExhibition.validators();
  759. if(validators==false){
  760. return false;
  761. }
  762. if(this.selectExhibitionServiceList.length>0){
  763. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  764. let ref = eval("this.$refs.ref_selectExhibitionitem"+this.selectExhibitionServiceList[i].id)[0];
  765. if(ref !=undefined){
  766. validators = ref.validators();
  767. if(validators==false){
  768. ref.show = true;
  769. return false;
  770. }
  771. }
  772. }
  773. }
  774. let selectExhibitionData = this.$refs.ref_selectExhibition.formData;
  775. let selectExhibitionServiceData = [];
  776. if(this.selectExhibitionServiceList.length>0){
  777. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  778. let ref = eval("this.$refs.ref_selectExhibitionitem"+this.selectExhibitionServiceList[i].id)[0];
  779. if(ref !=undefined){
  780. let target = ref.formData;
  781. selectExhibitionServiceData.push(target);
  782. }
  783. }
  784. }
  785. let quantityData = this.$refs.ref_quantitySelectGroup.formData;
  786. if(quantityData.selectList.length>0){
  787. if(this.showCardItem){
  788. validators = this.$refs.ref_quantitySelectGroup.validators();
  789. if(validators==false){
  790. this.pickupServiceShow = true;
  791. return false;
  792. }
  793. validators = this.$refs.ref_pickupService.validators();
  794. if(validators==false){
  795. this.pickupServiceShow = true;
  796. return false;
  797. }
  798. }
  799. }
  800. // let pickupServiceData = this.$refs.ref_pickupService.formData;
  801. let previewFile = "";
  802. let query = this.$route.query;
  803. if(query && query.PreviewFile){
  804. previewFile = decodeURIComponent(query.PreviewFile);
  805. }
  806. let title = "";
  807. if(query && query.Title){
  808. title = decodeURIComponent(query.Title);
  809. }
  810. this.$router.push(
  811. {
  812. path: this.localePath("/service/checkout/" + this.$route.params.id),
  813. //携带需要传递的参数
  814. query: {
  815. selectExhibitionData: encodeURIComponent(JSON.stringify(selectExhibitionData)),
  816. selectExhibitionServiceData: encodeURIComponent(JSON.stringify(selectExhibitionServiceData)),
  817. quantityData: encodeURIComponent(JSON.stringify(quantityData)),
  818. // pickupServiceData: encodeURIComponent(JSON.stringify(pickupServiceData)),
  819. totalPrice: this.totalPrice,
  820. previewFile: encodeURIComponent(previewFile),
  821. title: encodeURIComponent(title)
  822. }
  823. });
  824. },
  825. // choicesIdx(data) {
  826. // let vm = this;
  827. // vm.choicesIndex = data;
  828. // },
  829. addExhibitionService(){
  830. const arr = this.selectExhibitionServiceList.map(({id})=> id);
  831. let max = arr.length>0 ? Math.max.apply(null, arr) : 0;
  832. this.selectExhibitionServiceList.push({id: max+1,show:true});
  833. this.showServiceItem = max+1;
  834. },
  835. delExhibitionService(value){
  836. if(this.selectExhibitionServiceList.length>0){
  837. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  838. if(value == this.selectExhibitionServiceList[i].id){
  839. // let index = this.selectExhibitionServiceList.indexOf(this.selectExhibitionServiceList[i]);
  840. this.selectExhibitionServiceList.splice(i, 1);
  841. break;
  842. }
  843. }
  844. }
  845. this.ChangeCosts(null);
  846. },
  847. deletePickupSerivce(){
  848. this.pickupServiceShow = false;
  849. if(this.$refs.ref_quantitySelectGroup){
  850. this.$refs.ref_quantitySelectGroup.clearAll();
  851. }
  852. },
  853. ChangeCosts(data){
  854. let totalPrice = 0;
  855. this.totalPrice = 0;
  856. // let selectExhibitionData = this.$refs.ref_selectExhibition.formData;
  857. let selectExhibitionServiceData = [];
  858. if(this.selectExhibitionServiceList.length>0){
  859. for(let i=0;i<this.selectExhibitionServiceList.length;i++){
  860. let ref = eval("this.$refs.ref_selectExhibitionitem"+this.selectExhibitionServiceList[i].id)[0];
  861. if(ref !=undefined){
  862. let target = ref.formData;
  863. selectExhibitionServiceData.push(target);
  864. }
  865. }
  866. }
  867. if(selectExhibitionServiceData.length>0){
  868. for(let i=0;i<selectExhibitionServiceData.length;i++){
  869. let arr = selectExhibitionServiceData[i].selectServiceItems;
  870. if(arr.length>0){
  871. for(let j=0;j<arr.length;j++){
  872. if(arr[j].itemType == "01"){
  873. totalPrice += this.stackerCostRules(selectExhibitionServiceData[i],arr[j]);
  874. }else if(arr[j].itemType == "02"){
  875. }else if(arr[j].itemType == "03" || arr[j].itemType == "04" || arr[j].itemType == "05" || arr[j].itemType == "06"){
  876. totalPrice += this.OtherCostRules(selectExhibitionServiceData[i],arr[j]);
  877. }
  878. }
  879. }
  880. }
  881. }
  882. let quantityData = this.$refs.ref_quantitySelectGroup.formData;
  883. if(quantityData.selectList.length>0){
  884. totalPrice += this.TruckCostRules();
  885. }
  886. this.totalPrice = totalPrice;
  887. this.finalPrice = Number(totalPrice).toLocaleString();
  888. },
  889. // 堆高機
  890. stackerCostRules(data1,data2){
  891. let price = 0;
  892. let tmpWeight = 0;//Number(data1.weight)/1000;
  893. // 材積重 長x寬x高/6000 得到噸
  894. if((data1.length =="" && data1.width=="" && data1.height=="") && data1.weight!=""){
  895. tmpWeight = Number(data1.weight)/1000;
  896. }else if((data1.length !="" && data1.width!="" && data1.height!="") && data1.weight==""){
  897. tmpWeight = Number(data1.length)*Number(data1.width)*Number(data1.height)/6000/1000;
  898. }else if(data1.length !="" && data1.width!="" && data1.height!="" && data1.weight!=""){
  899. let volumeWeight = Number(data1.length)*Number(data1.width)*Number(data1.height)/6000/1000;
  900. // 比較誰大
  901. if(volumeWeight>Number(data1.weight)/1000){
  902. tmpWeight = volumeWeight;
  903. }else{
  904. tmpWeight = Number(data1.weight)/1000;
  905. }
  906. }
  907. if(tmpWeight==0){
  908. return price;
  909. }
  910. if(this.expenseRules.length>0){
  911. for(let i=0;i<this.expenseRules.length;i++){
  912. let subArr = this.expenseRules[i].StackerCostRules;
  913. if(this.expenseRules[i].Guid == data2.package_id && subArr.length>0){
  914. for(let j=0;j<subArr.length;j++){
  915. // 需要判斷按數量還是重量
  916. if(subArr[j].Weight_Min!="" && subArr[j].Weight_Max!=""){
  917. if(Number(subArr[j].Weight_Min)<=tmpWeight && Number(subArr[j].Weight_Max)>=tmpWeight){
  918. if(subArr[j].PricingMode=="N"){
  919. price = subArr[j].Price;
  920. }else{
  921. price = subArr[j].Price*tmpWeight;
  922. }
  923. break;
  924. }
  925. }
  926. }
  927. break;
  928. }
  929. }
  930. }
  931. let num = (data1.quantity =="" || data1.quantity =="0") ? 0 : Number(data1.quantity);
  932. price = price*num;
  933. return price;
  934. },
  935. TruckCostRules(){
  936. let price = 0;
  937. let quantityData = this.$refs.ref_quantitySelectGroup.formData;
  938. let pickupServiceData = this.$refs.ref_pickupService.formData;
  939. if(this.expenseRules.length>0){
  940. let list = filterData({ItemType: '02'},this.expenseRules);
  941. if(list.length>0){
  942. if(list[0].TruckCostRules.length>0 && quantityData.selectList.length>0 && pickupServiceData.address1!="" && pickupServiceData.address1!="0"){
  943. price += this.updateForData(quantityData.selectList,list[0].TruckCostRules,pickupServiceData.address1);
  944. }
  945. if(list[0].TruckMarkupByModel.length>0 && quantityData.truckList.length>0){
  946. price += this.updateForData(quantityData.truckList,list[0].TruckMarkupByModel,null);
  947. }
  948. // 壓車費
  949. if(list[0].TruckEscortCostRules.length>0 && pickupServiceData.delivery_type=="2" && quantityData.selectList.length>0
  950. && list[0].EscortFreeCityID!="" && pickupServiceData.address1!="0"){
  951. price += this.updateForData(quantityData.selectList,list[0].TruckEscortCostRules,list[0].EscortFreeCityID);
  952. }
  953. if(list[0].TruckHolidayPay.length>0 && pickupServiceData.select_date!=""){
  954. let inWeekend = dateIsInWeekend(pickupServiceData.select_date);
  955. if(inWeekend==5 && pickupServiceData.delivery_type=="2"){
  956. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  957. }else if(inWeekend==6 && pickupServiceData.delivery_type=="2"){
  958. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null)*2;
  959. }else if(inWeekend==0 && pickupServiceData.delivery_type=="2"){
  960. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  961. }else if(inWeekend==6 && pickupServiceData.delivery_type=="1"){
  962. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  963. }else if(inWeekend==0 && pickupServiceData.delivery_type=="1"){
  964. price += this.updateForData(quantityData.selectList,list[0].TruckHolidayPay,null);
  965. }
  966. }
  967. }
  968. }
  969. return price;
  970. },
  971. updateForData(data1,data2,address1){
  972. let price = 0;
  973. if(data1.length>0 && data2.length>0){
  974. for(let n=0;n<data1.length;n++){
  975. let truckID = data1[n].id;
  976. let num = data1[n].number;
  977. for(let i=0;i<data2.length;i++){
  978. if(data2[i].CityID!=undefined && data2[i].CityID!="" && data2[i].TruckID!=""){
  979. if(data2[i].CityID==address1 && data2[i].TruckID == truckID){
  980. price += data2[i].Price*num;
  981. break;
  982. }
  983. }else if(data2[i].CityID ==undefined && data2[i].TruckID!=""){
  984. if(data2[i].TruckID == truckID){
  985. price += data2[i].Price*num;
  986. break;
  987. }
  988. }
  989. }
  990. }
  991. }
  992. return price;
  993. },
  994. OtherCostRules(data1,data2){
  995. let price = 0;
  996. let tmpValue = 0;
  997. if(data1.length =="" && data1.width=="" && data1.height==""){
  998. return price;
  999. }else{
  1000. tmpValue = Number(data1.length)*Number(data1.width)*Number(data1.height)/1000000;
  1001. }
  1002. if(this.expenseRules.length>0){
  1003. for(let i=0;i<this.expenseRules.length;i++){
  1004. let subArr = this.expenseRules[i].OtherCostRules;
  1005. if(this.expenseRules[i].Guid == data2.package_id && subArr.length>0){
  1006. for(let j=0;j<subArr.length;j++){
  1007. if(subArr[j].Unit_Min!=""){
  1008. if(Number(subArr[j].Unit_Min)<tmpValue){
  1009. price = subArr[j].Price*tmpValue;
  1010. }else{
  1011. price = subArr[j].Price*subArr[j].Unit_Min;
  1012. }
  1013. break;
  1014. }
  1015. }
  1016. break;
  1017. }
  1018. }
  1019. }
  1020. let num = (data1.quantity =="" || data1.quantity =="0") ? 0 : Number(data1.quantity);
  1021. price = price*num;
  1022. return price;
  1023. }
  1024. },
  1025. };
  1026. </script>
  1027. <style lang="scss" scoped>
  1028. :deep() {
  1029. // .serviceDetails,
  1030. // .cancellationPolicy {
  1031. // p {
  1032. // margin-bottom: 6px;
  1033. // }
  1034. // }
  1035. }
  1036. .service-content {
  1037. .serviceDetails img {
  1038. width: 100%;
  1039. height: auto;
  1040. }
  1041. .fix-right {
  1042. position: fixed;
  1043. top: 120px;
  1044. right: 0 px;
  1045. max-width: 400px;
  1046. height: auto;
  1047. z-index: 100;
  1048. }
  1049. .title-icon-left {
  1050. background-position: left 0px center;
  1051. }
  1052. ul {
  1053. padding-left: 24px;
  1054. }
  1055. img {
  1056. // image-rendering: pixelated;
  1057. }
  1058. }
  1059. .seeMore {
  1060. &-hide {
  1061. position: relative;
  1062. max-height: 295px;
  1063. overflow: hidden;
  1064. &::after {
  1065. content: "";
  1066. display: block;
  1067. position: absolute;
  1068. background: url("~/assets/img/gradient_white.png") repeat-x left bottom;
  1069. width: 100%;
  1070. height: 130px;
  1071. left: 0;
  1072. bottom: 0;
  1073. z-index: 1;
  1074. transition: bottom 0.5s;
  1075. }
  1076. }
  1077. &-show {
  1078. position: relative;
  1079. max-height: 100%;
  1080. overflow: initial;
  1081. &::after {
  1082. display: none;
  1083. }
  1084. }
  1085. @media screen and (min-width: 1366px) {
  1086. position: relative;
  1087. display: flex;
  1088. align-items: center;
  1089. justify-content: center;
  1090. &::after {
  1091. content: "";
  1092. display: inline-block;
  1093. position: relative;
  1094. background-image: url("~/assets/svg/arrow-down-primary.svg");
  1095. background-position: center center;
  1096. background-repeat: no-repeat;
  1097. background-size: 100%;
  1098. width: 9px;
  1099. height: 6px;
  1100. margin-left: 16px;
  1101. }
  1102. &.open {
  1103. &::after {
  1104. transform: rotate(180deg);
  1105. }
  1106. }
  1107. }
  1108. }
  1109. .section-7 {
  1110. >div {
  1111. box-shadow: 1px 0px 2px rgba(0, 0, 0, 0.25), 0px 1px 2px rgba(0, 0, 0, 0.1);
  1112. }
  1113. }
  1114. .tablecss{
  1115. line-height: 36px;
  1116. text-align: center;
  1117. color: #343434;
  1118. // border-radius: 10px;
  1119. }
  1120. table{
  1121. border: 1px solid #cecece;
  1122. border-collapse: separate;
  1123. border-radius: 10px;
  1124. text-align: center;
  1125. border-spacing: 0px;
  1126. // padding: 10px;
  1127. }
  1128. table thead{
  1129. border-radius: 10px;
  1130. }
  1131. th{
  1132. border: 1px solid #343434;
  1133. text-align: center;
  1134. }
  1135. td{
  1136. border-top: 1px solid #cecece;
  1137. text-align: center;
  1138. }
  1139. table thead>tr:first-of-type>th:first-of-type{
  1140. border-top-left-radius: 10px;
  1141. }
  1142. table thead>tr:first-of-type>th:last-of-type{
  1143. border-top-right-radius: 10px;
  1144. }
  1145. table tfoot>tr:last-of-type>td:first-of-type{
  1146. border-bottom-left-radius: 10px;
  1147. }
  1148. table tfoot>tr:last-of-type>td:last-of-type{
  1149. border-bottom-right-radius: 10px;
  1150. }
  1151. table::before{
  1152. border-radius: 10px;
  1153. }
  1154. // table tr:first-child th:first-child {
  1155. // border-top-left-radius: 10px; /* 设置table左下圆角 */
  1156. // }
  1157. // table tr:first-child th:last-child {
  1158. // border-top-right-radius: 10px; /* 设置table右下圆角 */
  1159. // }
  1160. table tr:last-child td:first-child {
  1161. border-bottom-left-radius: 10px; /* 设置table左下圆角 */
  1162. }
  1163. table tr:last-child td:last-child {
  1164. border-bottom-right-radius: 10px; /* 设置table右下圆角 */
  1165. }
  1166. </style>