SyuanYu 10 месяцев назад
Родитель
Сommit
7bc9ba4d21

+ 1 - 0
builder/detail/img/loading.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="40" height="41.965" viewBox="0 0 40 41.965"><defs><style>.a{fill:#ee751b;}</style></defs><circle class="a" cx="4.89" cy="4.89" r="4.89" transform="translate(16.094)"/><ellipse class="a" cx="2.933" cy="2.933" rx="2.933" ry="2.933" transform="translate(18.05 36.099)"/><ellipse class="a" cx="4.401" cy="4.401" rx="4.401" ry="4.401" transform="translate(4.487 5.464)"/><circle class="a" cx="2.445" cy="2.445" r="2.445" transform="translate(30.626 31.609)"/><ellipse class="a" cx="3.911" cy="3.911" rx="3.911" ry="3.911" transform="translate(0 18.056)"/><circle class="a" cx="1.955" cy="1.955" r="1.955" transform="translate(36.091 20.01)"/><path class="a" d="M5.065,20.213a3.422,3.422,0,1,0,4.839,0A3.419,3.419,0,0,0,5.065,20.213Z" transform="translate(1.403 11.424)"/><ellipse class="a" cx="1.466" cy="1.466" rx="1.466" ry="1.466" transform="translate(31.603 8.434)"/></svg>

+ 18 - 11
builder/detail/index.html

@@ -16,30 +16,31 @@
   <script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-W3RJHTZ"></script>
   <!-- <script src="https://connect.facebook.net/signals/config/585285442299590?v=2.9.100&amp;r=stable" async=""></script> -->
 
+  <title>幸福空間 - 室內設計、裝潢、居家生活、影音平台</title>
+
   <meta charset="UTF-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <meta http-equiv="X-UA-Compatible" content="ie=edge, Chrome=1" />
   <meta http-equiv="Cache-Control" content="no-cache" />
   <meta name="copyright" content="2021 © 幸福空間 │ All Rights Reserved." />
   <meta name="creation-date" content="2021-08-05 12:00:04 GTM+8" />
-  <meta name="description" content="讓幸福室內設計,走進您的生活,解決您的裝潢問
-    題!幸福空間是台灣最大的室內設計、設計師與設計個案影音平台之一,找尋室內設計點子與案例我
-    們一定能幫助你!" />
+  <meta name="description" content="" />
   <meta name="distribution" content="Taiwan" />
   <meta name="keywords" content="" />
   <meta name="revisit-after" content="1 days" />
   <meta name="robots" content="all" />
   <meta name="format-detection" content="telephone=no" />
-
-  <meta property="og:description" content="讓幸福室內設計,走進您的生活,解決您的裝潢問題!
-    幸福空間是台灣最大的室內設計、設計師與設計個案影音平台之一,找尋室內設計點子與案例我們一定能幫助
-    你!" />
+  <meta property="og:description" content="" />
   <meta property="og:site_name" content="幸福空間" />
   <meta property="og:title" content="幸福空間 - 台灣最大的室內設計、設計師與設計個案影音平台" />
   <meta property="og:type" content="website" />
   <meta property="og:locale" content="zh_TW" />
-
-  <title>幸福空間 - 室內設計、裝潢、居家生活、影音平台</title>
+  <meta name="twitter:card" content="summary">
+  <meta name="twitter:site" content="@幸福空間">
+  <meta name="twitter:title" content="幸福空間">
+  <meta name="twitter:description" content="">
+  <meta name="twitter:creator" content="幸福空間">
+  <meta name="twitter:image" content="https://hhh.com.tw/images/logo-232x44.png">
 
   <link rel="icon" href="../../img/favicon.ico" />
 
@@ -63,8 +64,8 @@
   <link href="https://cdn.jsdelivr.net/npm/lightgallery@2.7.0/css/lightgallery-bundle.min.css" rel="stylesheet">
   <!-- CSS -->
   <link rel="stylesheet" href="../../css/reset.css" />
-  <link rel="stylesheet" href="../../css/detail.css" />
   <link rel="stylesheet" href="../../css/all.css" />
+  <link rel="stylesheet" href="../../css/detail.css" />
   </script>
 </head>
 
@@ -110,7 +111,7 @@
           <!-- <div class="slider-list" id="lightgallery">
           </div> -->
 
-          <div class="swiper mySwiper" id="lightgallery">
+          <div class="swiper swiper-list" id="lightgallery">
             <div class="swiper-wrapper slider-list">
               <!-- 輪播 -->
             </div>
@@ -224,10 +225,16 @@
             <div class="row" data-masonry='{"percentPosition": true }'>
             </div>
           </div>
+
+          <!-- 讀取圖示 -->
+          <div class="my-5 spinners">
+            <img src="./img/loading.svg" alt="" class="d-flex mx-auto">
+          </div>
         </div>
       </div>
     </div>
   </div>
+  </div>
 
   <!-- 建案影片 Modal -->
   <div class="modal fade" id="videoModal" tabindex="-1" aria-labelledby="videoModalLabel" aria-hidden="true">

+ 205 - 152
builder/detail/js/main.js

@@ -9,141 +9,153 @@ let pageSize = 18; // 每頁數量
 let isFirstLoad = true; // 初始載入
 
 // 列表篩選
-async function dataSearch(type = "") {
-  let url;
-  $('#builderSpinner').show();
-  $('#builderList').hide();
-
-  if (isFirstLoad) {
-    // 第一次載入使用本地 JSON 文件
-    // url = './json/designers_lists_data.json';
-    url = `https://m3.hhh.com.tw:18673/builder_search?page=${page}&page_size=${pageSize}`;
-  } else {
-    // 後續使用 API (預設排序為 recommend)
-    url = `https://m3.hhh.com.tw:18673/builder_search?page=${page}&page_size=${pageSize}`;
-
-    let input = $(".keywords").val();
-
-    if (input !== "") {
-      let isExist = filterList.some((item) => item.id === "keyword"); // 判斷是否已存在關鍵字
-
-      const newItem = {
-        id: "keyword",
-        text: "關鍵字",
-        value: input
-      };
-
-      if (!isExist) {
-        filterList.push(newItem);
-        createFilterHtml(newItem);
-      } else {
-        // 移除原本關鍵字
-        $('.budget p.me-1').each(function () {
-          if ($(this).text().includes('關鍵字')) {
-            $(this).closest('.me-3').remove();
-          }
-        });
-
-        if (filterList.length === 0) {
-          $('#removeResultBtn').hide();
-        }
-
-        filterList = filterList.filter(item => item.text !== "關鍵字");
-
-        filterList.push(newItem);
-        createFilterHtml(newItem);
-
-      }
-      $(".keywords").val("")
-      // url += `&keyword=${input}`;
-    }
-
-    if (filterList.length) {
-      filterList.map(item => {
-        url += `&${item.id}=${item.value}`;
-      });
-    }
-  }
-
-  try {
-    const response = await axios.get(url);
-    console.log('response.data', response.data);
-    // console.log('response.data.videos', response.data.videos);
-
-    let totalCount = response.data.total_count;
-    let totalPages = Math.ceil(totalCount / pageSize);
-
-    $("#totalCount").html(totalCount);
-
-    if (totalPages) {
-      $('.filter-list .pagination').show();
-      setPagination(totalPages); // 分頁處理
-    } else {
-      $('.filter-list .pagination').hide();
-    }
-
-    let resultHtml = '';
-
-    if (response.data.videos.length) {
-      response.data.videos.forEach((item) => {
-        resultHtml += `
-          <div class="col-md-4 mb-4">
-            <a href="${item.DesignerLink}">
-              <div class="card lists-card">
-                <div class="position-relative">
-                  <img src="../../img/icon/play.svg" class="play-img${item.Is_video === '0' ? ' d-none' : ''}" alt="play-img">
-                    <img src="${item.BuilderCoverImg}" class="cover-img" alt="${item.BuilderTitle}">
-                    </div>
-                    <div class="card-body p-4">
-                      <section>
-                        <h5 class="text-dark">${item.BuilderTitle}</h5>
-                        <p class="text-dark my-3">${item.BuilderDescr}</p>
-                        <h6 class="mb-0 text-muted fw-normal">
-                          ${item.BuilderAddress}
-                        </h6>
-                      </section>
-                    </div>
-                </div>
-            </a>
-          </div>`;
-      });
-    } else {
-      resultHtml += "<p class='text-center mt-5'>找不到符合的資料,請重新搜尋。</p>"
-    }
-
-    $('#builderList').html(resultHtml);
-
-    setTimeout(() => {
-      $('#builderList').show();
-      $('#builderSpinner').hide();
-    }, 100)
-
-    // 更新初始載入狀態
-    if (isFirstLoad) {
-      isFirstLoad = false;
-    }
-  } catch (error) {
-    console.log("error", error);
-  }
-}
-
-dataSearch();
+// async function dataSearch(type = "") {
+//   let url;
+//   $('#builderSpinner').show();
+//   $('#builderList').hide();
+
+//   if (isFirstLoad) {
+//     // 第一次載入使用本地 JSON 文件
+//     // url = './json/designers_lists_data.json';
+//     url = `https://m3.hhh.com.tw:18673/builder_search?page=${page}&page_size=${pageSize}`;
+//   } else {
+//     // 後續使用 API
+//     url = `https://m3.hhh.com.tw:18673/builder_search?page=${page}&page_size=${pageSize}`;
+
+//     let input = $(".keywords").val();
+
+//     if (input !== "") {
+//       let isExist = filterList.some((item) => item.id === "keyword"); // 判斷是否已存在關鍵字
+
+//       const newItem = {
+//         id: "keyword",
+//         text: "關鍵字",
+//         value: input
+//       };
+
+//       if (!isExist) {
+//         filterList.push(newItem);
+//         createFilterHtml(newItem);
+//       } else {
+//         // 移除原本關鍵字
+//         $('.budget p.me-1').each(function () {
+//           if ($(this).text().includes('關鍵字')) {
+//             $(this).closest('.me-3').remove();
+//           }
+//         });
+
+//         if (filterList.length === 0) {
+//           $('#removeResultBtn').hide();
+//         }
+
+//         filterList = filterList.filter(item => item.text !== "關鍵字");
+
+//         filterList.push(newItem);
+//         createFilterHtml(newItem);
+
+//       }
+//       $(".keywords").val("")
+//       // url += `&keyword=${input}`;
+//     }
+
+//     if (filterList.length) {
+//       filterList.map(item => {
+//         url += `&${item.id}=${item.value}`;
+//       });
+//     }
+//   }
+
+//   try {
+//     const response = await axios.get(url);
+//     console.log('response.data', response.data);
+//     // console.log('response.data.videos', response.data.videos);
+
+//     let totalCount = response.data.total_count;
+//     let totalPages = Math.ceil(totalCount / pageSize);
+
+//     $("#totalCount").html(totalCount);
+
+//     if (totalPages) {
+//       $('.filter-list .pagination').show();
+//       setPagination(totalPages); // 分頁處理
+//     } else {
+//       $('.filter-list .pagination').hide();
+//     }
+
+//     let resultHtml = '';
+
+//     if (response.data.videos.length) {
+//       response.data.videos.forEach((item) => {
+//         resultHtml += `
+//           <div class="col-md-4 mb-4">
+//             <a href="${item.DesignerLink}">
+//               <div class="card lists-card">
+//                 <div class="position-relative">
+//                   <img src="../../img/icon/play.svg" class="play-img${item.Is_video === '0' ? ' d-none' : ''}" alt="play-img">
+//                     <img src="${item.BuilderCoverImg}" class="cover-img" alt="${item.BuilderTitle}">
+//                     </div>
+//                     <div class="card-body p-4">
+//                       <section>
+//                         <h5 class="text-dark">${item.BuilderTitle}</h5>
+//                         <p class="text-dark my-3">${item.BuilderDescr}</p>
+//                         <h6 class="mb-0 text-muted fw-normal">
+//                           ${item.BuilderAddress}
+//                         </h6>
+//                       </section>
+//                     </div>
+//                 </div>
+//             </a>
+//           </div>`;
+//       });
+//     } else {
+//       resultHtml += "<p class='text-center mt-5'>找不到符合的資料,請重新搜尋。</p>"
+//     }
+
+//     $('#builderList').html(resultHtml);
+
+//     setTimeout(() => {
+//       $('#builderList').show();
+//       $('#builderSpinner').hide();
+//     }, 100)
+
+//     // 更新初始載入狀態
+//     if (isFirstLoad) {
+//       isFirstLoad = false;
+//     }
+//   } catch (error) {
+//     console.log("error", error);
+//   }
+// }
+
+// dataSearch();
+
+let isLoading = false;
+let haveOtherBuilder = true; // 是否有推薦建案
 
 async function getData() {
-
   // 取得當前網址的查詢字串部分
   let urlParams = new URLSearchParams(window.location.search);
 
   // 從查詢字串中取得 'id' 的值
   let id = urlParams.get('id');
-  let url = `https://m3.hhh.com.tw:18674/genbuilder?id=${id}&page=1`;
-  console.log(id); // 顯示 "2058"
+  let url = `https://m3.hhh.com.tw:18674/genbuilder?id=${id}&page=${page}`;
+
+  if (haveOtherBuilder) {
+    $(".spinners").show();
+  }
+
   try {
     const response = await axios.get(url);
 
-
     let data = response.data[0];
 
+    // 判斷是否有取回推薦建案
+    if (data.other_builder.length) {
+      haveOtherBuilder = true;
+    } else {
+      haveOtherBuilder = false;
+    }
+
     $("#name").text(data.name);
     $("#city").text(data.city);
     $("#builder_name").text(data.name);
@@ -151,6 +163,14 @@ async function getData() {
     $("#service_phone").attr("href", "tel:" + data.service_phone);
     $("#detail").text(data.detail);
 
+    // Header
+    $('title').text(`${data.name} - 幸福空間`);
+    $('meta[name="description"]').attr('content', `${data.detail}`);
+    $('meta[property="og:title"]').attr('content', `${data.name} - 幸福空間`);
+    $('meta[property="og:description"]').attr('content', `${data.detail}`);
+    $('meta[name="twitter:title"]').attr('content', `${data.name} - 幸福空間`);
+    $('meta[name="twitter:description"]').attr('content', `${data.detail}`);
+
     if (data.detail_data.unit_price !== "") {
       $("#unit_price span").text(data.detail_data.unit_price);
     } else {
@@ -204,6 +224,10 @@ async function getData() {
 
     let sliderDom = "";
 
+    setTimeout(() => {
+      isLoading = false;
+    }, 2000)
+
     // 建案影片
     if (data.yt.length) {
       // let dom = "";
@@ -276,18 +300,14 @@ async function getData() {
     //     '<button type="button" class="slick-next"><i class="fas fa-chevron-right" style="font-size: 36px;color: #D4D4D4;transform: translateY(-10px);"></i></button>',
     // });
 
-    var swiper = new Swiper(".mySwiper", {
+    var swiper = new Swiper(".swiper-list", {
       navigation: {
         nextEl: ".swiper-button-next",
         prevEl: ".swiper-button-prev",
       },
     });
 
-    console.log('$("#lightgallery")', $("#lightgallery"));
-    console.log('$("#lightgallery length")', $("#lightgallery").length);
-
     const container = document.querySelector('.slider-list');
-    console.log('container', container);
 
     window.lightGallery(container, {
       selector: 'a', // 對應圖片的 <a> 標籤
@@ -372,33 +392,41 @@ async function getData() {
     });
 
     // 推薦建案
-    let otherBuilder = '<div class="row" data-masonry="{" percentPosition": true }">';
-
-    data.other_builder.map(item => {
-      let dom = `
-                <div class="col-6 col-md-4 mb-3">
-                  <div class="card">
-                    <a href="${item.link}">
-                      <img src="../../img/icon/play.svg" class="play-img${item.is_video === '0' ? ' d-none' : ''}" alt="play-img">
-                        <img src="${item.img}" alt="" class="img-fluid card-img-top">
-                          <div class="card-body">
-                            <h5 class="card-title">${item.title}</h5>
-                          </div>
-                        </a>
-                      </div>
-                  </div>
-                  `;
-      otherBuilder += dom;
-    });
+    if (data.other_builder.length) {
+      let otherBuilder = "";
+
+      // 動態生成卡片內容
+      data.other_builder.map(item => {
+        let dom = `
+        <div class="col-6 col-md-4 mb-3">
+          <div class="card">
+            <a href="${item.link}">
+              <img src="../../img/icon/play.svg" class="play-img${item.is_video === '0' ? ' d-none' : ''}" alt="play-img">
+              <img src="${item.img}" alt="" class="img-fluid card-img-top">
+              <div class="card-body">
+                <h5 class="card-title">${item.title}</h5>
+              </div>
+            </a>
+          </div>
+        </div>`;
 
-    otherBuilder += "</div>";
-    $(".other-list .container").html(otherBuilder);
+        otherBuilder += dom;
+      });
 
-    // 確保圖片都載入完成,避免造成剛進入頁面時圖片被覆蓋
-    $('.other-list .row').imagesLoaded().progress(function () {
-      $('.other-list .row').masonry(); // 渲染整體畫面
-    });
+      // 新增內容到現有 Masonry 容器
+      let newItems = $(otherBuilder);
+      $(".other-list .container .row").append(newItems);
 
+      // 確保圖片載入完成後進行 Masonry 重新排版
+      newItems.imagesLoaded(function () {
+        $('.other-list .container .row').masonry('appended', newItems); // 重新排列
+        $('.other-list .container .row').masonry('layout'); // 重新 layout
+      });
+    }
+
+    setTimeout(() => {
+      $(".spinners").hide();
+    }, 1000)
     console.log('getData', data);
   } catch (error) {
     console.log("error", error);
@@ -407,6 +435,31 @@ async function getData() {
 
 getData();
 
+let noData = false; // 無資料
+
+// 判斷是否捲動到底部
+$(window).on('scroll', function () {
+  // 資料 < 18 筆取消判斷
+  // if (noData) {
+  //   return;
+  // }
+
+  let scrollTop = $(window).scrollTop(); // 捲軸頂部位置
+  let windowHeight = $(window).height(); // 視窗高度
+  let footerOffset = $('#footer').offset().top; // 取得 footer 位置
+
+  if (!isLoading && scrollTop + windowHeight >= footerOffset - 250) {
+    isLoading = true;
+
+    if (haveOtherBuilder) {
+      setTimeout(() => {
+        page++;
+        getData();
+      }, 100)
+    }
+  }
+});
+
 // 閱讀更多
 $(".article-read-more").on("click", () => {
   $(".article-content").css("height", "100%");

+ 1 - 1
columns/lists/index.html

@@ -286,7 +286,7 @@
           <!-- 動態載入 -->
         </div>
 
-        <div id="columnLoading" class="my-5 text-center">
+        <div class="my-5 text-center spinners">
           <img src="./img/loading.svg" alt="">
         </div>
 

+ 5 - 5
columns/lists/js/main.js

@@ -17,7 +17,7 @@ $('#topCarousel').load('../../template/top_carousel.html');
 //   }
 // }
 
-// $("#columnLoading").hide(); // 隱藏讀取動畫
+// $(".spinners").hide(); // 隱藏讀取動畫
 
 let assignOrder = ""; // 當前排序
 
@@ -217,22 +217,22 @@ async function dataSearch(type = "") {
     } else {
       resultHtml += "<p class='text-center mt-5'>找不到符合的資料,請重新搜尋。</p>"
       $('#dataList').append(resultHtml);
-      $("#columnLoading").hide();
+      $(".spinners").hide();
       noData = true;
     }
 
     setTimeout(() => {
       // $('#dataList').show();
       $('#dataSpinner').hide();
-      $("#columnLoading").hide();
+      $(".spinners").hide();
     }, 100)
 
     setTimeout(() => {
       isLoading = false;
       if (response.data.columns.length === 18) {
-        $("#columnLoading").show(); // 顯示讀取動畫
+        $(".spinners").show(); // 顯示讀取動畫
       } else {
-        $("#columnLoading").hide(); // 隱藏讀取動畫
+        $(".spinners").hide(); // 隱藏讀取動畫
       }
     }, 2000)
 

+ 16 - 1
css/all.css

@@ -792,4 +792,19 @@ body {
   height: 20px;
 }
 
-/* 左下按紐 End *//*# sourceMappingURL=all.css.map */
+/* 左下按紐 End */
+/* 讀取圖示 */
+.spinners {
+  display: none;
+}
+@keyframes rotate {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+.spinners img {
+  animation: rotate 2s linear infinite;
+}/*# sourceMappingURL=all.css.map */

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
css/all.css.map


+ 20 - 1
css/all.scss

@@ -953,4 +953,23 @@ body {
   }
 }
 
-/* 左下按紐 End */
+/* 左下按紐 End */
+
+/* 讀取圖示 */
+.spinners {
+  display: none;
+
+  @keyframes rotate {
+    from {
+      transform: rotate(0deg);
+    }
+
+    to {
+      transform: rotate(360deg);
+    }
+  }
+
+  img {
+    animation: rotate 2s linear infinite;
+  }
+}

+ 0 - 15
css/lists.css

@@ -352,19 +352,4 @@
 .autocomplete-active {
   background-color: DodgerBlue !important;
   color: #ffffff;
-}
-
-#columnLoading {
-  display: none;
-}
-@keyframes rotate {
-  from {
-    transform: rotate(0deg);
-  }
-  to {
-    transform: rotate(360deg);
-  }
-}
-#columnLoading img {
-  animation: rotate 2s linear infinite;
 }/*# sourceMappingURL=lists.css.map */

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
css/lists.css.map


+ 0 - 18
css/lists.scss

@@ -412,22 +412,4 @@
 .autocomplete-active {
   background-color: DodgerBlue !important;
   color: #ffffff;
-}
-
-#columnLoading {
-  display: none;
-
-  @keyframes rotate {
-    from {
-      transform: rotate(0deg);
-    }
-
-    to {
-      transform: rotate(360deg);
-    }
-  }
-
-  img {
-    animation: rotate 2s linear infinite;
-  }
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов