|
@@ -0,0 +1,188 @@
|
|
|
|
+<template>
|
|
|
|
+ <q-page>
|
|
|
|
+ <div class="row" style="height: 110px; background-color: #e5f2fa">
|
|
|
|
+ <div class="col-sm-2"></div>
|
|
|
|
+ <div class="col-12 col-sm-10 column">
|
|
|
|
+ <div class="q-pt-md q-pl-md text-black text-weight-bold">
|
|
|
|
+ Home > Destination > {{ destinationName }}
|
|
|
|
+ </div>
|
|
|
|
+ <div class="col text-weight-bold q-pl-md text-h3">
|
|
|
|
+ {{ destinationName }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="row">
|
|
|
|
+ <div class="col-12 col-sm-5 row q-px-md q-py-lg" style="height: 450px">
|
|
|
|
+ <div class="col-12" style="background-color: white">
|
|
|
|
+ <q-img :src="destinationProfileImage" fit="fill"> </q-img>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="col-12 col-sm-7 row q-px-md q-py-lg" style="height: 450px">
|
|
|
|
+ <div class="column col-12">
|
|
|
|
+ <div
|
|
|
|
+ class="col-9 q-pa-md text-subtitle1"
|
|
|
|
+ style="background-color: #fff9c6"
|
|
|
|
+ v-html="description"
|
|
|
|
+ ></div>
|
|
|
|
+ <div class="col-3 row">
|
|
|
|
+ <div class="col-6 text-h4 flex flex-center">
|
|
|
|
+ Guidbook of {{ destinationName }}
|
|
|
|
+ </div>
|
|
|
|
+ <div class="col-6 flex flex-center">
|
|
|
|
+ <q-btn class="glossy" rounded color="blue-6"
|
|
|
|
+ ><q-icon left size="3em" name="download" />
|
|
|
|
+ <div>Download</div></q-btn
|
|
|
|
+ >
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div
|
|
|
|
+ class="row flex flex-center text-h4"
|
|
|
|
+ style="border-top: 1px solid gray; height: 80px"
|
|
|
|
+ >
|
|
|
|
+ Places to go in {{ destinationName }}
|
|
|
|
+ </div>
|
|
|
|
+ <div
|
|
|
|
+ v-for="item in childDestinations"
|
|
|
|
+ v-bind:key="item.destinationId"
|
|
|
|
+ class="row q-pa-md"
|
|
|
|
+ style="width: 90%; min-height: 200px; margin: 0 auto"
|
|
|
|
+ >
|
|
|
|
+ <div class="col-3 q-pa-md" style="border-right: 1px solid gray">
|
|
|
|
+ <q-img fit="fill" :src="item.destinationProfileImage"></q-img>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="col-9 column q-pa-md">
|
|
|
|
+ <div class="text-h4 text-weight-bold">{{ item.destinationName }}</div>
|
|
|
|
+ <div class="q-pt-md">
|
|
|
|
+ {{ removeHtmlTag(item.description) }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </q-page>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script>
|
|
|
|
+import { ref, onMounted, getCurrentInstance } from "vue";
|
|
|
|
+import { api } from "boot/axios";
|
|
|
|
+import { useRoute } from "vue-router";
|
|
|
|
+import { useSeoMeta } from "unhead";
|
|
|
|
+export default {
|
|
|
|
+ name: "DestinationDetailPage",
|
|
|
|
+ setup() {
|
|
|
|
+ const app = getCurrentInstance().appContext.app;
|
|
|
|
+ const gp = app.config.globalProperties;
|
|
|
|
+
|
|
|
|
+ const route = useRoute();
|
|
|
|
+
|
|
|
|
+ const description = ref("");
|
|
|
|
+ const destinationProfileImage = ref("");
|
|
|
|
+ const downloadUrl = ref("");
|
|
|
|
+ const destinationName = ref("");
|
|
|
|
+ const childDestinations = ref([]);
|
|
|
|
+ const relevantToursProduct = ref([]);
|
|
|
|
+
|
|
|
|
+ function logPv() {
|
|
|
|
+ api
|
|
|
|
+ .post(
|
|
|
|
+ "/api/public/pagestats/pv/destination-detail-" +
|
|
|
|
+ route.params.destinationId
|
|
|
|
+ )
|
|
|
|
+ .then((res) => {
|
|
|
|
+ console.log("log pv:");
|
|
|
|
+ console.log(res.data);
|
|
|
|
+ })
|
|
|
|
+ .catch((err) => {
|
|
|
|
+ console.error("Error:", err);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function logView() {
|
|
|
|
+ api
|
|
|
|
+ .post(
|
|
|
|
+ "/api/public/pagestats/view-destination/" + route.params.destinationId
|
|
|
|
+ )
|
|
|
|
+ .then((res) => {
|
|
|
|
+ console.log("view cnt of this destination:");
|
|
|
|
+ console.log(res.data);
|
|
|
|
+ })
|
|
|
|
+ .catch((err) => {
|
|
|
|
+ console.error("Error:", err);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function loadRelatedTours() {
|
|
|
|
+ api
|
|
|
|
+ .get(
|
|
|
|
+ "/api/public/destination/relavanttourproduct/" +
|
|
|
|
+ route.params.destinationId
|
|
|
|
+ )
|
|
|
|
+ .then((response) => {
|
|
|
|
+ if (response.data.ok === true) {
|
|
|
|
+ relevantToursProduct.value = response.data.data;
|
|
|
|
+ } else {
|
|
|
|
+ relevantToursProduct.value = [];
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ .catch((e) => {
|
|
|
|
+ console.log("get relevant tours product err");
|
|
|
|
+ console.log(e);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function loadChildrenDestination() {
|
|
|
|
+ api
|
|
|
|
+ .get("/api/public/destination/children/" + route.params.destinationId)
|
|
|
|
+ .then((response) => {
|
|
|
|
+ childDestinations.value = response.data.data;
|
|
|
|
+ })
|
|
|
|
+ .catch((e) => {
|
|
|
|
+ console.log("get destination detail err");
|
|
|
|
+ console.log(e);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function loadDestinations() {
|
|
|
|
+ api
|
|
|
|
+ .get("/api/public/destination/" + route.params.destinationId)
|
|
|
|
+ .then((response) => {
|
|
|
|
+ description.value = response.data.data.description;
|
|
|
|
+ destinationProfileImage.value = gp.$normalizeMultiImageUrl(
|
|
|
|
+ response.data.data.destinationProfileImage
|
|
|
|
+ );
|
|
|
|
+ console.log(destinationProfileImage.value);
|
|
|
|
+ downloadUrl.value = response.data.data.downloadUrl;
|
|
|
|
+ destinationName.value = response.data.data.destinationName;
|
|
|
|
+ useSeoMeta({
|
|
|
|
+ title: destinationName.value,
|
|
|
|
+ description: description.value,
|
|
|
|
+ ogDescription: description.value,
|
|
|
|
+ ogTitle: destinationName.value,
|
|
|
|
+ ogImage:
|
|
|
|
+ "https://www.hichinatravel.com/static/png/name-67280b81.png",
|
|
|
|
+ twitterCard: "summary_large_image",
|
|
|
|
+ });
|
|
|
|
+ })
|
|
|
|
+ .catch((e) => {
|
|
|
|
+ console.log("get destination detail err");
|
|
|
|
+ console.log(e);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ onMounted(() => {
|
|
|
|
+ logPv();
|
|
|
|
+ logView();
|
|
|
|
+ console.log("on mounted destination detail page");
|
|
|
|
+ loadDestinations();
|
|
|
|
+ loadChildrenDestination();
|
|
|
|
+ loadRelatedTours();
|
|
|
|
+ });
|
|
|
|
+ return {
|
|
|
|
+ destinationName,
|
|
|
|
+ destinationProfileImage,
|
|
|
|
+ description,
|
|
|
|
+ childDestinations,
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+</script>
|