MobileProductDetail.vue 6.16 KB
<template>
  <v-container class="ma-0 pa-0 bg-grey-lighten-5">
    <v-carousel class="tw-float-left" height="450" v-model="slide" hide-delimiter-background>
      <v-carousel-item
        cover
        v-for="(slide, i) in info.productimageliststore"
        :src="slide.url"
        :key="i"
        :alt="info.name"
      >
      </v-carousel-item>
    </v-carousel>
    <div class="mb-3 bg-white mb-sm-10 text-h4 font-weight-medium pa-4">
      {{ info.name }}
    </div>
    <v-row class="mx-4 mt-0 mb-4 bg-white rounded-lg">
      <v-col cols="6"
        ><div class="text-body-1 text-grey-darken-3">Brand:</div>
        <div class="text-h6">{{ info.brandName }}</div></v-col
      >
      <v-col cols="6"
        ><div class="text-body-1 text-grey-darken-3">Product Model:</div>
        <div class="text-h6">{{ info.model }}</div></v-col
      >
      <v-col cols="6" v-if="info.basename1"
        ><div class="text-body-1 text-grey-darken-3">{{ info.basename1 }}:</div>
        <div class="text-h6">{{ info.basecore1 }}</div></v-col
      >
      <v-col cols="6" v-if="info.basename2"
        ><div class="text-body-1 text-grey-darken-3">{{ info.basename2 }}:</div>
        <div class="text-h6">{{ info.basecore2 }}</div></v-col
      >
      <v-col cols="6" v-if="info.basename3"
        ><div class="text-body-1 text-grey-darken-3">{{ info.basename3 }}:</div>
        <div class="text-h6">{{ info.basecore3 }}</div></v-col
      >
    </v-row>
    <div
      v-if="info.ticketTypes?.length"
      class="py-4 mx-4 bg-white rounded-lg tw-flex tw-flex-wrap tw-justify-around"
    >
      <v-sheet
        v-for="item in info.ticketTypes || []"
        :key="item.rank"
        rounded="lg"
        border
        class="tw-w-[40%] mb-4"
        >
        <div
          class="tw-bg-[#dcecfa] tw-h-[64px] !tw-leading-[64px] rounded-lg rounded-b-0 pa-2 tw-text-center text-h6 tw-overflow-hidden tw-text-ellipsis"
        >
          {{ item.typeName }}
        </div>
        <div class="tw-h-[82px] pa-2">
          <div class="text-caption">Product Code</div>
          <div class="text-body-1 !tw-font-[500]">
            {{ item.rank }}
          </div>
        </div>
      </v-sheet>
      <v-btn size="large" color="blue-darken-1" @click="dialogStore.updateDialog(true)">
        Quotation Inquiry
      </v-btn>
    </div>
    <!-- <v-dialog v-model="dialog" activator="parent" width="auto">
          <v-card> Contact us Email: contact@canrd.com QQ: 3003597584 / 2902385824 </v-card>
        </v-dialog> -->
    <div class="tw-pb-[64px] ma-4 rounded-lg">
      <v-tabs
        class="tabs"
        v-model="tab"
        bg-color="#fff"
        slider-color="#1d89e4"
        selected-class="active"
      >
        <v-tab :value="1">Product Details</v-tab>
        <v-tab :value="2">Specification</v-tab>
        <!-- <v-tab :value="3">商品百科</v-tab> -->
      </v-tabs>
      <v-window v-model="tab">
        <v-window-item key="1" :value="1">
          <div v-if="info.advantage" class="tw-mb-[24px]">
            <div class="py-2 pl-2 text-h6">Advantage</div>
            <v-divider class="tw-mb-[12px]"></v-divider>
            <div v-html="info.advantage"></div>
          </div>
          <div v-if="info.physicalproperty" class="tw-mb-[24px]">
            <div class="py-2 pl-2 text-h6">Physical Property</div>
            <v-divider class="tw-mb-[12px]"></v-divider>
            <div v-html="info.physicalproperty"></div>
          </div>
          <div v-if="info.advantage" class="tw-mb-[24px]">
            <div class="py-2 pl-2 text-h6">Storage</div>
            <v-divider class="tw-mb-[12px]"></v-divider>
            <div v-html="info.storage"></div>
          </div>
          <div v-if="info.introduction" class="tw-mb-[24px]">
            <div class="py-2 pl-2 text-h6">Introduction</div>
            <v-divider class="tw-mb-[12px]"></v-divider>
            <div v-html="info.introduction"></div>
          </div>
          <div v-if="info.advantage" class="tw-mb-[24px]">
            <div class="py-2 pl-2 text-h6">Description</div>
            <v-divider class="tw-mb-[12px]"></v-divider>
            <div v-html="info.description"></div>
          </div>
        </v-window-item>
        <v-window-item key="2" :value="2">
          <v-table density="compact" class="table2">
            <tbody>
              <tr class="tr" v-for="item in info.productAttributeList || []" :key="item.name">
                <td class="td tw-w-[400px]">{{ item.name }}</td>
                <td class="td">{{ item.value }}</td>
              </tr>
            </tbody>
          </v-table>
        </v-window-item>
        <!-- <v-window-item key="3" :value="3"> 2 </v-window-item> -->
      </v-window>
    </div>
  </v-container>
</template>

<script setup lang="ts">
import { getDetail } from '@/service'
import type { Product } from '@/type'
import type { ProductImage } from '@/type'
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import { useDialogStore } from '@/stores/dialog'
const dialogStore = useDialogStore()

const route = useRoute()
const info = ref<Partial<Product>>({
  productimageliststore: []
})

onMounted(() => {
  dialogStore.updateDialog(true)
  getDetail({ id: route.params.id as string }).then((res) => {
    const data = res.data.data || {}
    data.productimageliststore = (JSON.parse(data.productimageliststore) || []) as ProductImage[]
    data.productimageliststore = data.productimageliststore.map((item: ProductImage) => ({
      ...item,
      // url: `http://112.74.45.244:8100/api/show/image?fileKey=${item.fileKey}`
      url: `/api/show/image?fileKey=${item.fileKey}`
    }))
    info.value = data

    const doc = document as any
    const head = doc.getElementsByTagName('head')
    const meta = doc.createElement('meta')
    document.title = data.name
    doc
      .querySelector('meta[name="keywords"]')
      .setAttribute('content', data.metakeywords || data.name)
    doc
      .querySelector('meta[name="description"]')
      .setAttribute('content', data.metadescription || data.name)
    head[0].appendChild(meta)
  })
})

const tab = ref(0)
const slide = ref(0)
</script>

<style lang="scss" scoped>
.tabs {
  border-bottom: 2px solid #cbd9e4;
}
.active {
  background-color: #fff;
}
</style>