From eeff64f494ed72d8acaa13d653c9f3ee181ac950 Mon Sep 17 00:00:00 2001
From: unknown <qq1940665526@163.com>
Date: 星期五, 07 六月 2024 16:09:46 +0800
Subject: [PATCH] 优化

---
 src/books/lifeCare/index.vue |  385 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 323 insertions(+), 62 deletions(-)

diff --git a/src/books/lifeCare/index.vue b/src/books/lifeCare/index.vue
index ec8e4f1..57b0dc2 100644
--- a/src/books/lifeCare/index.vue
+++ b/src/books/lifeCare/index.vue
@@ -1,7 +1,10 @@
 <template>
   <div class="page-main" @scroll="throttledScrollHandler">
+    <div id="searchDomBox" style="display: none">
+      <div id="searchContent"></div>
+    </div>
     <div
-      class="public-lifeCare"
+      class="public-bookInnerContent"
       @mouseup="handleMouseUp"
       :style="{
         fontSize: fontSize ? fontSize + 'px' : '16px',
@@ -12,51 +15,64 @@
       <front001
         v-if="showCatalogList.indexOf(1) > -1"
         :showPageList="loadPageList"
+        :isSearch="isSearch"
       />
       <ChapterOne
         v-if="showCatalogList.indexOf(2) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <ChapterTwo
         v-if="showCatalogList.indexOf(3) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <ChapterThree
         v-if="showCatalogList.indexOf(4) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <ChapterFour
         v-if="showCatalogList.indexOf(5) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <ChapterFive
         v-if="showCatalogList.indexOf(6) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        @Upload_initViewer="changeDomViewer"
+        :isSearch="isSearch"
       />
       <chapterSix
         v-if="showCatalogList.indexOf(7) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <chapterSeven
         v-if="showCatalogList.indexOf(8) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        @eventSwdt="swdtChange"
+        @Upload_initViewer="changeDomViewer"
+        :isSearch="isSearch"
       />
       <chapterEight
         v-if="showCatalogList.indexOf(9) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <chapterNine
         v-if="showCatalogList.indexOf(10) > -1"
         :showPageList="loadPageList"
-        :questionData="questionData"
+        :questionData="questionDataMap"
+        :isSearch="isSearch"
       />
       <chapter010
         v-if="showCatalogList.indexOf(11) > -1"
@@ -122,6 +138,10 @@
 import _ from "lodash";
 import getQuestionList from "@/assets/methods/examination";
 import testData from "./js/examinationList";
+import Swiper from "swiper/bundle";
+import "swiper/swiper-bundle.css";
+import Viewer from "viewerjs";
+import "viewerjs/dist/viewer.css";
 export default {
   data() {
     return {
@@ -134,8 +154,10 @@
       observer: null,
       loadPageObserver: null,
       loadPageList: [],
-      questionData: {},
-      renderSignMap: {}
+      questionDataMap: {},
+      renderSignMap: {},
+      highlightData: null,
+      isSearch: false,
     };
   },
   computed: {
@@ -168,21 +190,20 @@
           this.initObservation();
           this.initThemeColor();
         }, 500);
-      }
+      },
     },
     loadPageList: {
-      handler(newVal, oldVal) {
-        console.log(newVal, "this.loadPageList");
+      handler() {
         setTimeout(() => {
           this.initSwiper();
           this.initViewer();
         }, 200);
-      }
-    }
+      },
+    },
   },
   mounted() {
     // 榛樿鍔犺浇绔犺妭
-    this.showCatalogList = [1];
+    this.showCatalogList = [6];
     // 婊氬姩鐩戝惉鑺傛祦
     this.throttledScrollHandler = _.throttle(
       this.scrollFun,
@@ -198,11 +219,21 @@
         },
         // 娓叉煋绗旇銆侀珮浜�佸垝绾�
         renderSign: (type, data) => {
-          this.renderSign(type, data);
+          // 鍥犱负璋冩暣涓洪〉闈㈡噿鍔犺浇锛屾墍浠ユ覆鏌撴爣璁颁篃闇�瑕佹寜鐓ч〉闈㈣繘琛屽鐞嗭紝鍏堝偍瀛樻暟鎹紝椤甸潰鍔犺浇瀹屾垚鍐嶆覆鏌撳搴旂殑鏍囪锛�
+          this.handelSignData(type, data);
+          // this.renderSign(type, data);
         },
         // 鍒犻櫎绗旇銆侀珮浜�佸垝绾�
         delSign: (data) => {
           this.delSign(data);
+        },
+        // 鍏ㄦ枃妫�绱�
+        searchBookByKeyword: (keyword) => {
+          return this.searchTextByPage(keyword);
+        },
+        // 璺宠浆妫�绱㈢粨鏋滀綅缃�
+        jumpSearchItem: (data) => {
+          this.searchItemLocation(data);
         },
       });
     }
