小说小程序前端代码仓库(小程序)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

448 lines
18 KiB

  1. <template>
  2. <!-- 小说文本页面 -->
  3. <view class="reader-container" @click.native="toggleFullScreen">
  4. <uv-navbar title="这游戏也太真实了" :autoBack="true" fixed placeholder titleStyle="color: #333; font-weight: 700;" :border="false">
  5. <template #left>
  6. <uv-icon name="arrow-left" size="46" color="#333" @click="$emit('back')" />
  7. </template>
  8. </uv-navbar>
  9. <view class="chapter-title">第1章 2004</view>
  10. <scroll-view scroll-y class="chapter-content" style="height: 70vh;" @touchend="handleTouchEnd" @scroll="handleScroll" @tap="handleContentClick">
  11. <text>
  12. 华星华东地区某个省市区不知名街后居民
  13. 读朱自清的荷塘月色品读鲁迅的从百草园到三味书屋看梁实秋的雅舍!一篇篇经典散文想起来就像藏在脑海里的动画优雅唯美的画面好像夜晚的微风轻抚着凝望远方的脸颊!美文入心!感慨万千!下面是100篇名家经典散文摘抄敬请你的欣赏!
  14. 100篇名家经典散文摘抄
  15. 叶圣陶散文"名家经典珍藏"丛书之一收录了叶圣陶先生的散文精品数十篇这些作品内容丰富题材各异构思精巧文笔精巧语言幽默内蕴深厚风格恬淡充分显示了叶圣陶先生的文学功底及丰富的人生阅历从一个侧面反映了作者的思想感情及创作风格非常值得一读叶圣陶是20世纪中国一位杰出的作家教育家和出版家又是中国现代儿童文学创作的先行者作为散文家他早期和周作人朱自清共同成为文学研究会散文创作的中坚后来又成为开明派散文的代表其散文被一九三五年出版的中国新文学大系选录的篇数仅次于周作人鲁迅和朱自清
  16. 1朱自清荷塘月色片段
  17. 路上只我一个人背着手踱着这一片天地好像是我的;我也像超出了平常旳自己到了另一世界里我爱热闹也爱冷静;爱群居也爱独处像今晚上一个人在这苍茫旳月下什么都可以想什么都可以不想便觉是个自由的人白天里一定要做的事一定要说的话现在都可不理这是独处的妙处我且受用这无边的荷香月色好了
  18. 曲曲折折的荷塘上面弥望旳是田田的叶子叶子出水很高像亭亭旳舞女旳裙层层的叶子中间零星地点缀着些白花有袅娜(niǎo,nuó)地开着旳有羞涩地打着朵儿旳;正如一粒粒的明珠又如碧天里的星星又如刚出浴的美人微风过处送来缕缕清香仿佛远处高楼上渺茫的歌声似的这时候叶子与花也有一丝的颤动像闪电般霎时传过荷塘的那边去了叶子本是肩并肩密密地挨着这便宛然有了一道凝碧的波痕叶子底下是脉脉()的流水遮住了不能见一些颜色;而叶子却更见风致了
  19. 月光如流水一般静静地泻在这一片叶子和花上薄薄的青雾浮起在荷塘里叶子和花仿佛在牛乳中洗过一样;又像笼着轻纱的梦虽然是满月天上却有一层淡淡的云所以不能朗照;但我以为这恰是到了好处酣眠固不可少小睡也别有风味的月光是隔了树照过来的高处丛生的灌木落下参差的斑驳的黑影峭楞楞如鬼一般;弯弯的杨柳的稀疏的倩影却又像是画在荷叶上塘中的月色并不均匀;但光与影有着和谐的旋律如梵婀(ē)(英语violin小提琴的译音)上奏着的名曲
  20. 荷塘的四面远远近近高高低低都是树而杨柳最多这些树将一片荷塘重重围住;只在小路一旁漏着几段空隙像是特为月光留下的树色一例是阴阴的乍看像一团烟雾;但杨柳的丰姿便在烟雾里也辨得出树梢上隐隐约约的是一带远山只有些大意罢了树缝里也漏着一两点路灯光没精打采的是渴睡人的眼这时候最热闹的要数树上的蝉声与水里的蛙声;但热闹是它们的我什么也没有
  21. 2鲁迅从百草园到三味书屋片段
  22. 100篇名家经典散文摘抄
  23. 叶圣陶散文"名家经典珍藏"丛书之一收录了叶圣陶先生的散文精品数十篇这些作品内容丰富题材各异构思精巧文笔精巧语言幽默内蕴深厚风格恬淡充分显示了叶圣陶先生的文学功底及丰富的人生阅历从一个侧面反映了作者的思想感情及创作风格非常值得一读叶圣陶是20世纪中国一位杰出的作家教育家和出版家又是中国现代儿童文学创作的先行者作为散文家他早期和周作人朱自清共同成为文学研究会散文创作的中坚后来又成为开明派散文的代表其散文被一九三五年出版的中国新文学大系选录的篇数仅次于周作人鲁迅和朱自清
  24. 1朱自清荷塘月色片段
  25. 路上只我一个人背着手踱着这一片天地好像是我的;我也像超出了平常旳自己到了另一世界里我爱热闹也爱冷静;爱群居也爱独处像今晚上一个人在这苍茫旳月下什么都可以想什么都可以不想便觉是个自由的人白天里一定要做的事一定要说的话现在都可不理这是独处的妙处我且受用这无边的荷香月色好了
  26. 曲曲折折的荷塘上面弥望旳是田田的叶子叶子出水很高像亭亭旳舞女旳裙层层的叶子中间零星地点缀着些白花有袅娜(niǎo,nuó)地开着旳有羞涩地打着朵儿旳;正如一粒粒的明珠又如碧天里的星星又如刚出浴的美人微风过处送来缕缕清香仿佛远处高楼上渺茫的歌声似的这时候叶子与花也有一丝的颤动像闪电般霎时传过荷塘的那边去了叶子本是肩并肩密密地挨着这便宛然有了一道凝碧的波痕叶子底下是脉脉()的流水遮住了不能见一些颜色;而叶子却更见风致了
  27. 月光如流水一般静静地泻在这一片叶子和花上薄薄的青雾浮起在荷塘里叶子和花仿佛在牛乳中洗过一样;又像笼着轻纱的梦虽然是满月天上却有一层淡淡的云所以不能朗照;但我以为这恰是到了好处酣眠固不可少小睡也别有风味的月光是隔了树照过来的高处丛生的灌木落下参差的斑驳的黑影峭楞楞如鬼一般;弯弯的杨柳的稀疏的倩影却又像是画在荷叶上塘中的月色并不均匀;但光与影有着和谐的旋律如梵婀(ē)(英语violin小提琴的译音)上奏着的名曲
  28. 荷塘的四面远远近近高高低低都是树而杨柳最多这些树将一片荷塘重重围住;只在小路一旁漏着几段空隙像是特为月光留下的树色一例是阴阴的乍看像一团烟雾;但杨柳的丰姿便在烟雾里也辨得出树梢上隐隐约约的是一带远山只有些大意罢了树缝里也漏着一两点路灯光没精打采的是渴睡人的眼这时候最热闹的要数树上的蝉声与水里的蛙声;但热闹是它们的我什么也没有
  29. 2鲁迅从百草园到三味书屋片段
  30. 100篇名家经典散文摘抄
  31. <!-- 这里填充章节内容后续可通过props或API获取 -->
  32. </text>
  33. </scroll-view>
  34. <view class="bottom-bar" v-if="!isFullScreen">
  35. <view class="bottom-left">
  36. <view class="bar-item">
  37. <view class="bar-icon"> <uv-icon name="plus"></uv-icon> </view>
  38. <text class="bar-label">加入书架</text>
  39. </view>
  40. <view class="bar-item">
  41. <view class="bar-icon"> <uv-icon name="eye-fill"></uv-icon> </view>
  42. <text class="bar-label">夜间</text>
  43. </view>
  44. </view>
  45. <view class="bottom-right">
  46. <button class="outline-btn"><text class="btn-text">上一章</text></button>
  47. <button class="outline-btn" @click="showCatalog = true"><text class="btn-text">目录</text></button>
  48. <button class="outline-btn"><text class="btn-text">下一章</text></button>
  49. </view>
  50. </view>
  51. <uv-popup v-model="showPopup" mode="center" :closeOnClickOverlay="true">
  52. <view style="padding: 48rpx 32rpx; text-align: center; background: #fff; border-radius: 24rpx; min-width: 500rpx;">
  53. <view style="font-size: 32rpx; font-weight: bold; color: #222; margin-bottom: 24rpx;">这是付费章节 需要订阅后才能阅读</view>
  54. <view style="font-size: 26rpx; color: #999; margin-bottom: 40rpx;">订阅后可继续阅读本章内容</view>
  55. <view style="display: flex; justify-content: center; gap: 24rpx;">
  56. <button style="background: #ff9800; color: #fff; border-radius: 32rpx; font-size: 28rpx; padding: 0 32rpx; border: none;" @click="goToSubscription">订阅本章</button>
  57. <button style="background: #fff3e0; color: #ff9800; border-radius: 32rpx; font-size: 28rpx; padding: 0 32rpx; border: 1px solid #ff9800;">观看视频解锁</button>
  58. <button style="background: #fff; color: #ff9800; border-radius: 32rpx; font-size: 28rpx; padding: 0 32rpx; border: 1px solid #ff9800;">批量订阅</button>
  59. </view>
  60. </view>
  61. </uv-popup>
  62. <!-- 目录弹窗顶部196px边距底部无边距宽度100vw高度自适应顶部圆角底部无圆角 -->
  63. <view v-if="showCatalog" class="catalog-popup-fullscreen" style="top:196px;bottom:0;height:auto;min-height:calc(100vh - 196px);">
  64. <view class="catalog-header">
  65. <view class="header-left" @click="showCatalog = false">
  66. <uv-icon name="arrow-down" size="46" color="#333" @click="goBack" />
  67. </view>
  68. <view class="header-title">目录</view>
  69. <view class="header-right" @click="reverseOrder">倒序</view>
  70. </view>
  71. <scroll-view scroll-y class="catalog-list" style="padding-bottom:0;margin-bottom:0;">
  72. <view v-for="(item, idx) in displayList" :key="item.id" @click="selectChapter(idx)"
  73. :class="['catalog-item', {active: idx === currentIndex}]">
  74. <view class="item-main">
  75. <text class="item-title">{{ item.title }}</text>
  76. <text v-if="item.vip" class="vip-tag" @click.stop="showPayPopup = true">付费</text>
  77. </view>
  78. </view>
  79. </scroll-view>
  80. </view>
  81. <view v-if="showPayPopup" class="pay-popup-mask" @click="showPayPopup = false">
  82. <view class="pay-popup" @click.stop>
  83. <view class="pay-title">这是付费章节 需要订阅后才能阅读</view>
  84. <view class="pay-desc">订阅后可继续阅读本章内容</view>
  85. <view class="pay-btns">
  86. <button class="pay-btn" @click="goToSubscription">订阅本章</button>
  87. <button class="pay-btn pay-btn-video">观看视频解锁</button>
  88. <button class="pay-btn pay-btn-batch">批量订阅</button>
  89. </view>
  90. </view>
  91. </view>
  92. </view>
  93. </template>
  94. <script>
  95. export default {
  96. components: {
  97. 'uv-popup': () => import('@/uni_modules/uv-popup/components/uv-popup/uv-popup.vue')
  98. },
  99. data() {
  100. return {
  101. isFullScreen: false,
  102. lastTap: 0,
  103. showPopup: false,
  104. popupShown: false, // 只弹一次
  105. showCatalog: false,
  106. orderAsc: true,
  107. currentIndex: 0,
  108. chapterList: [
  109. { id: 1, title: '第一章 重回2004', vip: false },
  110. { id: 2, title: '第二章 陈年旧恨', vip: false },
  111. { id: 3, title: '第三章 再相见', vip: false },
  112. { id: 4, title: '第四章 李东的邀请', vip: false },
  113. { id: 5, title: '第五章 小气的男', vip: false },
  114. { id: 6, title: '第六章 先送谁?', vip: false },
  115. { id: 7, title: '第七章 打听行情', vip: false },
  116. { id: 8, title: '第八章 省城探路', vip: false },
  117. { id: 9, title: '第九章 订货', vip: false },
  118. { id: 10, title: '第十章 第一桶金', vip: true },
  119. { id: 11, title: '第十一章 高富帅来袭', vip: true },
  120. { id: 12, title: '第十二章 故学后,挥场见!', vip: true },
  121. { id: 13, title: '第十三章 你来我往', vip: true },
  122. { id: 14, title: '第十四章 你来我往', vip: true },
  123. { id: 15, title: '第十五章 你来我往', vip: true },
  124. { id: 16, title: '第十六章 你来我往', vip: true },
  125. { id: 17, title: '第十七章 你来我往', vip: true },
  126. { id: 18, title: '第十八章 你来我往', vip: true },
  127. ],
  128. showPayPopup: false
  129. }
  130. },
  131. computed: {
  132. displayList() {
  133. return this.orderAsc ? this.chapterList : [...this.chapterList].reverse()
  134. }
  135. },
  136. methods: {
  137. handleContentClick() {
  138. this.toggleFullScreen();
  139. },
  140. handleTouchEnd(e) {
  141. this.toggleFullScreen();
  142. },
  143. handleScroll(e) {
  144. // 获取滚动位置
  145. const scrollTop = e.detail.scrollTop;
  146. console.log('scrollTop:', scrollTop);
  147. // 当滚动超过50且弹窗未显示过时,显示弹窗
  148. if (scrollTop > 50 && !this.popupShown) {
  149. this.showPopup = true;
  150. this.popupShown = true;
  151. }
  152. },
  153. toggleFullScreen() {
  154. this.isFullScreen = !this.isFullScreen
  155. },
  156. reverseOrder() {
  157. this.orderAsc = !this.orderAsc
  158. },
  159. selectChapter(idx) {
  160. this.currentIndex = this.orderAsc ? idx : this.chapterList.length - 1 - idx
  161. this.showCatalog = false
  162. // TODO: 跳转到对应章节内容
  163. },
  164. goToSubscription() {
  165. uni.navigateTo({
  166. url: '/pages_order/novel/SubscriptionInformation'
  167. })
  168. }
  169. },
  170. mounted() {
  171. // #ifdef H5
  172. if (typeof window !== 'undefined') {
  173. window.onscroll = () => {
  174. const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  175. if (scrollTop > 50 && !this.popupShown) {
  176. this.showPopup = true;
  177. this.popupShown = true;
  178. }
  179. };
  180. }
  181. // #endif
  182. },
  183. beforeDestroy() {
  184. // #ifdef H5
  185. if (typeof window !== 'undefined') {
  186. window.onscroll = null;
  187. }
  188. // #endif
  189. },
  190. onLoad(options) {
  191. // 可接收小说id、章节id等参数
  192. // this.novelId = options.id
  193. }
  194. }
  195. </script>
  196. <style lang="scss" scoped>
  197. .reader-container {
  198. min-height: 100vh;
  199. background: #fff;
  200. display: flex;
  201. flex-direction: column;
  202. }
  203. .chapter-title {
  204. font-size: 32rpx;
  205. font-weight: bold;
  206. margin: 40rpx 32rpx 24rpx 32rpx;
  207. }
  208. .chapter-content {
  209. flex: 1;
  210. padding: 0 32rpx;
  211. font-size: 28rpx;
  212. color: #222;
  213. line-height: 2.2;
  214. margin-bottom: 120rpx;
  215. }
  216. .bottom-bar {
  217. position: fixed;
  218. left: 0;
  219. right: 0;
  220. bottom: 0;
  221. background: #fff;
  222. display: flex;
  223. justify-content: center;
  224. align-items: center;
  225. height: 180rpx;
  226. box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.05);
  227. z-index: 10;
  228. padding: 0 40rpx 10rpx 40rpx;
  229. }
  230. .bottom-left {
  231. display: flex;
  232. align-items: flex-end;
  233. gap: 48rpx;
  234. }
  235. .bar-item {
  236. display: flex;
  237. flex-direction: column;
  238. align-items: center;
  239. justify-content: flex-end;
  240. }
  241. .bar-icon {
  242. width: 48rpx;
  243. height: 48rpx;
  244. margin-bottom: 4rpx;
  245. margin-right: 1rpx;
  246. }
  247. .bar-label {
  248. font-size: 22rpx;
  249. color: #b3b3b3;
  250. margin-top: 2rpx;
  251. }
  252. .bottom-right {
  253. display: flex;
  254. align-items: flex-end;
  255. gap: 32rpx;
  256. margin-left: 40rpx;
  257. }
  258. .outline-btn {
  259. min-width: 110rpx;
  260. padding: 0 28rpx;
  261. height: 60rpx;
  262. line-height: 60rpx;
  263. background: #fff;
  264. color: #223a7a;
  265. border: 2rpx solid #223a7a;
  266. border-radius: 32rpx;
  267. font-size: 28rpx;
  268. font-weight: bold;
  269. margin: 0;
  270. display: flex;
  271. align-items: center;
  272. justify-content: center;
  273. }
  274. .btn-text {
  275. font-weight: bold;
  276. color: #223a7a;
  277. font-size: 28rpx;
  278. border-bottom: 2rpx solid #223a7a;
  279. padding-bottom: 2rpx;
  280. }
  281. .catalog-popup-fullscreen {
  282. position: fixed;
  283. left: 0;
  284. top: 0;
  285. width: 100vw;
  286. height: 100vh;
  287. background: #fff;
  288. z-index: 9999;
  289. border-top-left-radius: 32rpx;
  290. border-top-right-radius: 32rpx;
  291. border-bottom-left-radius: 0;
  292. border-bottom-right-radius: 0;
  293. display: flex;
  294. flex-direction: column;
  295. box-shadow: 0 8rpx 48rpx rgba(0,0,0,0.18);
  296. overflow: hidden;
  297. }
  298. .catalog-header {
  299. display: flex;
  300. align-items: center;
  301. justify-content: space-between;
  302. padding: 0 24rpx;
  303. height: 96rpx;
  304. border-bottom: 1px solid #eee;
  305. position: sticky;
  306. top: 0;
  307. background: #fff;
  308. z-index: 2;
  309. }
  310. .header-left {
  311. width: 60rpx;
  312. display: flex;
  313. align-items: center;
  314. justify-content: flex-start;
  315. }
  316. .header-title {
  317. flex: 1;
  318. text-align: center;
  319. font-size: 32rpx;
  320. font-weight: bold;
  321. color: #222;
  322. }
  323. .header-right {
  324. color: #223a7a;
  325. font-size: 28rpx;
  326. font-weight: 500;
  327. min-width: 80rpx;
  328. text-align: right;
  329. }
  330. .catalog-list {
  331. flex: 1;
  332. overflow: auto;
  333. padding-bottom: 40rpx;
  334. }
  335. .catalog-item {
  336. padding: 0 32rpx;
  337. min-height: 80rpx;
  338. display: flex;
  339. flex-direction: column;
  340. justify-content: center;
  341. border-bottom: 1px solid #f5f5f5;
  342. background: #fff;
  343. color: #222;
  344. font-size: 30rpx;
  345. position: relative;
  346. }
  347. .catalog-item.active {
  348. color: #ff5a5f;
  349. background: #fff7f7;
  350. }
  351. .item-main {
  352. display: flex;
  353. align-items: center;
  354. gap: 16rpx;
  355. }
  356. .item-title {
  357. font-size: 30rpx;
  358. }
  359. .vip-tag {
  360. background: #ffe1b2;
  361. color: #ff9900;
  362. border-radius: 20rpx;
  363. font-size: 24rpx;
  364. padding: 2rpx 18rpx;
  365. margin-left: 16rpx;
  366. }
  367. .pay-popup-mask {
  368. position: fixed;
  369. left: 0; top: 0; right: 0; bottom: 0;
  370. background: rgba(0,0,0,0.5);
  371. z-index: 10000;
  372. }
  373. .pay-popup {
  374. position: absolute;
  375. left: 0;
  376. right: 0;
  377. bottom: 0;
  378. background: #232323;
  379. border-top-left-radius: 24rpx;
  380. border-top-right-radius: 24rpx;
  381. border-bottom-left-radius: 0;
  382. border-bottom-right-radius: 0;
  383. min-width: 500rpx;
  384. width: 100%;
  385. padding: 48rpx 32rpx 32rpx 32rpx;
  386. text-align: center;
  387. color: #fff;
  388. }
  389. .pay-title {
  390. font-size: 32rpx;
  391. font-weight: bold;
  392. color: #fff;
  393. margin-bottom: 24rpx;
  394. margin-right: 50rpx;
  395. }
  396. .pay-desc {
  397. font-size: 26rpx;
  398. color: #999;
  399. margin-bottom: 40rpx;
  400. margin-right: 50rpx;
  401. }
  402. .pay-btns {
  403. display: flex;
  404. justify-content: center;
  405. gap: 24rpx;
  406. margin-right: 50rpx;
  407. }
  408. .pay-btn {
  409. background: #ff9800;
  410. color: #fff;
  411. border-radius: 32rpx;
  412. font-size: 28rpx;
  413. padding: 0 32rpx;
  414. border: none;
  415. }
  416. .pay-btn-video {
  417. background: #ff9800;
  418. color: #fff;
  419. border-radius: 32rpx;
  420. font-size: 28rpx;
  421. padding: 0 32rpx;
  422. border: none;
  423. }
  424. .pay-btn-batch {
  425. background: #ff9800;
  426. color: #fff;
  427. border-radius: 32rpx;
  428. font-size: 28rpx;
  429. padding: 0 32rpx;
  430. border: none;
  431. }
  432. </style>