unknown
2024-05-29 db8134538a7721edade94e07c03ef59c063126ba
src/books/lifeCare/index.vue
@@ -1,33 +1,100 @@
<template>
  <div
    class="public-books"
    @scroll="throttledScrollHandler"
    @mouseup="handleMouseUp"
    :style="{
      fontSize: fontSize ? fontSize + 'px' : '16px',
      transform: `scale(${pageZoom ? pageZoom : 1})`,
    }"
  >
    <front001 v-if="showCatalogList.indexOf(0) > -1" />
    <ChapterOne v-if="showCatalogList.indexOf(1) > -1" />
    <!-- <ChapterTwo v-if="showCatalogList.indexOf(2) > -1" /> -->
    <!-- <ChapterThree v-if="showCatalogList.indexOf(3) > -1" /> -->
    <!-- <ChapterFour v-if="showCatalogList.indexOf(4) > -1" /> -->
    <!-- <ChapterFive  v-if="showCatalogList.indexOf(5) > -1" /> -->
    <!-- <chapterSix v-if="showCatalogList.indexOf(6) > -1" /> -->
    <chapterSix />
    <!-- <chapterSeven /> -->
    <!-- <chapterEight /> -->
    <!-- <chapterNine /> -->
    <!-- <chapter010 /> -->
    <!-- <chapter011 /> -->
    <!-- <chapter012 /> -->
    <!-- <chapter013 /> -->
    <!-- <chapter014 /> -->
    <!-- <chapter015 /> -->
    <!-- <chapter016 /> -->
    <!-- <chapter017 /> -->
    <!-- <topic008 /> -->
  <div class="page-main" @scroll="throttledScrollHandler">
    <div
      class="public-lifCare"
      @mouseup="handleMouseUp"
      :style="{
        fontSize: fontSize ? fontSize + 'px' : '16px',
        transform: `scale(${pageZoom ? pageZoom : 1})`,
        transformOrigin: 'center top',
      }"
    >
      <front001
        v-if="showCatalogList.indexOf(1) > -1"
        :showPageList="loadPageList"
      />
      <ChapterOne
        v-if="showCatalogList.indexOf(2) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <ChapterTwo
        v-if="showCatalogList.indexOf(3) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <ChapterThree
        v-if="showCatalogList.indexOf(4) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <ChapterFour
        v-if="showCatalogList.indexOf(5) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <ChapterFive
        v-if="showCatalogList.indexOf(6) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <chapterSix
        v-if="showCatalogList.indexOf(7) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <chapterSeven
        v-if="showCatalogList.indexOf(8) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <chapterEight
        v-if="showCatalogList.indexOf(9) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <chapterNine
        v-if="showCatalogList.indexOf(10) > -1"
        :showPageList="loadPageList"
        :questionData="questionData"
      />
      <chapter010
        v-if="showCatalogList.indexOf(11) > -1"
        :showPageList="loadPageList"
      />
      <chapter011
        v-if="showCatalogList.indexOf(12) > -1"
        :showPageList="loadPageList"
      />
      <chapter012
        v-if="showCatalogList.indexOf(13) > -1"
        :showPageList="loadPageList"
      />
      <chapter013
        v-if="showCatalogList.indexOf(14) > -1"
        :showPageList="loadPageList"
      />
      <chapter014
        v-if="showCatalogList.indexOf(15) > -1"
        :showPageList="loadPageList"
      />
      <chapter015
        v-if="showCatalogList.indexOf(16) > -1"
        :showPageList="loadPageList"
      />
      <chapter016
        v-if="showCatalogList.indexOf(17) > -1"
        :showPageList="loadPageList"
      />
      <chapter017
        v-if="showCatalogList.indexOf(18) > -1"
        :showPageList="loadPageList"
      />
      <chapter018
        v-if="showCatalogList.indexOf(19) > -1"
        :showPageList="loadPageList"
      />
    </div>
  </div>