@@ -229,24 +260,30 @@
 
     // 娴嬭瘯椤甸潰璺宠浆
     // setTimeout(() => {
-      // this.gotoPage(1, 15);
-      //   setTimeout(() => {
-      //     this.renderSign("Note", {
-      //       id: "2ACA9359",
-      //       txt: "钀ュ吇绱犲拰鐑噺锛屾墠鑳�",
-      //       page: "100",
-      //       type: "Highlight",
-      //       color: "#F5E12A"
-      //     });
-      //     setTimeout(() => {
-      //       this.delSign({
-      //         ids: ["2ACA9359"]
-      //       });
-      //     }, 2000);
-      //   }, 1000);
+    // this.gotoPage(1, 15);
+    //   setTimeout(() => {
+    //     this.renderSign("Note", {
+    //       id: "2ACA9359",
+    //       txt: "钀ュ吇绱犲拰鐑噺锛屾墠鑳�",
+    //       page: "100",
+    //       type: "Highlight",
+    //       color: "#F5E12A"
+    //     });
+    //     setTimeout(() => {
+    //       this.delSign({
+    //         ids: ["2ACA9359"]
+    //       });
+    //     }, 2000);
+    //   }, 1000);
     // }, 1000);
   },
   methods: {
+    changeDomViewer() {
+      setTimeout(() => {
+        this.initViewer();
+      }, 500);
+    },
+
     // 婊氬姩鐩戝惉
     scrollFun(event) {
       // 鍒ゆ柇鍚戜笂婊氬姩杩樻槸鍚戜笅婊氬姩
@@ -302,7 +339,7 @@
           this.showCatalogList = [
             this.catalogLength - 2,
             this.catalogLength - 1,
-            this.catalogLength
+            this.catalogLength,
           ];
         } else {
           this.showCatalogList = [catalog - 1, catalog, catalog + 1];
@@ -325,6 +362,12 @@
 
     // 澶勭悊鏍囪鏁版嵁
     handelSignData(type, data) {
+      if (this.loadPageList.indexOf(Number(data.page)) > -1) {
+        // 绔嬪嵆娓叉煋
+        this.renderSign(type, data);
+      }
+
+      // 鍌ㄥ瓨鏁版嵁
       if (!this.renderSignMap[type]) this.renderSignMap[type] = {};
       if (!this.renderSignMap[type][data.page])
         this.renderSignMap[type][data.page] = [];
@@ -333,6 +376,10 @@
 
     // 娓叉煋鏍囪
     renderSign(type, data) {
+      // 鐖跺眰璁剧疆绂佹娓叉煋鏍囪鏃朵笉鍐嶈繘琛屾覆鏌�
+      if (this.$store.state.qiankun.disableSign) {
+        return false;
+      }
       const existence = (
         this.container ? this.container : document
       ).querySelector(`[dataid="${data.id}"]`);
@@ -386,6 +433,7 @@
         }
       }
     },
+
     // 鍒犻櫎鏍囪娓叉煋
     delSign({ ids, type }) {
       if (ids && ids.length) {
@@ -413,6 +461,7 @@
         }
       }
     },
+
     initObservation() {
       const sections = (
         this.container ? this.container : document
@@ -441,6 +490,7 @@
         }
       });
     },
+
     initThemeColor() {
       // 鑾峰彇鍚勭闇�瑕佷富棰樿壊鐨勮妭鐐�
       const colorDom = (
@@ -520,14 +570,7 @@
         }
       });
     },
-    getParentWithClass(element, className) {
-      while (element.parentElement) {
-        element = element.parentElement;
-        if (element.classList.contains(className)) {
-          return element;
-        }
-      }
-    },
+
     pageChangeCallback(entries, observer) {
       //entries锛氫唬琛ㄨ瀵熷埌鐨勭洰鏍囧厓绱犵殑闆嗗悎銆� observer锛氫唬琛ㄨ瀵熻�呭璞°��
       entries.forEach((entry) => {
@@ -550,7 +593,7 @@
             this.$store.state.qiankun.pageChange({
               page: page,
               catalog: catalog,
-              text
+              text,
             });
           // const sections = Array.from(document.querySelectorAll(".section"));
           //sections锛氳幏鍙栨墍鏈夊叿鏈� .section 绫诲悕鐨勫厓绱狅紝骞惰浆鎹负鏁扮粍銆�
@@ -559,6 +602,7 @@
         }
       });
     },
