<script setup>
|
|
import { ref, onMounted, computed, watch } from 'vue';
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
import PageHeader from '../../components/PageHeader.vue';
|
|
import { useCasesStore } from '@/stores/cases';
|
|
|
|
const route = useRoute();
|
|
const router = useRouter();
|
|
const { selectedCase } = useCasesStore();
|
|
|
|
// 获取案例ID
|
|
const caseId = computed(() => Number(route.params.id));
|
|
|
|
// 当前案例数据
|
|
const currentCase = ref(null);
|
|
|
|
// 默认的静态案例数据
|
|
const defaultCaseData = {
|
|
id: '1923006946802786306',
|
|
title: '智慧校园管理系统',
|
|
description: '为某知名高校开发的一体化校园管理系统,涵盖教学、行政、学生服务等多个模块',
|
|
imageUrl: 'https://images.unsplash.com/photo-1523240795612-9a054b0db644?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80',
|
|
categoryName: '企业系统',
|
|
categoryId: 1,
|
|
pdfUrl: '/docs/smart-campus-system.pdf',
|
|
designUrl: 'https://www.figma.com/file/smart-campus-design',
|
|
qrcodeUrl: '/images/smart-campus-qrcode.png',
|
|
gallery: [
|
|
{
|
|
imageUrl: 'https://images.unsplash.com/photo-1523050854058-8df90110c9f1?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80',
|
|
imageTitle: '系统主界面'
|
|
},
|
|
{
|
|
imageUrl: 'https://images.unsplash.com/photo-1562774053-701939374585?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80',
|
|
imageTitle: '移动端应用界面'
|
|
},
|
|
{
|
|
imageUrl: 'https://images.unsplash.com/photo-1577896851231-70ef18881754?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80',
|
|
imageTitle: '数据分析仪表盘'
|
|
}
|
|
]
|
|
};
|
|
|
|
// 获取案例详情
|
|
const getCaseDetail = async () => {
|
|
console.log('当前案例ID:', caseId.value);
|
|
console.log('所有案例:', selectedCase.value);
|
|
|
|
// 尝试从selectedCase中获取数据
|
|
if (selectedCase.value && selectedCase.value.length > 0) {
|
|
const currentCaseData = selectedCase.value[0];
|
|
console.log('使用的案例数据:', currentCaseData);
|
|
|
|
// 处理图片路径,如果是数组则取第一个
|
|
if (currentCaseData.imageUrl && typeof currentCaseData.imageUrl === 'string') {
|
|
currentCaseData.image = currentCaseData.imageUrl.split(',')[0];
|
|
}
|
|
|
|
currentCase.value = currentCaseData;
|
|
} else {
|
|
// 如果没有可用数据,使用默认的静态数据
|
|
console.log('使用默认的静态数据');
|
|
currentCase.value = defaultCaseData;
|
|
}
|
|
};
|
|
|
|
// 返回案例列表
|
|
const goBackToList = () => {
|
|
router.push('/cases');
|
|
};
|
|
|
|
// 监听路由参数变化
|
|
watch(() => route.params.id, () => {
|
|
getCaseDetail();
|
|
});
|
|
|
|
// 页面加载时获取数据
|
|
onMounted(() => {
|
|
getCaseDetail();
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<div v-if="currentCase" class="case-detail-page">
|
|
<!-- 页面头部 -->
|
|
<PageHeader
|
|
:title="currentCase.title"
|
|
:subtitle="currentCase.description"
|
|
:backgroundImage="currentCase.image || (currentCase.imageUrl && currentCase.imageUrl.split(',')[0])"
|
|
height="50vh">
|
|
<template #header-cta>
|
|
<div class="header-cta" data-aos="fade-up" data-aos-delay="200">
|
|
<button @click="goBackToList" class="btn-outline">
|
|
<i class="fas fa-arrow-left"></i> 返回案例列表
|
|
</button>
|
|
</div>
|
|
</template>
|
|
</PageHeader>
|
|
|
|
<!-- 案例资源链接 -->
|
|
<section class="case-resources">
|
|
<div class="container">
|
|
<div class="resources-grid">
|
|
<!-- PDF文档 -->
|
|
<div class="resource-item" v-if="currentCase.pdfUrl" data-aos="fade-up">
|
|
<div class="resource-icon">
|
|
<i class="fas fa-file-pdf"></i>
|
|
</div>
|
|
<h3>功能说明文档</h3>
|
|
<p>查看完整的项目功能说明文档</p>
|
|
<a :href="currentCase.pdfUrl" target="_blank" class="btn-primary">
|
|
查看文档
|
|
</a>
|
|
</div>
|
|
|
|
<!-- 设计稿链接 -->
|
|
<div class="resource-item" v-if="currentCase.designUrl" data-aos="fade-up" data-aos-delay="100">
|
|
<div class="resource-icon">
|
|
<i class="fas fa-paint-brush"></i>
|
|
</div>
|
|
<h3>设计稿</h3>
|
|
<p>浏览完整的项目设计方案</p>
|
|
<a :href="currentCase.designUrl" target="_blank" class="btn-primary">
|
|
查看设计
|
|
</a>
|
|
</div>
|
|
|
|
<!-- 小程序二维码 -->
|
|
<div class="resource-item" v-if="currentCase.qrcodeUrl" data-aos="fade-up" data-aos-delay="200">
|
|
<div class="resource-icon">
|
|
<i class="fas fa-qrcode"></i>
|
|
</div>
|
|
<h3>小程序体验</h3>
|
|
<p>扫码立即体验项目</p>
|
|
<img :src="currentCase.qrcodeUrl" alt="小程序二维码" class="qrcode-image">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 项目展示图片 -->
|
|
<section class="case-gallery" v-if="currentCase.gallery && currentCase.gallery.length > 0">
|
|
<div class="container">
|
|
<h3>设计展示</h3>
|
|
<div class="gallery-grid">
|
|
<div v-for="(image, index) in currentCase.gallery"
|
|
:key="index"
|
|
class="gallery-item"
|
|
data-aos="fade-up"
|
|
:data-aos-delay="index * 100">
|
|
<img :src="image.imageUrl" :alt="image.imageTitle">
|
|
<div class="image-caption">{{ image.imageTitle }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.case-detail-page {
|
|
background-color: #f8f9fa;
|
|
}
|
|
|
|
.case-resources {
|
|
padding: 60px 0;
|
|
background-color: white;
|
|
}
|
|
|
|
.resources-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
gap: 30px;
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
.resource-item {
|
|
text-align: center;
|
|
padding: 30px;
|
|
background: white;
|
|
border-radius: 12px;
|
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
transition: transform 0.3s ease;
|
|
}
|
|
|
|
.resource-item:hover {
|
|
transform: translateY(-5px);
|
|
}
|
|
|
|
.resource-icon {
|
|
font-size: 2.5rem;
|
|
color: #007bff;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.resource-item h3 {
|
|
margin-bottom: 10px;
|
|
color: #333;
|
|
}
|
|
|
|
.resource-item p {
|
|
color: #666;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.btn-primary {
|
|
display: inline-block;
|
|
padding: 10px 20px;
|
|
background-color: #007bff;
|
|
color: white;
|
|
border-radius: 6px;
|
|
text-decoration: none;
|
|
transition: background-color 0.3s ease;
|
|
}
|
|
|
|
.btn-primary:hover {
|
|
background-color: #0056b3;
|
|
}
|
|
|
|
.qrcode-image {
|
|
max-width: 200px;
|
|
margin: 0 auto;
|
|
border-radius: 8px;
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.case-gallery {
|
|
padding: 60px 0;
|
|
background-color: #f8f9fa;
|
|
}
|
|
|
|
.gallery-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
gap: 30px;
|
|
margin-top: 30px;
|
|
}
|
|
|
|
.gallery-item {
|
|
position: relative;
|
|
border-radius: 12px;
|
|
overflow: hidden;
|
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.gallery-item img {
|
|
width: 100%;
|
|
height: 250px;
|
|
object-fit: cover;
|
|
transition: transform 0.3s ease;
|
|
}
|
|
|
|
.gallery-item:hover img {
|
|
transform: scale(1.05);
|
|
}
|
|
|
|
.image-caption {
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
padding: 15px;
|
|
background: rgba(0, 0, 0, 0.7);
|
|
color: white;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.container {
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: 0 20px;
|
|
}
|
|
|
|
h3 {
|
|
text-align: center;
|
|
margin-bottom: 30px;
|
|
color: #333;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.resources-grid {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.gallery-grid {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.case-resources {
|
|
padding: 40px 0;
|
|
}
|
|
|
|
.case-gallery {
|
|
padding: 40px 0;
|
|
}
|
|
}
|
|
</style>
|