<template>
|
|
<div class="customer-reviews">
|
|
<div class="reviews-header">
|
|
<h2><i class="fas fa-comments"></i> 客户评价</h2>
|
|
<div class="separator"></div>
|
|
<p class="subtitle">真实的客户反馈,见证我们的专业服务</p>
|
|
</div>
|
|
|
|
<div class="reviews-container">
|
|
<div class="activity-feed">
|
|
<!-- 第一行活动 -->
|
|
<div class="activity-row">
|
|
<div class="activity-card" data-aos="fade-down-right">
|
|
<div class="user-activity-header">
|
|
<div class="user-avatar">
|
|
<img src="https://randomuser.me/api/portraits/men/32.jpg" alt="张总" />
|
|
</div>
|
|
<div class="activity-info">
|
|
<h4>张总 添加了 3 张照片</h4>
|
|
<p class="activity-time">57 分钟前</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-content">
|
|
<h3 class="place-name">星月楼</h3>
|
|
<p class="place-category">点心, 粤菜</p>
|
|
|
|
<div class="photos-grid">
|
|
<div class="photo-item">
|
|
<img src="https://via.placeholder.com/400x300/3498db/ffffff?text=菜品1" alt="菜品照片" />
|
|
</div>
|
|
<div class="photo-item">
|
|
<img src="https://via.placeholder.com/400x300/2ecc71/ffffff?text=菜品2" alt="菜品照片" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="action-buttons">
|
|
<button class="like-btn">
|
|
<i class="far fa-thumbs-up"></i>
|
|
</button>
|
|
<button class="like-btn">
|
|
<i class="far fa-thumbs-up"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<div class="view-all">
|
|
<a href="#">查看全部 3 张照片</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-card" data-aos="fade-down">
|
|
<div class="user-activity-header">
|
|
<div class="user-avatar">
|
|
<img src="https://randomuser.me/api/portraits/men/67.jpg" alt="王总监" />
|
|
</div>
|
|
<div class="activity-info">
|
|
<h4>王总监 添加了一张照片</h4>
|
|
<p class="activity-time">9 小时前</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-content">
|
|
<h3 class="place-name">天星维港游</h3>
|
|
<div class="rating">
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<span class="rating-count">3</span>
|
|
</div>
|
|
<p class="place-category">旅游</p>
|
|
|
|
<div class="photos-single">
|
|
<img src="https://via.placeholder.com/800x400/34495e/ffffff?text=维港夜景" alt="维港夜景" />
|
|
</div>
|
|
|
|
<div class="action-buttons">
|
|
<button class="like-btn">
|
|
<i class="far fa-thumbs-up"></i>
|
|
<span>5 赞</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-card" data-aos="fade-down-left">
|
|
<div class="user-activity-header">
|
|
<div class="user-avatar">
|
|
<img src="https://randomuser.me/api/portraits/women/44.jpg" alt="李经理" />
|
|
</div>
|
|
<div class="activity-info">
|
|
<h4>李经理 发表了评论</h4>
|
|
<p class="activity-time">1 天前</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-content">
|
|
<div class="review-photo">
|
|
<img src="https://via.placeholder.com/800x400/e74c3c/ffffff?text=美食照片" alt="美食照片" />
|
|
</div>
|
|
|
|
<h3 class="place-name">Belon</h3>
|
|
<div class="rating">
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
</div>
|
|
|
|
<p class="review-text">世界是一个美丽的地方,米其林星级餐厅Belon拥有杰出的厨师团队...</p>
|
|
<a href="#" class="read-more">阅读更多</a>
|
|
|
|
<div class="interaction-stats">
|
|
<div class="stat">
|
|
<i class="far fa-lightbulb"></i>
|
|
<span>7</span>
|
|
</div>
|
|
<div class="stat">
|
|
<i class="far fa-hand-point-up"></i>
|
|
<span>2</span>
|
|
</div>
|
|
<div class="stat">
|
|
<i class="far fa-heart"></i>
|
|
<span>4</span>
|
|
</div>
|
|
<div class="stat">
|
|
<i class="far fa-smile"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 第二行活动 -->
|
|
<div class="activity-row">
|
|
<div class="activity-card" data-aos="fade-up-right">
|
|
<div class="user-activity-header">
|
|
<div class="user-avatar">
|
|
<img src="https://randomuser.me/api/portraits/men/67.jpg" alt="王总监" />
|
|
</div>
|
|
<div class="activity-info">
|
|
<h4>王总监 添加了 4 张照片</h4>
|
|
<p class="activity-time">1 天前</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-content">
|
|
<h3 class="place-name">Belon</h3>
|
|
<div class="rating">
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star"></i>
|
|
<span class="rating-count">8</span>
|
|
</div>
|
|
<p class="place-category">法国菜</p>
|
|
|
|
<div class="photos-grid">
|
|
<div class="photo-item">
|
|
<img src="https://via.placeholder.com/400x300/e74c3c/ffffff?text=法式甜点" alt="法式甜点" />
|
|
</div>
|
|
<div class="photo-item">
|
|
<img src="https://via.placeholder.com/400x300/3498db/ffffff?text=主菜" alt="主菜" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="action-buttons">
|
|
<button class="like-btn">
|
|
<i class="far fa-thumbs-up"></i>
|
|
<span>9 赞</span>
|
|
</button>
|
|
<button class="like-btn">
|
|
<i class="far fa-thumbs-up"></i>
|
|
<span>9 赞</span>
|
|
</button>
|
|
</div>
|
|
|
|
<div class="view-all">
|
|
<a href="#">查看全部 4 张照片</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-card" data-aos="fade-up">
|
|
<div class="user-activity-header">
|
|
<div class="user-avatar">
|
|
<img src="https://randomuser.me/api/portraits/men/44.jpg" alt="刘先生" />
|
|
</div>
|
|
<div class="activity-info">
|
|
<h4>刘先生 发表了评论</h4>
|
|
<p class="activity-time">1 天前</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-content">
|
|
<div class="review-photo">
|
|
<img src="https://via.placeholder.com/800x400/1abc9c/ffffff?text=自助餐照片" alt="自助餐照片" />
|
|
</div>
|
|
|
|
<h3 class="place-name">The Place</h3>
|
|
<div class="rating">
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star"></i>
|
|
<i class="fas fa-star"></i>
|
|
<i class="fas fa-star"></i>
|
|
<i class="fas fa-star"></i>
|
|
</div>
|
|
|
|
<p class="review-text">对于748港币每位的自助餐,品质非常糟糕!不推荐来这个地方...</p>
|
|
<a href="#" class="read-more">阅读更多</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-card" data-aos="fade-up-left">
|
|
<div class="user-activity-header">
|
|
<div class="user-avatar">
|
|
<img src="https://randomuser.me/api/portraits/men/44.jpg" alt="刘先生" />
|
|
</div>
|
|
<div class="activity-info">
|
|
<h4>刘先生 添加了一张照片</h4>
|
|
<p class="activity-time">1 天前</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-content">
|
|
<h3 class="place-name">The Place</h3>
|
|
<div class="rating">
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star active"></i>
|
|
<i class="fas fa-star"></i>
|
|
<span class="rating-count">8</span>
|
|
</div>
|
|
<p class="place-category">$$ • 自助餐</p>
|
|
|
|
<div class="photos-single">
|
|
<img src="https://via.placeholder.com/800x400/f39c12/ffffff?text=自助餐厅" alt="自助餐厅" />
|
|
</div>
|
|
|
|
<div class="action-buttons">
|
|
<button class="like-btn">
|
|
<i class="far fa-thumbs-up"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 图片查看器 -->
|
|
<div v-if="showImageViewer" class="image-viewer-overlay" @click="closeImageViewer">
|
|
<div class="image-viewer-content">
|
|
<img :src="currentImage" alt="照片大图" />
|
|
<button class="close-btn" @click="closeImageViewer">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref, onMounted, onUnmounted } from 'vue'
|
|
|
|
// 响应式数据
|
|
const showImageViewer = ref(false)
|
|
const currentImage = ref('')
|
|
|
|
// 方法
|
|
const openImageViewer = (imageUrl) => {
|
|
currentImage.value = imageUrl
|
|
showImageViewer.value = true
|
|
}
|
|
|
|
const closeImageViewer = () => {
|
|
showImageViewer.value = false
|
|
currentImage.value = ''
|
|
}
|
|
|
|
// 生命周期
|
|
onMounted(() => {
|
|
// 初始化
|
|
})
|
|
|
|
onUnmounted(() => {
|
|
// 清理
|
|
})
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.customer-reviews {
|
|
padding: 80px 0;
|
|
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
|
|
}
|
|
|
|
.reviews-header {
|
|
text-align: center;
|
|
margin-bottom: 60px;
|
|
|
|
h2 {
|
|
font-size: 2.5rem;
|
|
color: #2c3e50;
|
|
margin-bottom: 20px;
|
|
font-weight: 700;
|
|
|
|
i {
|
|
color: #3498db;
|
|
margin-right: 15px;
|
|
}
|
|
}
|
|
|
|
.separator {
|
|
width: 80px;
|
|
height: 4px;
|
|
background: linear-gradient(90deg, #3498db, #2980b9);
|
|
margin: 0 auto 20px;
|
|
border-radius: 2px;
|
|
}
|
|
|
|
.subtitle {
|
|
font-size: 1.1rem;
|
|
color: #7f8c8d;
|
|
max-width: 600px;
|
|
margin: 0 auto;
|
|
line-height: 1.6;
|
|
}
|
|
}
|
|
|
|
.reviews-container {
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: 0 20px;
|
|
}
|
|
|
|
.activity-feed {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 30px;
|
|
}
|
|
|
|
.activity-row {
|
|
display: grid;
|
|
grid-template-columns: repeat(3, 1fr);
|
|
gap: 20px;
|
|
|
|
@media (max-width: 1024px) {
|
|
grid-template-columns: repeat(2, 1fr);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
|
|
.activity-card {
|
|
background: white;
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
border: 1px solid #e0e0e0;
|
|
}
|
|
|
|
.user-activity-header {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 15px;
|
|
border-bottom: 1px solid #f5f5f5;
|
|
}
|
|
|
|
.user-avatar {
|
|
width: 50px;
|
|
height: 50px;
|
|
border-radius: 50%;
|
|
overflow: hidden;
|
|
margin-right: 15px;
|
|
|
|
img {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
}
|
|
|
|
.activity-info {
|
|
h4 {
|
|
margin: 0;
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: #333;
|
|
}
|
|
|
|
.activity-time {
|
|
margin: 5px 0 0;
|
|
font-size: 14px;
|
|
color: #777;
|
|
}
|
|
}
|
|
|
|
.activity-content {
|
|
padding: 15px;
|
|
}
|
|
|
|
.place-name {
|
|
margin: 0 0 5px;
|
|
font-size: 20px;
|
|
font-weight: 600;
|
|
color: #333;
|
|
}
|
|
|
|
.place-category {
|
|
margin: 5px 0 15px;
|
|
font-size: 14px;
|
|
color: #666;
|
|
}
|
|
|
|
.rating {
|
|
margin-bottom: 10px;
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
.fa-star {
|
|
color: #ddd;
|
|
font-size: 18px;
|
|
margin-right: 2px;
|
|
|
|
&.active {
|
|
color: #f39c12;
|
|
}
|
|
}
|
|
|
|
.rating-count {
|
|
margin-left: 5px;
|
|
color: #666;
|
|
}
|
|
}
|
|
|
|
.photos-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(2, 1fr);
|
|
gap: 10px;
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.photos-single {
|
|
margin-bottom: 15px;
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
|
|
img {
|
|
width: 100%;
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
.photo-item {
|
|
aspect-ratio: 4/3;
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
|
|
img {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
}
|
|
|
|
.action-buttons {
|
|
display: flex;
|
|
margin-bottom: 10px;
|
|
|
|
.like-btn {
|
|
background: none;
|
|
border: none;
|
|
padding: 8px 12px;
|
|
margin-right: 10px;
|
|
cursor: pointer;
|
|
display: flex;
|
|
align-items: center;
|
|
color: #777;
|
|
|
|
i {
|
|
margin-right: 5px;
|
|
}
|
|
|
|
&:hover {
|
|
color: #3498db;
|
|
}
|
|
}
|
|
}
|
|
|
|
.view-all {
|
|
a {
|
|
color: #3498db;
|
|
text-decoration: none;
|
|
font-size: 14px;
|
|
|
|
&:hover {
|
|
text-decoration: underline;
|
|
}
|
|
}
|
|
}
|
|
|
|
.review-photo {
|
|
margin-bottom: 15px;
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
|
|
img {
|
|
width: 100%;
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
.review-text {
|
|
margin: 10px 0;
|
|
font-size: 15px;
|
|
color: #333;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.read-more {
|
|
color: #3498db;
|
|
text-decoration: none;
|
|
font-size: 14px;
|
|
display: inline-block;
|
|
margin-bottom: 15px;
|
|
|
|
&:hover {
|
|
text-decoration: underline;
|
|
}
|
|
}
|
|
|
|
.interaction-stats {
|
|
display: flex;
|
|
border-top: 1px solid #f5f5f5;
|
|
padding-top: 15px;
|
|
|
|
.stat {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-right: 20px;
|
|
color: #777;
|
|
|
|
i {
|
|
margin-right: 5px;
|
|
font-size: 16px;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 图片查看器样式
|
|
.image-viewer-overlay {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background: rgba(0, 0, 0, 0.9);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 1000;
|
|
}
|
|
|
|
.image-viewer-content {
|
|
position: relative;
|
|
max-width: 90vw;
|
|
max-height: 90vh;
|
|
|
|
img {
|
|
max-width: 100%;
|
|
max-height: 90vh;
|
|
object-fit: contain;
|
|
}
|
|
|
|
.close-btn {
|
|
position: absolute;
|
|
top: -40px;
|
|
right: 0;
|
|
background: none;
|
|
border: none;
|
|
color: white;
|
|
font-size: 24px;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
|
|
// 响应式设计
|
|
@media (max-width: 768px) {
|
|
.customer-reviews {
|
|
padding: 40px 0;
|
|
}
|
|
|
|
.reviews-header h2 {
|
|
font-size: 2rem;
|
|
}
|
|
}
|
|
</style>
|