+
     loadPageCallback(entries, observer) {
       entries.forEach(async (entry) => {
         if (entry.isIntersecting) {
@@ -570,15 +614,18 @@
               "chapter"
             );
             const catalog = catalogDom.getAttribute("num");
-            if (!this.questionData[page]) {
+            if (!this.questionDataMap[page]) {
+              const token = localStorage.getItem(this.config.tokenKey);
               if (testData && testData[catalog]) {
                 if (testData[catalog][page]) {
                   if (Array.isArray(testData[catalog][page])) {
-                    this.questionData[page] = await getQuestionList(
-                      page,
-                      testData[catalog][page],
-                      this.config.activeBook
-                    );
+                    if (token) {
+                      this.questionDataMap[page] = await getQuestionList(
+                        page,
+                        testData[catalog][page],
+                        this.config.activeBook
+                      );
+                    }
                   } else {
                     const obj = {};
                     for (let key in testData[catalog][page]) {
@@ -588,8 +635,9 @@
                         this.config.activeBook
                       );
                     }
-                    this.questionData[page] = obj;
+                    this.questionDataMap[page] = obj;
                   }
+                  console.log("棰樼洰", this.questionDataMap);
                 }
               }
             }
@@ -603,6 +651,39 @@
                 });
               }
             }
+            // 澶勭悊楂樹寒
+            if (this.highlightData) {
+              // 楂樹寒琛�
+              setTimeout(() => {
+                // 鑾峰彇椤甸潰鎵�鏈塼ext鑺傜偣
+                const pageTextList = document.createTreeWalker(
+                  target,
+                  NodeFilter.SHOW_TEXT
+                );
+                // 鍖归厤鍏抽敭瀛�
+                const allPageTextNodes = [];
+                let currentNode = pageTextList.nextNode();
+                while (currentNode) {
+                  allPageTextNodes.push(currentNode);
+                  currentNode = pageTextList.nextNode();
+                }
+                for (let i = 0; i < allPageTextNodes.length; i++) {
+                  const textDom = allPageTextNodes[i];
+                  let txtIndex = textDom.textContent.indexOf(
+                    this.highlightData.txt
+                  );
+                  if (txtIndex > -1) {
+                    textDom.parentNode.style.transition =
+                      "background-color 0.8s";
+                    textDom.parentNode.scrollIntoView();
+                    textDom.parentNode.style.backgroundColor = "#79bbf0";
+                    setTimeout(() => {
+                      textDom.parentNode.style.backgroundColor = "";
+                    }, 1000);
+                  }
+                }
+              }, 100);
+            }
             if (this.loadPageList.length > 5) {
               // 瓒呰繃5椤�
               this.loadPageList.shift();
@@ -611,10 +692,11 @@
         }
       });
     },
