闫增涛
2024-10-25 d6cc07d3e9c19a4f97f770581bc85ee3550a22ba
src/books/mathBook/view/components/index.vue
@@ -3,23 +3,48 @@
    <div id="searchDomBox" style="display: none">
      <div id="searchContent"></div>
    </div>
    <div class="page-content" :style="{
      fontSize: fontSize ? fontSize + 'px' : '16px',
      transform: `scale(${pageZoom ? pageZoom : 1})`,
      transformOrigin: 'center top',
    }">
      <pageHeader v-if="showCatalogList.indexOf(0) > -1" :showPageList="loadPageList"></pageHeader>
      <chapterOne v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList" :questionData="questionDataMap">
    <div
      class="page-content"
      :style="{
        fontSize: fontSize ? fontSize + 'px' : '16px',
        transform: `scale(${pageZoom ? pageZoom : 1})`,
        transformOrigin: 'center top',
      }"
    >
      <pageHeader
        v-if="showCatalogList.indexOf(1) > -1"
        :showPageList="loadPageList"
      ></pageHeader>
      <chapterOne
        v-if="showCatalogList.indexOf(2) > -1"
        :showPageList="loadPageList"
        :questionData="questionDataMap"
      >
      </chapterOne>
      <chapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :questionData="questionDataMap">
      <chapterTwo
        v-if="showCatalogList.indexOf(3) > -1"
        :showPageList="loadPageList"
        :questionData="questionDataMap"
      >
      </chapterTwo>
      <chapterThree v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :questionData="questionDataMap">
      <chapterThree
        v-if="showCatalogList.indexOf(4) > -1"
        :showPageList="loadPageList"
        :questionData="questionDataMap"
      >
      </chapterThree>
      <chapterFour v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :questionData="questionDataMap">
      <chapterFour
        v-if="showCatalogList.indexOf(5) > -1"
        :showPageList="loadPageList"
        :questionData="questionDataMap"
      >
      </chapterFour>
      <chapterFive v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :questionData="questionDataMap">
      <chapterFive
        v-if="showCatalogList.indexOf(6) > -1"
        :showPageList="loadPageList"
        :questionData="questionDataMap"
      >
      </chapterFive>
    </div>
  </div>
