unknown
2024-06-06 fe02206b64c4997094fd8371f6b5d439c3f2688f
优化
2个文件已删除
12个文件已修改
717 ■■■■ 已修改文件
src/App.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/English/view/components/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/chapter001.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/chapter002.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/chapter003.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/chapter004.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/chapter005.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/header.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/index.vue 218 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/components/pageHeader/evenHeader.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/components/pageHeader/oddHeader.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/content/components/header.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/embedded/view/components/chapter001.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/embedded/view/components/index.vue 302 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -72,7 +72,7 @@
        // embedded
        // english
        // artAndDance
        this.config.resourceCtx + "sportsAndHealth"
        this.config.resourceCtx + "english"
      );
      // 测试试读30页
      // this.activeBook.tryPageCount = 10;
src/books/English/view/components/index.vue
@@ -88,7 +88,6 @@
        setTimeout(() => {
          this.initSwiper();
          this.initViewer();
          // this.getAduio();
        }, 200);
      },
    },
src/books/artAndDance/view/components/chapter001.vue
@@ -80,13 +80,8 @@
            x5-playsinline=""
            controls
            class="w100"
            style="margin-top: 40px;"
          ></video>
          <p class="center">
            <img class="img-g" alt="" src="image/i0007-1.jpg" />
          </p>
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="image/czysj.jpg" />
          </h2>
        </div>
        <ul>
          <li class="fl ju-end mr-40">
@@ -109,6 +104,9 @@
          class="w100 mb-40"
        />
        <div class="padding-96">
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="../../assets/images/czysj.jpg" />
          </h2>
          <div class="bj1">
            <p class="block">
              <img
@@ -133,7 +131,6 @@
              充分理解古诗表达的情感,根据已学舞蹈元素,创编带有送别意味的单一舞蹈动作或造型吧。
            </p>
          </div>
          <p class="center"><img class="img-0" alt="" src="image/ym.jpg" /></p>
        </div>
        <ul class="pb-box">
          <li class="ml-40">
src/books/artAndDance/view/components/chapter002.vue
@@ -115,6 +115,7 @@
            x5-playsinline=""
            controls
            class="w100"
            style="margin-top: 40px;"
          ></video>
          <h2 class="lefth2 mt-40" id="b007">
            <img class="img-gn" alt="" src="../../assets/images/czysj.jpg" />
src/books/artAndDance/view/components/chapter003.vue
@@ -79,13 +79,8 @@
            x5-playsinline=""
            controls
            class="w100"
            style="margin-top: 40px;"
          ></video>
          <p class="center">
            <img class="img-g" alt="" src="image/i0007-1.jpg" />
          </p>
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="image/czysj.jpg" />
          </h2>
        </div>
        <ul>
          <li class="fl ju-end mr-40">
@@ -108,6 +103,9 @@
          class="w100 mb-40"
        />
        <div class="padding-96">
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="../../assets/images/czysj.jpg" />
          </h2>
          <div class="bj1">
            <p class="block">
              <img
@@ -132,7 +130,6 @@
              观察生活中钓鱼者的形象,根据已学舞蹈元素,创编出新的单一舞蹈动作或者造型吧。
            </p>
          </div>
          <p class="center"><img class="img-0" alt="" src="image/ym.jpg" /></p>
        </div>
        <ul class="pb-box">
          <li class="ml-40">
src/books/artAndDance/view/components/chapter004.vue
@@ -83,13 +83,8 @@
            x5-playsinline=""
            controls
            class="w100"
            style="margin-top: 40px;"
          ></video>
          <p class="center">
            <img class="img-g" alt="" src="image/i0007-1.jpg" />
          </p>
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="image/czysj.jpg" />
          </h2>
        </div>
        <ul>
          <li class="fl ju-end mr-40">
@@ -112,6 +107,9 @@
          class="w100 mb-40"
        />
        <div class="padding-96">
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="../../assets/images/czysj.jpg" />
          </h2>
          <div class="bj1">
            <p class="block">
              <img