+
     initSwiper() {
       const doms = (
         this.container ? this.container : document
-      ).querySelectorAll(".swiper-container");
+      ).querySelectorAll(".swiper-img");
       for (let i = 0; i < doms.length; i++) {
         const dom = doms[i];
         new Swiper(dom, {
@@ -622,27 +704,75 @@
           autoplay: {
             //鑷姩寮�濮�
             delay: 3000, //鏃堕棿闂撮殧
-            disableOnInteraction: false //*鎵嬪姩鎿嶄綔杞挱鍥惧悗涓嶄細鏆傚仠*
+            disableOnInteraction: false, //*鎵嬪姩鎿嶄綔杞挱鍥惧悗涓嶄細鏆傚仠*
           },
           paginationClickable: true,
           slidesPerView: 1, // 涓�缁勪笁涓�
           spaceBetween: 30, // 闂撮殧
           // 濡傛灉闇�瑕佸墠杩涘悗閫�鎸夐挳
           navigation: {
-            nextEl: ".swiper-button-next",
-            prevEl: ".swiper-button-prev"
+            nextEl: (this.container ? this.container : document).querySelector(
+              ".swiper-button-next"
+            ),
+            prevEl: (this.container ? this.container : document).querySelector(
+              ".swiper-button-prev"
+            ),
           },
           // 绐楀彛鍙樺寲,閲嶆柊init,閽堝F11鍏ㄥ睆鍜屾斁澶х缉灏�,蹇呴』鍔�
           observer: true,
           observeParents: true,
-          // 濡傛灉闇�瑕佸垎椤靛櫒
-          pagination: {
-            el: ".swiper-pagination",
-            clickable: true // 鍒嗛〉鍣ㄥ彲浠ョ偣鍑�
-          }
+          // // 濡傛灉闇�瑕佸垎椤靛櫒
+          // pagination: {
+          //   el: (this.container ? this.container : document).querySelector(
+          //     ".swiper-pagination"
+          //   ),
+          //   clickable: true // 鍒嗛〉鍣ㄥ彲浠ョ偣鍑�
+          // }
+        });
+      }
+      const pptDoms = (
+        this.container ? this.container : document
+      ).querySelectorAll(".swiper_ppt");
+      for (let i = 0; i < pptDoms.length; i++) {
+        const dom = pptDoms[i];
+        new Swiper(dom, {
+          loop: false, // 鏃犵紳
+          autoplay: false,
+          paginationClickable: true,
+          slidesPerView: 1, // 涓�缁勪笁涓�
+          spaceBetween: 30, // 闂撮殧
+          // 濡傛灉闇�瑕佸墠杩涘悗閫�鎸夐挳
+          navigation: {
+            nextEl: (this.container ? this.container : document).querySelector(
+              ".swiper-button-next"
+            ),
+            prevEl: (this.container ? this.container : document).querySelector(
+              ".swiper-button-prev"
+            ),
+          },
+          // 绐楀彛鍙樺寲,閲嶆柊init,閽堝F11鍏ㄥ睆鍜屾斁澶х缉灏�,蹇呴』鍔�
+          observer: true,
+          observeParents: true,
+          on: {
+            init: (value) => {
+              let currentPage = value.activeIndex + 1; // 鑾峰彇褰撳墠椤碉紙浠�1寮�濮嬭鏁帮級
+              let totalPages = value.slides.length; // 鑾峰彇鎬婚〉鏁�
+              var paginationInfoEl = dom.querySelector(".pageBox");
+              if (paginationInfoEl)
+                paginationInfoEl.textContent = currentPage + "/" + totalPages;
+            },
+            slideChange: (value) => {
+              let currentPage = value.activeIndex + 1; // 鑾峰彇褰撳墠椤碉紙浠�1寮�濮嬭鏁帮級
+              let totalPages = value.slides.length; // 鑾峰彇鎬婚〉鏁�
+              var paginationInfoEl = dom.querySelector(".pageBox");
+              if (paginationInfoEl)
+                paginationInfoEl.textContent = currentPage + "/" + totalPages;
+            },
+          },
         });
       }
     },
+
     initViewer() {
       const doms = (
         this.container ? this.container : document
@@ -650,14 +780,18 @@
       for (let i = 0; i < doms.length; i++) {
         const dom = doms[i];
         new Viewer(dom, {
+          container: this.container
+            ? this.container.querySelector("#app")
+            : "body",
           navbar: true, // 鏄剧ず瀵艰埅鏍�
           toolbar: true, // 鏄剧ず宸ュ叿鏍�
-          title: true // 鏄剧ず鏍囬
+          title: true, // 鏄剧ず鏍囬
         });
       }
     },
-    // eslint-disable-next-line
+
     getParentWithClass(element, className) {
+      // console.log(element, className, "element, className");
       while (element.parentElement) {
         element = element.parentElement;
         if (element.classList.contains(className)) {
@@ -665,6 +799,7 @@
         }
       }
     },
+    
     handleMouseUp(e) {
       const selection = (
         this.container ? this.container : window
@@ -707,6 +842,132 @@
         }
       }
     },
