index.vue 2.8 KB
<template>
  <div
    v-for="(item, index) in cardList"
    :key="index"
    class="bg-white dark:bg-[#272929] rounded-xl shadow-md overflow-hidden hover:shadow-lg hover:translate-y-[-6px] transition-all duration-300"
  >
    <el-popconfirm
      v-if="item.isPopup == '1'"
      class="box-item"
      :title="item.popupContent"
      placement="top-start"
      icon-color="#5961f9"
      width="280"
      :icon="Promotion"
      confirm-button-text="确认前往"
      cancel-button-text="取消"
      @confirm="onConfirm(item.id)"
    >
      <template #reference>
        <a
          :href="config.public.baseUrl + '/site-details/' + item.id"
          target="_blank"
          @click.stop="onNuxtLink"
        >
          <div class="group p-3">
            <div class="flex items-start space-x-4">
              <img
                loading="lazy"
                :src="config.public.apiUrl + item.image"
                :alt="item.title"
                class="w-10 h-10 md:w-14 md:h-14 object-cover rounded-lg"
              />
              <div>
                <h3
                  class="font-bold dark:text-[#c6c9cf] md:text-base text-sm line-clamp-1 text-gray-800 transition group-hover:text-[#5961f9] dark:group-hover:text-white"
                >
                  {{ item.title }}
                </h3>
                <p
                  class="text-gray-600 dark:text-[#6c757d] text-xs mt-1 md:line-clamp-2 line-clamp-1"
                >
                  {{ item.description }}
                </p>
              </div>
            </div>
          </div>
        </a>
      </template>
    </el-popconfirm>
    <a
      v-else
      :href="config.public.baseUrl + '/site-details/' + item.id"
      target="_blank"
    >
      <div class="group p-3">
        <div class="flex items-start space-x-4">
          <img
            loading="lazy"
            :src="config.public.apiUrl + item.image"
            :alt="item.title"
            class="w-10 h-10 md:w-14 md:h-14 object-cover rounded-lg"
          />
          <div>
            <h3
              class="font-bold dark:text-[#c6c9cf] md:text-base text-sm line-clamp-1 text-gray-800 transition group-hover:text-[#5961f9] dark:group-hover:text-white"
            >
              {{ item.title }}
            </h3>
            <p
              class="text-gray-600 dark:text-[#6c757d] text-xs mt-1 md:line-clamp-2 line-clamp-1"
            >
              {{ item.description }}
            </p>
          </div>
        </div>
      </div>
    </a>
  </div>
</template>

<script lang="ts" setup>
import { Promotion } from "@element-plus/icons-vue";
defineProps<{
  cardList: any[];
}>();

const config = useRuntimeConfig();
// 阻止默认行为
function onNuxtLink(event: any) {
  event.preventDefault();
}
// 点击确认跳转
function onConfirm(id: number) {
  window.open(`/site-details/${id}`);
}
</script>