index.ux 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. <import name="short-page" src="../../components/short/index.ux"></import>
  2. <import name="wechat-page" src="../../components/wechat/index.ux"></import>
  3. <import name="recom-page" src="../../components/book/read_recom.ux"></import>
  4. <template>
  5. <div id="reader-content">
  6. <stack>
  7. <div class="reader-wrap" id='list' style="background-color:{{currentColor.color}}">
  8. <div class="back-btn" @click="backToPak" if="isShowBackBtn">
  9. <div class="back-btn-wrap">
  10. <image src="../../assets/imgs/white_back.png" ></image>
  11. <text>{{back_name}}</text>
  12. </div>
  13. </div>
  14. <div class="reader-title">
  15. <text class="title" style="color:{{isNight=='night'?'#666':'#333'}}">{{bookinfo.chapter_name}}</text>
  16. <!-- <text class="add-shelf" @click="addShelf">加入书架1</text> -->
  17. </div>
  18. <div class="reader-content">
  19. <div class="readContent" @click="showMore"><text class="chapter-text" for='content' style="color:{{currentColor.fontColor}};font-size:{{`${readFontSize}px`}}">{{$item}}</text></div>
  20. <div class="bottom-setting" style="background-color:{{currentColor.btColor}}" if={{showSetting}} @click="stopPop">
  21. <div class="item-content">
  22. <text class="label-min" style="color:{{isNight=='night'?'#666':'#333'}}">A</text>
  23. <slider class="slider" min="30" max="48" step="2" value="{{readFontSize}}" onchange="changeFontSize" style="blockColor: #fff"></slider>
  24. <text class="label-max" style="color:{{isNight=='night'?'#666':'#333'}}">A</text>
  25. </div>
  26. <div class="item-color">
  27. <text class="colori" for="colorList" onclick="changeColor($item,undefined)" style="border-color:{{currentColor.color==$item.color? currentBorder: $item.borderColor}};background-color:{{$item.color}};"></text>
  28. <text class="color-icon {{ isNight }}" onclick="changeColor(nightColor,isNight)"></text>
  29. </div>
  30. <div class="item-page">
  31. <text @click="getPrevChapter" style="color:{{isNight=='night'?'#666':'#333'}}">上一章</text>
  32. <text @click="toCatalog" style="color:{{isNight=='night'?'#666':'#333'}}">目录</text>
  33. <text @click="getNextChapter" style="color:{{isNight=='night'?'#666':'#333'}}">下一章</text>
  34. </div>
  35. <div>
  36. </div>
  37. <div class="setting-top" style="background-color:{{currentColor.color}}" if={{showSetting}} @click="backRouter">
  38. <image src="{{getImgUrl}}" class="back-icon"></image> <text style="color:{{isNight=='night'?'#666':'#333'}}">{{bookinfo.chapter_name}}</text><text style="text-indent:-999px">1</text>
  39. </div>
  40. </div>
  41. <div class="banner-list" if="{{reader_banner.length>0}}">
  42. <swiper class="swipe-bar" autoplay="true" indicator="false">
  43. <block for="reader_banner">
  44. <div class="swipe-item">
  45. <image class="cover" src="{{$item.img}}" @click="goActivity($item)"></image>
  46. </div>
  47. </block>
  48. </swiper>
  49. </div>
  50. </div>
  51. <recom-page if="{{isShowBackRecom}}" @addshort="changeRecomEnd" recom_list="{{recom_list}}"></recom-page>
  52. <short-page if="{{showShortPop}}" @addshort="shortEnd" bottom="40"></short-page>
  53. <!-- <wechat-page></wechat-page> -->
  54. <div class='toast' if="{{showtoast}}">
  55. <text>正在加载中...</text>
  56. </div>
  57. </stack>
  58. <div class="reader-bottom">
  59. <div class="reader-operator-next" @click="getNextChapter"><text class="operator">下一章</text></div>
  60. <div class="reader-operator">
  61. <text class="operator prev" @click="getPrevChapter">上一章</text>
  62. <text>|</text>
  63. <text class="operator catalog" @click="toCatalog">目录</text>
  64. </div>
  65. </div>
  66. <div class="mustToask" show="{{showMustTost}}">
  67. <div class="mustBox">
  68. <image src="../../assets/imgs/addImg.png" @click="addDestop"></image>
  69. </div>
  70. </div>
  71. <div class="mustToask" show="{{showWorkWechatTost}}">
  72. <div class="qiweiMustBox">
  73. <image src="../../assets/imgs/add_work_wechat.png" @click="goToWorkWeachat" ></image>
  74. <!-- <div class="add-area" @click="goToWorkWeachat" :style="{{workWeachatHight}}"></div> -->
  75. <div class="close-box" @click="closeWorkWeachat" show="{{force_add_work_wechat_type === 1}}">
  76. <image src="../../assets/imgs/close.png"></image>
  77. </div>
  78. </div>
  79. </div>
  80. </template>
  81. <script>
  82. import prompt from '@system.prompt';
  83. import router from "@system.router";
  84. import storage from '@system.storage';
  85. import pkg from '@system.package'
  86. import it from "../../helper/interface.js";
  87. import { getChapters, getIsonshelf, postUserShelfBooks, chapterOrders, userAddDsktop, noAdvBookInfo, recommendBooks, advReplaceBookInfo } from "../../api";
  88. import { getAppConfig } from '../../api/utils.js';
  89. let getConfig;
  90. export default {
  91. // protected: {
  92. // bid: '',
  93. // chapter_id: ''
  94. // },
  95. public: {
  96. workWeachatHight: "",
  97. bid: '',
  98. tx_bid: "",
  99. chapter_id: '',
  100. send_order_id: "",
  101. push_id: "",
  102. canReadecid: "",
  103. showtoast: false,
  104. back_name: '',
  105. back_url: '',
  106. back_pkg: '',
  107. platform: '',
  108. isShowBackBtn: false,
  109. recom_list: [],
  110. isShowBackRecom: false,
  111. last_recom_bid: "",
  112. },
  113. private: {
  114. bookinfo: {},
  115. content: [],
  116. reader_banner: [],
  117. showShortPop: false,
  118. readFontSize: 38,
  119. isNight: 'sun',
  120. back_nums: 0,
  121. hasShort: false,
  122. showSetting: false,
  123. force_add_desk_type: 0,
  124. force_add_work_wechat_type: 0, // 企微
  125. hasClickWorkWechat: false, // 是否跳转过企微
  126. showWorkWechatTost: false,
  127. workWechatUrl: "",
  128. showMustTost: false,
  129. back_reader: 0,
  130. colorList: [
  131. { color: '#DFDAC7', borderColor: '#6090AE', btColor: '#E8F6FF', isIcon: false },
  132. { color: '#E6E6E6', borderColor: '#CCC', btColor: '#F2F2F2', isIcon: false },
  133. { color: '#EED9BB', borderColor: '#C6A473', btColor: '#FFFBE8', isIcon: false },
  134. { color: '#B3E2CB', borderColor: '#68AA8A', btColor: '#D5F2D8', isIcon: false },
  135. { color: '#B3D0E2', borderColor: '#6090AE', btColor: '#E8F6FF', isIcon: false },
  136. ],
  137. currentBorder: '#EE6159',
  138. nightColor: {
  139. fontColor: '#666',
  140. btColor: '#333',
  141. color: '#1a1a1a'
  142. },
  143. currentColor: {
  144. color: '#DFDAC7', btColor: '#F2F2F2', fontColor: '#1a1a1a'
  145. }
  146. },
  147. computed: {
  148. getImgUrl() {
  149. return this.isNight == 'night' ? '../../assets/imgs/white_back.png' : '../../assets/imgs/black_back.png'
  150. }
  151. },
  152. async onInit() {
  153. // 企微点击读取
  154. let clilck_work_wechat = (await storage.get({ key: "has_click_work_wechat_" + this.bid })).data;
  155. if (clilck_work_wechat) {
  156. this.hasClickWorkWechat = true;
  157. }
  158. if (this.platform) {
  159. await storage.set({ key: "platform", value: this.platform });
  160. } else {
  161. let platform = (await storage.get({ key: "platform" })).data;
  162. if (platform) this.platform = platform;
  163. }
  164. if (!this.last_recom_bid || this.last_recom_bid == "") {
  165. let last_recom_bid = (await storage.get({ key: "last_recom_bid" })).data;
  166. if (last_recom_bid) {
  167. this.last_recom_bid = last_recom_bid;
  168. } else {
  169. this.last_recom_bid = "";
  170. }
  171. }
  172. if (this.back_name) {
  173. await storage.set({ key: "back_name", value: this.back_name });
  174. } else {
  175. let back_name = (await storage.get({ key: "back_name" })).data;
  176. if (back_name) this.back_name = back_name;
  177. }
  178. if (this.back_url) {
  179. await storage.set({ key: "back_url", value: this.back_url });
  180. } else {
  181. let back_url = (await storage.get({ key: "back_url" })).data;
  182. if (back_url) this.back_url = back_url;
  183. }
  184. if (this.back_pkg) {
  185. await storage.set({ key: "back_pkg", value: this.back_pkg });
  186. } else {
  187. let back_pkg = (await storage.get({ key: "back_pkg" })).data;
  188. if (back_pkg) this.back_pkg = back_pkg;
  189. }
  190. if (this.send_order_id) {
  191. await storage.set({ key: "send_order_id", value: this.send_order_id });
  192. } else {
  193. let send_order_id = (await storage.get({ key: "send_order_id" })).data;
  194. if (send_order_id) this.send_order_id = send_order_id;
  195. }
  196. if (this.push_id) {
  197. await storage.set({ key: "push_id", value: this.push_id });
  198. }
  199. this.back_name = decodeURI(this.back_name)
  200. if (this.platform && (this.platform == 'tx_adq' || this.platform == 'tx_adq_new')) {
  201. if (this.back_url) {
  202. // console.log('book_info',book_info);
  203. pkg.hasInstalled({
  204. package: this.back_pkg,
  205. success: data => {
  206. if (!data.result) {
  207. this.isShowBackBtn = false
  208. }
  209. if (data.result) {
  210. this.isShowBackBtn = true;
  211. }
  212. },
  213. fail: function (data, code) {
  214. console.log(data)
  215. },
  216. complete: data => {
  217. }
  218. })
  219. }
  220. }
  221. // else {
  222. // // 如果书籍id为派单书籍id则检测是否需要替换书籍
  223. // if (this.send_order_id > 0 && this.ad_bid == this.bid) {
  224. // let realBook = await advReplaceBookInfo(this.send_order_id);
  225. // // let realBook = {};
  226. // if (realBook && realBook.bid && realBook.bid && realBook.cid) {
  227. // this.bid = realBook.bid;
  228. // this.chapter_id = realBook.cid;
  229. // }
  230. // }
  231. // }
  232. /* let s = (await storage.get({ key: "send_order_id" })).data;
  233. console.log("save send_order_id in storage");
  234. console.log("send_order_id", this.send_order_id);
  235. console.log("storage send_order_id", s); */
  236. await this.getChapters(this.bid, this.chapter_id);
  237. let setting = (await storage.get({ key: "readSetting" })).data;
  238. if (setting) {
  239. let sets = JSON.parse(setting)
  240. this.currentColor = sets;
  241. this.isNight = sets.isNight;
  242. }
  243. let font = (await storage.get({ key: "readFont" })).data;
  244. if (font) {
  245. this.readFontSize = font;
  246. }
  247. getConfig = getAppConfig(this);
  248. let { reader_banner } = await getConfig('position');
  249. this.reader_banner = reader_banner;
  250. let { sign_out_reader_show } = await getConfig('add_desk_alert');
  251. this.back_reader = sign_out_reader_show;
  252. this.getRecomList();
  253. userAddDsktop(this.$app.$def.data.backClickCount).then(res => {
  254. //TODO 加桌后统计上报
  255. }).catch(r => {
  256. //TODO 失败后统计上报
  257. });
  258. },
  259. goActivity(item) {
  260. router.push({
  261. uri: item.url,
  262. params: item.params
  263. })
  264. },
  265. backToPak() {
  266. console.log(12)
  267. router.push({
  268. uri: this.back_url
  269. })
  270. },
  271. backRouter() {
  272. this.back_reader = 1;
  273. let that = this;
  274. if (this.back_reader == 1) {
  275. if (this.back_nums == 0 && this.recom_list.length > 0) {
  276. this.showShortPop = false;
  277. this.back_nums = 2;
  278. this.isShowBackRecom = true;
  279. return true;
  280. }
  281. if (this.back_nums == 2) {
  282. if (!this.hasShort) {
  283. this.showShortPop = true;
  284. }
  285. this.back_nums = 3;
  286. this.isShowBackRecom = false;
  287. return true;
  288. }
  289. it.backCreateShortCut(res => {
  290. if (res == 'back') {
  291. that.getLastPage();
  292. return true;
  293. }
  294. });
  295. } else {
  296. that.getLastPage();
  297. }
  298. return true;
  299. },
  300. async onShow() {
  301. it.getShortCut((value) => {
  302. this.showSetting = false;
  303. this.showShortPop = !value;
  304. this.hasShort = value;
  305. if (value) {
  306. this.$app.$def.data.backClickCount = 1
  307. } else {
  308. this.$app.$def.data.backClickCount = 0
  309. }
  310. })
  311. let params = {
  312. bid: this.bid,
  313. chapter_id: this.chapter_id,
  314. }
  315. await storage.set({ key: "lastCapter", value: JSON.stringify(params) });
  316. },
  317. stopPop(evt) {
  318. evt.stopPropagation();
  319. return;
  320. },
  321. showMore() {
  322. this.showSetting = !this.showSetting;
  323. if (this.showSetting) {
  324. this.showShortPop = false;
  325. } else {
  326. if (!this.hasShort) this.showShortPop = true;
  327. }
  328. },
  329. async changeFontSize(evt) {
  330. this.readFontSize = evt.progress;
  331. await storage.set({ key: "readFont", value: this.readFontSize });
  332. },
  333. async changeColor(item, type) {
  334. if (type) {
  335. if (type == 'sun') {
  336. this.isNight = 'night';
  337. this.currentColor = this.nightColor;
  338. await storage.set({ key: "readSetting", value: JSON.stringify({ ...this.nightColor, isNight: 'night' }) });
  339. } else {
  340. this.isNight = 'sun';
  341. this.currentColor = { color: '#E6E6E6', borderColor: '#CCC', btColor: '#F2F2F2', isIcon: false };
  342. await storage.set({ key: "readSetting", value: JSON.stringify({ ...this.currentColor, isNight: 'sun' }) });
  343. }
  344. } else {
  345. this.isNight = 'sun';
  346. this.currentColor = {
  347. color: item.color,
  348. btColor: item.btColor,
  349. fontColor: '#1a1a1a'
  350. }
  351. await storage.set({ key: "readSetting", value: JSON.stringify({ ...this.currentColor, isNight: 'sun' }) });
  352. }
  353. },
  354. addShelf() {
  355. console.log("add shelf");
  356. getIsonshelf({ bid: this.bid }).then(r => {
  357. r.is_on ? '' : postUserShelfBooks({ bid: this.bid })
  358. })
  359. },
  360. shortEnd(value) {
  361. if (value.detail.installed) {
  362. this.showMustTost = false;
  363. prompt.showToast({ message: "添加桌面成功!请前往任务中心领取奖励" });
  364. }
  365. this.showShortPop = !value.detail.installed;
  366. this.hasShort = value.detail.installed;
  367. },
  368. getChapters(bid, chapter_id) {
  369. this.showtoast = true
  370. console.log("router length:", router.getLength());
  371. getChapters({ bid: bid, chapter_id: chapter_id }).then(r => {
  372. this.force_add_desk_type = r.force_add_desk_type;
  373. this.force_add_work_wechat_type = r.force_add_work_wechat_type;
  374. this.workWechatUrl = r.force_add_work_wechat_url
  375. this.content = r.chapter_content.trim().split(/\n/)
  376. this.bookinfo = r;
  377. // this.$element('list').scrollTo({ index: 0 })
  378. this.addShelf();
  379. this.showtoast = false
  380. }).catch(e => {
  381. console.log('e code')
  382. console.log(e.data)
  383. console.log(e.data.code == '10016' || e.data.code == '10019')
  384. if (e.data.code == '10016' || e.data.code == '10019' || e.data.code == '10017') {
  385. chapterOrders({ bid: bid, chapter_id: chapter_id }).then(r => {
  386. this.content = r.chapter_content.trim().split(/\n/)
  387. this.bookinfo = r
  388. this.showtoast = false
  389. // this.$element('list').scrollTo({ index: 0 })
  390. }).catch(f => {
  391. console.log('f code')
  392. console.log(f.data)
  393. this.showtoast = false
  394. if (f.data.code == '10014' || f.data.code == '10015' || f.data.code == '10016') {
  395. this.getChapters(bid, this.canReadecid)
  396. router.push({
  397. uri: "/views/Pay",
  398. params: {
  399. code: f.data.code,
  400. fee: e.data.data.fee,
  401. bid: this.bid
  402. }
  403. })
  404. }
  405. })
  406. } else if (e.data.code == '10014' || e.data.code == '10015') {
  407. this.showtoast = false
  408. this.getChapters(bid, this.canReadecid)
  409. router.push({
  410. uri: "/views/Pay",
  411. params: {
  412. code: e.data.code,
  413. fee: e.data.data.fee,
  414. bid: this.bid
  415. }
  416. })
  417. }
  418. })
  419. },
  420. toCatalog(evt) {
  421. evt.stopPropagation();
  422. router.replace({
  423. uri: "/views/Catalog",
  424. params: {
  425. chapter_sequence: this.bookinfo.chapter_sequence,
  426. bid: this.bid,
  427. chapter_id: this.chapter_id,
  428. fromReader: true,
  429. }
  430. })
  431. },
  432. getPrevChapter(evt) {
  433. evt.stopPropagation();
  434. console.log("get prev chapter");
  435. if (this.bookinfo.prev_cid == 0) {
  436. return prompt.showToast({ message: '已经是第一章啦' });
  437. }
  438. router.replace({
  439. uri: "/views/Reader",
  440. params: {
  441. bid: this.bookinfo.bid,
  442. chapter_id: this.bookinfo.prev_cid,
  443. canReadecid: this.bookinfo.chapter_id
  444. }
  445. })
  446. },
  447. addDestop() {
  448. it.mustCreateShort((res, code) => {
  449. if (res) {
  450. this.goNext();
  451. } else {
  452. prompt.showToast({ message: '开启加桌权限可以领取新人福利哟~' });
  453. }
  454. })
  455. },
  456. getNextChapter(evt) {
  457. evt.stopPropagation();
  458. let _this = this;
  459. if (!this.hasClickWorkWechat && this.force_add_work_wechat_type > 0) {
  460. // 需要处理企微
  461. if (this.force_add_desk_type == 1) {
  462. // 强加桌
  463. it.getShortCut(res => {
  464. if (!res) { this.showMustTost = true; } else {
  465. this.showWorkWechatTost = true;
  466. // this.goNext();
  467. }
  468. })
  469. } else {
  470. this.showWorkWechatTost = true;
  471. }
  472. } else {
  473. // 无需弹窗企微
  474. if (this.force_add_desk_type == 1) {
  475. it.getShortCut(res => {
  476. if (!res) { this.showMustTost = true; } else {
  477. this.goNext();
  478. }
  479. })
  480. } else if (this.force_add_desk_type == 2) {
  481. it.loseLevelShortCut(res => {
  482. this.goNext();
  483. })
  484. } else {
  485. this.goNext();
  486. }
  487. }
  488. },
  489. goNext() {
  490. let self = this;
  491. if (this.bookinfo.next_cid == 0) {
  492. router.push({
  493. uri: "/views/Raderover",
  494. params: {
  495. bid: this.bid
  496. }
  497. })
  498. return
  499. }
  500. //判断是否自然流量自然流量付费章节开启付费提醒
  501. if (!this.send_order_id && this.bookinfo.next_chapter_status == 2) {
  502. prompt.showDialog({
  503. title: '温馨提示',
  504. message: `下一章即将消耗${this.bookinfo.next_price}书币哟~`,
  505. buttons: [
  506. {
  507. text: '阅读下一章',
  508. color: '#EF5952'
  509. },
  510. {
  511. text: '我再想想',
  512. color: '#999'
  513. }
  514. ],
  515. success: function (data) {
  516. if (data.index === 0) {
  517. router.replace({
  518. uri: "/views/Reader",
  519. params: {
  520. bid: self.bookinfo.bid,
  521. chapter_id: self.bookinfo.next_cid,
  522. canReadecid: self.bookinfo.chapter_id
  523. }
  524. })
  525. }
  526. },
  527. cancel: function () {
  528. console.log('取消前往')
  529. },
  530. })
  531. } else {
  532. router.replace({
  533. uri: "/views/Reader",
  534. params: {
  535. bid: this.bookinfo.bid,
  536. chapter_id: this.bookinfo.next_cid,
  537. canReadecid: this.bookinfo.chapter_id
  538. }
  539. })
  540. }
  541. // this.getChapters(this.bookinfo.bid, this.bookinfo.next_cid)
  542. },
  543. onBackPress() {
  544. this.backRouter();
  545. // that.getLastPage();
  546. return true;
  547. }, async changeRecomEnd(data) {
  548. if (data.detail.op == "change_book") {
  549. this.getRecomList(1);
  550. } else if (data.detail.op == "close") {
  551. this.isShowBackRecom = false;
  552. this.back_nums = 3;
  553. if (!this.hasShort) {
  554. this.back_nums = 2;
  555. }
  556. }
  557. }, async getRecomList(isChang = 0) {
  558. let recom_list = await recommendBooks(this.last_recom_bid);
  559. if (recom_list.length > 0) {
  560. this.recom_list = recom_list;
  561. this.last_recom_bid = recom_list[recom_list.length - 1].book_id;
  562. }
  563. if (isChang == 1 || !this.last_recom_bid || this.last_recom_bid == '') {
  564. await storage.set({ key: "last_recom_bid", value: this.last_recom_bid });
  565. }
  566. // console.log(this.recom_list.length);
  567. // if(this.recom_list.length == 3){
  568. // return true;
  569. // }
  570. }, getLastPage() {
  571. let page = router.getState();
  572. let allPage = router.getPages();
  573. let back = {};
  574. for (var i = allPage.length - 1; i >= 0; i--) {
  575. if (allPage[i].name != page.name && allPage[i].name != "views/Dispatch") {
  576. back = allPage[i];
  577. break;
  578. }
  579. }
  580. if (JSON.stringify(back) === '{}') {
  581. router.replace({ uri: "/views/Index" });
  582. } else {
  583. router.back(back);
  584. }
  585. }, async goToWorkWeachat() {
  586. await storage.set({ key: "has_click_work_wechat_" + this.bid, value: 1 });
  587. this.showWorkWechatTost = false;
  588. this.hasClickWorkWechat = true;
  589. if (this.workWechatUrl) {
  590. router.push({
  591. uri: this.workWechatUrl
  592. })
  593. let $this = this;
  594. setTimeout(() => {
  595. $this.goNext();
  596. }, 10000)
  597. }else{
  598. this.goNext();
  599. }
  600. }, async closeWorkWeachat() {
  601. await storage.set({ key: "has_click_work_wechat_" + this.bid, value: 2 });
  602. this.showWorkWechatTost = false;
  603. this.hasClickWorkWechat = true;
  604. this.goNext();
  605. }
  606. }
  607. </script>
  608. <style lang="less">
  609. @import '../../assets/less/reader.less';
  610. </style>