src/App.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/artAndDance/view/components/header.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/artAndDance/view/components/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/childHealth/view/content/components/chapter005.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/childHealth/view/content/components/chapter006.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/childHealth/view/content/components/chapter007.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/childHealth/view/content/components/chapter008.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/math/assets/images/Cover.jpg | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/math/assets/main.less | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/math/view/components/header.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/math/view/components/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/books/math/view/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | 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" >专题七 学前儿童疾病及其预防</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" >专题七 学前儿童疾病及其预防</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>版权所有 侵权必究</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>