@@ -136,7 +134,6 @@
              请思考一下,除了舞蹈中“只在此山中”的动作之外,还有什么舞蹈动作也可以体现这句诗的含义呢?
            </p>
          </div>
          <p class="center"><img class="img-0" alt="" src="image/ym.jpg" /></p>
        </div>
        <ul class="pb-box">
          <li class="ml-40">
src/books/artAndDance/view/components/chapter005.vue
@@ -127,6 +127,9 @@
            class="w100"
            style="margin:38px 0"
          ></video>
          <h2 class="lefth2" id="b003">
            <img class="img-gn" alt="" src="../../assets/images/czysj.jpg" />
          </h2>
          <div class="bj1">
            <p class="block">
              <img
@@ -151,7 +154,6 @@
              根据本单元所学的舞蹈元素以及古诗寓意,发挥想象,创编新的单一舞蹈动作或造型吧。
            </p>
          </div>
          <p class="center"><img class="img-0" alt="" src="image/ym.jpg" /></p>
        </div>
        <ul>
          <li class="ml-40">
src/books/artAndDance/view/components/header.vue
@@ -11,12 +11,12 @@
    </div>
    <div class="page-box" page="3">
      <div v-if="showPageList.indexOf(3) > -1">
        <ul class="fl fl-cl ju-bt">
        <ul class="fl fl-cl ju-bt pg-mh">
          <li>
            <img src="../../assets/images/pageHeader.png" alt="" class="w100" />
          </li>
          <li>
            <div class="bodystyle">
            <div class="bodystyle" style="margin-bottom: 100px">
              <h1 id="a003" class="front">编委会</h1>
              <hr />
              <p>顾  问:<span class="kaiti">彭吉象 吕艺生</span></p>
src/books/artAndDance/view/components/index.vue
@@ -1,5 +1,8 @@
<template>
  <div class="page-main" @scroll="throttledScrollHandler">
    <div id="searchDomBox" style="display: none">
      <div id="searchContent"></div>
    </div>
    <div
      class="page-content"
      :style="{
@@ -13,7 +16,6 @@
        :showPageList="loadPageList"
      ></pageHeader>
      <chapterOne
        @saveCharacters="saveCharacters"
        v-if="showCatalogList.indexOf(2) > -1"
        :showPageList="loadPageList"
      ></chapterOne>
@@ -69,8 +71,9 @@
      observer: null,
      loadPageObserver: null,
      loadPageList: [],
      questionData: {},
      questionDataMap: {},
      renderSignMap: {},
      highlightData: null,
    };
  },
  computed: {
@@ -108,6 +111,14 @@
        }, 200);
      },
    },
    pageZoom: {
      handler(newVal, oldVal) {
        const scrollBox = (
          this.container ? this.container : document
        ).querySelector(".page-main");
        scrollBox.scrollTop = (scrollBox.scrollTop / oldVal) * newVal;
      },
    },
  },
  mounted() {
    // 默认加载章节
@@ -134,6 +145,14 @@
        // 删除笔记、高亮、划线
        delSign: (data) => {
          this.delSign(data);
        },
        // 全文检索
        searchBookByKeyword: (keyword) => {
          return this.searchTextByPage(keyword);
        },
        // 跳转检索结果位置
        jumpSearchItem: (data) => {
          this.searchItemLocation(data);
        },
      });
    }
