articleDetail.vue 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408
  1. <template>
  2. <div
  3. class="bookStore"
  4. :style="{ background: bgColorList[activeIndex].contentBg }"
  5. v-if="articleInfo"
  6. :v-loading="loading"
  7. >
  8. <Header :LoginNavIndex="LoginNavIndex" />
  9. <div
  10. class="navBar"
  11. :class="['navBar-' + bgColorList[activeIndex].type]"
  12. :style="{ background: bgColorList[activeIndex].navBg }"
  13. >
  14. <div class="navBar-left">
  15. <a class="goback" @click="$router.go(-1)"
  16. ><i class="el-icon-arrow-left"></i> 第 {{ articleInfo.iss_no }} 期</a
  17. >
  18. <div class="border"></div>
  19. <p class="article-title">{{ articleInfo.art_title }}</p>
  20. </div>
  21. <div class="navBar-right">
  22. <el-input-number
  23. class="article-fontsize"
  24. v-model="wordFontsize"
  25. :step="2"
  26. step-strictly
  27. :min="12"
  28. :max="28"
  29. :style="{ borderColor: bgColorList[activeIndex].boxBorder }"
  30. ></el-input-number>
  31. <ul
  32. class="article-color"
  33. :style="{ borderColor: bgColorList[activeIndex].boxBorder }"
  34. >
  35. <li
  36. :class="['color-item', activeIndex === indexC ? 'active' : '']"
  37. v-for="(itemC, indexC) in bgColorList"
  38. :key="indexC"
  39. @click="handleChangeBgColor(indexC)"
  40. :style="{
  41. borderColor: activeIndex === indexC ? itemC.border_active : '',
  42. }"
  43. >
  44. <a
  45. :style="{
  46. background: itemC.border,
  47. borderColor: activeIndex === indexC ? itemC.borderColor : '',
  48. }"
  49. ></a>
  50. </li>
  51. </ul>
  52. </div>
  53. </div>
  54. <div class="article-box">
  55. <div
  56. class="artricle-inner"
  57. :style="{ background: bgColorList[activeIndex].contentInnerBg }"
  58. >
  59. <!-- 文章 -->
  60. <div class="atricle-data">
  61. <normal-model
  62. :titleFontsize="48"
  63. :wordFontsize="wordFontsize"
  64. :colorObj="bgColorList[activeIndex]"
  65. :articleType="articleType"
  66. :style="{ padding: '0 40px' }"
  67. v-if="menuType === 'original'"
  68. :articleInfo="articleInfo"
  69. :likeSentencelist="likeSentencelist"
  70. :likeWord="likeWordList"
  71. :articleImg="articleImg"
  72. :activeArticleIndexLen="issueChnTanList.length"
  73. :activeArticleIndex="activeArticleIndex"
  74. @handlePage="handlePage"
  75. ></normal-model>
  76. <phrase-model
  77. :titleFontsize="48"
  78. :wordFontsize="wordFontsize"
  79. :colorObj="bgColorList[activeIndex]"
  80. :articleType="articleType"
  81. :style="{ padding: '0 40px' }"
  82. v-if="menuType === 'newWord'"
  83. :articleInfo="articleInfo"
  84. :likePhraseList="likePhraseList"
  85. :likeWord="likeWordList"
  86. @changeLike="changeLike"
  87. :likeSentencelist="likeSentencelist"
  88. :articleImg="articleImg"
  89. ></phrase-model>
  90. <practice-model
  91. :titleFontsize="48"
  92. :wordFontsize="wordFontsize"
  93. :colorObj="bgColorList[activeIndex]"
  94. :articleType="articleType"
  95. :style="{ padding: '0 40px' }"
  96. v-if="menuType === 'practice'"
  97. :articleInfo="articleInfo"
  98. :likeSentencelist="likeSentencelist"
  99. :likeWord="likeWordList"
  100. :articleImg="articleImg"
  101. ></practice-model>
  102. <inner-text-search
  103. :titleFontsize="48"
  104. :wordFontsize="wordFontsize"
  105. :colorObj="bgColorList[activeIndex]"
  106. :articleType="articleType"
  107. :style="{ padding: '0 40px' }"
  108. v-if="menuType === 'search'"
  109. :articleInfo="articleInfo"
  110. ref="innerTextSearchs"
  111. :likeSentencelist="likeSentencelist"
  112. :likeWord="likeWordList"
  113. :articleImg="articleImg"
  114. ></inner-text-search>
  115. <lexical-type
  116. :titleFontsize="48"
  117. :wordFontsize="wordFontsize"
  118. :colorObj="bgColorList[activeIndex]"
  119. :articleType="articleType"
  120. :style="{ padding: '0 40px' }"
  121. v-if="menuType === 'filtrate'"
  122. :articleInfo="articleInfo"
  123. ref="lexicalType"
  124. :likeSentencelist="likeSentencelist"
  125. :likeWord="likeWordList"
  126. :articleImg="articleImg"
  127. ></lexical-type>
  128. <notes-model
  129. :titleFontsize="48"
  130. :wordFontsize="wordFontsize"
  131. :colorObj="bgColorList[activeIndex]"
  132. :articleType="articleType"
  133. :style="{ padding: '0 40px' }"
  134. v-if="menuType === 'notebook'"
  135. :articleInfo="articleInfo"
  136. :likeSentencelist="likeSentencelist"
  137. :likeWord="likeWordList"
  138. :articleImg="articleImg"
  139. ></notes-model>
  140. </div>
  141. <div
  142. class="article-btn"
  143. v-if="this.$route.query.iss_id && menuType !== 'practice'"
  144. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  145. >
  146. <div class="left">
  147. <span
  148. :class="['support colloct-article', !noRead ? 'active' : '']"
  149. @click="changeStatus('noRead')"
  150. ><svg-icon
  151. icon-class="like-line"
  152. :style="{ marginRight: articleNumber ? '8px' : '0px' }"
  153. ></svg-icon
  154. >{{ articleNumber ? articleNumber : "" }}</span
  155. >
  156. <!-- <span :class="['oppose',oppose?'active':'']" @click="changeStatus('oppose')"><svg-icon icon-class="oppose"></svg-icon></span> -->
  157. </div>
  158. <div class="center">
  159. <el-button
  160. type="text"
  161. class="btn-left"
  162. :class="[activeArticleIndex === 0 ? 'not-allow' : '']"
  163. @click="handlePage('-')"
  164. :style="{ color: bgColorList[activeIndex].btnColor }"
  165. ><svg-icon icon-class="arrow-left-line"></svg-icon
  166. >上一篇</el-button
  167. >
  168. <el-button
  169. type="text"
  170. class="btn-right"
  171. :class="[
  172. activeArticleIndex === issueChnTanList.length - 1
  173. ? 'not-allow'
  174. : '',
  175. ]"
  176. @click="handlePage('+')"
  177. :style="{ color: bgColorList[activeIndex].btnColor }"
  178. >下一篇<svg-icon icon-class="arrow-right-line"></svg-icon
  179. ></el-button>
  180. </div>
  181. <div class="right">
  182. <template v-if="support">
  183. <span
  184. class="support"
  185. @click="handleReadArticle"
  186. :style="{ color: bgColorList[activeIndex].btnColor }"
  187. ><svg-icon icon-class="no-read"></svg-icon>标记为已读</span
  188. >
  189. </template>
  190. <template v-else>
  191. <span
  192. class="support readed"
  193. :style="{ color: bgColorList[activeIndex].btnColor }"
  194. ><svg-icon
  195. icon-class="readed"
  196. :style="{ color: bgColorList[activeIndex].btnColor }"
  197. ></svg-icon
  198. >已读</span
  199. >
  200. </template>
  201. </div>
  202. </div>
  203. <!-- 词汇表 -->
  204. <div class="glossary-box" v-if="menuType !== 'practice'">
  205. <div
  206. class="title"
  207. :style="{ color: bgColorList[activeIndex].glossaryTitle }"
  208. v-if="
  209. (articleInfo.art_voc_data &&
  210. articleInfo.art_voc_data.length > 0) ||
  211. (articleInfo.art_phrase_data &&
  212. articleInfo.art_phrase_data.length > 0) ||
  213. (articleInfo.art_explain_data &&
  214. articleInfo.art_explain_data.length > 0)
  215. "
  216. >
  217. <h2>词汇表</h2>
  218. <a @click="showGlossary = !showGlossary">{{
  219. showGlossary ? "收起" : "展开"
  220. }}</a>
  221. </div>
  222. <el-collapse-transition>
  223. <div v-if="showGlossary">
  224. <template
  225. v-if="
  226. articleInfo.art_voc_data &&
  227. articleInfo.art_voc_data.length > 0
  228. "
  229. >
  230. <h4
  231. :style="{ color: bgColorList[activeIndex].glossarySubtitle }"
  232. >
  233. 生词
  234. </h4>
  235. <new-word-list
  236. class="newWord-list"
  237. :list="articleInfo.art_voc_data"
  238. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  239. :colorObj="bgColorList[activeIndex]"
  240. :likeWordList="likeWordList"
  241. @changeLike="changeLike"
  242. ref="newWordList"
  243. ></new-word-list>
  244. </template>
  245. <template
  246. v-if="
  247. articleInfo.art_phrase_data &&
  248. articleInfo.art_phrase_data.length > 0
  249. "
  250. >
  251. <h4
  252. :style="{ color: bgColorList[activeIndex].glossarySubtitle }"
  253. >
  254. 短语
  255. </h4>
  256. <phrase-list
  257. class="newWord-list"
  258. :list="articleInfo.art_phrase_data"
  259. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  260. :colorObj="bgColorList[activeIndex]"
  261. :likePhraseList="likePhraseList"
  262. @changeLike="changeLike"
  263. ref="phraseList"
  264. ></phrase-list>
  265. </template>
  266. <template
  267. v-if="
  268. articleInfo.art_explain_data &&
  269. articleInfo.art_explain_data.length > 0
  270. "
  271. >
  272. <h4
  273. :style="{ color: bgColorList[activeIndex].glossarySubtitle }"
  274. >
  275. 注释
  276. </h4>
  277. <annotation-list
  278. class="newWord-list"
  279. :list="articleInfo.art_explain_data"
  280. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  281. :colorObj="bgColorList[activeIndex]"
  282. ></annotation-list>
  283. </template>
  284. </div>
  285. </el-collapse-transition>
  286. <div
  287. class="title"
  288. :style="{
  289. color: bgColorList[activeIndex].glossaryTitle,
  290. marginTop: '40px',
  291. }"
  292. v-if="articleInfo && articleInfo.art_corpus_data"
  293. >
  294. <h2>详细统计</h2>
  295. <a @click="showWordInfo = !showWordInfo">{{
  296. showWordInfo ? "收起" : "展开"
  297. }}</a>
  298. </div>
  299. <el-collapse-transition
  300. v-if="articleInfo && articleInfo.art_corpus_data"
  301. >
  302. <div v-if="showWordInfo">
  303. <h4 :style="{ color: bgColorList[activeIndex].glossarySubtitle }">
  304. 词汇信息
  305. </h4>
  306. <div
  307. class="word-info"
  308. v-if="
  309. articleInfo.art_corpus_data &&
  310. articleInfo.art_corpus_data.artStatInfo
  311. "
  312. >
  313. <div
  314. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  315. >
  316. <label
  317. :style="{ color: bgColorList[activeIndex].statisticTitle }"
  318. >文章长度</label
  319. >
  320. <span
  321. :style="{ color: bgColorList[activeIndex].statisticValue }"
  322. >{{ articleInfo.art_corpus_data.artStatInfo.wc }}</span
  323. >
  324. </div>
  325. <div
  326. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  327. >
  328. <label
  329. :style="{ color: bgColorList[activeIndex].statisticTitle }"
  330. >词汇数量</label
  331. >
  332. <span
  333. :style="{ color: bgColorList[activeIndex].statisticValue }"
  334. >{{ articleInfo.art_corpus_data.artStatInfo.wdc }}</span
  335. >
  336. </div>
  337. <div
  338. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  339. >
  340. <label
  341. :style="{ color: bgColorList[activeIndex].statisticTitle }"
  342. >平均词长</label
  343. >
  344. <span
  345. :style="{ color: bgColorList[activeIndex].statisticValue }"
  346. >{{
  347. articleInfo.art_corpus_data.artStatInfo.avgWordLen
  348. }}</span
  349. >
  350. </div>
  351. <div
  352. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  353. >
  354. <label
  355. :style="{ color: bgColorList[activeIndex].statisticTitle }"
  356. >词汇密度</label
  357. >
  358. <span
  359. :style="{ color: bgColorList[activeIndex].statisticValue }"
  360. >{{
  361. articleInfo.art_corpus_data.artStatInfo.vocabDensity
  362. }}</span
  363. >
  364. </div>
  365. <div
  366. :style="{ background: bgColorList[activeIndex].glossaryBg }"
  367. >
  368. <label
  369. :style="{ color: bgColorList[activeIndex].statisticTitle }"
  370. >词汇难度</label
  371. >
  372. <span
  373. :style="{ color: bgColorList[activeIndex].statisticValue }"
  374. >{{
  375. articleInfo.art_corpus_data.artStatInfo.vocabHardLevel
  376. }}</span
  377. >
  378. </div>
  379. </div>
  380. <h4 :style="{ color: bgColorList[activeIndex].glossarySubtitle }">
  381. 词汇分布
  382. </h4>
  383. <div
  384. class="echarts-box"
  385. v-if="
  386. articleInfo &&
  387. articleInfo.art_corpus_data &&
  388. articleInfo.art_corpus_data.artStatInfo &&
  389. articleInfo.art_corpus_data.artStatInfo.vocabVlLevelItems
  390. "
  391. >
  392. <ul class="echarts-type">
  393. <li
  394. v-for="(itemE, indexE) in articleInfo.art_corpus_data
  395. .artStatInfo.vocabVlLevelItems"
  396. :key="indexE"
  397. @mouseover="gaolangbzt(indexE, 'shanxing_main')"
  398. @mouseout="closegaolangbzt(indexE, 'shanxing_main')"
  399. :style="{
  400. background:
  401. bgColorList[activeIndex].type === 'white'
  402. ? itemE.bg
  403. : bgColorList[activeIndex].type === 'darkGreen'
  404. ? itemE.darkGreenBg
  405. : itemE.darkBg,
  406. color:
  407. bgColorList[activeIndex].type === 'white'
  408. ? itemE.color
  409. : bgColorList[activeIndex].type === 'darkGreen'
  410. ? itemE.darkGreenColor
  411. : itemE.darkColor,
  412. borderColor:
  413. bgColorList[activeIndex].type === 'white'
  414. ? itemE.border
  415. : bgColorList[activeIndex].type === 'darkGreen'
  416. ? itemE.darkGreenBorder
  417. : itemE.darkBorder,
  418. }"
  419. >
  420. <span class="name">{{ itemE.vlCnName }}</span>
  421. <span class="number">{{ itemE.value }}</span>
  422. <span class="percent">{{ itemE.vocabPercentStr }}</span>
  423. </li>
  424. </ul>
  425. <div id="shanxing_main" style="height: 360px"></div>
  426. </div>
  427. </div>
  428. </el-collapse-transition>
  429. </div>
  430. <!-- 右侧菜单 -->
  431. <div
  432. class="mene-right"
  433. :style="{
  434. background: bgColorList[activeIndex].contentInnerBg,
  435. borderColor: bgColorList[activeIndex].glossaryBg,
  436. }"
  437. >
  438. <menu-right
  439. :colorObj="bgColorList[activeIndex]"
  440. @changeArticleType="changeArticleType"
  441. ></menu-right>
  442. </div>
  443. </div>
  444. </div>
  445. <div
  446. class="share-box"
  447. v-if="menuFeature === 'share'"
  448. v-loading="shareLoading"
  449. >
  450. <div class="share-box-top">
  451. <h5>分享</h5>
  452. <i class="el-icon-close" @click="handleCloseShare"></i>
  453. </div>
  454. <template v-if="shareSrc">
  455. <img :src="shareSrc" />
  456. </template>
  457. <template v-else>
  458. <el-skeleton style="width: 380px" :loading="true" animated>
  459. <template slot="template">
  460. <el-skeleton-item
  461. variant="image"
  462. style="width: 380px; height: 738px"
  463. />
  464. </template>
  465. </el-skeleton>
  466. </template>
  467. <div class="share-box-bottom">
  468. <el-button type="primary" @click="downLoadImg(shareSrc)" size="small"
  469. >下载图片</el-button
  470. >
  471. <el-button
  472. @click="CopyToClipboard('copyDownUrl')"
  473. size="small"
  474. type="primary"
  475. plain
  476. >复制链接</el-button
  477. >
  478. <span id="copyDownUrl">{{ share_url }}</span>
  479. </div>
  480. </div>
  481. <div class="catalog-box" v-if="menuFeature === 'list'">
  482. <ul class="treeList">
  483. <li v-for="(item, index) in issueChnList" :key="index">
  484. <p class="parent-node">
  485. <span class="number">{{ index + 1 }}</span
  486. ><b class="title">{{ item.chn_name }}</b>
  487. </p>
  488. <ul v-if="item.arts && item.arts.length > 0">
  489. <li
  490. :class="[
  491. items.canRead ? 'children-buy' : 'children-no',
  492. 'children',
  493. ]"
  494. v-for="(items, indexs) in item.arts"
  495. :key="indexs"
  496. @click="handleLink(items, items.canRead, index)"
  497. >
  498. <p class="children-node">
  499. <span class="number">{{ indexs + 1 }}</span
  500. ><b class="title">{{ items.art_title }}</b>
  501. </p>
  502. </li>
  503. </ul>
  504. </li>
  505. </ul>
  506. </div>
  507. <el-dialog
  508. :visible.sync="articleInfoFlag"
  509. :show-close="false"
  510. :close-on-click-modal="false"
  511. width="968px"
  512. class="articleDetail-dialog"
  513. v-if="articleInfoFlag"
  514. >
  515. <article-info
  516. @closeArticleInfo="closeArticleInfo"
  517. :articleInfo="articleInfo"
  518. :colorObj="bgColorList[activeIndex]"
  519. ></article-info>
  520. </el-dialog>
  521. <el-dialog
  522. :visible.sync="ciyunShow"
  523. :show-close="true"
  524. :title="articleInfo.art_corpus_data.artTitle"
  525. :close-on-click-modal="false"
  526. width="1182px"
  527. class="ciyun-dialog"
  528. v-if="ciyunShow"
  529. >
  530. <iframe
  531. width="100%"
  532. height="834px"
  533. border="none"
  534. :src="
  535. './ciyun/ciyunindex.html?partitionKey=1&searchType=2&articleId=' +
  536. articleId
  537. "
  538. ></iframe>
  539. </el-dialog>
  540. <el-dialog
  541. :visible.sync="printFlag"
  542. :show-close="false"
  543. :close-on-click-modal="false"
  544. width="100%"
  545. top="0"
  546. class="articleDetail-dialog"
  547. v-if="printFlag"
  548. >
  549. <print-model
  550. :titleFontsize="48"
  551. :wordFontsize="wordFontsize"
  552. :colorObj="bgColorList[activeIndex]"
  553. :articleType="articleType"
  554. :articleInfo="articleInfo"
  555. @closePrint="closePrint"
  556. :articleImg="articleImg"
  557. ></print-model>
  558. </el-dialog>
  559. </div>
  560. </template>
  561. <script>
  562. import Header from "../../components/Header.vue";
  563. import NavBar from "../../components/common/NavBar.vue";
  564. import NewWordList from "./components/NewWordList.vue";
  565. import PhraseList from "./components/PhraseList.vue";
  566. import AnnotationList from "./components/AnnotationList.vue";
  567. import NormalModel from "./components/NormalModel.vue";
  568. import PhraseModel from "./components/PhraseModel.vue";
  569. import MenuRight from "./components/MenuRight.vue";
  570. import ArticleInfo from "./components/ArticleInfo.vue";
  571. import InnerTextSearch from "./components/InnerTextSearch.vue";
  572. import LexicalType from "./components/LexicalType.vue";
  573. import PracticeModel from "./components/PracticeModel.vue";
  574. import NotesModel from "./components/NotesModel.vue";
  575. import printModel from "./components/PrintModel.vue";
  576. import * as echarts from "echarts";
  577. import { getLogin } from "@/api/ajax";
  578. import { getToken } from "@/utils/auth";
  579. export default {
  580. name: "articleDetail",
  581. computed: {},
  582. components: {
  583. Header,
  584. NavBar,
  585. NewWordList,
  586. PhraseList,
  587. AnnotationList,
  588. NormalModel,
  589. MenuRight,
  590. PhraseModel,
  591. ArticleInfo,
  592. InnerTextSearch,
  593. LexicalType,
  594. PracticeModel,
  595. NotesModel,
  596. printModel,
  597. },
  598. data() {
  599. return {
  600. config: this.$route.query.headerConfig
  601. ? decodeURIComponent(this.$route.query.headerConfig)
  602. : "",
  603. LoginNavIndex: 0,
  604. wordFontsize: 22, // 文章文字大小
  605. bgColorList: [
  606. {
  607. type: "white",
  608. contentBg: "#D9EAF1",
  609. contentInnerBg: "#FFFFFF",
  610. navBg: "#00ADEF",
  611. border: "#E5E6EB",
  612. bg: "#FFFFFF",
  613. border_active: "#3459D2",
  614. boxBorder: "#E5E6EB",
  615. titleColor: "#1F2C5C",
  616. sourceColor: "#929CA8",
  617. contentColor: "#2F3742",
  618. btnColor: "#3459D2",
  619. glossaryTitle: "#2F3742",
  620. glossarySubtitle: "#4E5969",
  621. glossaryBg: "#F7F8FA",
  622. newWordColor: "#175DFF",
  623. newWordOtherColor: "#667180",
  624. newWordStar: "#FFB224",
  625. newWordType: {
  626. L0: {
  627. color: "#FDB600",
  628. bg: "#FFF7E4",
  629. },
  630. L1: {
  631. color: "#3AB854",
  632. bg: "#EFFCEF",
  633. },
  634. L2: {
  635. color: "#00C6F1",
  636. bg: "#DFF9FF",
  637. },
  638. L3: {
  639. color: "#3459D2",
  640. bg: "#EEF3FF",
  641. },
  642. LA: {
  643. color: "#E03177",
  644. bg: "#FFECF5",
  645. },
  646. LB: {
  647. color: "#CD2B31",
  648. bg: "#FFE8E8",
  649. },
  650. LC: {
  651. color: "#99A29E",
  652. bg: "#DFE4E2",
  653. },
  654. LD: {
  655. color: "#504F57",
  656. bg: "#C1C5CD",
  657. },
  658. },
  659. phraseColor: "#ED5F00",
  660. phraseOhterColor: "#2F3742",
  661. annotationTitle: "#4E5969",
  662. annotationOhter: "#667180",
  663. statisticTitle: "#2F3742",
  664. statisticValue: "#3459D2",
  665. menuBg: "#EEF3FF",
  666. audiobg: "#FFFFFF",
  667. audioBorder: "#EBEBEB",
  668. audioBtnColor: "#175DFF",
  669. audioBtnBg: "#EEF3FF",
  670. audioTimeColor: "#2F3742",
  671. audioSpeedColor: "#2F3742",
  672. },
  673. {
  674. type: "darkGreen",
  675. contentBg: "#C2C9C6",
  676. contentInnerBg: "#DFE4E2",
  677. navBg: "#236E55",
  678. border: "#5BB99A",
  679. bg: "#FFFFFF",
  680. border_active: "#FFFFFF",
  681. boxBorder: "#1B5441",
  682. titleColor: "#1F2C5C",
  683. sourceColor: "#929CA8",
  684. contentColor: "#2F3742",
  685. btnColor: "#3459D2",
  686. glossaryTitle: "#393F3C",
  687. glossarySubtitle: "#66736D",
  688. glossaryBg: "#D7DCDA",
  689. newWordColor: "#175DFF",
  690. newWordOtherColor: "#667180",
  691. newWordStar: "#FFB224",
  692. newWordType: {
  693. L0: {
  694. color: "#FDB600",
  695. bg: "#FFF7E4",
  696. },
  697. L1: {
  698. color: "#3AB854",
  699. bg: "#EFFCEF",
  700. },
  701. L2: {
  702. color: "#00C6F1",
  703. bg: "#DFF9FF",
  704. },
  705. L3: {
  706. color: "#3459D2",
  707. bg: "#EEF3FF",
  708. },
  709. LA: {
  710. color: "#E03177",
  711. bg: "#FFECF5",
  712. },
  713. LB: {
  714. color: "#CD2B31",
  715. bg: "#FFE8E8",
  716. },
  717. LC: {
  718. color: "#99A29E",
  719. bg: "#DFE4E2",
  720. },
  721. LD: {
  722. color: "#504F57",
  723. bg: "#C1C5CD",
  724. },
  725. },
  726. phraseColor: "#ED5F00",
  727. phraseOhterColor: "#2F3742",
  728. statisticTitle: "#393F3C",
  729. statisticValue: "#299772",
  730. menuBg: "#E9F7F2",
  731. audiobg: "#ECEFED",
  732. audioBorder: "#DFE4E2",
  733. audioBtnColor: "#299772",
  734. audioBtnBg: "#DFE4E2",
  735. audioTimeColor: "#393F3C",
  736. audioSpeedColor: "#299772",
  737. },
  738. {
  739. type: "darkBlue",
  740. contentBg: "#1C2129",
  741. contentInnerBg: "#2F3742",
  742. navBg: "#2F3742",
  743. border: "#1F2C5C",
  744. bg: "#1F2C5C",
  745. border_active: "#FFFFFF",
  746. boxBorder: "#1C2129",
  747. titleColor: "#5373E7",
  748. sourceColor: "#929CA8",
  749. contentColor: "#C1C5CD",
  750. btnColor: "#5373E7",
  751. glossaryTitle: "#929CA8",
  752. glossarySubtitle: "#929CA8",
  753. glossaryBg: "#3E4855",
  754. newWordColor: "#8DA4EF",
  755. newWordOtherColor: "#929CA8",
  756. newWordStar: "#816C00",
  757. newWordType: {
  758. L0: {
  759. color: "rgba(255, 255, 255, 0.64)",
  760. bg: "#FDB600",
  761. },
  762. L1: {
  763. color: "rgba(255, 255, 255, 0.64)",
  764. bg: "#3AB854",
  765. },
  766. L2: {
  767. color: "rgba(255, 255, 255, 0.64)",
  768. bg: "#00C6F1",
  769. },
  770. L3: {
  771. color: "rgba(255, 255, 255, 0.64)",
  772. bg: "#3459D2",
  773. },
  774. LA: {
  775. color: "rgba(255, 255, 255, 0.64)",
  776. bg: "#AE1955",
  777. },
  778. LB: {
  779. color: "rgba(255, 255, 255, 0.64)",
  780. bg: "#8F2025",
  781. },
  782. LC: {
  783. color: "rgba(255, 255, 255, 0.64)",
  784. bg: "#4A524E",
  785. },
  786. LD: {
  787. color: "rgba(255, 255, 255, 0.64)",
  788. bg: "#2F3742",
  789. },
  790. },
  791. phraseColor: "#ED5F00",
  792. phraseOhterColor: "#929CA8",
  793. statisticTitle: "#D0D3D9",
  794. statisticValue: "#5373E7",
  795. menuBg: "#EEF3FF",
  796. audiobg: "#3E4855",
  797. audioBorder: "#2F3742",
  798. audioBtnColor: "#D0D3D9",
  799. audioBtnBg: "#4E5969",
  800. audioTimeColor: "#D0D3D9",
  801. audioSpeedColor: "#D0D3D9",
  802. },
  803. {
  804. type: "armyGreen",
  805. contentBg: "#2A2F2C",
  806. contentInnerBg: "#393F3C",
  807. navBg: "#393F3C",
  808. border: "#13392E",
  809. bg: "#13392E",
  810. border_active: "#FFFFFF",
  811. boxBorder: "#2A2F2C",
  812. titleColor: "#30A47D",
  813. sourceColor: "#99A29E",
  814. contentColor: "#C1C5CD",
  815. btnColor: "#30A47D",
  816. glossaryTitle: "#99A29E",
  817. glossarySubtitle: "#99A29E",
  818. glossaryBg: "#4A524E",
  819. newWordColor: "#8DA4EF",
  820. newWordOtherColor: "#99A29E",
  821. newWordStar: "#816C00",
  822. newWordType: {
  823. L0: {
  824. color: "rgba(255, 255, 255, 0.64)",
  825. bg: "#FDB600",
  826. },
  827. L1: {
  828. color: "rgba(255, 255, 255, 0.64)",
  829. bg: "#3AB854",
  830. },
  831. L2: {
  832. color: "rgba(255, 255, 255, 0.64)",
  833. bg: "#00C6F1",
  834. },
  835. L3: {
  836. color: "rgba(255, 255, 255, 0.64)",
  837. bg: "#3459D2",
  838. },
  839. LA: {
  840. color: "rgba(255, 255, 255, 0.64)",
  841. bg: "#AE1955",
  842. },
  843. LB: {
  844. color: "rgba(255, 255, 255, 0.64)",
  845. bg: "#8F2025",
  846. },
  847. LC: {
  848. color: "rgba(255, 255, 255, 0.64)",
  849. bg: "#4A524E",
  850. },
  851. LD: {
  852. color: "rgba(255, 255, 255, 0.64)",
  853. bg: "#2F3742",
  854. },
  855. },
  856. phraseColor: "#ED5F00",
  857. phraseOhterColor: "#99A29E",
  858. statisticTitle: "#D0D3D9",
  859. statisticValue: "#30A47D",
  860. menuBg: "#EEF3FF",
  861. audiobg: "#4A524E",
  862. audioBorder: "#393F3C",
  863. audioBtnColor: "#D7DCDA",
  864. audioBtnBg: "#66736D",
  865. audioTimeColor: "#D7DCDA",
  866. audioSpeedColor: "#D7DCDA",
  867. },
  868. ],
  869. activeIndex: 0, // 选择主题色的索引
  870. showGlossary: true, // 是否展开词汇表
  871. showWordInfo: true,
  872. wordList: [
  873. {
  874. src: ".",
  875. word: "cremation",
  876. symbol: "/krəˈmeɪʃn/",
  877. paraList: [
  878. {
  879. cixing: "n.",
  880. shiyi: "火葬;火化",
  881. },
  882. ],
  883. type: "daochu",
  884. rate: 3,
  885. },
  886. {
  887. src: ".",
  888. word: "thrive",
  889. symbol: "/θraɪv/",
  890. paraList: [
  891. {
  892. cixing: "v.",
  893. shiyi:
  894. "茁壮成长,兴旺,繁荣;(尤指在别人觉得困难的时候)以……为乐,可以出色应对",
  895. },
  896. ],
  897. type: "xuanbi",
  898. rate: 4,
  899. },
  900. {
  901. src: ".",
  902. word: "diversify",
  903. symbol: "/daɪˈvɜːsɪfaɪ/",
  904. paraList: [
  905. {
  906. cixing: "v.",
  907. shiyi:
  908. "(使)多样化,(使)不同;扩大经营范围,增加……的品种;(投资)多元化;",
  909. },
  910. {
  911. cixing: "n.",
  912. shiyi: "兽医;<美,非正式>老兵;兽医诊所(vet's)",
  913. },
  914. ],
  915. type: "daochu",
  916. rate: 2,
  917. },
  918. ],
  919. phraseList: [
  920. {
  921. word: "send off",
  922. paraList: ["送行"],
  923. },
  924. {
  925. word: "more than",
  926. paraList: ["多于"],
  927. },
  928. {
  929. word: "according to",
  930. paraList: ["根据"],
  931. },
  932. {
  933. word: "In addition to",
  934. paraList: ["除了……之外"],
  935. },
  936. ],
  937. annotationList: [
  938. {
  939. prefix: "visiting team",
  940. para: "时区。全球划分为24个时区。相邻两个时区的时问相差1小时。出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。凡向西走,每过一个时区,就要把表拨慢1小时;凡向东走,每过一个时区,就要把表拨快1小时。",
  941. },
  942. {
  943. prefix: "jet–lagged",
  944. para: "有时差反应的,有时差感的。人体症状多表现为疲劳、方向感减弱和失眠、往往会影响人们最初几天的活动。",
  945. },
  946. ],
  947. vocabularyType: {
  948. L0: {
  949. color: "#FDB600",
  950. bg: "#FFF7E4",
  951. darkBg: "#FDB600",
  952. border: "#FFF7E4",
  953. darkColor: "rgba(255, 255, 255, 0.64)",
  954. darkBorder: "rgba(255, 255, 255, 0.08)",
  955. darkGreenBg: "#FFF7E4",
  956. darkGreenColor: "#FDB600",
  957. darkGreenBorder: "#FFF7E4",
  958. },
  959. L1: {
  960. bg: "#EFFCEF",
  961. color: "#3AB854",
  962. darkBg: "#3AB854",
  963. darkColor: "rgba(255, 255, 255, 0.64)",
  964. darkBorder: "rgba(255, 255, 255, 0.08)",
  965. darkGreenBg: "#EFFCEF",
  966. darkGreenColor: "#3AB854",
  967. darkGreenBorder: "#EFFCEF",
  968. },
  969. L2: {
  970. bg: "#DFF9FF",
  971. color: "#00C6F1",
  972. darkBg: "#00C6F1",
  973. darkColor: "rgba(255, 255, 255, 0.64)",
  974. darkBorder: "rgba(255, 255, 255, 0.08)",
  975. darkGreenBg: "#DFF9FF",
  976. darkGreenColor: "#00C6F1",
  977. darkGreenBorder: "#DFF9FF",
  978. },
  979. L3: {
  980. bg: "#EEF3FF",
  981. color: "#3459D2",
  982. darkBg: "#3459D2",
  983. darkColor: "rgba(255, 255, 255, 0.64)",
  984. darkBorder: "rgba(255, 255, 255, 0.08)",
  985. darkGreenBg: "#EEF3FF",
  986. darkGreenColor: "#3459D2",
  987. darkGreenBorder: "#EEF3FF",
  988. },
  989. LA: {
  990. bg: "#FFECF5",
  991. color: "#E03177",
  992. darkBg: "#AE1955",
  993. darkColor: "rgba(255, 255, 255, 0.64)",
  994. darkBorder: "rgba(255, 255, 255, 0.08)",
  995. darkGreenBg: "#FFECF5",
  996. darkGreenColor: "#E03177",
  997. darkGreenBorder: "#FFECF5",
  998. },
  999. LB: {
  1000. bg: "#FFE8E8",
  1001. color: "#CD2B31",
  1002. darkBg: "#8F2025",
  1003. darkColor: "rgba(255, 255, 255, 0.64)",
  1004. darkBorder: "rgba(255, 255, 255, 0.08)",
  1005. darkGreenBg: "#FFE8E8",
  1006. darkGreenColor: "#CD2B31",
  1007. darkGreenBorder: "#FFE8E8",
  1008. },
  1009. LC: {
  1010. bg: "#DFE4E2",
  1011. color: "#99A29E",
  1012. border: "rgba(0, 0, 0, 0.08)",
  1013. darkBg: "#4A524E",
  1014. darkColor: "rgba(255, 255, 255, 0.64)",
  1015. darkBorder: "rgba(255, 255, 255, 0.08)",
  1016. darkGreenBg: "#DFE4E2",
  1017. darkGreenColor: "#4A524E",
  1018. darkGreenBorder: "rgba(0, 0, 0, 0.08)",
  1019. },
  1020. LD: {
  1021. bg: "#C1C5CD",
  1022. color: "#504F57",
  1023. darkBg: "#2F3742",
  1024. darkColor: "rgba(255, 255, 255, 0.64)",
  1025. darkBorder: "rgba(255, 255, 255, 0.08)",
  1026. darkGreenBg: "#C1C5CD",
  1027. darkGreenColor: "#504F57",
  1028. darkGreenBorder: "#C1C5CD",
  1029. },
  1030. },
  1031. articleType: this.$route.query.type ? this.$route.query.type * 1 : 1,
  1032. articleId: this.$route.query.id ? this.$route.query.id : "",
  1033. noRead: true, // 未读
  1034. support: false, // 点赞
  1035. oppose: false, // 不支持
  1036. timer: null,
  1037. readLength: 0,
  1038. articleInfo: null,
  1039. loading: false,
  1040. menuType: "original",
  1041. menuFeature: "", // 功能
  1042. shareSrc: "", // 分享图片
  1043. share_url: "", // 分享链接
  1044. shareLoading: false,
  1045. likeWordList: [], // 收藏短语list
  1046. likePhraseList: [],
  1047. likeSentencelist: [],
  1048. issueChnList: [], // 报刊文章目录
  1049. issueChnTanList: [], //文章摊平
  1050. userMessage: getToken() ? JSON.parse(getToken()) : null,
  1051. activeArticleIndex: 0,
  1052. articleNumber: 0,
  1053. articleInfoFlag: false, // 显示文章信息
  1054. ciyunShow: false, // 显示词云
  1055. printFlag: false, // 打印
  1056. articleImg: {}, // 文章图片
  1057. };
  1058. },
  1059. watch: {
  1060. showWordInfo: {
  1061. handler(val, oldVal) {
  1062. const _this = this;
  1063. if (val) {
  1064. setTimeout(() => {
  1065. _this.inityuan();
  1066. }, 100);
  1067. }
  1068. },
  1069. // 深度观察监听
  1070. deep: true,
  1071. },
  1072. },
  1073. methods: {
  1074. inityuan() {
  1075. if (
  1076. this.articleInfo &&
  1077. this.articleInfo.art_corpus_data &&
  1078. this.articleInfo.art_corpus_data.artStatInfo &&
  1079. this.articleInfo.art_corpus_data.artStatInfo.vocabVlLevelItems
  1080. ) {
  1081. var chartDom = document.getElementById("shanxing_main");
  1082. var myChart = echarts.init(chartDom);
  1083. var option;
  1084. let newdata = JSON.parse(
  1085. JSON.stringify(
  1086. this.articleInfo.art_corpus_data.artStatInfo.vocabVlLevelItems
  1087. )
  1088. );
  1089. newdata.forEach((item) => {
  1090. let percent = item.vocabPercent / 100;
  1091. if (percent % 1 == 0) {
  1092. item.name = item.vlCnName + " " + percent + "%";
  1093. } else {
  1094. item.name = item.vlCnName + " " + percent.toFixed(2) + "%";
  1095. }
  1096. });
  1097. option = {
  1098. color:
  1099. this.bgColorList[this.activeIndex].type === "white"
  1100. ? this.articleInfo.vl_id === "VL26"
  1101. ? [
  1102. "#FDB600",
  1103. "#55B467",
  1104. "#F04F88",
  1105. "#F2555A",
  1106. "#D7DCDA",
  1107. "#99A29E",
  1108. ]
  1109. : [
  1110. "#FDB600",
  1111. "#55B467",
  1112. "#5FD4F4",
  1113. "#5373E7",
  1114. "#F04F88",
  1115. "#F2555A",
  1116. "#D7DCDA",
  1117. "#99A29E",
  1118. ]
  1119. : this.bgColorList[this.activeIndex].type === "darkGreen"
  1120. ? this.articleInfo.vl_id === "VL26"
  1121. ? [
  1122. "#FDB600",
  1123. "#55B467",
  1124. "#F04F88",
  1125. "#F2555A",
  1126. "#D7DCDA",
  1127. "#99A29E",
  1128. ]
  1129. : [
  1130. "#FDB600",
  1131. "#55B467",
  1132. "#5FD4F4",
  1133. "#5373E7",
  1134. "#F04F88",
  1135. "#F2555A",
  1136. "#D7DCDA",
  1137. "#99A29E",
  1138. ]
  1139. : this.articleInfo.vl_id === "VL26"
  1140. ? [
  1141. "#FDB600",
  1142. "#3AB854",
  1143. "#AE1955",
  1144. "#F2555A",
  1145. "#4A524E",
  1146. "#2F3742",
  1147. ]
  1148. : [
  1149. "#FDB600",
  1150. "#3AB854",
  1151. "#00C6F1",
  1152. "#3459D2",
  1153. "#AE1955",
  1154. "#F2555A",
  1155. "#4A524E",
  1156. "#2F3742",
  1157. ],
  1158. series: [
  1159. {
  1160. name: "Access From",
  1161. type: "pie",
  1162. radius: ["50%", "90%"],
  1163. data: newdata,
  1164. itemStyle: {
  1165. borderColor: "rgba(255, 255, 255, 0.24)",
  1166. borderWidth: 1,
  1167. },
  1168. top: 50,
  1169. emphasis: {
  1170. itemStyle: {
  1171. shadowBlur: 10,
  1172. shadowOffsetX: 0,
  1173. shadowColor: "rgba(0, 0, 0, 0.5)",
  1174. },
  1175. },
  1176. },
  1177. ],
  1178. xAxis: {
  1179. show: false, //不显示坐标轴线、坐标轴刻度线和坐标轴上的文字
  1180. axisTick: {
  1181. show: false, //不显示坐标轴刻度线
  1182. },
  1183. axisLine: {
  1184. show: false, //不显示坐标轴线
  1185. },
  1186. axisLabel: {
  1187. show: false, //不显示坐标轴上的文字
  1188. },
  1189. },
  1190. };
  1191. option && myChart.setOption(option);
  1192. }
  1193. },
  1194. // 鼠标进入
  1195. gaolangbzt(index, id) {
  1196. var compareChart = echarts.getInstanceByDom(document.getElementById(id));
  1197. compareChart.dispatchAction({
  1198. type: "highlight",
  1199. seriesIndex: 0,
  1200. dataIndex: index,
  1201. });
  1202. },
  1203. // 鼠标移出
  1204. closegaolangbzt(index, id) {
  1205. var compareChart = echarts.getInstanceByDom(document.getElementById(id));
  1206. compareChart.dispatchAction({
  1207. type: "downplay",
  1208. seriesIndex: 0,
  1209. dataIndex: index,
  1210. });
  1211. },
  1212. // 切换主题颜色
  1213. handleChangeBgColor(index) {
  1214. this.activeIndex = index;
  1215. this.inityuan();
  1216. },
  1217. async handlePage(type) {
  1218. if (type === "-") {
  1219. if (this.activeArticleIndex !== 0) {
  1220. if (!this.issueChnTanList[this.activeArticleIndex - 1].canRead) {
  1221. this.$message.error("您没有阅读其他文章的相关权益");
  1222. return;
  1223. }
  1224. if (this.support) {
  1225. this.handleReadArticle();
  1226. }
  1227. this.activeArticleIndex--;
  1228. let MethodName = "/PaperServer/Client/Issue/SaveLastReadArtInIss";
  1229. let data = {
  1230. iss_id: this.$route.query.iss_id,
  1231. art_id: this.issueChnTanList[this.activeArticleIndex].id,
  1232. };
  1233. await getLogin(MethodName, data).then((res) => {});
  1234. this.$router.replace({
  1235. path: "/articleDetail",
  1236. query: {
  1237. headerConfig: this.$route.query.headerConfig
  1238. ? this.$route.query.headerConfig
  1239. : "",
  1240. id: this.issueChnTanList[this.activeArticleIndex].id,
  1241. iss_id: this.$route.query.iss_id,
  1242. },
  1243. });
  1244. } else {
  1245. return;
  1246. }
  1247. } else {
  1248. if (this.activeArticleIndex !== this.issueChnTanList.length - 1) {
  1249. if (!this.issueChnTanList[this.activeArticleIndex + 1].canRead) {
  1250. this.$message.error("您没有阅读其他文章的相关权益");
  1251. return;
  1252. }
  1253. if (this.support) {
  1254. this.handleReadArticle();
  1255. }
  1256. this.activeArticleIndex++;
  1257. let MethodName = "/PaperServer/Client/Issue/SaveLastReadArtInIss";
  1258. let data = {
  1259. iss_id: this.$route.query.iss_id,
  1260. art_id: this.issueChnTanList[this.activeArticleIndex].id,
  1261. };
  1262. await getLogin(MethodName, data).then((res) => {});
  1263. this.$router.replace({
  1264. path: "/articleDetail",
  1265. query: {
  1266. headerConfig: this.$route.query.headerConfig
  1267. ? this.$route.query.headerConfig
  1268. : "",
  1269. id: this.issueChnTanList[this.activeArticleIndex].id,
  1270. iss_id: this.$route.query.iss_id,
  1271. },
  1272. });
  1273. } else {
  1274. return;
  1275. }
  1276. }
  1277. location.reload();
  1278. },
  1279. // 跳转
  1280. async handleLink(item, flag) {
  1281. if (!flag) {
  1282. return;
  1283. }
  1284. if (this.support) {
  1285. this.handleReadArticle();
  1286. }
  1287. let MethodName = "/PaperServer/Client/Issue/SaveLastReadArtInIss";
  1288. let data = {
  1289. iss_id: this.$route.query.iss_id,
  1290. art_id: item.id,
  1291. };
  1292. await getLogin(MethodName, data).then((res) => {});
  1293. this.$router.replace({
  1294. path: "/articleDetail",
  1295. query: {
  1296. headerConfig: this.$route.query.headerConfig
  1297. ? this.$route.query.headerConfig
  1298. : "",
  1299. id: item.id,
  1300. iss_id: this.$route.query.iss_id,
  1301. },
  1302. });
  1303. location.reload();
  1304. },
  1305. getArticleDetail() {
  1306. this.loading = true;
  1307. let this_ = this;
  1308. let MethodName = "/PaperServer/Client/Article/GetArticleDetail";
  1309. let data = {
  1310. id: this.articleId,
  1311. };
  1312. getLogin(MethodName, data)
  1313. .then((res) => {
  1314. this.loading = false;
  1315. if (res.status === 1) {
  1316. this.articleInfo = res.data;
  1317. if (
  1318. this.articleInfo &&
  1319. this.articleInfo.art_corpus_data &&
  1320. this.articleInfo.art_corpus_data.artStatInfo &&
  1321. this.articleInfo.art_corpus_data.artStatInfo.vocabVlLevelItems
  1322. ) {
  1323. this.articleInfo.art_corpus_data.artStatInfo.vocabVlLevelItems.forEach(
  1324. (item) => {
  1325. if (item.vlCnName === "导出" || item.vlCnName === "导出词") {
  1326. item.vlCnName = "课标同根词";
  1327. }
  1328. if (item.vlCnName === "必修") {
  1329. item.vlCnName = "高中必修";
  1330. }
  1331. if (item.vlCnName === "选必") {
  1332. item.vlCnName = "高中选必";
  1333. }
  1334. item.value = item.vocabCount;
  1335. item = Object.assign(item, this.vocabularyType[item.vlId]);
  1336. }
  1337. );
  1338. if (this.articleInfo.art_voc_data) {
  1339. this.articleInfo.art_voc_data.forEach((item) => {
  1340. if (
  1341. item.word_explain &&
  1342. item.word_explain.vl_level_name &&
  1343. (item.word_explain.vl_level_name === "导出" ||
  1344. item.word_explain.vl_level_name === "导出词")
  1345. ) {
  1346. item.word_explain.vl_level_name = "课标同根词";
  1347. }
  1348. if (
  1349. item.word_explain &&
  1350. item.word_explain.vl_level_name &&
  1351. item.word_explain.vl_level_name === "必修"
  1352. ) {
  1353. item.word_explain.vl_level_name = "高中必修";
  1354. }
  1355. if (
  1356. item.word_explain &&
  1357. item.word_explain.vl_level_name &&
  1358. item.word_explain.vl_level_name === "选必"
  1359. ) {
  1360. item.word_explain.vl_level_name = "高中选必";
  1361. }
  1362. item.collect = false;
  1363. });
  1364. }
  1365. }
  1366. let articleArr =
  1367. this.articleInfo.art_content.split('<p class="para"');
  1368. articleArr.forEach((itema) => {
  1369. if (itema.indexOf("<img") > -1) {
  1370. // 当前段落有图片
  1371. let imgArr = [];
  1372. let pno =
  1373. itema.indexOf('pno="') > -1
  1374. ? itema.substring(
  1375. itema.indexOf('pno="') + 5,
  1376. itema
  1377. .substring(itema.indexOf('pno="') + 5)
  1378. .indexOf('"') +
  1379. 1 +
  1380. 5
  1381. )
  1382. : 0;
  1383. let itemArr = itema.split("<img");
  1384. itemArr.forEach((items) => {
  1385. if (items.indexOf('src="') > -1) {
  1386. let indexS =
  1387. items.substring(items.indexOf('src="') + 5).indexOf('"') +
  1388. items.indexOf('src="'); // src所在索引
  1389. let indexW =
  1390. items.indexOf('width="') > -1
  1391. ? items
  1392. .substring(items.indexOf('width="') + 7)
  1393. .indexOf('"')
  1394. : items.indexOf("width: ") > -1
  1395. ? items
  1396. .substring(items.indexOf("width: ") + 7)
  1397. .indexOf(";")
  1398. : -1; // width所在索引
  1399. let indexH =
  1400. items.indexOf('height="') > -1
  1401. ? items
  1402. .substring(items.indexOf('height="') + 8)
  1403. .indexOf('"')
  1404. : items.indexOf("height: ") > -1
  1405. ? items
  1406. .substring(items.indexOf("height: ") + 8)
  1407. .indexOf(";")
  1408. : -1; // height所在索引
  1409. let oldSrc = items.substring(
  1410. items.indexOf('src="') + 5,
  1411. indexS + 5
  1412. );
  1413. let MethodNames =
  1414. "/FileServer/FilePackManager/GetFileBytesBase64TextByURL";
  1415. let datas = {
  1416. url: oldSrc,
  1417. };
  1418. getLogin(MethodNames, datas)
  1419. .then((res) => {
  1420. if (res.status === 1) {
  1421. let imgobj = {
  1422. src: oldSrc,
  1423. newSrc: "data:image/jpeg;base64," + res.base64_text,
  1424. width:
  1425. items.indexOf('width="') > -1
  1426. ? items.substring(
  1427. items.indexOf('width="') + 7,
  1428. items.indexOf('width="') + indexW + 7
  1429. )
  1430. : items.indexOf("width: ") > -1
  1431. ? items.substring(
  1432. items.indexOf("width: ") + 7,
  1433. items.indexOf("width: ") + indexW + 7
  1434. )
  1435. : null,
  1436. height:
  1437. items.indexOf('height="') > -1
  1438. ? items.substring(
  1439. items.indexOf('height="') + 8,
  1440. items.indexOf('height="') + indexH + 8
  1441. )
  1442. : items.indexOf("height: ") > -1
  1443. ? items.substring(
  1444. items.indexOf("height: ") + 8,
  1445. items.indexOf('height="') + indexH + 8
  1446. )
  1447. : null,
  1448. };
  1449. imgArr.push(imgobj);
  1450. let newItems = items.replace(
  1451. oldSrc,
  1452. "data:image/jpeg;base64," + res.base64_text
  1453. );
  1454. this.articleInfo.art_content =
  1455. this.articleInfo.art_content.replace(
  1456. oldSrc,
  1457. "data:image/jpeg;base64," + res.base64_text
  1458. );
  1459. items = newItems;
  1460. }
  1461. })
  1462. .catch(() => {
  1463. let imgobj = {
  1464. src: items.substring(
  1465. items.indexOf('src="') + 5,
  1466. indexS + 5
  1467. ),
  1468. width:
  1469. items.indexOf('width="') > -1
  1470. ? items.substring(
  1471. items.indexOf('width="') + 7,
  1472. items.indexOf('width="') + indexW + 7
  1473. )
  1474. : items.indexOf("width: ") > -1
  1475. ? items.substring(
  1476. items.indexOf("width: ") + 7,
  1477. items.indexOf("width: ") + indexW + 7
  1478. )
  1479. : null,
  1480. height:
  1481. items.indexOf('height="') > -1
  1482. ? items.substring(
  1483. items.indexOf('height="') + 8,
  1484. items.indexOf('height="') + indexH + 8
  1485. )
  1486. : items.indexOf("height: ") > -1
  1487. ? items.substring(
  1488. items.indexOf("height: ") + 8,
  1489. items.indexOf('height="') + indexH + 8
  1490. )
  1491. : null,
  1492. };
  1493. imgArr.push(imgobj);
  1494. });
  1495. }
  1496. });
  1497. this.articleImg[pno] = imgArr;
  1498. }
  1499. });
  1500. setTimeout(() => {
  1501. this_.inityuan();
  1502. }, 100);
  1503. }
  1504. })
  1505. .catch(() => {
  1506. this.loading = false;
  1507. });
  1508. getLogin(
  1509. "/ShopServer/Client/CollectManager/GetMyCollectIntegrateInfo_Article",
  1510. {
  1511. article_id: this.articleId,
  1512. }
  1513. )
  1514. .then((res) => {
  1515. if (res.status === 1) {
  1516. this.noRead = res.is_collect_article === "false";
  1517. this.articleNumber = res.collect_person_count;
  1518. this.likeWordList = [];
  1519. res.word_list.forEach((item) => {
  1520. this.likeWordList.push(item.word);
  1521. });
  1522. this.likePhraseList = [];
  1523. res.phrase_list.forEach((item) => {
  1524. this.likePhraseList.push(item.phrase);
  1525. });
  1526. this.likeSentencelist = [];
  1527. res.sentence_list.forEach((item) => {
  1528. this.likeSentencelist.push(item.sentence_id);
  1529. });
  1530. }
  1531. })
  1532. .catch(() => {
  1533. this.loading = false;
  1534. });
  1535. getLogin(
  1536. "/ShopServer/Client/ReadingRecordManager/GetReadingStatus_Article",
  1537. {
  1538. goods_type: 21,
  1539. article_id: this.articleId,
  1540. }
  1541. )
  1542. .then((res) => {
  1543. if (res.status === 1) {
  1544. this.support = res.reading_info.is_reading === "false";
  1545. // if (!this.support) {
  1546. // clearInterval(this_.timer);
  1547. // this_.timer = null;
  1548. // }
  1549. }
  1550. })
  1551. .catch(() => {
  1552. this.loading = false;
  1553. });
  1554. },
  1555. handleReadArticle() {
  1556. let this_ = this;
  1557. clearInterval(this_.timer);
  1558. this_.timer = null;
  1559. let MethodName =
  1560. "/ShopServer/Client/ReadingRecordManager/AddReadingRecord_Article";
  1561. let data = {
  1562. goods_type: 21,
  1563. article_id: this.articleId,
  1564. duration: this.readLength,
  1565. };
  1566. getLogin(MethodName, data)
  1567. .then((res) => {
  1568. if (res.status === 1) {
  1569. this.support = false;
  1570. }
  1571. })
  1572. .catch(() => {});
  1573. },
  1574. changeStatus(flag) {
  1575. if (this[flag]) {
  1576. let MethodName = "/ShopServer/Client/CollectManager/AddCollect_Article";
  1577. let data = {
  1578. article_id: this.articleId,
  1579. };
  1580. getLogin(MethodName, data)
  1581. .then((res) => {
  1582. if (res.status === 1) {
  1583. this[flag] = !this[flag];
  1584. this.articleNumber++;
  1585. this.$message({
  1586. message: "收藏成功",
  1587. type: "success",
  1588. });
  1589. }
  1590. })
  1591. .catch(() => {});
  1592. // let datas = {
  1593. // sentence_id: this.articleInfo.art_sound_srt_data?this.articleInfo.art_sound_srt_data.sents[1].id:this.articleInfo.art_corpus_data.sentList[1].id,
  1594. // audio_file_id: this.articleInfo.art_sound_srt_data?this.articleInfo.art_sound_srt_data.mp3:'',
  1595. // audio_begin_time: this.articleInfo.art_sound_srt_data?this.articleInfo.art_sound_srt_data.sents[1].s:null,
  1596. // audio_end_time: this.articleInfo.art_sound_srt_data?this.articleInfo.art_sound_srt_data.sents[1].e:null
  1597. // }
  1598. // getLogin('/ShopServer/Client/CollectManager/AddCollect_Sentence', datas)
  1599. // .then((res) => {
  1600. // if(res.status===1){
  1601. // }
  1602. // })
  1603. // .catch(() => {
  1604. // });
  1605. } else {
  1606. let MethodName =
  1607. "/ShopServer/Client/CollectManager/CancelCollect_Article";
  1608. getLogin(MethodName, {
  1609. article_id: this.articleId,
  1610. })
  1611. .then((res) => {
  1612. if (res.status === 1) {
  1613. this[flag] = !this[flag];
  1614. this.articleNumber--;
  1615. this.$message({
  1616. message: "取消收藏",
  1617. type: "success",
  1618. });
  1619. }
  1620. })
  1621. .catch(() => {
  1622. this.loading = false;
  1623. });
  1624. }
  1625. },
  1626. changeArticleType(type, e) {
  1627. if (
  1628. type === "print" ||
  1629. type === "share" ||
  1630. type === "list" ||
  1631. type === "cloud" ||
  1632. type === "chart"
  1633. ) {
  1634. if (type === "share" || type === "cloud" || type === "print") {
  1635. if (this.userMessage) {
  1636. if (type === "cloud") {
  1637. this.ciyunEvent();
  1638. } else if (type === "print") {
  1639. let MethodName =
  1640. "/ShopServer/Client/PrintRecordManager/GetMyPrintCount_Article";
  1641. getLogin(MethodName, {
  1642. goods_type: 21,
  1643. date_range: "ALL",
  1644. article_id: this.articleId,
  1645. }).then((res) => {
  1646. if (res.status === 1) {
  1647. if (res.print_count < 5) {
  1648. this.printFlag = true;
  1649. } else {
  1650. this.$message.warning(
  1651. "每篇文章打印+下载次数共5次,现已达上限。"
  1652. );
  1653. }
  1654. }
  1655. });
  1656. } else {
  1657. this.handleCreateShare();
  1658. }
  1659. this.menuFeature = type;
  1660. } else {
  1661. this.$message.error("请先登录");
  1662. }
  1663. } else {
  1664. if (type === "chart") {
  1665. this.articleInfoFlag = true;
  1666. } else {
  1667. this.articleInfoFlag = false;
  1668. }
  1669. this.menuFeature = type;
  1670. }
  1671. } else {
  1672. this.menuType = type;
  1673. if (type === "search") {
  1674. setTimeout(() => {
  1675. this.$refs.innerTextSearchs.changeShow();
  1676. }, 100);
  1677. } else if (type === "filtrate") {
  1678. setTimeout(() => {
  1679. this.$refs.lexicalType.changeShow();
  1680. }, 100);
  1681. }
  1682. this.menuFeature = "";
  1683. }
  1684. },
  1685. ciyunEvent() {
  1686. // let MethodName = "/PaperServer/Client/Article/CalcArtWordCloud";
  1687. // let data = {
  1688. // type: 0,
  1689. // id: this.articleId
  1690. // }
  1691. // getLogin(MethodName, data)
  1692. // .then((res) => {
  1693. this.ciyunShow = true;
  1694. // window.localStorage.setItem('ciyunData', JSON.stringify(res.data))
  1695. // window.open(
  1696. // "./ciyun/ciyunindex.html?partitionKey=1&searchType=2&articleId=" +
  1697. // this.articleId,
  1698. // "_blank"
  1699. // );
  1700. // })
  1701. // .catch(() => {
  1702. // });
  1703. },
  1704. handleCloseShare() {
  1705. this.menuFeature = "";
  1706. },
  1707. CopyToClipboard(element) {
  1708. var doc = document,
  1709. text = doc.getElementById(element),
  1710. range,
  1711. selection;
  1712. if (doc.body.createTextRange) {
  1713. range = doc.body.createTextRange();
  1714. range.moveToElementText(text);
  1715. range.select();
  1716. } else if (window.getSelection) {
  1717. selection = window.getSelection();
  1718. range = doc.createRange();
  1719. range.selectNodeContents(text);
  1720. selection.removeAllRanges();
  1721. selection.addRange(range);
  1722. }
  1723. document.execCommand("copy");
  1724. this.$message({
  1725. message: "复制成功",
  1726. type: "success",
  1727. });
  1728. window.getSelection().removeAllRanges();
  1729. },
  1730. downLoadImg(base64URL) {
  1731. const a = document.createElement("a");
  1732. a.download = "分享图片";
  1733. const mimeType = base64URL.match(/:(.*?);/)[1];
  1734. const byteCharacters = atob(base64URL.split(",")[1]);
  1735. const byteNumbers = new Array(byteCharacters.length);
  1736. for (let i = 0; i < byteCharacters.length; i++) {
  1737. byteNumbers[i] = byteCharacters.charCodeAt(i);
  1738. }
  1739. const byteArray = new Uint8Array(byteNumbers);
  1740. const blob = new Blob([byteArray], { type: mimeType });
  1741. a.href = URL.createObjectURL(blob);
  1742. document.body.appendChild(a);
  1743. a.click();
  1744. document.body.removeChild(a);
  1745. },
  1746. // 创建分享
  1747. handleCreateShare() {
  1748. this.shareLoading = true;
  1749. let MethodName = "/ShopServer/Client/ShareManager/CreateShareRecord";
  1750. let data = {
  1751. goods_type: 21,
  1752. goods_id: this.articleId,
  1753. };
  1754. getLogin(MethodName, data)
  1755. .then((res) => {
  1756. this.shareLoading = false;
  1757. if (res.status === 1) {
  1758. this.share_url = res.share_url;
  1759. this.shareSrc =
  1760. "data:image/jpeg;base64," + res.image_content_base64;
  1761. }
  1762. })
  1763. .catch(() => {
  1764. this.shareLoading = false;
  1765. });
  1766. },
  1767. changeLike(type, list) {
  1768. this[type] = list;
  1769. if (type === "likePhraseList") {
  1770. this.$refs.phraseList.handleData();
  1771. } else if (type === "likeWordList") {
  1772. this.$refs.newWordList.handleData();
  1773. }
  1774. },
  1775. // 报刊信息
  1776. getIssueDetail() {
  1777. this.issueChnTanList = [];
  1778. this.issueChnList = [];
  1779. let articleindex = 0;
  1780. let MethodName = "/PaperServer/Client/Issue/GetIssueBriefInfo";
  1781. let data = {
  1782. id: this.$route.query.iss_id,
  1783. };
  1784. getLogin(MethodName, data)
  1785. .then((res) => {
  1786. if (res.status === 1) {
  1787. let issueChnList = res.data.chn_art_data;
  1788. if (this.userMessage) {
  1789. getLogin("/ShopServer/Client/BookshelfQuery/GetGoodsBuyStatus", {
  1790. goods_type: 2,
  1791. goods_id: this.$route.query.iss_id,
  1792. })
  1793. .then((res) => {
  1794. if (res.status === 1) {
  1795. let isBuy = res.buy_info.is_buy === "true";
  1796. issueChnList.forEach((item, index) => {
  1797. item.canRead = isBuy || index === 0;
  1798. item.arts.forEach((items) => {
  1799. if (items.id === this.$route.query.id) {
  1800. this.activeArticleIndex = articleindex;
  1801. item.active = true;
  1802. items.active = true;
  1803. }
  1804. this.issueChnTanList.push({
  1805. id: items.id,
  1806. canRead: isBuy || index === 0,
  1807. });
  1808. if (isBuy || index === 0) {
  1809. items.canRead = true;
  1810. } else {
  1811. items.canRead = false;
  1812. }
  1813. articleindex++;
  1814. });
  1815. });
  1816. this.issueChnList = issueChnList;
  1817. }
  1818. })
  1819. .catch(() => {});
  1820. } else {
  1821. let isBuy = false;
  1822. issueChnList.forEach((item, index) => {
  1823. item.canRead = isBuy || index === 0;
  1824. item.arts.forEach((items) => {
  1825. if (items.id === this.$route.query.id) {
  1826. this.activeArticleIndex = articleindex;
  1827. item.active = true;
  1828. items.active = true;
  1829. }
  1830. this.issueChnTanList.push({
  1831. id: items.id,
  1832. canRead: isBuy || index === 0,
  1833. });
  1834. if (isBuy || index === 0) {
  1835. items.canRead = true;
  1836. } else {
  1837. items.canRead = false;
  1838. }
  1839. articleindex++;
  1840. });
  1841. });
  1842. this.issueChnList = issueChnList;
  1843. }
  1844. }
  1845. })
  1846. .catch(() => {});
  1847. },
  1848. closeArticleInfo() {
  1849. this.articleInfoFlag = false;
  1850. },
  1851. closePrint() {
  1852. this.printFlag = false;
  1853. },
  1854. },
  1855. created() {
  1856. if (this.config) {
  1857. let arr = this.config.split("&&&");
  1858. this.LoginNavIndex = arr[0] * 1;
  1859. this.userBg = arr[1] ? arr[1] : "rgba(0, 0, 0, 0.24)";
  1860. this.headerBorder = arr[2] ? arr[2] : "#5C5C5C";
  1861. this.headerBg = arr[3] ? arr[3] : "#00ADEF";
  1862. this.previousPage = arr[4] ? arr[4] : "商城";
  1863. }
  1864. if (this.articleId) {
  1865. this.getArticleDetail();
  1866. }
  1867. if (this.$route.query.iss_id) {
  1868. this.getIssueDetail();
  1869. }
  1870. },
  1871. mounted() {
  1872. let this_ = this;
  1873. this_.timer = null;
  1874. this_.readLength = 0;
  1875. this_.timer = setInterval(() => {
  1876. this_.readLength++;
  1877. }, 1000);
  1878. },
  1879. beforeDestroy() {
  1880. if (this.support) {
  1881. this.handleReadArticle();
  1882. }
  1883. },
  1884. };
  1885. </script>
  1886. <style lang="scss" scoped>
  1887. .bookStore {
  1888. min-height: calc(100vh - 64px);
  1889. .navBar-right {
  1890. display: flex;
  1891. align-items: center;
  1892. }
  1893. .article-color {
  1894. display: flex;
  1895. width: 132px;
  1896. height: 32px;
  1897. justify-content: space-between;
  1898. align-items: center;
  1899. border: 1px solid #e5e6eb;
  1900. border-radius: 40px;
  1901. margin-left: 12px;
  1902. padding: 4px;
  1903. .color-item {
  1904. padding: 2px;
  1905. border: 2px solid transparent;
  1906. border-radius: 50%;
  1907. a {
  1908. width: 16px;
  1909. height: 16px;
  1910. border-radius: 50%;
  1911. display: block;
  1912. border: 1px solid transparent;
  1913. padding: 0;
  1914. }
  1915. }
  1916. }
  1917. .article-box {
  1918. position: relative;
  1919. padding: 80px 0;
  1920. .artricle-inner {
  1921. width: 1000px;
  1922. margin: 0 auto;
  1923. border-radius: 8px;
  1924. }
  1925. .mene-right {
  1926. position: fixed;
  1927. right: calc((100% - 1000px) / 2 - 172px);
  1928. top: 144px;
  1929. width: 152px;
  1930. max-height: 80%;
  1931. overflow: auto;
  1932. background: #ffffff;
  1933. border: 1px solid #e5e6eb;
  1934. border-radius: 8px;
  1935. padding: 4px;
  1936. z-index: 99;
  1937. }
  1938. }
  1939. .atricle-data {
  1940. padding: 120px 100px 40px 100px;
  1941. }
  1942. .glossary-box {
  1943. // border-top: 1px solid #F2F3F5;
  1944. padding: 40px;
  1945. .title {
  1946. display: flex;
  1947. justify-content: space-between;
  1948. h2 {
  1949. margin: 0;
  1950. font-weight: 400;
  1951. font-size: 24px;
  1952. line-height: 32px;
  1953. }
  1954. a {
  1955. font-weight: 400;
  1956. font-size: 16px;
  1957. line-height: 24px;
  1958. }
  1959. }
  1960. h4 {
  1961. margin: 24px 0 8px 0;
  1962. font-weight: 400;
  1963. font-size: 12px;
  1964. line-height: 20px;
  1965. }
  1966. }
  1967. .newWord-list {
  1968. padding: 2px 4px;
  1969. }
  1970. .word-info {
  1971. display: flex;
  1972. justify-content: space-between;
  1973. > div {
  1974. width: 178px;
  1975. height: 64px;
  1976. border-radius: 4px;
  1977. padding: 8px 12px;
  1978. label {
  1979. display: block;
  1980. font-weight: 400;
  1981. font-size: 12px;
  1982. line-height: 20px;
  1983. margin-bottom: 4px;
  1984. }
  1985. span {
  1986. font-weight: 400;
  1987. font-size: 16px;
  1988. line-height: 24px;
  1989. }
  1990. }
  1991. }
  1992. .echarts-box {
  1993. display: flex;
  1994. .echarts-type {
  1995. width: 232px;
  1996. flex-shrink: 0;
  1997. li {
  1998. height: 38px;
  1999. border-radius: 4px;
  2000. margin-bottom: 8px;
  2001. font-size: 14px;
  2002. line-height: 20px;
  2003. display: flex;
  2004. padding: 8px 12px;
  2005. cursor: pointer;
  2006. border: 1px solid transparent;
  2007. .name {
  2008. flex: 1;
  2009. }
  2010. .number {
  2011. width: 40px;
  2012. text-align: right;
  2013. }
  2014. .percent {
  2015. width: 80px;
  2016. text-align: right;
  2017. }
  2018. }
  2019. }
  2020. #shanxing_main {
  2021. flex: 1;
  2022. }
  2023. }
  2024. }
  2025. .article-btn {
  2026. display: flex;
  2027. justify-content: space-between;
  2028. align-items: center;
  2029. padding: 16px;
  2030. background: #f7f8fa;
  2031. .right {
  2032. width: 150px;
  2033. margin-right: -8px;
  2034. text-align: right;
  2035. }
  2036. .support {
  2037. padding: 8px 16px;
  2038. border-radius: 20px;
  2039. background: #e5e6eb;
  2040. margin-right: 8px;
  2041. color: rgba(0, 0, 0, 0.88);
  2042. font-size: 16px;
  2043. font-weight: 400;
  2044. line-height: 24px;
  2045. cursor: pointer;
  2046. .svg-icon {
  2047. margin-right: 8px;
  2048. color: rgba(23, 93, 255, 1);
  2049. }
  2050. &.active {
  2051. background: rgba(48, 110, 255, 1);
  2052. color: #fff;
  2053. .svg-icon {
  2054. color: #fff;
  2055. }
  2056. }
  2057. }
  2058. .colloct-article {
  2059. .svg-icon {
  2060. color: rgba(242, 85, 90, 1);
  2061. }
  2062. &.active {
  2063. background: rgba(242, 85, 90, 1);
  2064. }
  2065. }
  2066. .oppose {
  2067. padding: 12px;
  2068. border-radius: 20px;
  2069. background: #e5e6eb;
  2070. height: 40px;
  2071. font-size: 16px;
  2072. line-height: 16px;
  2073. display: inline-block;
  2074. cursor: pointer;
  2075. .svg-icon {
  2076. width: 16px;
  2077. height: 16px;
  2078. }
  2079. &.active {
  2080. background: rgba(48, 110, 255, 1);
  2081. .svg-icon {
  2082. color: #fff;
  2083. }
  2084. }
  2085. }
  2086. .btn-left,
  2087. .btn-right {
  2088. color: #3459d2;
  2089. font-size: 16px;
  2090. line-height: 24px;
  2091. padding: 0;
  2092. .svg-icon {
  2093. margin-right: 12px;
  2094. }
  2095. &.not-allow {
  2096. color: #5e89ef;
  2097. cursor: not-allowed;
  2098. }
  2099. }
  2100. .btn-right {
  2101. .svg-icon {
  2102. margin-right: 0;
  2103. margin-left: 12px;
  2104. }
  2105. }
  2106. .readed {
  2107. background: rgba(231, 238, 255, 1);
  2108. color: rgba(23, 93, 255, 1);
  2109. cursor: initial;
  2110. }
  2111. }
  2112. .share-box,
  2113. .catalog-box {
  2114. padding: 24px;
  2115. width: 428px;
  2116. height: 90%;
  2117. overflow: auto;
  2118. max-height: 712px;
  2119. position: fixed;
  2120. top: 40%;
  2121. left: 50%;
  2122. z-index: 10;
  2123. font-size: 0;
  2124. margin-top: -270px;
  2125. margin-left: -214px;
  2126. border-radius: 8px;
  2127. border: 1px solid #d0d3d9;
  2128. background: #fff;
  2129. box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.08),
  2130. 0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 6px 30px 5px rgba(0, 0, 0, 0.05);
  2131. &-top {
  2132. display: flex;
  2133. justify-content: space-between;
  2134. align-items: center;
  2135. h5 {
  2136. color: #000;
  2137. font-size: 24px;
  2138. font-weight: 400;
  2139. line-height: 32px;
  2140. margin: 0;
  2141. }
  2142. .el-icon-close {
  2143. color: rgba(47, 55, 66, 1);
  2144. cursor: pointer;
  2145. font-size: 16px;
  2146. }
  2147. }
  2148. img {
  2149. width: 380px;
  2150. height: 738px;
  2151. border-radius: 16px;
  2152. margin: 24px 0;
  2153. }
  2154. #copyDownUrl {
  2155. width: 0;
  2156. height: 0;
  2157. opacity: 0;
  2158. display: block;
  2159. }
  2160. &-bottom {
  2161. .el-button {
  2162. width: 174px;
  2163. height: 48px;
  2164. color: #fff;
  2165. font-size: 16px;
  2166. font-weight: 400;
  2167. line-height: 24px;
  2168. border-radius: 8px;
  2169. &.is-plain {
  2170. color: rgba(23, 93, 255, 1);
  2171. border-color: rgba(23, 93, 255, 1);
  2172. &:hover {
  2173. background: rgba(231, 238, 255, 1);
  2174. }
  2175. &:focus {
  2176. color: rgba(23, 93, 255, 1);
  2177. border-color: rgba(23, 93, 255, 1);
  2178. background: rgba(231, 238, 255, 1);
  2179. }
  2180. }
  2181. }
  2182. }
  2183. }
  2184. .catalog-box {
  2185. right: calc((100% - 1000px) / 2);
  2186. left: auto;
  2187. margin-left: auto;
  2188. .treeList {
  2189. .parent-node {
  2190. display: flex;
  2191. align-items: center;
  2192. margin-bottom: 16px;
  2193. .number {
  2194. width: 26px;
  2195. font-weight: 500;
  2196. font-size: 16px;
  2197. line-height: 24px;
  2198. color: #2f3742;
  2199. }
  2200. .title {
  2201. font-weight: 500;
  2202. font-size: 16px;
  2203. line-height: 24px;
  2204. color: #2f3742;
  2205. word-break: break-word;
  2206. }
  2207. }
  2208. ul {
  2209. margin-bottom: 16px;
  2210. .children {
  2211. padding: 0 32px;
  2212. border-radius: 4px;
  2213. height: 40px;
  2214. display: flex;
  2215. align-items: center;
  2216. margin-bottom: 4px;
  2217. &-buy {
  2218. .number,
  2219. .title {
  2220. color: #2f3742;
  2221. }
  2222. }
  2223. &-no {
  2224. .number,
  2225. .title {
  2226. color: #929ca8;
  2227. }
  2228. }
  2229. &-buy:hover {
  2230. background: #e5e6eb;
  2231. cursor: pointer;
  2232. }
  2233. &-node {
  2234. display: flex;
  2235. width: 100%;
  2236. }
  2237. .number {
  2238. width: 24px;
  2239. }
  2240. .title {
  2241. flex: 1;
  2242. word-break: break-word;
  2243. }
  2244. .number,
  2245. .title {
  2246. font-weight: 400;
  2247. font-size: 16px;
  2248. line-height: 24px;
  2249. }
  2250. .el-icon-lock {
  2251. height: 16px;
  2252. color: #929ca8;
  2253. }
  2254. }
  2255. }
  2256. }
  2257. }
  2258. </style>
  2259. <style lang="scss">
  2260. .article-fontsize {
  2261. width: 144px;
  2262. height: 32px;
  2263. line-height: 30px;
  2264. border: 1px solid #e5e6eb;
  2265. border-radius: 40px;
  2266. overflow: hidden;
  2267. .el-input {
  2268. height: 30px;
  2269. }
  2270. .el-input-number__decrease,
  2271. .el-input-number__increase {
  2272. height: 30px;
  2273. border: none;
  2274. background: transparent;
  2275. color: #d9e2fc;
  2276. }
  2277. .el-input-number__decrease {
  2278. border-right: 1px solid #1b5441;
  2279. }
  2280. .el-input-number__increase {
  2281. border-left: 1px solid #1b5441;
  2282. }
  2283. .el-input__inner {
  2284. height: 30px;
  2285. border: none;
  2286. line-height: 30px;
  2287. background: transparent;
  2288. color: #d9e2fc;
  2289. }
  2290. }
  2291. .navBar {
  2292. border-color: transparent;
  2293. &-white {
  2294. border-color: #ebebeb;
  2295. .el-input-number__decrease,
  2296. .el-input-number__increase,
  2297. .el-input__inner {
  2298. color: #fff;
  2299. }
  2300. .el-input-number__decrease {
  2301. border-right: 1px solid #e5e6eb;
  2302. }
  2303. .el-input-number__increase {
  2304. border-left: 1px solid #e5e6eb;
  2305. }
  2306. .goback {
  2307. color: #fff;
  2308. }
  2309. .border {
  2310. background: #e5e6eb;
  2311. height: 16px;
  2312. margin-top: 2px;
  2313. }
  2314. .article-title {
  2315. color: #fff;
  2316. }
  2317. }
  2318. &-darkGreen {
  2319. .el-input-number__decrease {
  2320. border-right: 1px solid #1b5441;
  2321. }
  2322. .el-input-number__increase {
  2323. border-left: 1px solid #1b5441;
  2324. }
  2325. .goback {
  2326. color: #e9f7f2;
  2327. }
  2328. .border {
  2329. background: #1b5441;
  2330. height: 16px;
  2331. margin-top: 2px;
  2332. }
  2333. .article-title {
  2334. color: #ccebe1;
  2335. }
  2336. }
  2337. &-darkBlue {
  2338. .el-input-number__decrease {
  2339. border-right: 1px solid #1c2129;
  2340. }
  2341. .el-input-number__increase {
  2342. border-left: 1px solid #1c2129;
  2343. }
  2344. .goback {
  2345. color: #e9f7f2;
  2346. }
  2347. .border {
  2348. background: #667180;
  2349. height: 16px;
  2350. margin-top: 2px;
  2351. }
  2352. .article-title {
  2353. color: #d9e2fc;
  2354. }
  2355. }
  2356. &-armyGreen {
  2357. .el-input-number__decrease {
  2358. border-right: 1px solid #2a2f2c;
  2359. }
  2360. .el-input-number__increase {
  2361. border-left: 1px solid #2a2f2c;
  2362. }
  2363. .goback {
  2364. color: #e9f7f2;
  2365. }
  2366. .border {
  2367. background: #99a29e;
  2368. height: 16px;
  2369. margin-top: 2px;
  2370. }
  2371. .article-title {
  2372. color: #d9e2fc;
  2373. }
  2374. }
  2375. }
  2376. .articleDetail-dialog {
  2377. .el-dialog__header,
  2378. .el-dialog__body {
  2379. padding: 0;
  2380. }
  2381. }
  2382. .ciyun-dialog {
  2383. .el-dialog__title {
  2384. color: #2f3742;
  2385. font-size: 24px;
  2386. font-weight: 600;
  2387. line-height: 32px;
  2388. }
  2389. iframe {
  2390. border: none;
  2391. }
  2392. .el-dialog__body {
  2393. padding: 0;
  2394. }
  2395. }
  2396. .NNPE-ArticleView {
  2397. figure {
  2398. font-size: 0;
  2399. text-align: center;
  2400. img {
  2401. max-width: 70%;
  2402. }
  2403. }
  2404. }
  2405. </style>