+
+    // 鏍规嵁鍏抽敭瀛楀叏鏂囨绱�
+    searchTextByPage(keyword) {
+      const searchResult = [];
+      let catalogIndex = 0;
+      // 鎵�鏈夌珷鑺傜粍浠讹紙姣忔湰涔﹀埗浣滄椂鍗曠嫭閰嶇疆锛�
+      const pageData = {
+        front001,
+        ChapterOne,
+        ChapterTwo,
+        ChapterThree,
+        ChapterFour,
+        ChapterFive,
+        chapterSix,
+        chapterSeven,
+        chapterEight,
+        chapterNine,
+        chapter010,
+        chapter011,
+        chapter012,
+        chapter013,
+        chapter014,
+        chapter015,
+        chapter016,
+        chapter017,
+        chapter018,
+      };
+      // 閬嶅巻鎵�鏈夌珷鑺傛枃浠�
+      for (const key in pageData) {
+        catalogIndex++;
+        let pageComponent, pageExample;
+        // 鍏堟覆鏌撲竴娆″綋鍓嶇珷鑺傛枃浠讹紙杩欐椂椤甸潰鐨勫唴瀹逛负绌猴級锛岃幏鍙栭〉鐮佷俊鎭�
+        pageComponent = Vue.extend(pageData[key]);
+        pageExample = new pageComponent({
+          propsData: {
+            showPageList: [],
+            questionData: {},
+          },
+        });
+        pageExample.$mount(
+          (this.container ? this.container : document).querySelector(
+            "#searchContent"
+          )
+        );
+        // 鑾峰彇椤电爜
+        const pageDom = (this.container ? this.container : document)
+          .querySelector("#searchDomBox")
+          .querySelectorAll(".page-box");
+        const pages = [];
+        for (let i = 0; i < pageDom.length; i++) {
+          const pageDomItem = pageDom[i];
+          pages.push(Number(pageDomItem.getAttribute("page")));
+        }
+        // 鑾峰彇椤甸潰缁撴潫锛屽嵏杞介攢姣�
+        pageExample.$destroy();
+        (this.container ? this.container : document).querySelector(
+          "#searchDomBox"
+        ).innerHTML = '<div id="searchContent"></div>';
+        // 閬嶅巻椤电爜
+        if (pages.length) {
+          for (let i = 0; i < pages.length; i++) {
+            const pageNum = pages[i];
+            // 鍔ㄦ�佹覆鏌撳搴旂珷鑺傜殑椤电爜
+            pageComponent = Vue.extend(pageData[key]);
+            pageExample = new pageComponent({
+              propsData: {
+                showPageList: [pageNum],
+                questionData: {},
+              },
+            });
+            pageExample.$mount(
+              (this.container ? this.container : document).querySelector(
+                "#searchContent"
+              )
+            );
+            // 鑾峰彇瀵瑰簲椤甸潰dom
+            const thisPageDom = (this.container ? this.container : document)
+              .querySelector("#searchDomBox")
+              .querySelector(`[page="${pageNum}"]`);
+            if (thisPageDom) {
+              // 鑾峰彇椤甸潰鎵�鏈塼ext鑺傜偣
+              const pageTextList = document.createTreeWalker(
+                thisPageDom,
+                NodeFilter.SHOW_TEXT
+              );
+              // 鍖归厤鍏抽敭瀛�
+              const allPageTextNodes = [];
+              let currentNode = pageTextList.nextNode();
+              while (currentNode) {
+                allPageTextNodes.push(currentNode);
+                currentNode = pageTextList.nextNode();
+              }
+              for (let i = 0; i < allPageTextNodes.length; i++) {
+                const textDom = allPageTextNodes[i];
+                let txtIndex = textDom.textContent.indexOf(keyword);
+                if (txtIndex > -1) {
+                  // 璁板綍鍏抽敭瀛楁墍鍦ㄩ〉鐮併�佺珷鑺備互鍙婂尮閰嶅埌鐨勬钀�
+                  searchResult.push({
+                    page: pageNum,
+                    catalog: catalogIndex,
+                    txt: textDom.textContent,
+                    txtIndex: txtIndex,
+                  });
+                }
+              }
+              // 缁撴潫锛屽嵏杞介攢姣�
+              pageExample.$destroy();
+              (this.container ? this.container : document).querySelector(
+                "#searchDomBox"
+              ).innerHTML = '<div id="searchContent"></div>';
+            }
+          }
+        }
+      }
+      // 杈撳嚭鎼滅储缁撴灉
+      // console.log(searchResult);
+      return searchResult;
+    },
+
+    // 鏍规嵁妫�绱㈢粨鏋滆烦杞搴斾綅缃苟楂樹寒
+    searchItemLocation(data) {
+      // 璁板綍楂樹寒淇℃伅
+      this.highlightData = data;
+      // 璺宠浆
+      this.gotoPage(data.catalog, data.page, () => {});
+    },
   },
   components: {
     front001,

--
Gitblit v1.9.1