@@ -175,9 +194,36 @@
    //   });
    // }, 2000);
    //   }, 5000);
    // }, 1000);
    // const pageDom = (this.container ? this.container : document)
    //   .querySelector("#app")
    //   .querySelectorAll(".page-box");
    // 检索
    // console.log(this.searchTextByPage("保护内脏器官"), "searchTextByPage");
    // 检索跳转
    // this.searchItemLocation({
    //   catalog: 2,
    //   page: 10,
    //   txt: " 运动系统是由骨、骨连结和骨骼肌三部分组成的。全身的骨通过骨连结组成人体骨骼(见图1-1)。骨骼是人体的支架,具有保护内脏器官、供肌肉附着和作为肌肉运动的杠杆等作用。在神经系统的支配下,肌肉收缩牵动所附着的骨绕着关节转动,使身体产生各种动作。所以,运动系统具有运动、支持和保护等功能,幼年时期的骨骼还具有造血功能。 ",
    //   txtIndex: 57
    // });
    // }, 5000);
  },
  methods: {
    // setZoom1() {
    //   let scale = this.$store.state.qiankun.scale + 10;
    //   const scrollBox = (
    //     this.container ? this.container : document
    //   ).querySelector(".page-main");
    //   this.$store.commit("setZoom", scale);
    // },
    // setZoom2() {
    //   let scale = this.$store.state.qiankun.scale - 10;
    //   const scrollBox = (
    //     this.container ? this.container : document
    //   ).querySelector(".page-main");
    //   this.$store.commit("setZoom", scale);
    // },
    // 滚动监听
    scrollFun(event) {
      // 判断向上滚动还是向下滚动
@@ -270,6 +316,10 @@
    // 渲染标记
    renderSign(type, data) {
      // 父层设置禁止渲染标记时不再进行渲染
      if (this.$store.state.qiankun.disableSign) {
        return false;
      }
      const existence = (
        this.container ? this.container : document
      ).querySelector(`[dataid="${data.id}"]`);
@@ -279,10 +329,7 @@
          this.container ? this.container : document
        ).querySelector(`[page="${data.page}"]`);
        // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组
        const treeWalker = document.createTreeWalker(
          pageDom,
          NodeFilter.SHOW_TEXT
        );
        const treeWalker = document.createTreeWalker(pageDom, NodeFilter.SHOW_TEXT);
        const allTextNodes = [];
        let currentNode = treeWalker.nextNode();
        while (currentNode) {
@@ -458,6 +505,7 @@
      });
    },
    getParentWithClass(element, className) {
      console.log(element, className, "element, className");
      while (element.parentElement) {
        element = element.parentElement;
        if (element.classList.contains(className)) {
@@ -507,11 +555,11 @@
              "chapter"
            );
            const catalog = catalogDom.getAttribute("num");
            // if (!this.questionData[page]) {
            // if (!this.questionDataMap[page]) {
            //   if (testData && testData[catalog]) {
            //     if (testData[catalog][page]) {
            //       if (Array.isArray(testData[catalog][page])) {
            //         this.questionData[page] = await getQuestionList(
            //         this.questionDataMap[page] = await getQuestionList(
            //           page,
            //           testData[catalog][page],
            //           this.config.activeBook
@@ -525,9 +573,9 @@
            //             this.config.activeBook
            //           );
            //         }
            //         this.questionData[page] = obj;
            //         this.questionDataMap[page] = obj;
            //       }
            //       console.log("题目", this.questionData);
            //       console.log("题目", this.questionDataMap);
            //     }
            //   }
            // }
@@ -540,6 +588,36 @@
                  this.renderSign(key, item);
                });
              }
            }
            // 处理高亮
            if (this.highlightData) {
              // 高亮行
              setTimeout(() => {
                // 获取页面所有text节点
                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页
@@ -644,18 +722,114 @@
        });
      }
    },
    // 点击事件:将生僻单词传给 主应用 从而调用词典功能
    saveCharacters(event, word) {
      console.log("生僻字", event, word);
      if (this.$store.state.qiankun && this.$store.state.qiankun.chooseWords) {
        this.$store.state.qiankun.chooseWords({
          type: "word",
          word,
          x: event.pageX,
          y: event.pageY,
    // 根据关键字全文检索
    searchTextByPage(keyword) {
      const searchResult = [];
      let catalogIndex = 0;
      // 所有章节组件(每本书制作时单独配置)
      const pageData = {
        pageHeader,
        chapterOne,
        chapterTwo,
        chapterThree,
        chapterFour,
        chapterFive,
        chapterSix,
      };
      // 遍历所有章节文件
      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) {
              // 获取页面所有text节点
              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>';
            }
          }
        }
      }
      // chooseWords
      // 输出搜索结果
      console.log(searchResult);
      return searchResult;
    },
    // 根据检索结果跳转对应位置并高亮
    searchItemLocation(data) {
      // 记录高亮信息
      this.highlightData = data;
      // 跳转
      this.gotoPage(data.catalog, data.page, () => {});
    },
  },
  components: {
@@ -665,7 +839,7 @@
    chapterThree,
    chapterFour,
    chapterFive,
    chapterSix
    chapterSix,
  },
};
</script>
src/books/childHealth/view/components/pageHeader/evenHeader.vue
File was deleted
src/books/childHealth/view/components/pageHeader/oddHeader.vue
File was deleted
src/books/childHealth/view/content/components/header.vue
@@ -193,10 +193,8 @@
</template>
<script>
import evenHeaderVue from "../../components/pageHeader/evenHeader.vue";
export default {
  name: "page-header",
  components: { evenHeaderVue },
  props: {
    showPageList: {
      type: Array,
src/books/embedded/view/components/chapter001.vue
@@ -51,10 +51,12 @@
            随着后PC时代的到来,在制造业领域更注重使用符合其特定需求并带有智能的嵌入式工业控制组态软件,而嵌入式组态软件特具的按功能剪裁的特性,以及其内嵌的实时多任务操作系统,可保证整个嵌入系统体积小、成本低、实时性高、可靠性高的同时,还方便不具备嵌入式软件开发经验的用户在极短的时间内,使用嵌入式组态软件快速开发完成一个嵌入式系统,并极大地加快了嵌入式产品进入市场的速度,而且使产品具有丰富的人机界面。北京昆仑通态公司MCGS组态软件,通过大力加强对工控硬件产品的驱动支持和提升软件内部功
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">1</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">1</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 2 -->
@@ -293,10 +295,12 @@
            (2)设备窗口是MCGS嵌入版系统与外围设备联系的媒介。设备窗口专门用来放置不同
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">3</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">3</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 4 -->
@@ -457,10 +461,12 @@
            (5)TPC7062K启动。使用24V直流电源给TPC供电,开机启动后屏幕出现“正在启动”提示进度条,此时不需任何操作自动进入工程运行界面,如图1-11所示。
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">5</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">5</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 6 -->
@@ -741,10 +747,12 @@
            在安装程序窗口中单击“安装组态软件”按钮,弹出安装程序窗口。单击“下一步”按钮,启动安装程序,如图1-16所示。
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">7</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">7</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 8 -->
@@ -1116,10 +1124,12 @@
            (2)单击“窗口属性”按钮,弹出“用户窗口属性设置”对话框,在“基本属性”选项卡,将“窗口名称”修改为“常用构件使用”,单击“确认”按钮进行保存,如图1-23所示。
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">9</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">9</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 10 -->
@@ -1274,10 +1284,12 @@
            (6)单击工具箱中的“输入框”按钮,在窗口按住鼠标左键,拖放出两个一定大小的“输入框”,分别摆放在“状态显示1:”标签、“状态显示2:”标签的旁边位置,如图1-32所示。
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">11</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">11</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 12 -->
@@ -1485,10 +1497,12 @@
            />按钮,进行下载配置。单击“联机运行”按钮,连接方式选择“TCP/IP网络通信”,设置触摸屏IP与计算机IP在同一网段内,单击“通信测试”按钮,通
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">13</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">13</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
    <!-- 14 -->
@@ -1881,10 +1895,12 @@
            ></textarea>
          </p>
        </div>
        <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
          <li class="footer-num">15</li>
          <li class="footer-box"></li>
        </ul>
        <div class="fl ju-ed">
          <ul class="page-footer fl fl-cl al-cn w-mi p0 mb-40">
            <li class="footer-num">15</li>
            <li class="footer-box"></li>
          </ul>
        </div>
      </div>
    </div>
  </div>
src/books/embedded/view/components/index.vue
@@ -1,5 +1,8 @@
<template>
  <div class="page-main" @scroll="throttledScrollHandler">
    <div id="searchDomBox" style="display: none">
      <div id="searchContent"></div>
    </div>
    <div
      class="page-content"
      :style="{
@@ -40,8 +43,9 @@
      observer: null,
      loadPageObserver: null,
      loadPageList: [],
      questionData: {},
      renderSignMap: {}
      questionDataMap: {},
      renderSignMap: {},
      highlightData: null,
    };
  },
  computed: {
@@ -50,7 +54,7 @@
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100;
    }
    },
  },
  watch: {
    showCatalogList: {
@@ -61,7 +65,7 @@
        ) {
          // 调用父层方法
          this.$store.state.qiankun.catalogChange({
            showCatalogList: newVal
            showCatalogList: newVal,
          });
        }
        // 启动页码观察
@@ -69,17 +73,24 @@
          this.initObservation();
          this.initThemeColor();
        }, 500);
      }
      },
    },
    loadPageList: {
      handler(newVal, oldVal) {
        console.log(newVal, "this.loadPageList");
        setTimeout(() => {
          this.initSwiper();
          this.initViewer();
        }, 200);
      }
    }
      },
    },
    pageZoom: {
      handler(newVal, oldVal) {
        const scrollBox = (
          this.container ? this.container : document
        ).querySelector(".page-main");
        scrollBox.scrollTop = (scrollBox.scrollTop / oldVal) * newVal;
      },
    },
  },
  mounted() {
    // 默认加载章节
@@ -106,7 +117,15 @@
        // 删除笔记、高亮、划线
        delSign: (data) => {
          this.delSign(data);
        }
        },
        // 全文检索
        searchBookByKeyword: (keyword) => {
          return this.searchTextByPage(keyword);
        },
        // 跳转检索结果位置
        jumpSearchItem: (data) => {
          this.searchItemLocation(data);
        },
      });
    }
