123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <template>
- <div class="py-8">
- <div class="container-custom">
- <h1 class="text-3xl font-bold mb-8">{{ $t('faq.title') }}</h1>
-
- <div class="mb-8">
- <div class="relative">
- <input
- type="text"
- v-model="searchQuery"
- :placeholder="$t('faq.searchPlaceholder')"
- class="w-full px-4 py-3 border border-gray-300 rounded-md pl-10 focus:outline-none focus:ring-2 focus:ring-blue-500"
- />
- <div class="absolute left-3 top-3 text-gray-400">
- <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
- </svg>
- </div>
- </div>
- </div>
-
- <ErrorBoundary :error="error">
- <div v-if="isLoading" class="flex justify-center py-12">
- <!-- 加载中 -->
- <div class="animate-spin h-8 w-8 border-4 border-blue-500 rounded-full border-t-transparent"></div>
- </div>
-
- <div v-else>
- <div v-if="filteredFaqs.length === 0" class="bg-yellow-50 border border-yellow-200 text-yellow-800 p-4 rounded-md">
- 没有找到匹配的问题,请尝试其他关键词。
- </div>
-
- <div v-else class="space-y-6">
- <div v-for="faq in filteredFaqs" :key="faq.id" class="bg-white border border-gray-200 rounded-lg overflow-hidden hover:shadow-md transition-shadow">
- <div class="p-6">
- <NuxtLink :to="`/faq/${faq.id}`" class="block">
- <h2 class="text-xl font-semibold mb-2 text-blue-700 hover:text-blue-800">{{ faq.question }}</h2>
- <p class="text-gray-600 line-clamp-2">{{ faq.answer }}</p>
- <div class="mt-4 flex items-center text-blue-600">
- <span class="text-sm font-medium">阅读全文</span>
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
- </svg>
- </div>
- </NuxtLink>
- </div>
- </div>
- </div>
- </div>
- </ErrorBoundary>
- </div>
- </div>
- </template>
-
- <script setup lang="ts">
- /**
- * FAQ列表页面
- * 展示所有常见问题并支持搜索
- */
- import { ref, computed, onMounted } from 'vue';
- import { useErrorHandler } from '~/composables/useErrorHandler';
-
- // FAQ接口定义
- interface Faq {
- id: number;
- question: string;
- answer: string;
- category: string;
- }
-
- const { error, isLoading, wrapAsync } = useErrorHandler();
- const faqs = ref<Faq[]>([]);
- const searchQuery = ref('');
-
- /**
- * 根据搜索条件过滤FAQ
- */
- const filteredFaqs = computed(() => {
- if (!searchQuery.value.trim()) return faqs.value;
-
- const query = searchQuery.value.toLowerCase();
- return faqs.value.filter(faq =>
- faq.question.toLowerCase().includes(query) ||
- faq.answer.toLowerCase().includes(query)
- );
- });
-
- /**
- * 加载FAQ数据
- */
- async function loadFaqs() {
- await wrapAsync(async () => {
- // 模拟API请求延迟
- await new Promise(resolve => setTimeout(resolve, 500));
-
- // 模拟数据,实际项目中应从API获取
- faqs.value = [
- {
- id: 1,
- question: '如何使用产品?',
- answer: '我们的产品设计简单直观,开箱即用。首先,打开包装并检查所有配件是否齐全。然后,按照说明书的步骤进行安装。如有任何问题,可以观看我们网站上的视频教程或联系客服。',
- category: '使用指南'
- },
- {
- id: 2,
- question: '产品有哪些保修政策?',
- answer: '我们为所有产品提供1年的标准保修服务,覆盖制造缺陷和材料问题。部分高端产品可享受最长3年的延长保修服务。保修期内,我们提供免费维修或更换服务。请注意,人为损坏、不当使用或自行拆卸不在保修范围内。',
- category: '售后服务'
- },
- {
- id: 3,
- question: '如何进行退换货?',
- answer: '购买后30天内,如产品未使用且包装完好,可申请无理由退换货。请保留原始包装和购买凭证,联系我们的客服团队安排退换事宜。退款将在收到退回产品并确认状态后的7个工作日内处理。',
- category: '售后服务'
- },
- {
- id: 4,
- question: '产品支持哪些操作系统?',
- answer: '我们的软件产品兼容Windows 10/11、macOS 10.15及以上版本、iOS 14及以上版本和Android 10及以上版本。硬件产品与大多数现代设备兼容,具体请查看产品详情页的技术规格部分。',
- category: '技术支持'
- },
- {
- id: 5,
- question: '如何联系客服?',
- answer: '您可以通过多种方式联系我们的客服团队:拨打服务热线400-123-4567(工作日9:00-18:00);发送邮件至support@example.com(24小时内回复);在官网使用在线客服(工作日9:00-20:00);或填写联系表单,我们会尽快与您联系。',
- category: '联系方式'
- },
- {
- id: 6,
- question: '是否提供国际配送服务?',
- answer: '是的,我们提供国际配送服务,覆盖大部分国家和地区。国际订单的配送时间通常为7-15个工作日,具体取决于目的地和当地海关情况。国际订单可能产生额外的关税和进口费用,这些费用需由收件人承担。',
- category: '配送信息'
- }
- ];
-
- return faqs.value;
- });
- }
-
- // 页面加载时获取FAQ数据
- onMounted(() => {
- loadFaqs();
- });
-
- // SEO优化
- useHead({
- title: '常见问题 - Hanye',
- meta: [
- { name: 'description', content: '浏览我们的常见问题解答,获取产品使用指南、技术支持和售后服务等相关信息。' }
- ]
- });
- </script>
-
- <style scoped>
- .line-clamp-2 {
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
- }
- </style>
|