unknown
2024-06-12 62a6b29d24207428219882556c77ffb5941b7943
Merge branch 'master' of http://182.92.203.7:2001/r/testbookLayout
7个文件已修改
5个文件已添加
1923 ■■■■■ 已修改文件
src/App.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/header.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/artAndDance/view/components/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/content/components/chapter005.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/content/components/chapter006.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/content/components/chapter007.vue 112 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/childHealth/view/content/components/chapter008.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/math/assets/images/Cover.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/books/math/assets/main.less 716 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/math/view/components/header.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/math/view/components/index.vue 862 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/books/math/view/index.vue 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -8,6 +8,7 @@
      v-if="activeBook.name == 'sportsAndHealth'"
    ></sportsAndHealth>
    <artAndDance v-if="activeBook.name == 'artAndDance'"></artAndDance>
    <math v-if="activeBook.name == 'math'"></math>
  </div>
</template>
@@ -18,7 +19,7 @@
import english from "./books/English/view/index.vue";
import sportsAndHealth from "./books/sportsAndHealth/view/index";
import artAndDance from './books/artAndDance/view/index.vue'
import math from './books/math/view/index.vue'
export default {
  name: "App",
  components: {
@@ -27,7 +28,8 @@
    embedded,
    english,
    sportsAndHealth,
    artAndDance
    artAndDance,
    math
  },
  data() {
    return {
@@ -72,7 +74,8 @@
        // embedded
        // english
        // artAndDance
        this.config.resourceCtx + "sportsAndHealth"
        // math
        this.config.resourceCtx + "math"
      );
      // 测试试读30页
      // this.activeBook.tryPageCount = 10;
src/books/artAndDance/view/components/header.vue
@@ -1,9 +1,10 @@
<template>
  <div class="chapter" num="1">
    <div class="page-box mt-20" page="1" style="min-height: auto;">
      <div v-if="showPageList.indexOf(1) > -1"></div>
      <div v-if="showPageList.indexOf(1) > -1">
      <img class="img-0" alt="" src="../../assets/images/Cover.jpg" />
    </div>
    </div>
    <div class="page-box" page="2" style="min-height: auto;">
      <div v-if="showPageList.indexOf(2) > -1">
        <img class="img-0" alt="" src="../../assets/images/SMY.jpg" />
src/books/artAndDance/view/components/index.vue
@@ -60,6 +60,7 @@
import Viewer from "viewerjs";
import "viewerjs/dist/viewer.css";
export default {
  name:"pageContent",
  data() {
    return {
      catalogLength: 7, // 总章节数
src/books/childHealth/view/content/components/chapter005.vue
@@ -701,7 +701,7 @@
            <p class="center">
              <b
                >中国居民膳食指南<a id="w1"></a
                ><a href="chapter005.html#m1"><sup>[1]</sup></a></b
                ><a href="javascript: void(0)"><sup>[1]</sup></a></b
              >
            </p>
            <p class="block">
@@ -731,7 +731,7 @@
          </div>
          <div class="annotation-border"></div>
          <p class="note t0 word-break-all">
            <a id="m1"></a><a href="chapter005.html#w1">[1]</a>
            <a id="m1"></a><a href="javascript: void(0)">[1]</a>
            摘自《〈中国居民膳食指南(2022)〉平衡膳食八准则》,http://dg.cnsoc.org/article/04/J4-AsD_DR3OLQMnHG0-jZA.html,2022-12-28。
          </p>
        </div>
@@ -834,7 +834,7 @@
            </p>
            <p class="block">
              第五,经常户外活动;定期体格测量,保障健康成长。<a id="w2"></a
              ><a href="chapter005.html#m2"><sup>[2]</sup></a>
              ><a href="javascript: void(0)"><sup>[2]</sup></a>
            </p>
            <p class="center openImgBox">
              <img src="../../../assets/images/chapterFive/0124-1.jpg" class="w100">
@@ -861,7 +861,7 @@
          </p>
          <div class="annotation-border"></div>
          <p class="note word-break-all">
            <a id="m2"></a><a href="chapter005.html#w2">[2]</a>
            <a id="m2"></a><a href="javascript: void(0)">[2]</a>
            摘自《中国婴幼儿喂养指南(2022)》,http://dg.cnsoc.org/article/04/gc5cUak3RhSGheqSaRljnA.html,
            2022-12-28。
          </p>
@@ -1385,7 +1385,7 @@
                <textarea
                  cols="30"
                  rows="4"
                  v-model="chapterFiveData.learnTableTwo.qEnight"
                  v-model="chapterFiveData.learnTableTwo.qEight"
                  placeholder="请输入内容"
                  maxlength="300"
                  class="w100 ta-br textarea-text"
@@ -1847,7 +1847,7 @@
                <textarea
                  cols="30"
                  rows="4"
                  v-model="chapterFiveData.learnTableThree.qEnight"
                  v-model="chapterFiveData.learnTableThree.qEight"
                  placeholder="请输入内容"
                  maxlength="300"
                  class="w100 ta-br textarea-text"
@@ -1986,7 +1986,7 @@
            <p class="center">
              <b
                >中华饮食文化及其对学前儿童饮食的影响<a id="w3"></a
                ><a href="chapter005.html#m3"><sup>[3]</sup></a></b
                ><a href="javascript: void(0)"><sup>[3]</sup></a></b
              >
            </p>
            <p class="block">
@@ -2017,7 +2017,7 @@
          </p>
          <div class="annotation-border"></div>
          <p class="note">
            <a id="m3"></a><a href="chapter005.html#w3">[3]</a>
            <a id="m3"></a><a href="javascript: void(0)">[3]</a>
            摘自江琳:《浅谈幼儿饮食生活中的课程资源及其开发》,载《学前教育研究》,2007(2)。引用时有改动。
          </p>
        </div>
@@ -2317,7 +2317,7 @@
                <textarea
                  cols="30"
                  rows="4"
                  v-model="chapterFiveData.learnTableFour.qEnight"
                  v-model="chapterFiveData.learnTableFour.qEight"
                  placeholder="请输入内容"
                  maxlength="300"
                  class="w100 ta-br textarea-text"
@@ -2872,8 +2872,8 @@
            qTwo: {
              oen: "",
              two: "",
              Three: "",
              Four: "",
              three: "",
              four: "",
            },
          },
          short: {
src/books/childHealth/view/content/components/chapter006.vue
@@ -223,7 +223,7 @@
                <textarea
                  cols="30"
                  rows="4"
                  v-model="chapterSixData.learnTableOne.qEnight"
                  v-model="chapterSixData.learnTableOne.qEight"
                  placeholder="请输入内容"
                  maxlength="300"
                  class="w100 ta-br textarea-text"
@@ -267,12 +267,12 @@
            282个儿童样本中发现,许多出生缺陷属于“随时畸形”,即在孕期的任何时间都可能发生由致畸因素导致的问题。<a
              id="w1"
            ></a
            ><a href="chapter006.html#m1"><sup>[1]</sup></a
            ><a href="javascript: void(0)"><sup>[1]</sup></a
            >因此,整个孕期都可以被看作人类发展的关键期。
          </p>
          <div class="annotation-border"></div>
          <p class="note">
            <a id="m1"></a><a href="chapter006.html#w1">[1]</a> Heinonen O P,
            <a id="m1"></a><a href="javascript: void(0)">[1]</a> Heinonen O P,
            Slone D, Monson R R, et al., Cardiovascular Birth Defects and
            Antenatal Exposure to Female Sex Hormones, Obstetrical and
            Gynecological Survey,1977,32(6):385-389.
@@ -323,11 +323,11 @@
            胎儿源之于孕妇,所以胎儿的成长是否健全,与孕妇的健康息息相关,这是中外学者一致认同的观点。赫洛克<a
              id="w2"
            ></a
            ><a href="chapter006.html#m2"><sup>[2]</sup></a
            ><a href="javascript: void(0)"><sup>[2]</sup></a
            >认为,为孕妇提供良好的环境,能供给个体一个充分发展其遗传素质的机会。还有学者研究认为,胎儿可以在一个原始的水平看、听、体验生活,甚至学习,孩子将来快乐或悲伤、攻击或温顺、安全或焦虑,部分与在子宫内所接受的信息有关。<a
              id="w3"
            ></a
            ><a href="chapter006.html#m3"><sup>[3]</sup></a>
            ><a href="javascript: void(0)"><sup>[3]</sup></a>
          </p>
          <p>
            中国古代就很重视胎教的问题。贾谊在《新书》中提及:古代王后怀孕时,令负责礼节、声乐、饮食等有关的官吏,立于门内,以随时注意王后听的礼乐是否不正、所食用的餐食是否不适。到了胎儿形成的时候,王后就要注意自己的言行,站要站直,坐要坐正,笑不可太大声,生气时不可过分动怒。举凡一切措施,都是为了避免胎儿受到不良影响。刘向在《列女传》中提及:古者妇人妊子寝不侧,坐不边,立不跸,不食邪味,耳不听于淫声,夜则令瞽诵诗书,道正事,如此则生子形容端正,才德必过人矣。又说:太姒妊文王也,目不视恶色,耳不听恶声,文王因之生而圣明。
@@ -350,11 +350,11 @@
          </p>
          <div class="annotation-border"></div>
          <p class="note">
            <a id="m2"></a><a href="chapter006.html#w2">[2]</a> Hurlock EB,Child
            <a id="m2"></a><a href="javascript: void(0)">[2]</a> Hurlock EB,Child
            Development(6ed),New York,McGraw-Hill Inc,1983.
          </p>
          <p class="note">
            <a id="m3"></a><a href="chapter006.html#w3">[3]</a> Verny
            <a id="m3"></a><a href="javascript: void(0)">[3]</a> Verny
            Thomas,Kelly John,The Secret Life of the Unborn Child, New
            York,Dell,1982.
          </p>
src/books/childHealth/view/content/components/chapter007.vue
@@ -1134,7 +1134,7 @@
            <p class="center">
              <b
                >新生儿抚触<a id="w1"></a
                ><a href="chapter007.html#m1"><sup>[1]</sup></a></b
                ><a href="javascript: void(0)"><sup>[1]</sup></a></b
              >
            </p>
            <p class="block">
@@ -1360,14 +1360,15 @@
              </td>
            </tr>
          </table>
          <p class="custom_tag"><b>•学习初体验•</b></p>
          <div class="fieldset">
            <p>
            <p class="block">
              乐乐的妈妈开始发愁了,儿子已经过了2岁,可牙齿还没有出齐,长出来的几颗也是七零八落,排列很不规则。已是寒冬季节,乐乐晚上睡觉还是不停地出汗,并且睡一会就惊一下,闹一阵,好像有人吓唬他似的。而隔壁莉莉和他同岁,已经跑得欢实了,但乐乐的腿还是软软
            </p>
          </div>
          <div class="annotation-border"></div>
          <p class="note">
            <a id="m1"></a><a href="chapter007.html#w1">[1]</a>
            <a id="m1"></a><a href="javascript: void(0)">[1]</a>
            整理自北京中医药大学东方医院儿科主管护师王潇相关文章。
          </p>
        </div>
@@ -1384,7 +1385,7 @@
          </div>
        </div>
        <div class="padding-96">
          <p class="custom_tag"><b>•学习初体验•</b></p>
          <div class="fieldset">
            <p class="block t0">
              的,走路跌跌撞撞,步态不稳。乐乐到底得了什么病呢?
@@ -2860,7 +2861,7 @@
          <p>(2)护理</p>
          <p>①患急性肝炎应卧床休息,病情好转后可轻微活动,但以不感觉疲劳为宜。</p>
          <p>
            ②饮食宜少吃脂肪,适当增加蛋白质和糖类的供给量,多吃水果蔬菜。蛋白质是肝细胞再生和修复所必需的营养物质,糖类是供给能量的主要来源。脂肪过多,只能加重肝脏的负担。但也不宜吃过多的蛋白质和糖类,过剩的蛋白质、糖类可转化为脂肪,并
            ②饮食宜少吃脂肪,适当增加蛋白质和糖类的供给量,多吃水果蔬菜。蛋白质是肝细胞再生和修复所必需的营养物质,糖类是供给能量的主要来源。脂肪过多,只能加重肝脏的负担。但也不宜吃过多的蛋白质和糖类,过剩的蛋白质、糖类可转化为脂肪,并可加重
          </p>
        </div>
      </div>
@@ -2875,7 +2876,7 @@
          <span class="page-header-num">199</span>
        </div>
        <div class="padding-96">
          <p class="t0">可加重腹胀。</p>
          <p class="t0">腹胀。</p>
          <p>
            ③做好消毒隔离工作。患者的食具、水杯、牙刷要专用。食具、水杯、毛巾每日煮沸消毒一次。便盆用消毒液浸泡,衣服、被褥常晒(暴晒4~6小时)。
          </p>
@@ -2952,7 +2953,7 @@
          <p>手足口病是由肠道病毒感染引起的疱疹性传染病。</p>
          <h5 id="e229">1.流行特点</h5>
          <p>
            患者是主要的传染源。患儿的水疱液、咽分泌物及粪便中均可带有病毒。夏季高
            患者是主要的传染源。患儿的水疱液、咽分泌物及粪便中均可带有病毒。夏季高发,
          </p>
        </div>
      </div>
@@ -2967,7 +2968,7 @@
          <span class="page-header-num">201</span>
        </div>
        <div class="padding-96">
          <p class="t0">发,1~2岁幼儿多见。</p>
          <p class="t0">1~2岁幼儿多见。</p>
          <h5 id="e230">2.症状</h5>
          <p>
            潜伏期4~6日。最先出现轻微症状如发热、咳嗽、咽痛及全身不适。以手、足、口腔等部位的皮疹和疱疹为主要特征。在指(趾)的背面、侧缘、手掌、足跖,尤其是指(趾)甲周围,有时在臀部、躯干和四肢发生红色斑丘疹,很快发展为水疱。口腔内在舌、硬腭、颊黏膜、齿龈上发生水疱,破溃后形成浅在的糜烂,因疼痛而影响进食。8~10天水疱结痂,疾病痊愈。
@@ -3052,7 +3053,7 @@
          </p>
          <h5 id="e241">1.流行特点</h5>
          <p>
            手癣和中医学中记载的“鹅掌风”相类似,足癣俗称“脚气”,甲癣俗称“灰指甲”。以足癣多见。主要通过直接接触病原体侵犯部位或使用病原体污染的物品,如
            手癣和中医学中记载的“鹅掌风”相类似,足癣俗称“脚气”,甲癣俗称“灰指甲”。以足癣多见。主要通过直接接触病原体侵犯部位或使用病原体污染的物品,如拖
          </p>
        </div>
      </div>
@@ -3067,7 +3068,7 @@
          <span class="page-header-num">203</span>
        </div>
        <div class="padding-96">
          <p class="t0">拖鞋、洗脚盆、毛巾而感染。</p>
          <p class="t0">鞋、洗脚盆、毛巾而感染。</p>
          <h5 id="e242">2.症状</h5>
          <p>
            病程缓慢,有不同程度瘙痒,夏季较重,冬季减轻。穿不透气的胶鞋、球鞋加重,治愈后可再感染。
@@ -3157,7 +3158,7 @@
          <p>①口服脊髓灰质炎减毒活疫苗糖丸,未服糖丸者可注射丙种球蛋白。</p>
          <p>②注意个人卫生和环境卫生。</p>
          <p>
            ③食具、用具、玩具、家具等日常用品及患儿生活环境彻底用紫外线或消毒液消
            ③食具、用具、玩具、家具等日常用品及患儿生活环境彻底用紫外线或消毒液消毒。
          </p>
        </div>
      </div>
@@ -3172,7 +3173,6 @@
          <span class="page-header-num">205</span>
        </div>
        <div class="padding-96">
          <p class="t0">毒。</p>
          <p>④早发现、早隔离、早治疗。</p>
          <h4 id="d286">(十八)狂犬病</h4>
          <p>狂犬病又称“恐水症”,是由狂犬病毒感染引起的急性传染病。</p>
@@ -3228,7 +3228,7 @@
          </p>
          <h5 id="e257">1.病因及流行病学</h5>
          <p>
            人蛔虫是寄生在人体的最大线虫之一,雌雄异体。其成虫状如蚯蚓,色淡红,寄生于肠道内,寿命约1年。雌成虫身体较长,尾端伸直,每日产卵20余万个;雄成虫较短,尾端向腹侧卷曲。虫卵随粪便排出。刚产出的卵无感染力,但生命力顽强。虫卵污染泥土、食物,在适宜的温度、湿度条件下,2周左右发展为感染性虫卵。学前儿童
            人蛔虫是寄生在人体的最大线虫之一,雌雄异体。其成虫状如蚯蚓,色淡红,寄生于肠道内,寿命约1年。雌成虫身体较长,尾端伸直,每日产卵20余万个;雄成虫较短,尾端向腹侧卷曲。虫卵随粪便排出。刚产出的卵无感染力,但生命力顽强。虫卵污染泥土、食物,在适宜的温度、湿度条件下,2周左右发展为感染性虫卵。学前儿童喜玩泥土,若
          </p>
        </div>
      </div>
@@ -3245,7 +3245,7 @@
        </div>
        <div class="padding-96">
          <p class="t0">
            喜玩泥土,若饭前不认真洗手,或生吃不洁的瓜果蔬菜、喝不洁生冷水,或使用虫卵污染的食具、玩具等,均可感染该病。
            饭前不认真洗手,或生吃不洁的瓜果蔬菜、喝不洁生冷水,或使用虫卵污染的食具、玩具等,均可感染该病。
          </p>
          <h5 id="e258">2.症状</h5>
          <p>
@@ -3260,14 +3260,51 @@
            ①进行广泛的卫生宣传,注意环境卫生,消灭蝇类。做好粪便管理和改良积肥,不随地大小便。
          </p>
          <p>②讲究饮食卫生,生吃瓜果蔬菜一定要洗干净。</p>
          <div class="fl fl-around">
            <div class="left" style="width: 38%">
              <p>
                ③讲究个人卫生,勤剪指甲,进餐前后肥皂、流动水洗手,不吸吮手指。
              </p>
              <p>④托幼机构可于每年9月、10月进行集体驱蛔。</p>
              <p>(2)治疗</p>
              <p>服驱蛔虫药,驱蛔虫。</p>
          <div class="fl fl-around">
            <div class="left" style="width: 48%">
              <p class="center openImgBox" style="margin-top: 50px">
                <img src="../../../assets/images/chapterSeven/0219-2.jpg" style="width:95%">
              </p>
              <p class="img">图7-1 蛲虫生活史</p>
            </div>
            <div class="right" style="width: 50%">
              <h4 id="d288" class="tl">(二)蛲虫病</h4>
              <p>
                蛲虫病是蛲虫寄生于人体所致的一种常见的寄生虫病。临床以会阴及肛门附近瘙痒为特征,易在家庭及托幼机构中流行。
              </p>
              <h5 id="e260" class="tl">1.病因及流行病学</h5>
              <p>
                蛲虫为乳白色,约1厘米长,状如棉线线头,故又名线头虫。雌雄异体。一般寄生于人体小肠下段、阑尾、直肠等处。雌雄交配,雄虫交配后即死亡。雌虫于夜间移行至肛门附近产卵,每条雌虫可含卵5000~17000个,成熟的雌虫在爬行时连续产卵,数分钟内可连续产卵达10000个左 右。具有感染性的虫卵被吞入后至发育为成虫需1个月左右,
              </p>
            </div>
          </div>
        </div>
      </div>
    </div>
    <!-- 207 -->
    <div class="page-box" page="215">
      <div v-if="showPageList.indexOf(215) > -1">
        <div class="page-header-box">
          <span class="page-header-text"
            >专题七&nbsp;学前儿童疾病及其预防</span
          >
          <span class="page-header-num">207</span>
        </div>
        <div class="padding-96">
          <p class="m0-t0">
           成虫的寿命为20~30天。成熟的虫卵对外界抵抗力甚大,在自然环境中可保持感染性10~14天。
          </p>
          <div class="fl fl-around">
            <div class="left" style="width: 38%">
              <p class="tl">
                儿童主要经手—口传染。被虫卵污染的手、食物、食具可使人进食时感染。由于雌虫夜间在肛门处产卵,引起瘙痒,儿童用手抓挠,手或指甲内沾上虫卵可使患儿反复感染。虫卵排出后还可污染衣裤、被褥或玩具,也可造成传播。
              </p>
            </div>
            <div class="right" style="width: 60%">
              <video
@@ -3288,43 +3325,6 @@
              <p class="img">视频:学前儿童常见寄生虫病——蛲虫病</p>
            </div>
          </div>
          <div class="fl fl-around">
            <div class="left" style="width: 48%">
              <p class="center openImgBox" style="margin-top: 50px">
                <img src="../../../assets/images/chapterSeven/0219-2.jpg" style="width:95%">
              </p>
              <p class="img">图7-1 蛲虫生活史</p>
            </div>
            <div class="right" style="width: 50%">
              <h4 id="d288" class="tl">(二)蛲虫病</h4>
              <p>
                蛲虫病是蛲虫寄生于人体所致的一种常见的寄生虫病。临床以会阴及肛门附近瘙痒为特征,易在家庭及托幼机构中流行。
              </p>
              <h5 id="e260" class="tl">1.病因及流行病学</h5>
              <p>
                蛲虫为乳白色,约1厘米长,状如棉线线头,故又名线头虫。雌雄异体。一般寄生于人体小肠下段、阑尾、直肠等处。雌雄交配,雄虫交配后即死亡。雌虫于夜间移行至肛门附近产卵,每条雌虫可含卵5000~17000个,成熟的雌虫在爬行时连续产卵,数分钟内可连续产卵达10000个左
              </p>
            </div>
          </div>
        </div>
      </div>
    </div>
    <!-- 207 -->
    <div class="page-box" page="215">
      <div v-if="showPageList.indexOf(215) > -1">
        <div class="page-header-box">
          <span class="page-header-text"
            >专题七&nbsp;学前儿童疾病及其预防</span
          >
          <span class="page-header-num">207</span>
        </div>
        <div class="padding-96">
          <p class="m0-t0">
            右。具有感染性的虫卵被吞入后至发育为成虫需1个月左右,成虫的寿命为20~30天。成熟的虫卵对外界抵抗力甚大,在自然环境中可保持感染性10~14天。
          </p>
          <p class="tl">
            儿童主要经手—口传染。被虫卵污染的手、食物、食具可使人进食时感染。由于雌虫夜间在肛门处产卵,引起瘙痒,儿童用手抓挠,手或指甲内沾上虫卵可使患儿反复感染。虫卵排出后还可污染衣裤、被褥或玩具,也可造成传播。
          </p>
          <h5 id="e261" class="tl">2.症状</h5>
          <p class="tl">
            雌虫夜间产卵使肛门奇痒,影响睡眠,间接影响小儿的精神状态和食欲。因瘙痒抓破皮肤,可使肛门周围皮肤发炎。
@@ -3448,7 +3448,7 @@
            8.幼儿患上呼吸道感染时,应适当增加运动量,促进痊愈。(<input
              type="text"
              class="judge-input"
              v-model="chapterSevenData.question.judge.qEnight"
              v-model="chapterSevenData.question.judge.qEight"
              @input="saveChapterOneData"
            />)
          </p>
@@ -3456,7 +3456,7 @@
            9.麻疹黏膜斑为麻疹患者特有的征象,是早期诊断麻疹的重要标志。(<input
              type="text"
              class="judge-input"
              v-model="chapterSevenData.question.judge.qEnight"
              v-model="chapterSevenData.question.judge.qNine"
              @input="saveChapterOneData"
            />)
          </p>
@@ -3782,7 +3782,7 @@
            qFive:"",
            qSix:"",
            qSeven:"",
            qEnight:"",
            qEight:"",
            qNine:"",
            qTen:"",
            qEleven:"",
src/books/childHealth/view/content/components/chapter008.vue
@@ -512,6 +512,8 @@
          <p>
            ②用左手食指、拇指将患儿上下眼皮轻轻分开,嘱患儿头向后仰,眼睛向上看。
          </p>
          <p>③操作者右手持滴药瓶,轻轻将药液滴于下眼皮内,每次1~2滴。</p>
          <p> ④嘱患儿轻轻闭上眼睛,操作者用拇指、食指轻提其上眼皮,嘱患儿转动眼球,使药液均匀涂满眼内。</p>
          <p class="custom_tag"><b>•温馨提示•</b></p>
          <div class="fieldset">
            <p class="block">①眼药膏宜在睡前涂用。</p>
@@ -522,10 +524,7 @@
              ③若眼药膏和滴眼液合用,应先使用滴眼液,5~10分钟后再涂眼药膏,因为眼药膏的油性会阻碍滴眼液的吸收。
            </p>
            <p class="block">
              ④眼药膏开启后,使用期不要超过4周。③操作者右手持滴药瓶,轻轻将药液滴于下眼皮内,每次1~2滴。
            </p>
            <p class="block">
              ④嘱患儿轻轻闭上眼睛,操作者用拇指、食指轻提其上眼皮,嘱患儿转动眼球,使药液均匀涂满眼内。
              ④眼药膏开启后,使用期不要超过4周。
            </p>
          </div>
          <p>涂眼药膏前也应核对药名,操作如下。</p>
@@ -1178,13 +1177,16 @@
          </p>
          <h4 id="d296">(六)晕厥</h4>
          <p>
            天气过于炎热,未进早餐引起低血糖,或站立过久、疼痛、精神紧张,均可使大脑短时间出现供血不足,引起晕厥。晕厥发生前,患儿多有短时间的头晕、恶心、心慌、眼前发黑、四肢发凉、出冷汗症状,随即摔倒在地。
            天气过于炎热,未进早餐引起低血糖,或站立过久、疼痛、精神紧张,均可使大脑短时间出现供血不足,引起晕厥。晕厥发生前,患儿多有短时间的头晕、恶心、心慌、眼前
          </p>
          <div class="fl fl-around">
            <div class="left" style="width: 75%">
              <div>
                <p class="t0">发黑、四肢发凉、出冷汗症状,随即摔倒在地。</p>
              <p>
                处理办法:让患儿平卧,松开衣领、腰带,头部略放低,脚略抬高,改善脑部供血,不长时间即可恢复(见图8-3)。患儿清醒后,可适当补充热的糖盐水或热饮。
              </p>
              </div>
            </div>
            <div class="right" style="width: 20%">
              <p class="center openImgBox">
@@ -1197,7 +1199,7 @@
            <div class="left" style="width: 38%">
              <h4 id="d297" class="tl">(七)惊厥</h4>
              <p class="tl">
                幼儿惊厥的原因很多(详见本书专题七),表现通常是突然性意识丧失,头向后仰,眼球凝视,口唇青紫,呼吸微弱,四肢及面部抽搐,持续时间不等,可短至1分钟,长至几十分钟。发生惊厥后,保教人员不可惊慌、大声呼叫或拍打幼儿。
                幼儿惊厥的原因很多(详见本书专题七),表现通常是突然性意识丧失,头向后仰,眼球凝视,口唇青紫,呼吸微弱,四肢及面部抽搐,持续时间不等,可短至1分钟,长至几十分钟。发生
              </p>
            </div>
            <div class="right" style="width: 60%">
@@ -1217,6 +1219,7 @@
              <p class="img">视频:惊厥、晕厥、休克的处理</p>
            </div>
          </div>
          <p class="t0">惊厥后,保教人员不可惊慌、大声呼叫或拍打幼儿。</p>
          <p class="tl">处理办法如下。</p>
          <p class="tl">①让患儿侧卧,便于及时排出分泌物,防止异物入气管。</p>
        </div>
src/books/math/assets/images/Cover.jpg
src/books/math/assets/main.less
New file
@@ -0,0 +1,716 @@
.math-book {
  width: 100%;
  height: 100%;
  font-family: "宋体", SimSun, sans-serif;
  ul {
    list-style-type: none;
  }
  li {
    list-style-type: none;
  }
  .ls1 {
    font-family: "HiFont Hei GB";
    color: #30aad1;
    font-weight: bold;
  }
  .hs {
    font-family: "HiFont Hei GB";
    color: #ea6b00;
    font-weight: bold;
  }
  .zs1 {
    font-family: "HiFont Hei GB";
    color: #857eb4;
    font-weight: bold;
  }
  span.under1 {
    border-bottom: 2px solid #f0bd4a;
    border-width: 2px;
  }
  div.bodystyle {
    font-size: 18px;
    text-align: justify;
    margin: 5%;
    line-height: 30px;
  }
  span.zt-0 {
    color: #0087af;
  }
  p.pzt-0 {
    color: #0087af;
    font-size: 18px;
  }
  p.pzt-0-right {
    font-size: 18px;
    color: #0087af;
    text-align: right;
  }
  p.pzt-1 {
    font-weight: bold;
    color: #0087af;
    font-size: 18px;
  }
  .note {
    font-size: 0.85em;
  }
  .img {
    text-align: center;
    font-size:18px;
    color: #000;
    margin-left: 0%;
    margin-right: 0%;
    text-indent: 0em;
  }
  .img1 {
    text-align: right;
    font-size: 0.85em;
    margin-left: 0%;
    margin-right: 2em;
    text-indent: 0em;
  }
  p {
    // margin-top: 1em;
    margin: 0;
    text-indent: 2em;
    line-height: 30px;
    font-size: 18px;
    text-align: justify;
  }
  .cover {
    width: 100%;
    padding: 0px;
  }
  .center {
    text-align: center;
    margin-left: 0%;
    margin-right: 0%;
    text-indent: 0em;
  }
  .center1 {
    font-family: "STKaiti";
    text-align: center;
    margin-left: 0%;
    margin-right: 0%;
    text-indent: 0em;
  }
  .left {
    text-indent: 0em;
    margin-left: 0%;
    margin-right: 0%;
  }
  .right {
    text-align: right;
    margin-left: 0%;
    margin-right: 0%;
  }
  .right1 {
    font-family: "STKaiti";
    text-align: right;
    margin-left: 0%;
    margin-right: 0%;
  }
  .quote {
    margin-top: 0%;
    margin-bottom: 0%;
    margin-left: 1em;
    margin-right: 1em;
    text-align: justify;
    font-family: "cnepub", serif;
  }
  h1 {
    font-family: "STKaiti";
    text-align: center;
    font-size: 1.8em;
    color: #515594;
    margin-bottom: 0.5cm;
    margin-top: 0.5cm;
  }
  h2 {
    font-family: "STKaiti";
    text-align: center;
    font-size: 1.2em;
    margin-top: 0.2em;
    margin-bottom: 0.2em;
    text-indent: 0em;
  }
  h2.lefth2 {
    text-align: left;
    font-size: 1.2em;
    margin-top: 0.2em;
    margin-bottom: 0.2em;
    text-indent: 0em;
  }
  h2.whleft2 {
    text-align: left;
    color: #af0206;
    font-size: 38px;
    margin-top: 0.2em;
    margin-bottom: 0.2em;
    text-indent: 0em;
  }
  h3 {
    font-family: "STKaiti";
    color: #ef495d;
    font-weight: bold;
    // font-size: 1.15em;
    font-size: 26px;
    margin-top: 2em;
    text-align: center;
    margin-bottom: 20px;
    text-indent: 0em;
  }
  h4 {
    font-weight: bold;
    color: #5877ba;
    font-size: 1.1em;
    margin-top: 0.2em;
    margin-bottom: 1em;
    text-indent: 0em;
  }
  h5 {
    font-weight: bold;
    color: #c96653;
    font-size: 1em;
    margin-top: 0.2em;
    margin-bottom: 1em;
    text-indent: 2em;
  }
  h6 {
    font-family: "cnepub", serif;
    color: #36c3f4;
    font-size: 1.1em;
    margin-top: 10px;
    text-indent: 2em;
    margin-bottom: 10px;
  }
  .u {
    text-decoration: underline;
  }
  .img-0 {
    width: 100%;
  }
  .imz {
    width: 96%;
    text-align: center;
  }
  .img-a {
    width: 95%;
  }
  .img-b {
    width: 80%;
  }
  .img-c {
    width: 70%;
  }
  .img-d {
    width: 60%;
  }
  .img-e {
    width: 50%;
  }
  .img-f {
    width: 40%;
  }
  .img-g {
    width: 30%;
  }
  .img-gh1 {
    width: 30%;
    text-align: right;
  }
  .img-gh2 {
    width: 45%;
    text-align: right;
  }
  .img-h {
    width: 25%;
  }
  .img-i {
    width: 10%;
  }
  .img-j {
    width: 5%;
  }
  .img-gn {
    width: 48%;
  }
  .img-gn1 {
    width: 18%;
  }
  .inline {
    height: 2em;
    margin-bottom: -0.5em;
  }
  .inline1 {
    height: 1.5em;
    margin-top: -1em;
    margin-bottom: -0.4em;
  }
  .inline2 {
    height: 2.5em;
    margin-top: 2em;
    margin-bottom: -0.4em;
  }
  .inline3 {
    height: 4em;
    margin-top: 2em;
    margin-bottom: -0.4em;
  }
  .block {
    font-family: "STKaiti";
    font-size: 1.15em;
  }
  .block1 {
    font-family: "STKaiti";
    color: #08a496;
    text-align: right;
    font-size: 1.15em;
    margin-right: 2em;
    text-indent: 0em;
  }
  .block2 {
    font-family: "STKaiti";
    // font-size: 1.15em;
    font-size: 26px;
    text-align: center;
    text-indent: 0em;
    margin: 6px 0;
  }
  .bj1 {
    border: 2px solid #0aa19c;
    background: #e3efd7;
    border-style: solid none none none;
    padding: 0.2em 0.4em 0.2em 0.4em;
    margin-top: 1em;
    margin-left: 0.5em;
    margin-right: 0.5em;
    margin-bottom: 1em;
    font-size: 1.1em;
    box-shadow: 0.3em 0.3em 0px 0px #c3c2c0;
  }
  .bj2 {
    border: 2px solid #e04239;
    background: #fdecd2;
    border-style: solid none none none;
    padding: 0.2em 0.4em 0.2em 0.4em;
    margin-top: 1em;
    margin-left: 0.5em;
    margin-right: 0.5em;
    margin-bottom: -0.8em;
    font-size: 1.1em;
    box-shadow: 0.3em 0.3em 0px 0px #c3c2c0;
  }
  .kaiti {
    font-family: "STKaiti";
  }
  // 自定义
  .page-box {
    position: relative;
    box-sizing: border-box;
    min-height: 1150px;
    margin-bottom: 20px;
    box-shadow: 0 3px 6px 1px #00000029;
    background-color: #fff;
  }
  .book {
    margin: 0 auto;
    width: 816px;
  }
  .text-center {
    text-align: center;
  }
  .tl {
    text-align: left !important;
  }
  .tl-ri {
    text-align: right !important;
  }
  .tl-ju {
    text-align: justify;
  }
  .ti2 {
    text-indent: 2em !important;
  }
  .lineInput {
    width: 90%;
    font-size: 14px;
    color: #666;
    border: none;
    border-bottom: 1px solid #15c0f2;
    outline: none;
    background: transparent;
  }
  .textarea-border {
    border-color: #15c0f2;
  }
  .completion-input {
    width: 64px !important;
    color: #000 !important;
  }
  .judge-input {
    width: 20px;
    font-size: 14px;
    color: #000;
    border: none;
    border: 0;
    outline: none;
    background: transparent;
  }
  .sport-text {
    font-size: 20px;
    line-height: 40px;
  }
  .img-text {
    color: #000;
    text-align: center;
    font-size: 16px;
    text-indent: 0em;
    font-weight: 700;
  }
  .text-size {
    font-size: 20px;
  }
  .fl {
    display: flex;
  }
  .fl-evenly {
    justify-content: space-evenly;
  }
  .fl-around {
    justify-content: space-around;
  }
  .fl-between {
    justify-content: space-between;
  }
  .ju-cn {
    justify-content: center;
  }
  .fl-di {
    flex-direction: column;
  }
  .fl-cn {
    align-items: center;
  }
  .fz-18 {
    font-size: 18px;
  }
  .fz-16 {
    font-size: 16px;
  }
  .fz-14 {
    font-size: 14px;
  }
  .fz-12 {
    font-size: 12px;
  }
  .suspend-title {
    white-space: nowrap;
    min-width: 120px;
    position: absolute;
    top: -27px;
    left: -15px;
    background-color: #32a59e;
    height: 34px;
    line-height: 34px;
    border-radius: 13px;
    color: #fff;
    text-align: center;
  }
  .m0 {
    margin: 0;
  }
  .t0 {
    text-indent: 0;
  }
  .t2 {
    text-indent: 2em;
  }
  .m0-t0 {
    margin: 0;
    text-indent: 0 !important;
  }
  .learn-btn img {
    cursor: pointer;
    height: 30px;
    // width: 25px;
  }
  .lh {
    line-height: 1.5em;
    margin-top: 0.5em;
  }
  .page-box {
    box-sizing: border-box;
    min-height: 1150px ;
    margin-bottom: 20px;
    box-shadow: 0 3px 6px 1px #00000029;
    background-color: #fff;
  }
  .ds-bl {
    display: block;
  }
  ul {
    list-style: none;
    padding: 0;
  }
  .lh2 {
    line-height: 2em;
  }
  .header-box {
    position: relative;
    display: flex;
    justify-content: flex-end;
    margin-bottom: 20px;
  }
  .header-border-box {
    width: 90%;
    height: 100px;
    border-bottom: 1px solid #00aeef;
    border-left: 1px solid #00aeef;
  }
  .header-num-box {
    box-sizing: border-box;
    position: absolute;
    top: 50px;
    width: 100%;
    height: 26px !important;
    line-height: 26px;
    background-color: #15c0f2;
    color: #fff;
    padding-left: 50px;
  }
  .page-header-box {
    padding-top: 96px;
    display: flex;
    justify-content: flex-end;
    align-items: flex-end;
    margin-bottom: 28px;
  }
  .page-header-text {
    color: #616161;
    font-size: 14px;
  }
  .page-header-num {
    display: inline-block;
    width: 100px;
    height: 30px;
    line-height: 30px;
    padding-left: 20px;
    box-sizing: border-box;
    background-color: #15c0f2;
    color: #fff;
    margin-left: 20px;
    font-weight: bold;
  }
  .fw-b {
    font-weight: bold;
  }
  .italic {
    font-style: italic;
  }
  .mb-0 {
    margin-bottom: 0;
  }
  .mb-20 {
    margin: 20px 0 !important;
  }
  .mb-40 {
    margin-bottom: 40px !important;
  }
  .mt-20 {
    margin-top: 20px;
  }
  .mt-40 {
    margin-top: 40px;
  }
  .mb-80 {
    margin-bottom: 80px !important;
  }
  .mr-20 {
    margin-right: 20px;
  }
  .ml-30 {
    margin-left: 30px;
  }
  .table-box {
    width: 94%;
    font-family: "STKaiti";
    line-height: 1.5em;
  }
  .dl-bl {
    display: inline-block;
  }
  .mt-10 {
    margin-top: 10px;
  }
  .w100 {
    width: 100% !important;
  }
  .primary-color {
    color: #15c0f2;
  }
  .video-border {
    border: 1px dotted #15c0f2;
  }
  .fm-st {
    font-family: "STKaiti";
  }
  .btn {
    cursor: pointer;
    width: 23px;
    border-radius: 5px;
    margin-left: 5px;
  }
  .table-br-color {
    border-color: #e9e9e9;
  }
  .span-border {
    margin-left: -13px;
    display: block;
    width: 104%;
    margin-top: 20px;
    border-bottom: 2px dotted #1eb9ee;
    border-radius: 10px;
  }
  .wh-no {
    white-space: nowrap;
  }
  .annotation-border {
    margin: 20px 0;
    width: 150px;
    border: 1px solid #00aeef;
  }
  .word-break-all {
    word-break: break-all;
  }
  .textarea-text {
    font-size: 16px;
    font-family: "STKaiti";
  }
  .mt-20 {
    margin-top: 20px;
  }
  .mt-40 {
    margin-top: 40px;
  }
  .ta-br {
    border-color: #c0c4cc;
  }
  textarea:focus {
    border-color: #15c0f2;
    outline: none;
  }
  .cl-66 {
    color: #666;
  }
  .svg-btn {
    margin-left: 5px;
    cursor: pointer;
    display: flex;
    padding: 3px;
    fill: #fff;
    border: 1px solid #008bff;
    border-radius: 5px;
    background-color: #008bff;
    &:hover{
      fill: #008bff;
      background-color: #fff;
    }
  }
  a {
    cursor: default;
  }
}
/* 媒体查询做基础响应式布局 */
@media (max-width: 430px) {
  .ans-dance  {
    .page-box {
      min-height: 750px;
    }
    .pg-mh {
      min-height: 815px;
    }
  }
}
@media (max-width: 660px) {
  .ans-dance {
    /* 分页padding */
    .page-padding {
      padding: 104px 20px;
    }
    .padding-96 {
      padding: 0 20px;
    }
    /* video大小 */
    .video-box {
      max-width: 260px;
    }
    .audio-box {
      margin-top: 20px;
      flex-wrap: wrap;
      li {
        width: 100%;
      }
      li:nth-child(2) {
        margin-top: 10px;
      }
    }
  }
}
@media (min-width: 660px) {
  .ans-dance {
    .page-padding {
      padding: 104px 96px;
    }
    .padding-96 {
      padding: 0 96px;
    }
    .video-box {
      max-width: 370px;
    }
    .audio-box {
      margin-top: 20px;
      flex-wrap: nowrap;
      li {
        width: 58%;
      }
      li:nth-child(2) {
        margin-left: 10px;
      }
    }
  }
}
src/books/math/view/components/header.vue
New file
@@ -0,0 +1,93 @@
<template>
  <div class="chapter" num="1">
    <!-- 封面 -->
    <div class="page-box cover mt-20" page="1" style="min-height:auto">
      <div v-if="showPageList.indexOf(1) > -1">
        <img src="../../assets/images/Cover.jpg" alt="" />
      </div>
    </div>
    <div class="page-box" page="2" style="min-height:auto">
      <div v-if="showPageList.indexOf(1) > -1">
        <img src="../../assets/images/Cover.jpg" alt="" />
      </div>
    </div>
      <!-- 版权页 -->
      <div class="page-box text-center" style="padding: 136px 0" page="3">
      <div v-if="showPageList.indexOf(3) > -1">
        <div class="box">
          <hr class="line" />
          <p class="tl fz-14"><b>图书在版编目(CIP)数据</b></p>
          <p class="tl fz-14 m0">
            学前儿童卫生与保健/张兰香,潘秀萍主编.—3版.—北京:北京师范大学出版社,2023.2(2024.2重印)
          </p>
          <p class="tl" style="margin-bottom: 10px">ISBN 978-7-303-26340-0</p>
          <p class="tl fz-14 m0" style="margin-bottom: 10px">
            Ⅰ.①学… Ⅱ.①张… ②潘… Ⅲ.①学前儿童—卫生保健—幼儿师范学校—教材 Ⅳ.①R179
          </p>
          <p class="tl fz-14">中国版本图书馆CIP数据核字(2020)第179545号</p>
          <hr class="line" style="height: 1px" />
          <p class="tl fz-14 m0" style="margin-top: 136px">
            <b>教材意见反馈:gaozhifk@bnupg.com 010-58805079</b>
          </p>
          <p class="tl fz-14 m0">营销中心电话:010-58802755 58800035</p>
          <p class="tl fz-14 m0">编辑部电话:010-58802883</p>
          <hr class="line" style="height: 1px" />
          <p class="tl fz-14 m0">出版发行:北京师范大学出版社 www.bnupg.com</p>
          <p class="tl fz-14 m0">     北京市西城区新街口外大街12-3号</p>
          <p class="tl fz-14 m0">     邮政编码:100088</p>
          <p class="tl fz-14 m0">印  刷:天津旭非印刷有限公司</p>
          <p class="tl fz-14 m0">经  销:全国新华书店</p>
          <p class="tl fz-14 m0">开  本:889mm×1194mm 1/16</p>
          <p class="tl fz-14 m0">印  张:18.25</p>
          <p class="tl fz-14 m0">字  数:373千字</p>
          <p class="tl fz-14 m0">版  次:2023年2月第3版</p>
          <p class="tl fz-14 m0">印  次:2024年2月第23次印刷</p>
          <p class="tl fz-14 m0">定  价:39.80元</p>
          <hr class="line" />
          <ul class="fl fl-between m0" style="padding: 0">
            <li>
              <p class="tl fz-14 m0">策划编辑:姚贵平</p>
              <p class="tl fz-14 m0">美术编辑:焦丽</p>
              <p class="tl fz-14 m0">责任校对:陈民</p>
            </li>
            <li>
              <p class="tl fz-14 m0">责任编辑:周鹏</p>
              <p class="tl fz-14 m0">装帧设计:焦丽</p>
              <p class="tl fz-14 m0">责任印制:马洁</p>
            </li>
          </ul>
          <p class="center m0" style="margin-top: 20px; font-size: 20px">
            <b>版权所有&nbsp;&nbsp;侵权必究</b>
          </p>
          <p class="center m0"><b>反盗版、 侵权举报电话:</b>010-58800697</p>
          <p class="block2 m0">北京读者服务部电话:010-58808104</p>
          <p class="block2 m0">外埠邮购电话:010-58808083</p>
          <p class="block2 m0">
            本书如有印装质量问题, 请与印制管理部联系调换。
          </p>
          <p class="block2 m0">印制管理部电话:010-58805079</p>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: "page-header",
  props: {
    showPageList: {
      type: Array,
      default: [],
    },
    data() {
      return {
      }
    },
  },
};
</script>
<style lang="less" scoped>
</style>
src/books/math/view/components/index.vue
New file
@@ -0,0 +1,862 @@
<template>
  <div class="page-main" @scroll="throttledScrollHandler">
    <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(1) > -1"
        :showPageList="loadPageList"
      ></pageHeader>
      <!-- <chapterOne
        v-if="showCatalogList.indexOf(2) > -1"
        :showPageList="loadPageList"
      ></chapterOne>
      <chapterTwo
        v-if="showCatalogList.indexOf(3) > -1"
        :showPageList="loadPageList"
      >
      </chapterTwo>
      <chapterThree
      v-if="showCatalogList.indexOf(4) > -1"
        :showPageList="loadPageList"
      ></chapterThree>
      <chapterFour
      v-if="showCatalogList.indexOf(5) > -1"
        :showPageList="loadPageList"
      ></chapterFour>
      <chapterFive
      v-if="showCatalogList.indexOf(6) > -1"
        :showPageList="loadPageList"
      ></chapterFive>
      <chapterSix
        v-if="showCatalogList.indexOf(7) > -1"
        :showPageList="loadPageList"
      ></chapterSix> -->
    </div>
  </div>
</template>
<script>
import pageHeader from "./header.vue";
// 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 chapterSix from './chapter006.vue'
import NoteIcon from "@/assets/images/biji.png";
import _ from "lodash";
import Swiper from "swiper/bundle";
import "swiper/swiper-bundle.css";
import Viewer from "viewerjs";
import "viewerjs/dist/viewer.css";
export default {
  name:"pageContent",
  data() {
    return {
      catalogLength: 7, // 总章节数
      showCatalogList: [], // 显示的章节
      loadThreshold: 300, // 触发加载阈值
      throttleThreshold: 100, // 节流阈值
      previousScrollTop: 0,
      throttledScrollHandler: null,
      observer: null,
      loadPageObserver: null,
      loadPageList: [],
      questionDataMap: {},
      renderSignMap: {},
      highlightData: null,
    };
  },
  computed: {
    fontSize() {
      return this.$store.state.qiankun.fontSize;
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100;
    },
  },
  watch: {
    showCatalogList: {
      handler(newVal, oldVal) {
        if (
          this.$store.state.qiankun &&
          this.$store.state.qiankun.catalogChange
        ) {
          // 调用父层方法
          this.$store.state.qiankun.catalogChange({
            showCatalogList: newVal,
          });
        }
        // 启动页码观察
        setTimeout(() => {
          this.initObservation();
          this.initThemeColor();
        }, 500);
      },
    },
    loadPageList: {
      handler(newVal, oldVal) {
        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() {
    // 默认加载章节
    this.showCatalogList = [1];
    // 滚动监听节流
    this.throttledScrollHandler = _.throttle(
      this.scrollFun,
      this.throttleThreshold,
      { leading: true, trailing: false }
    );
    // 定义子层方法
    if (this.setGlobalState) {
      // 提供页面跳转功能
      this.setGlobalState({
        gotoPage: (catalog, page) => {
          this.gotoPage(catalog, page);
        },
        // 渲染笔记、高亮、划线
        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);
        },
      });
    }
    // 创建一个新的 Intersection Observer 实例,用于观察目标元素和执行相应的回调函数。
    // new IntersectionObserver(callback, options):使用之前定义的 callback 回调函数和 options 配置选项来初始化 Intersection Observer 实例。
    this.observer = new IntersectionObserver(this.pageChangeCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, {
      root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。
      rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合
      threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。
    });
    // 启动页码观察
    setTimeout(() => {
      this.initObservation();
      this.initThemeColor();
    }, 500);
    // 测试页面跳转
    // setTimeout(() => {
    //   this.gotoPage(1, 10);
    //   setTimeout(() => {
    //     this.renderSign("Highlight", {
    //       id: "2ACA9359",
    //       txt: "题一学习主题一 运动",
    //       page: "10",
    //       type: "Highlight",
    //       color: "#F5E12A"
    //     });
    // setTimeout(() => {
    //   this.delSign({
    //     ids: ["2ACA9359"]
    //   });
    // }, 2000);
    //   }, 5000);
    // 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) {
      // 判断向上滚动还是向下滚动
      if (event.target.scrollTop > this.previousScrollTop) {
        // 向下
        const currentScrollTop =
          event.target.scrollTop + event.target.offsetHeight;
        if (
          currentScrollTop >=
          event.target.scrollHeight - this.loadThreshold
        ) {
          // 到达阈值
          if (
            this.showCatalogList[this.showCatalogList.length - 1] <
            this.catalogLength
          ) {
            // 加载下一章
            this.showCatalogList.push(
              this.showCatalogList[this.showCatalogList.length - 1] + 1
            );
            if (this.showCatalogList.length > 3) {
              // 超过三章隐藏顶部一章
              this.showCatalogList.shift();
            }
          }
        }
      } else if (event.target.scrollTop < this.previousScrollTop) {
        // 向上
        const currentScrollTop = event.target.scrollTop;
        if (currentScrollTop <= this.loadThreshold) {
          // 到达阈值
          if (this.showCatalogList[0] > 0) {
            // 加载上一章
            this.showCatalogList.unshift(this.showCatalogList[0] - 1);
            if (this.showCatalogList.length > 3) {
              // 超过三章隐藏底部一章
              this.showCatalogList.pop();
            }
          }
        }
      }
      // showCatalogList 当前显示的三个章节,watch监听传递给主应用
      // 更新上一次滚动的位置
      this.previousScrollTop = event.target.scrollTop;
    },
    // 章节、页面跳转
    gotoPage(catalog, page) {
      if (catalog >= 0 && catalog <= this.catalogLength) {
        // 处理渲染章节
        if (catalog == 0) {
          this.showCatalogList = [0, 1];
        } else if (catalog == this.catalogLength) {
          this.showCatalogList = [
            this.catalogLength - 2,
            this.catalogLength - 1,
            this.catalogLength,
          ];
        } else {
          this.showCatalogList = [catalog - 1, catalog, catalog + 1];
        }
        setTimeout(() => {
          // 跳转页码
          const pageDom = (
            this.container ? this.container : document
          ).querySelector(`[page="${page}"]`);
          if (pageDom) {
            pageDom.scrollIntoView();
          } else {
            console.log("页码错误!");
          }
        }, 500);
      } else {
        console.log("章节错误!");
      }
    },
    // 处理标记数据
    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] = [];
      this.renderSignMap[type][data.page].push(data);
    },
    // 渲染标记
    renderSign(type, data) {
      // 父层设置禁止渲染标记时不再进行渲染
      if (this.$store.state.qiankun.disableSign) {
        return false;
      }
      const existence = (
        this.container ? this.container : document
      ).querySelector(`[dataid="${data.id}"]`);
      // 去重
      if (!existence) {
        const pageDom = (
          this.container ? this.container : document
        ).querySelector(`[page="${data.page}"]`);
        // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组
        const treeWalker = document.createTreeWalker(pageDom, NodeFilter.SHOW_TEXT);
        const allTextNodes = [];
        let currentNode = treeWalker.nextNode();
        while (currentNode) {
          allTextNodes.push(currentNode);
          currentNode = treeWalker.nextNode();
        }
        for (let i = 0; i < allTextNodes.length; i++) {
          const textDom = allTextNodes[i];
          if (textDom.textContent.indexOf(data.txt) > -1) {
            let reg = new RegExp(`${data.txt}`, "ig");
            switch (type) {
              case "Highlight":
                // 高亮
                textDom.parentNode.innerHTML =
                  textDom.parentNode.innerHTML.replace(
                    reg,
                    `<span datatype="Highlight" dataid="${data.id}" style="background: ${data.color};" class="highLight" onclick="signClick('Highlight','${data.id}','${data.chapterNum}')">${data.txt}</span>`
                  );
                break;
              case "Dashing":
                // 划线
                textDom.parentNode.innerHTML =
                  textDom.parentNode.innerHTML.replace(
                    reg,
                    `<span datatype="Dashing" dataid="${data.id}" style="text-decoration-color:${data.color};" class="underline" onclick="signClick('Dashing','${data.id}','${data.chapterNum}')">${data.txt}</span>`
                  );
                break;
              case "Note":
                // 笔记
                textDom.parentNode.innerHTML =
                  textDom.parentNode.innerHTML.replace(
                    reg,
                    `<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('Note')">${data.txt}<img src="${NoteIcon}"/></span>`
                  );
                break;
            }
          }
        }
      }
    },
    // 删除标记渲染
    delSign({ ids, type }) {
      if (ids && ids.length) {
        for (let i = 0; i < ids.length; i++) {
          const id = ids[i];
          const dom = (
            this.container ? this.container : document
          ).querySelector(`[dataid="${id}"]`);
          dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace(
            dom.outerHTML,
            dom.outerText
          );
        }
      }
      if (type) {
        const doms = (
          this.container ? this.container : document
        ).querySelectorAll(`[datatype="${type}"]`);
        for (let i = 0; i < doms.length; i++) {
          const dom = doms[i];
          dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace(
            dom.outerHTML,
            dom.outerText
          );
        }
      }
    },
    initObservation() {
      const sections = (
        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");
        }
      });
    },
    initThemeColor() {
      // 获取各种需要主题色的节点
      const colorDom = (
        this.container ? this.container : document
      ).querySelectorAll(".theme-color");
      const backgroundColorDom = (
        this.container ? this.container : document
      ).querySelectorAll(".theme-back");
      const borderColorDom = (
        this.container ? this.container : document
      ).querySelectorAll(".theme-border");
      // 获取配置的主题色
      const bookThemeColor =
        this.config.activeBook && this.config.activeBook.bookThemeColor
          ? this.config.activeBook.bookThemeColor
          : null;
      const chapterThemeColor =
        this.config.activeBook && this.config.activeBook.chapterThemeColor
          ? this.config.activeBook.chapterThemeColor
          : null;
      const pageThemeColor =
        this.config.activeBook && this.config.activeBook.pageThemeColor
          ? this.config.activeBook.pageThemeColor
          : null;
      colorDom.forEach((domItem) => {
        // 获取章节、页码
        let pageDom = this.getParentWithClass(domItem, "page-box");
        let chapterDom = this.getParentWithClass(domItem, "chapter");
        let page, chapterNum;
        if (pageDom) page = pageDom.getAttribute("page");
        if (chapterDom) chapterNum = chapterDom.getAttribute("num");
        // 向上匹配主题色
        const themeColor =
          page && pageThemeColor && pageThemeColor[page]
            ? pageThemeColor[page]
            : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum]
            ? chapterThemeColor[chapterNum]
            : bookThemeColor;
        if (themeColor) {
          domItem.style.color = themeColor;
        }
      });
      backgroundColorDom.forEach((domItem) => {
        // 获取章节、页码
        let pageDom = this.getParentWithClass(domItem, "page-box");
        let chapterDom = this.getParentWithClass(domItem, "chapter");
        let page, chapterNum;
        if (pageDom) page = pageDom.getAttribute("page");
        if (chapterDom) chapterNum = chapterDom.getAttribute("num");
        // 向上匹配主题色
        const themeColor =
          page && pageThemeColor && pageThemeColor[page]
            ? pageThemeColor[page]
            : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum]
            ? chapterThemeColor[chapterNum]
            : bookThemeColor;
        if (themeColor) {
          domItem.style.backgroundColor = themeColor;
        }
      });
      borderColorDom.forEach((domItem) => {
        // 获取章节、页码
        let pageDom = this.getParentWithClass(domItem, "page-box");
        let chapterDom = this.getParentWithClass(domItem, "chapter");
        let page, chapterNum;
        if (pageDom) page = pageDom.getAttribute("page");
        if (chapterDom) chapterNum = chapterDom.getAttribute("num");
        // 向上匹配主题色
        const themeColor =
          page && pageThemeColor && pageThemeColor[page]
            ? pageThemeColor[page]
            : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum]
            ? chapterThemeColor[chapterNum]
            : bookThemeColor;
        if (themeColor) {
          domItem.style.borderColor = themeColor;
        }
      });
    },
    getParentWithClass(element, className) {
      console.log(element, className, "element, className");
      while (element.parentElement) {
        element = element.parentElement;
        if (element.classList.contains(className)) {
          return element;
        }
      }
    },
    pageChangeCallback(entries, observer) {
      //entries:代表观察到的目标元素的集合。 observer:代表观察者对象。
      entries.forEach((entry) => {
        //entry.isIntersecting:检查当前目标元素是否与根元素相交。
        if (entry.isIntersecting) {
          const target = entry.target;
          //entry.target:获取当前目标元素
          const page = target.getAttribute("page");
          const catalogDom = this.tool.getParentNodeByClassName(
            target,
            "chapter"
          );
          const catalog = catalogDom.getAttribute("num");
          let text = null;
          if (target.querySelector("p")) {
            text = target.querySelector("p").textContent.substring(0, 50);
          }
          // 返回页码和章节信息
          if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange)
            this.$store.state.qiankun.pageChange({
              page: page,
              catalog: catalog,
              text,
            });
          // const sections = Array.from(document.querySelectorAll(".section"));
          //sections:获取所有具有 .section 类名的元素,并转换为数组。
          // let index = sections.findIndex((section) => section === target) + 1;
          //index:查找当前目标元素在 sections 数组中的索引,并加 1,用于确定当前页码。
        }
      });
    },
    loadPageCallback(entries, observer) {
      entries.forEach(async (entry) => {
        if (entry.isIntersecting) {
          const target = entry.target;
          const page = target.getAttribute("page");
          if (this.loadPageList.indexOf(Number(page)) == -1) {
            const catalogDom = this.tool.getParentNodeByClassName(
              target,
              "chapter"
            );
            // 添加页码
            this.loadPageList.push(Number(page));
            const catalog = catalogDom.getAttribute("num");
            // if (!this.questionDataMap[page]) {
            //   if (testData && testData[catalog]) {
            //     if (testData[catalog][page]) {
            //       if (Array.isArray(testData[catalog][page])) {
            //         this.questionDataMap[page] = await getQuestionList(
            //           page,
            //           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.questionDataMap[page] = obj;
            //       }
            //       console.log("题目", this.questionDataMap);
            //     }
            //   }
            // }
            // 渲染这一页的标记
            for (const key in this.renderSignMap) {
              if (this.renderSignMap[key][page]) {
                this.renderSignMap[key][page].forEach((item) => {
                  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页
              this.loadPageList.shift();
            }
          }
        }
      });
    },
    initSwiper() {
      const doms = (
        this.container ? this.container : document
      ).querySelectorAll(".swiper-img");
      for (let i = 0; i < doms.length; i++) {
        const dom = doms[i];
        new Swiper(dom, {
          loop: false, // 无缝
          autoplay: {
            //自动开始
            delay: 3000, //时间间隔
            disableOnInteraction: 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,
          // // 如果需要分页器
          // 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
      ).querySelectorAll(".openImgBox");
      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, // 显示标题
        });
      }
    },
    // 根据关键字全文检索
    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: {},
            isSearch: true
          },
        });
        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: {},
                isSearch: true
              },
            });
            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,
    // chapterTwo,
    // chapterThree,
    // chapterFour,
    // chapterFive,
    // chapterSix,
  },
};
</script>
<style lang="less" scoped>
.page-main {
  width: 100%;
  height: 100%;
  overflow: auto;
  .page-content {
    max-width: 816px;
    min-width: 375px;
    margin: 0 auto;
    padding-bottom: 100px;
  }
}
</style>
src/books/math/view/index.vue
New file
@@ -0,0 +1,76 @@
<template>
  <div class="math-book" @mouseup="handleMouseUp">
    <pageContent></pageContent>
  </div>