@@ -115,13 +134,13 @@
    this.observer = new IntersectionObserver(this.pageChangeCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0.5 // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
      threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0 // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
      threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    // 启动页码观察
@@ -147,9 +166,36 @@
    //   });
    // }, 2000);
    //   }, 5000);
    // }, 1000);
    // const pageDom = (this.container ? this.container : document)
    //   .querySelector("#app")
    //   .querySelectorAll(".page-box");
    // 检索
    // console.log(this.searchTextByPage("保护内脏器官"), "searchTextByPage");
    // 检索跳转
    // this.searchItemLocation({
    //   catalog: 2,
    //   page: 10,
    //   txt: " 运动系统是由骨、骨连结和骨骼肌三部分组成的。全身的骨通过骨连结组成人体骨骼(见图1-1)。骨骼是人体的支架,具有保护内脏器官、供肌肉附着和作为肌肉运动的杠杆等作用。在神经系统的支配下,肌肉收缩牵动所附着的骨绕着关节转动,使身体产生各种动作。所以,运动系统具有运动、支持和保护等功能,幼年时期的骨骼还具有造血功能。 ",
    //   txtIndex: 57
    // });
    // }, 5000);
  },
  methods: {
    // setZoom1() {
    //   let scale = this.$store.state.qiankun.scale + 10;
    //   const scrollBox = (
    //     this.container ? this.container : document
    //   ).querySelector(".page-main");
    //   this.$store.commit("setZoom", scale);
    // },
    // setZoom2() {
    //   let scale = this.$store.state.qiankun.scale - 10;
    //   const scrollBox = (
    //     this.container ? this.container : document
    //   ).querySelector(".page-main");
    //   this.$store.commit("setZoom", scale);
    // },
    // 滚动监听
    scrollFun(event) {
      // 判断向上滚动还是向下滚动
@@ -205,7 +251,7 @@
          this.showCatalogList = [
            this.catalogLength - 2,
            this.catalogLength - 1,
            this.catalogLength
            this.catalogLength,
          ];
        } else {
          this.showCatalogList = [catalog - 1, catalog, catalog + 1];
@@ -232,6 +278,7 @@
        // 立即渲染
        this.renderSign(type, data);
      }
      // 储存数据
      if (!this.renderSignMap[type]) this.renderSignMap[type] = {};
      if (!this.renderSignMap[type][data.page])
@@ -241,6 +288,10 @@
    // 渲染标记
    renderSign(type, data) {
      // 父层设置禁止渲染标记时不再进行渲染
      if (this.$store.state.qiankun.disableSign) {
        return false;
      }
      const existence = (
        this.container ? this.container : document
      ).querySelector(`[dataid="${data.id}"]`);
@@ -250,10 +301,7 @@
          this.container ? this.container : document
        ).querySelector(`[page="${data.page}"]`);
        // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组
        const treeWalker = document.createTreeWalker(
          pageDom,
          NodeFilter.SHOW_TEXT
        );
        const treeWalker = document.createTreeWalker(pageDom, NodeFilter.SHOW_TEXT);
        const allTextNodes = [];
        let currentNode = treeWalker.nextNode();
        while (currentNode) {
@@ -429,6 +477,7 @@
      });
    },
    getParentWithClass(element, className) {
      console.log(element, className, "element, className");
      while (element.parentElement) {
        element = element.parentElement;
        if (element.classList.contains(className)) {
@@ -458,7 +507,7 @@
            this.$store.state.qiankun.pageChange({
              page: page,
              catalog: catalog,
              text
              text,
            });
          // const sections = Array.from(document.querySelectorAll(".section"));
          //sections:获取所有具有 .section 类名的元素,并转换为数组。
@@ -478,16 +527,15 @@
              "chapter"
            );
            const catalog = catalogDom.getAttribute("num");
            // if (!this.questionData[page]) {
            // if (!this.questionDataMap[page]) {
            //   if (testData && testData[catalog]) {
            //     if (testData[catalog][page]) {
            //       if (Array.isArray(testData[catalog][page])) {
            //         this.questionData[page] = await getQuestionList(
            //         this.questionDataMap[page] = await getQuestionList(
            //           page,
            //           testData[catalog][page],
            //           this.config.activeBook
            //         );
            //       } else {
            //         const obj = {};
            //         for (let key in testData[catalog][page]) {
@@ -497,9 +545,9 @@
            //             this.config.activeBook
            //           );
            //         }
            //         this.questionData[page] = obj;
            //         this.questionDataMap[page] = obj;
            //       }
            //       console.log('题目',this.questionData);
            //       console.log("题目", this.questionDataMap);
            //     }
            //   }
            // }
@@ -512,6 +560,36 @@
                  this.renderSign(key, item);
                });
              }
            }
            // 处理高亮
            if (this.highlightData) {
              // 高亮行
              setTimeout(() => {
                // 获取页面所有text节点
                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页
@@ -564,40 +642,40 @@
      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;
          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"
            ),
          },
          slideChange:(value) => {
            let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数)
            let totalPages = value.slides.length; // 获取总页数
            var paginationInfoEl = dom.querySelector('.pageBox');
            if(paginationInfoEl)
              paginationInfoEl.textContent = currentPage + '/' + totalPages;
          // 窗口变化,重新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() {
@@ -607,18 +685,124 @@
      for (let i = 0; i < doms.length; i++) {
        const dom = doms[i];
        new Viewer(dom, {
          container: (this.container ? this.container.querySelector("#app") : "body"),
          container: this.container
            ? this.container.querySelector("#app")
            : "body",
          navbar: true, // 显示导航栏
          toolbar: true, // 显示工具栏
          title: true // 显示标题
          title: true, // 显示标题
        });
      }
    }
    },
    // 根据关键字全文检索
    searchTextByPage(keyword) {
      const searchResult = [];
      let catalogIndex = 0;
      // 所有章节组件(每本书制作时单独配置)
      const pageData = {
        pageHeader,
        chapterOne,
      };
      // 遍历所有章节文件
      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) {
              // 获取页面所有text节点
              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: {
    pageHeader,
    chapterOne,
  }
  },
};
</script>
<style scoped lang="less">