公司官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

603 lines
15 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. <template>
  2. <div class="customer-reviews">
  3. <div class="reviews-header">
  4. <h2><i class="fas fa-comments"></i> 客户评价</h2>
  5. <div class="separator"></div>
  6. <p class="subtitle">真实的客户反馈见证我们的专业服务</p>
  7. </div>
  8. <div class="reviews-container">
  9. <div class="activity-feed">
  10. <!-- 第一行活动 -->
  11. <div class="activity-row">
  12. <div class="activity-card" data-aos="fade-down-right">
  13. <div class="user-activity-header">
  14. <div class="user-avatar">
  15. <img src="https://randomuser.me/api/portraits/men/32.jpg" alt="张总" />
  16. </div>
  17. <div class="activity-info">
  18. <h4>张总 添加了 3 张照片</h4>
  19. <p class="activity-time">57 分钟前</p>
  20. </div>
  21. </div>
  22. <div class="activity-content">
  23. <h3 class="place-name">星月楼</h3>
  24. <p class="place-category">点心, 粤菜</p>
  25. <div class="photos-grid">
  26. <div class="photo-item">
  27. <img src="https://via.placeholder.com/400x300/3498db/ffffff?text=菜品1" alt="菜品照片" />
  28. </div>
  29. <div class="photo-item">
  30. <img src="https://via.placeholder.com/400x300/2ecc71/ffffff?text=菜品2" alt="菜品照片" />
  31. </div>
  32. </div>
  33. <div class="action-buttons">
  34. <button class="like-btn">
  35. <i class="far fa-thumbs-up"></i>
  36. </button>
  37. <button class="like-btn">
  38. <i class="far fa-thumbs-up"></i>
  39. </button>
  40. </div>
  41. <div class="view-all">
  42. <a href="#">查看全部 3 张照片</a>
  43. </div>
  44. </div>
  45. </div>
  46. <div class="activity-card" data-aos="fade-down">
  47. <div class="user-activity-header">
  48. <div class="user-avatar">
  49. <img src="https://randomuser.me/api/portraits/men/67.jpg" alt="王总监" />
  50. </div>
  51. <div class="activity-info">
  52. <h4>王总监 添加了一张照片</h4>
  53. <p class="activity-time">9 小时前</p>
  54. </div>
  55. </div>
  56. <div class="activity-content">
  57. <h3 class="place-name">天星维港游</h3>
  58. <div class="rating">
  59. <i class="fas fa-star active"></i>
  60. <i class="fas fa-star active"></i>
  61. <i class="fas fa-star active"></i>
  62. <i class="fas fa-star active"></i>
  63. <i class="fas fa-star active"></i>
  64. <span class="rating-count">3</span>
  65. </div>
  66. <p class="place-category">旅游</p>
  67. <div class="photos-single">
  68. <img src="https://via.placeholder.com/800x400/34495e/ffffff?text=维港夜景" alt="维港夜景" />
  69. </div>
  70. <div class="action-buttons">
  71. <button class="like-btn">
  72. <i class="far fa-thumbs-up"></i>
  73. <span>5 </span>
  74. </button>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="activity-card" data-aos="fade-down-left">
  79. <div class="user-activity-header">
  80. <div class="user-avatar">
  81. <img src="https://randomuser.me/api/portraits/women/44.jpg" alt="李经理" />
  82. </div>
  83. <div class="activity-info">
  84. <h4>李经理 发表了评论</h4>
  85. <p class="activity-time">1 天前</p>
  86. </div>
  87. </div>
  88. <div class="activity-content">
  89. <div class="review-photo">
  90. <img src="https://via.placeholder.com/800x400/e74c3c/ffffff?text=美食照片" alt="美食照片" />
  91. </div>
  92. <h3 class="place-name">Belon</h3>
  93. <div class="rating">
  94. <i class="fas fa-star active"></i>
  95. <i class="fas fa-star active"></i>
  96. <i class="fas fa-star active"></i>
  97. <i class="fas fa-star active"></i>
  98. <i class="fas fa-star active"></i>
  99. </div>
  100. <p class="review-text">世界是一个美丽的地方米其林星级餐厅Belon拥有杰出的厨师团队...</p>
  101. <a href="#" class="read-more">阅读更多</a>
  102. <div class="interaction-stats">
  103. <div class="stat">
  104. <i class="far fa-lightbulb"></i>
  105. <span>7</span>
  106. </div>
  107. <div class="stat">
  108. <i class="far fa-hand-point-up"></i>
  109. <span>2</span>
  110. </div>
  111. <div class="stat">
  112. <i class="far fa-heart"></i>
  113. <span>4</span>
  114. </div>
  115. <div class="stat">
  116. <i class="far fa-smile"></i>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. <!-- 第二行活动 -->
  123. <div class="activity-row">
  124. <div class="activity-card" data-aos="fade-up-right">
  125. <div class="user-activity-header">
  126. <div class="user-avatar">
  127. <img src="https://randomuser.me/api/portraits/men/67.jpg" alt="王总监" />
  128. </div>
  129. <div class="activity-info">
  130. <h4>王总监 添加了 4 张照片</h4>
  131. <p class="activity-time">1 天前</p>
  132. </div>
  133. </div>
  134. <div class="activity-content">
  135. <h3 class="place-name">Belon</h3>
  136. <div class="rating">
  137. <i class="fas fa-star active"></i>
  138. <i class="fas fa-star active"></i>
  139. <i class="fas fa-star active"></i>
  140. <i class="fas fa-star active"></i>
  141. <i class="fas fa-star"></i>
  142. <span class="rating-count">8</span>
  143. </div>
  144. <p class="place-category">法国菜</p>
  145. <div class="photos-grid">
  146. <div class="photo-item">
  147. <img src="https://via.placeholder.com/400x300/e74c3c/ffffff?text=法式甜点" alt="法式甜点" />
  148. </div>
  149. <div class="photo-item">
  150. <img src="https://via.placeholder.com/400x300/3498db/ffffff?text=主菜" alt="主菜" />
  151. </div>
  152. </div>
  153. <div class="action-buttons">
  154. <button class="like-btn">
  155. <i class="far fa-thumbs-up"></i>
  156. <span>9 </span>
  157. </button>
  158. <button class="like-btn">
  159. <i class="far fa-thumbs-up"></i>
  160. <span>9 </span>
  161. </button>
  162. </div>
  163. <div class="view-all">
  164. <a href="#">查看全部 4 张照片</a>
  165. </div>
  166. </div>
  167. </div>
  168. <div class="activity-card" data-aos="fade-up">
  169. <div class="user-activity-header">
  170. <div class="user-avatar">
  171. <img src="https://randomuser.me/api/portraits/men/44.jpg" alt="刘先生" />
  172. </div>
  173. <div class="activity-info">
  174. <h4>刘先生 发表了评论</h4>
  175. <p class="activity-time">1 天前</p>
  176. </div>
  177. </div>
  178. <div class="activity-content">
  179. <div class="review-photo">
  180. <img src="https://via.placeholder.com/800x400/1abc9c/ffffff?text=自助餐照片" alt="自助餐照片" />
  181. </div>
  182. <h3 class="place-name">The Place</h3>
  183. <div class="rating">
  184. <i class="fas fa-star active"></i>
  185. <i class="fas fa-star"></i>
  186. <i class="fas fa-star"></i>
  187. <i class="fas fa-star"></i>
  188. <i class="fas fa-star"></i>
  189. </div>
  190. <p class="review-text">对于748港币每位的自助餐品质非常糟糕不推荐来这个地方...</p>
  191. <a href="#" class="read-more">阅读更多</a>
  192. </div>
  193. </div>
  194. <div class="activity-card" data-aos="fade-up-left">
  195. <div class="user-activity-header">
  196. <div class="user-avatar">
  197. <img src="https://randomuser.me/api/portraits/men/44.jpg" alt="刘先生" />
  198. </div>
  199. <div class="activity-info">
  200. <h4>刘先生 添加了一张照片</h4>
  201. <p class="activity-time">1 天前</p>
  202. </div>
  203. </div>
  204. <div class="activity-content">
  205. <h3 class="place-name">The Place</h3>
  206. <div class="rating">
  207. <i class="fas fa-star active"></i>
  208. <i class="fas fa-star active"></i>
  209. <i class="fas fa-star active"></i>
  210. <i class="fas fa-star active"></i>
  211. <i class="fas fa-star"></i>
  212. <span class="rating-count">8</span>
  213. </div>
  214. <p class="place-category">$$ 自助餐</p>
  215. <div class="photos-single">
  216. <img src="https://via.placeholder.com/800x400/f39c12/ffffff?text=自助餐厅" alt="自助餐厅" />
  217. </div>
  218. <div class="action-buttons">
  219. <button class="like-btn">
  220. <i class="far fa-thumbs-up"></i>
  221. </button>
  222. </div>
  223. </div>
  224. </div>
  225. </div>
  226. </div>
  227. </div>
  228. <!-- 图片查看器 -->
  229. <div v-if="showImageViewer" class="image-viewer-overlay" @click="closeImageViewer">
  230. <div class="image-viewer-content">
  231. <img :src="currentImage" alt="照片大图" />
  232. <button class="close-btn" @click="closeImageViewer">
  233. <i class="fas fa-times"></i>
  234. </button>
  235. </div>
  236. </div>
  237. </div>
  238. </template>
  239. <script setup>
  240. import { ref, onMounted, onUnmounted } from 'vue'
  241. // 响应式数据
  242. const showImageViewer = ref(false)
  243. const currentImage = ref('')
  244. // 方法
  245. const openImageViewer = (imageUrl) => {
  246. currentImage.value = imageUrl
  247. showImageViewer.value = true
  248. }
  249. const closeImageViewer = () => {
  250. showImageViewer.value = false
  251. currentImage.value = ''
  252. }
  253. // 生命周期
  254. onMounted(() => {
  255. // 初始化
  256. })
  257. onUnmounted(() => {
  258. // 清理
  259. })
  260. </script>
  261. <style lang="scss" scoped>
  262. .customer-reviews {
  263. padding: 80px 0;
  264. background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
  265. }
  266. .reviews-header {
  267. text-align: center;
  268. margin-bottom: 60px;
  269. h2 {
  270. font-size: 2.5rem;
  271. color: #2c3e50;
  272. margin-bottom: 20px;
  273. font-weight: 700;
  274. i {
  275. color: #3498db;
  276. margin-right: 15px;
  277. }
  278. }
  279. .separator {
  280. width: 80px;
  281. height: 4px;
  282. background: linear-gradient(90deg, #3498db, #2980b9);
  283. margin: 0 auto 20px;
  284. border-radius: 2px;
  285. }
  286. .subtitle {
  287. font-size: 1.1rem;
  288. color: #7f8c8d;
  289. max-width: 600px;
  290. margin: 0 auto;
  291. line-height: 1.6;
  292. }
  293. }
  294. .reviews-container {
  295. max-width: 1200px;
  296. margin: 0 auto;
  297. padding: 0 20px;
  298. }
  299. .activity-feed {
  300. display: flex;
  301. flex-direction: column;
  302. gap: 30px;
  303. }
  304. .activity-row {
  305. display: grid;
  306. grid-template-columns: repeat(3, 1fr);
  307. gap: 20px;
  308. @media (max-width: 1024px) {
  309. grid-template-columns: repeat(2, 1fr);
  310. }
  311. @media (max-width: 768px) {
  312. grid-template-columns: 1fr;
  313. }
  314. }
  315. .activity-card {
  316. background: white;
  317. border-radius: 8px;
  318. overflow: hidden;
  319. box-shadow: 0 1px 3px rgba(0,0,0,0.1);
  320. border: 1px solid #e0e0e0;
  321. }
  322. .user-activity-header {
  323. display: flex;
  324. align-items: center;
  325. padding: 15px;
  326. border-bottom: 1px solid #f5f5f5;
  327. }
  328. .user-avatar {
  329. width: 50px;
  330. height: 50px;
  331. border-radius: 50%;
  332. overflow: hidden;
  333. margin-right: 15px;
  334. img {
  335. width: 100%;
  336. height: 100%;
  337. object-fit: cover;
  338. }
  339. }
  340. .activity-info {
  341. h4 {
  342. margin: 0;
  343. font-size: 16px;
  344. font-weight: 600;
  345. color: #333;
  346. }
  347. .activity-time {
  348. margin: 5px 0 0;
  349. font-size: 14px;
  350. color: #777;
  351. }
  352. }
  353. .activity-content {
  354. padding: 15px;
  355. }
  356. .place-name {
  357. margin: 0 0 5px;
  358. font-size: 20px;
  359. font-weight: 600;
  360. color: #333;
  361. }
  362. .place-category {
  363. margin: 5px 0 15px;
  364. font-size: 14px;
  365. color: #666;
  366. }
  367. .rating {
  368. margin-bottom: 10px;
  369. display: flex;
  370. align-items: center;
  371. .fa-star {
  372. color: #ddd;
  373. font-size: 18px;
  374. margin-right: 2px;
  375. &.active {
  376. color: #f39c12;
  377. }
  378. }
  379. .rating-count {
  380. margin-left: 5px;
  381. color: #666;
  382. }
  383. }
  384. .photos-grid {
  385. display: grid;
  386. grid-template-columns: repeat(2, 1fr);
  387. gap: 10px;
  388. margin-bottom: 15px;
  389. }
  390. .photos-single {
  391. margin-bottom: 15px;
  392. border-radius: 8px;
  393. overflow: hidden;
  394. img {
  395. width: 100%;
  396. display: block;
  397. }
  398. }
  399. .photo-item {
  400. aspect-ratio: 4/3;
  401. border-radius: 8px;
  402. overflow: hidden;
  403. img {
  404. width: 100%;
  405. height: 100%;
  406. object-fit: cover;
  407. }
  408. }
  409. .action-buttons {
  410. display: flex;
  411. margin-bottom: 10px;
  412. .like-btn {
  413. background: none;
  414. border: none;
  415. padding: 8px 12px;
  416. margin-right: 10px;
  417. cursor: pointer;
  418. display: flex;
  419. align-items: center;
  420. color: #777;
  421. i {
  422. margin-right: 5px;
  423. }
  424. &:hover {
  425. color: #3498db;
  426. }
  427. }
  428. }
  429. .view-all {
  430. a {
  431. color: #3498db;
  432. text-decoration: none;
  433. font-size: 14px;
  434. &:hover {
  435. text-decoration: underline;
  436. }
  437. }
  438. }
  439. .review-photo {
  440. margin-bottom: 15px;
  441. border-radius: 8px;
  442. overflow: hidden;
  443. img {
  444. width: 100%;
  445. display: block;
  446. }
  447. }
  448. .review-text {
  449. margin: 10px 0;
  450. font-size: 15px;
  451. color: #333;
  452. line-height: 1.5;
  453. }
  454. .read-more {
  455. color: #3498db;
  456. text-decoration: none;
  457. font-size: 14px;
  458. display: inline-block;
  459. margin-bottom: 15px;
  460. &:hover {
  461. text-decoration: underline;
  462. }
  463. }
  464. .interaction-stats {
  465. display: flex;
  466. border-top: 1px solid #f5f5f5;
  467. padding-top: 15px;
  468. .stat {
  469. display: flex;
  470. align-items: center;
  471. margin-right: 20px;
  472. color: #777;
  473. i {
  474. margin-right: 5px;
  475. font-size: 16px;
  476. }
  477. }
  478. }
  479. // 图片查看器样式
  480. .image-viewer-overlay {
  481. position: fixed;
  482. top: 0;
  483. left: 0;
  484. right: 0;
  485. bottom: 0;
  486. background: rgba(0, 0, 0, 0.9);
  487. display: flex;
  488. align-items: center;
  489. justify-content: center;
  490. z-index: 1000;
  491. }
  492. .image-viewer-content {
  493. position: relative;
  494. max-width: 90vw;
  495. max-height: 90vh;
  496. img {
  497. max-width: 100%;
  498. max-height: 90vh;
  499. object-fit: contain;
  500. }
  501. .close-btn {
  502. position: absolute;
  503. top: -40px;
  504. right: 0;
  505. background: none;
  506. border: none;
  507. color: white;
  508. font-size: 24px;
  509. cursor: pointer;
  510. }
  511. }
  512. // 响应式设计
  513. @media (max-width: 768px) {
  514. .customer-reviews {
  515. padding: 40px 0;
  516. }
  517. .reviews-header h2 {
  518. font-size: 2rem;
  519. }
  520. }
  521. </style>