</template>
<script>
import pageContent from "./components/index.vue";
export default {
  name:"ansAndDance",
  components: {
    pageContent,
  },
  data() {
    return {};
  },
  mounted() {},
  methods: {
    getParentWithClass(element, className) {
      while (element.parentElement) {
        element = element.parentElement;
        if (element.classList.contains(className)) {
          return element;
        }
      }
    },
    handleMouseUp(e) {
      const selection = (
        this.container ? this.container : window
      ).getSelection();
      const txt = selection.toString();
      if (selection.type != "none" && txt) {
        let node = selection.anchorNode.parentNode;
        let pageHtml = this.getParentWithClass(
          selection.anchorNode,
          "page-box"
        );
        let chapterDom = this.getParentWithClass(
          selection.anchorNode,
          "chapter"
        );
        let chapterNum;
        if (chapterDom) chapterNum = chapterDom.getAttribute("num");
        if (pageHtml) {
          const page = pageHtml.getAttribute("page");
          // 监听选中文本事件,并触发父层方法
          if (this.$store.state.qiankun.windowSelection) {
            this.$store.state.qiankun.windowSelection({
              chapterNum,
              txt,
              page,
              x: e.x,
              y: e.y,
            });
          }
        }
      } else {
        if (this.$store.state.qiankun.windowSelection) {
          this.$store.state.qiankun.windowSelection({
            chapterNum: "",
            txt: "",
            page: "",
            x: e.x,
            y: e.y,
          });
        }
      }
    },
  },
};
</script>
<style lang="less">
@import "../assets/main.less";
</style>