</template>
@@ -30,8 +55,8 @@
import chapterOne from "./chapter001.vue";
import chapterTwo from "./chapter002.vue";
import chapterThree from "./chapter003.vue";
import chapterFour from './chapter004.vue'
import chapterFive from './chapter005.vue'
import chapterFour from "./chapter004.vue";
import chapterFive from "./chapter005.vue";
import NoteIcon from "@/assets/images/biji.png";
import _ from "lodash";
import Swiper from "swiper/bundle";
@@ -57,6 +82,8 @@
      highlightData: null,
      questionId: {},
      collectId: [],
      questionDataIndex: 0, // 当前请求的是哪个章节的题目
      questionList: [], // 章节题目列表
    };
  },
  computed: {
@@ -105,7 +132,7 @@
  },
  mounted() {
    // 默认加载章节
    this.showCatalogList = [0];
    this.showCatalogList = [1];
    // 滚动监听节流
    this.throttledScrollHandler = _.throttle(
      this.scrollFun,
@@ -162,7 +189,7 @@
    // 测试页面跳转
    setTimeout(() => {
      this.gotoPage(3, 111);
      this.gotoPage(4,99);
    //   //   setTimeout(() => {
    //   //     this.renderSign("Highlight", {
    //   //       id: "2ACA9359",
@@ -194,7 +221,7 @@
    // 获取题目id列表
    this.getQuestionId();
    this.getCollect()
    this.getCollect();
  },
  methods: {
    // setZoom1() {
@@ -213,9 +240,7 @@
    // },
    // 滚动监听
    scrollFun(event) {
      this.handleVideoPicture()
      this.handleVideoPicture();
      // 判断向上滚动还是向下滚动
      if (event.target.scrollTop > this.previousScrollTop) {
        // 向下
@@ -270,7 +295,6 @@
            this.catalogLength - 2,
            this.catalogLength - 1,
            this.catalogLength,
          ];
        } else {
          this.showCatalogList = [catalog - 1, catalog, catalog + 1];
@@ -455,8 +479,8 @@
          page && pageThemeColor && pageThemeColor[page]
            ? pageThemeColor[page]
            : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum]
              ? chapterThemeColor[chapterNum]
              : bookThemeColor;
            ? chapterThemeColor[chapterNum]
            : bookThemeColor;
        if (themeColor) {
          domItem.style.color = themeColor;
        }
@@ -473,8 +497,8 @@
          page && pageThemeColor && pageThemeColor[page]
            ? pageThemeColor[page]
            : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum]
              ? chapterThemeColor[chapterNum]
              : bookThemeColor;
            ? chapterThemeColor[chapterNum]
            : bookThemeColor;
        if (themeColor) {
          domItem.style.backgroundColor = themeColor;
        }
@@ -491,8 +515,8 @@
          page && pageThemeColor && pageThemeColor[page]
            ? pageThemeColor[page]
            : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum]
              ? chapterThemeColor[chapterNum]
              : bookThemeColor;
            ? chapterThemeColor[chapterNum]
            : bookThemeColor;
        if (themeColor) {
          domItem.style.borderColor = themeColor;
        }
@@ -554,17 +578,21 @@
            if (!this.questionDataMap[page]) {
              if (this.questionId && this.questionId[catalog]) {
                if (this.questionId[catalog][page]) {
                  console.log(page,Array.isArray(this.questionId[catalog][page]));
                  if(Array.isArray(this.questionId[catalog][page])) {
                    this.questionDataMap[page] = await this.getQuestion(catalog, page,false);
                  if (Array.isArray(this.questionId[catalog][page])) {
                    this.questionDataMap[page] = await this.getQuestion(
                      catalog,
                      page,
                      false
                    );
                  } else {
                    const obj = {}
                    const obj = {};
                    for (let key in this.questionId[catalog][page]) {
                      obj[key] = await this.getQuestion(catalog, page,key)
                      obj[key] = await this.getQuestion(catalog, page, key);
                    }
                    this.questionDataMap[page] = obj
                    this.questionDataMap[page] = obj;
                  }
                }
                console.log(1, this.questionDataMap);
              }
            }
            // 渲染这一页的标记
@@ -814,7 +842,7 @@
      // 记录高亮信息
      this.highlightData = data;
      // 跳转
      this.gotoPage(data.catalog, data.page, () => { });
      this.gotoPage(data.catalog, data.page, () => {});
    },
    // 获取题目列表
    getQuestionId() {
@@ -826,7 +854,7 @@
    },
    // 获取题目收藏id列表
    getCollect() {
      if(!localStorage.getItem(this.config.tokenKey)) return false
      if (!localStorage.getItem(this.config.tokenKey)) return false;
      this.MG.identity
        .getUserKey({
          domain: "collectData",
@@ -836,17 +864,20 @@
          try {
            const collect = JSON.parse(res[0].value);
            if (collect.length) {
              this.collectId = collect.find(item => item.type == 'json').collectList
              this.collectId = collect.find(
                (item) => item.type == "json"
              ).collectList;
            }
          } catch (error) {
            console.log("暂无数据");
          }
        }).catch(res => {
          console.log('index 请求题目收藏id报错');
        })
        .catch((res) => {
          console.log("index 请求题目收藏id报错");
        });
    },
    // 获取章节题目
    async getQuestion(num, page,questionIndex) {
    async getQuestion(num, page, questionIndex) {
      let cardList = [
        {
          catalogName: "单选题",
@@ -871,40 +902,57 @@
      ];
      if (this.questionId) {
        if (this.questionId[num] && this.questionId[num][page]) {
          const res = await axios.get(
            this.config.activeBook.resourceUrl + "/question-" + num + ".json"
          );
          if (!res.data) return [];
          let ids = []
          questionIndex ? ids = this.questionId[num][page][questionIndex] : ids = this.questionId[num][page]
          for (let index = 0; index < res.data.data.length; index++) {
            const item = res.data.data[index];
          if (num != this.questionDataIndex || !this.questionList.length) {
            // 判断当前章节的题目json是否已经请求过
            const res = await axios.get(
              this.config.activeBook.resourceUrl + "/question-" + num + ".json"
            );
            if (!res.data) return [];
            this.questionList = res.data.data;
            this.questionDataIndex = res.data.chapterNum;
            console.log("章节号", num, res);
          }
          let ids = [];
          questionIndex
            ? (ids = this.questionId[num][page][questionIndex])
            : (ids = this.questionId[num][page]);
          for (let index = 0; index < this.questionList.length; index++) {
            const item = this.questionList[index];
            // 数学公式加类名去修改样式
            if (item.type && item.type == 'material') {
              if (!item.infoList.length) return false
              item.infoList.forEach(citem => {
                if (citem.answer) citem.answer = citem.answer.replace(/\<math/gi, '<math class="examination-math"')
              })
            if (item.type && item.type == "material") {
              if (!item.infoList.length) return false;
              item.infoList.forEach((citem) => {
                if (citem.answer)
                  citem.answer = citem.answer.replace(
                    /\<math/gi,
                    '<math class="examination-math"'
                  );
              });
            } else {
              if (item.answer) item.answer = item.answer.replace(/\<math/gi, '<math class="examination-math"')
              if (item.answer)
                item.answer = item.answer.replace(
                  /\<math/gi,
                  '<math class="examination-math"'
                );
            }
            item.isCollect = this.collectId.indexOf(item.id) > -1 ? true : false
            item.isCollect =
              this.collectId.indexOf(item.id) > -1 ? true : false;
            if (ids.indexOf(item.id) > -1) {
              if (item.type && item.type == "material") {
                cardList.push(item);
              } else {
                if (item.questionType == "judge") {
                  cardList[1].infoList.push(item);
                }
                }
                if (item.questionType == "singleChoice") {
                  cardList[0].infoList.push(item);
                }
                 if (item.questionType == "multipleChoice") {
                }
                if (item.questionType == "multipleChoice") {
                  cardList[2].infoList.push(item);
                }
                 if (item.questionType == "completion") {
                }
                if (item.questionType == "completion") {
                  cardList[3].infoList.push(item);
                }
                }
                if (item.questionType == "shortAnswer") {
                  cardList[4].infoList.push(item);
                }
@@ -917,17 +965,14 @@
        return [];
      }
    },
    // 视频小窗
    handleVideoPicture() {
      let doms = (
        this.container ? this.container : document
      ).querySelectorAll(".video");
      doms = Array.from(doms)
      if (!doms.length) return false
      const playVudio = doms
        .reverse()
        .find((item) => item.paused == false);
      let doms = (this.container ? this.container : document).querySelectorAll(
        ".video"
      );
      doms = Array.from(doms);
      if (!doms.length) return false;
      const playVudio = doms.reverse().find((item) => item.paused == false);
      if (playVudio) {
        const bottomGap = playVudio.getBoundingClientRect().bottom;
        const topGap = playVudio.getBoundingClientRect().top;
@@ -935,7 +980,7 @@
          playVudio.requestPictureInPicture();
        }
      }
    }
    },
  },
  components: {
    pageHeader,