</template>
@@ -50,18 +117,37 @@
import chapter015 from "./view/chapter015";
import chapter016 from "./view/chapter016";
import chapter017 from "./view/chapter017";
import chapter018 from "./view/chapter018";
import NoteIcon from "@/assets/images/biji.png";
import _ from "lodash";
import getQuestionList from "@/assets/methods/examination";
import testData from "./js/examinationList";
export default {
  name: "temp-book",
  data() {
    return {
      catalogLength: 13, // 总章节数
      catalogLength: 19, // 总章节数
      showCatalogList: [], // 显示的章节
      loadThreshold: 300, // 触发加载阈值
      throttleThreshold: 100, // 节流阈值
      previousScrollTop: 0,
      throttledScrollHandler: null,
      observer: null,
      loadPageObserver: null,
      loadPageList: [],
      questionData: {},
    };
  },
  computed: {
    fontSize() {
      return this.$store.state.qiankun.fontSize;
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100;
    },
  },
  provide() {
    return {
      changeQuestionData: this.changeQuestionData,
    };
  },
  watch: {
@@ -86,7 +172,7 @@
  },
  mounted() {
    // 默认加载章节
    this.showCatalogList = [0];
    this.showCatalogList = [11];
    // 滚动监听节流
    this.throttledScrollHandler = _.throttle(
      this.scrollFun,
@@ -119,6 +205,12 @@
      threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    // 启动页码观察
    setTimeout(() => {
      this.initObservation();
@@ -144,34 +236,6 @@
    //   }, 1000);
    // }, 3000);
  },
  components: {
    front001,
    ChapterOne,
    ChapterTwo,
    ChapterThree,
    ChapterFour,
    ChapterFive,
    chapterSix,
    chapterSeven,
    chapterEight,
    chapterNine,
    chapter010,
    chapter011,
    chapter012,
    chapter013,
    chapter014,
    chapter015,
    chapter016,
    chapter017,
  },
  computed: {
    fontSize() {
      return this.$store.state.qiankun.fontSize;
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100;
    },
  },
  methods: {
    getParentWithClass(element, className) {
      while (element.parentElement) {
@@ -187,6 +251,7 @@
      ).getSelection();
      const txt = selection.toString();
      if (selection.type != "none" && txt) {
        // eslint-disable-next-line no-unused-vars
        let node = selection.anchorNode.parentNode;
        let pageHtml = this.getParentWithClass(
          selection.anchorNode,
@@ -223,7 +288,6 @@
        }
      }
    },
    // 滚动监听
    scrollFun(event) {
      // 判断向上滚动还是向下滚动
@@ -330,7 +394,7 @@
            // 笔记
            pageDom.innerHTML = pageDom.innerHTML.replace(
              reg,
              `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')">${data.txt}<img src="${NoteIcon}" style="cursor: pointer" /></span>`
              `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')" onmouseout="noteOut">${data.txt}<img src="${NoteIcon}"/></span>`
            );
            break;
        }
@@ -368,11 +432,26 @@
        this.container ? this.container : document
      ).querySelectorAll(".page-box");
      sections.forEach((section) => {
        if (this.config.activeBook && this.config.activeBook.tryPageCount) {
          const page = section.getAttribute("page");
          if (Number(page) > this.config.activeBook.tryPageCount) {
            let chapterDom = this.getParentWithClass(section, "chapter");
            const chapterNum = chapterDom.getAttribute("num");
            this.catalogLength = Number(chapterNum) - 1;
            section.remove();
            return false;
          }
        }
        //observer 观察每个元素,以便在它们进入或离开视窗时触发回调函数。
        const isObserver = section.getAttribute("observer");
        const isLoadObserver = section.getAttribute("loadObserver");
        if (!isObserver) {
          this.observer.observe(section);
          section.setAttribute("observer", "1");
        }
        if (!isLoadObserver) {
          this.loadPageObserver.observe(section);
          section.setAttribute("loadObserver", "1");
        }
      });
    },
@@ -387,7 +466,6 @@
      const borderColorDom = (
        this.container ? this.container : document
      ).querySelectorAll(".theme-border");
      console.log(this.config, "this.configthis.config");
      // 获取配置的主题色
      const bookThemeColor =
        this.config.activeBook && this.config.activeBook.bookThemeColor
@@ -477,7 +555,7 @@
            "chapter"
          );
          const catalog = catalogDom.getAttribute("num");
          console.log("page", page, catalog);
          console.log(page, "page", catalog, "catalog");
          // 返回页码和章节信息
          if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange)
            this.$store.state.qiankun.pageChange({
@@ -491,6 +569,74 @@
        }
      });
    },
    loadPageCallback(entries, observer) {
      entries.forEach(async (entry) => {
        if (entry.isIntersecting) {
          const target = entry.target;
          const page = target.getAttribute("page");
          if (this.loadPageList.indexOf(page) == -1) {
            //
            const catalogDom = this.tool.getParentNodeByClassName(
              target,
              "chapter"
            );
            const catalog = catalogDom.getAttribute("num");
            if (!this.questionData[page]) {
              if (testData && testData[catalog]) {
                if (testData[catalog][page]) {
                  if (Array.isArray(testData[catalog][page])) {
                    this.questionData[page] = await getQuestionList(
                      [],
                      testData[catalog][page],
                      this.config.activeBook
                    );
                  } else {
                    const obj = {};
                    for (let key in testData[catalog][page]) {
                      obj[key] = await getQuestionList(
                        [],
                        testData[catalog][page][key],
                        this.config.activeBook
                      );
                    }
                    this.questionData[page] = obj;
                  }
                }
              }
            }
            this.loadPageList.push(Number(page));
            if (this.loadPageList.length > 5) {
              // 超过5页
              this.loadPageList.shift();
            }
          }
        }
      });
    },
    changeQuestionData(page, data) {
      this.$props.questionData[page] = data;
    },
  },
  components: {
    front001,
    ChapterOne,
    ChapterTwo,
    ChapterThree,
    ChapterFour,
    ChapterFive,
    chapterSix,
    chapterSeven,
    chapterEight,
    chapterNine,
    chapter010,
    chapter011,
    chapter012,
    chapter013,
    chapter014,
    chapter015,
    chapter016,
    chapter017,
    chapter018,
  },
};
</script>