首页 > 小程序教程 > 微信小程序树芽读书书籍朗读页设计制作开发教程

微信小程序树芽读书书籍朗读页设计制作开发教程

上一篇 下一篇
本文给大家带来的是微信小程序树芽读书书籍朗读页设计制作开发教程,制作好以后效果图如下:
一、wxml页面代码如下:
<!--listbook.wxml-->
<view class="swiper-wrapper">
    <swiper autoplay="true" interval="{{swiperTime}}" class="swiper-box">
        <!--封面 S-->
        <swiper-item class="book-page">
            <scroll-view scroll-y="true" class="bookpage-scroll">
                <view class="page-img">
                    <image mode="aspectFit" src="{{bookInfo.coverUrl}}"></image>
                </view>
                <view class="title">{{bookInfo.title}}</view>
                <view class="author">朗读者 : {{bookInfo.author}}</view>
            </scroll-view>
        </swiper-item>
        <!--封面 S-->

        <!--内容 S-->
        <swiper-item class="book-page" wx:for="{{pages}}">
            <scroll-view scroll-y="true" class="bookpage-scroll">
                <view class="page-img" wx:if="{{item.imgUrl}}">
                    <image mode="aspectFit" src="{{item.imgUrl}}"></image>
                </view>
                <view class="page-text">{{item.text}}</view>
            </scroll-view>
            <view class="ctl-box" wx:if="{{item.audioUrl}}">
                <view class="progress">
                    <progress percent="{{ item.playProgress }}" activeColor="#4cd4c1" stroke-width="3" />
                </view>
                <view class="start-time">{{item.playTimeFt}}</view>
                <view class="end-time">{{item.duration}}</view>
                <view class="paly-btn" catchtap="onVicesTap" data-index="{{index}}" >
                    <image wx:if="{{!item.isPlaying}}" mode="aspectFit" src="../../images/icon/stop_btn@3x.png"></image>
                    <image wx:if="{{item.isPlaying}}" mode="aspectFit" src="../../images/icon/playing_btn@3x.png"></image>
                </view>
            </view>
        </swiper-item>
        <!--内容 S-->

        <!-- 书封底面 S-->
        <swiper-item>
            <!--内部滚动 S-->
            <scroll-view scroll-y="true" class="book-last-page">
                <!--封底头部 S -->
                <view class="top-part">
                    <view class="book-cover-wp">
                        <image mode="aspectFill" src="{{bookInfo.coverUrl}}"></image>
                        <view class="book-cover">
                            <image mode="aspectFill" src="{{bookInfo.coverUrl}}"></image>
                        </view>
                        <view class="cover-side"></view>
                        <view class="cover-circle">
                            <image src="{{bookInfo.coverUrl}}"></image>
                        </view>
                    </view>

                    <!--书本信息 S-->
                    <view class="subinfo">
                        <view class="item text-left">阅读 {{bookInfo.pvCnt}}</view>
                        <view class="item text-center">
                            <view class="inline-box">
                                <view class="inline-box" catchtap="likeIt" data-bookid="{{bookInfo.bookId}}">
                                    <image wx:if="{{bookInfo.hasLiked == 0}}" mode="aspectFit" src="../../images/icon/thumb_up_default_icon@3x.png"></image>
                                    <image wx:if="{{bookInfo.hasLiked == 1}}" mode="aspectFit" src="../../images/icon/thumb_up_selected@3x.png"></image>
                                    {{bookInfo.likeCnt}}
                                </view>
                            </view>
                        </view>
                        <view catchtap="palyComment" data-bookinfo="{{bookInfo}}" class="item text-right">
                            <image src="../../images/icon/content_icon@3x.png"></image>
                            {{bookInfo.commentCnt}}</view>
                    </view>
                    <!--书本信息 E-->
                </view>
                <!--封底头部 E -->

                <view class="spacing"></view>

                <!-- 评论 可以组件 S-->
                <view class="comment-panel">
                    <!--没有评论 S-->
                    <view class="comment-none" wx:if="{{isComment == 1}}">
                        <view>暂无评论 ~</view>
                    </view>
                    <!--没有评论 E-->

                    <!-- 一条评论 S-->
                    <view wx:if="{{isComment == 0}}">
                        <view class="comment-item" wx:for="{{comments}}" wx:for-item="Citem">
                            <view class="comment-avatar">
                                <image src="{{Citem.headImgUrl}}"></image>
                            </view>
                            <view class="comment-main">
                                <text class="comment-username">{{Citem.nickName}}</text>
                                <view class="comment-content">{{Citem.content}}</view>
                                <view class="comment-sub">
                                    <text class="comment-time">{{Citem.ts}}</text>
                                    <!--<text class="comment-replay-btn"> 回复</text>-->
                                </view>
                                <!--<view class="comment-replay">
                            <view class="comment-replay-title">作者回复</view>
                            <view class="comment-replay-content">作者回复</view>
                        </view>-->
                            </view>
                        </view>
                    </view>
                    <!-- 一条评论 E-->
                </view>
                <!-- 评论 可以组件 E-->
                <!-- 评论 S -->
                <view wx:if="{{showComment}}" class="comment-wrapper">
                    <view class="comment-form">
                        <form bindsubmit="submitComment">
                            <view class="comment-text">
                                <textarea auto-height="true" name="comment" placeholder="评论" />
                            </view>
                            <button form-type="submit" size="mini" class="btn-primary comment-btn" hover-class="btn-primary-hover"> 提交 </button>
                        </form>
                    </view>
                </view>
                <!-- 评论 E -->

            </scroll-view>
            <!--内部滚动 E-->
        </swiper-item>
        <!-- 书封底面 E-->


    </swiper>
</view>
 
二、wxss样式文件代码如下:
/* listbook.wxss */
.swiper-wrapper {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 100%;
}

.swiper-box, .book-page, .book-last-page {
  width: 100%;
  height: 100%;
}


/*封面 S*/
.cover-img{
    position: relative;
    height: 580rpx;
    width: 580rpx;
    margin: 0 auto;
    text-align: center;
}
.cover-img image{
    width: 580rpx;
    height: 580rpx;
}

.cover-br{
    position: absolute;
    top: 50rpx;
    left: 50rpx;
    width: 480rpx;
    height: 480rpx;
    border-radius: 100%;
    overflow: hidden;
    
}

.cover-br .cover{
    width: 480rpx;
    height: 480rpx;
}

.title{
    margin-top: 80rpx;
    text-align: center;
    font-size: 42rpx;
    color: #333;
}

.author{
    margin-top: 20rpx;
    text-align: center;
    font-size: 34rpx;
    color: #999999;
}
.author-avatar{
    margin: 150rpx;
    text-align: center;
}
.author-avatar image{
    width: 110rpx;
    height: 110rpx;
    border-radius: 50%;
}

/*封面 E*/

/*内容页 S*/
.bookpage-scroll{
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 200rpx;
    padding: 50rpx 0;
}

.page-img{
    margin: 0 50rpx 38rpx 50rpx;
    height: 450rpx;
}

.page-img image{
    height: 450rpx;
}

.page-text{
   margin: 0 50rpx 0 50rpx; 
}

/*播放控制器*/
.ctl-box{
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 200rpx;
    overflow: hidden;
}

.start-time{
    position: absolute;
    top: 24rpx;
    left: 26rpx;
}
.end-time{
    position: absolute;
    top: 24rpx;
    right: 26rpx;
}

.paly-btn{
    height: 60rpx;
    width: 60rpx;
    margin: 0 auto;
    vertical-align: middle;
}

.paly-btn image{
    height: 200rpx;
    width: 60rpx;
    line-height: 200rpx;
}

/*内容页 E*/


/* 封底排版 */

.book-last-page {
    padding-top: 15rpx;
    background: #fff;
}

.top-part{
    padding-bottom: 40rpx;
}

.book-cover-wp{
    position: relative;
    width: 598rpx;
    height: 514rpx;
    margin-top: 40rpx;
    margin-left:auto;
    margin-right:auto;
    border: 2rpx solid #bebdbd;
}

.book-cover-wp > image{
    width: 598rpx;
    height: 514rpx;
    filter: blur(10rpx);
    /*opacity:0.4;
    filter:alpha(opacity=40);*/
}

.book-cover-wp .book-cover{
    position: absolute;
    top: 24rpx;
    right: 48rpx;
    height: 462rpx;
    width: 462rpx;
    border: 2rpx solid #fff;
    border-radius: 100%;
    overflow: hidden;
}

.book-cover-wp .book-cover > image{
    height: 462rpx;
    width: 462rpx;
}

.book-cover-wp .cover-side{
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 44rpx;
    border-right: 1rpx solid rgb(33, 33, 33);
    background: #808080;
    background: -moz-linear-gradient(bottom, rgba(67, 67, 67, 0.5), rgba(70, 67, 67, 1.0));
    background: -webkit-linear-gradient(bottom, rgba(67, 67, 67, 0.5), rgba(70, 67, 67, 1.0));
}

.book-cover-wp .cover-circle{
    position: absolute;
    top: 218rpx;
    right: 242rpx;
    width: 68rpx;
    height: 68rpx;
    border: 2rpx solid #fff;
    overflow: hidden;
    border-radius: 100%;
    /*background: rgba(255, 255, 255, 0.3);*/
}

.book-cover-wp .cover-circle > image{
    width: 68rpx;
    height: 68rpx;
    filter: blur(10rpx);
}

.book-title{
    margin-top: 25rpx;
    font-size: 34rpx;
    text-align: center;
}

.book-author{
    margin-top: 10rpx;
    font-size: 28rpx;
    color: #666;
    text-align: center;
}

.book-recommend{
    display: -webkit-box !important;
    margin-top: 20rpx;
    padding: 0 20rpx;
    text-indent: 2rem;
    overflow: hidden;  
    text-overflow: ellipsis;  
    word-break: break-all;  
    -webkit-box-orient: vertical;  
    -webkit-line-clamp: 2; 
    font-size: 24rpx;
    color: #999999;
}

/*点赞信息*/
.subinfo{
    display: flex;
    width: 588rpx;
    height: 50rpx;
    line-height: 50rpx;
    margin-top: 50rpx;
    margin-left: auto;
    margin-right: auto;
    font-size: 32rpx;
    color: #999;
}

.subinfo .item{
    flex: 1;
}

/*分享编辑菜单*/
.sub-nav{
    display: flex;
    width: 588rpx;
    height: 50rpx;
    margin-top: 30rpx;
    margin-left: auto;
    margin-right: auto;  
    line-height: 50rpx;
    font-size: 32rpx;
    color: #999;
}

.item{
    flex: 1;
}

.item image{
    display: inline-block;
    height: 40rpx;
    width: 40rpx;
}

/* 评论 */
.comment-panel {
    padding: 0 24rpx 40rpx 24rpx;
    background: #fff;
}

.comment-panel-head {
    height: 100rpx;
    padding-right: 20rpx;
    line-height: 100rpx;
    text-align: right;
    font-size: 28rpx;
    color: #38cfba;
}

.comment-panel-btn image {
    width: 50rpx;
    height: 40rpx;
    margin-right: 8rpx;
    vertical-align: middle;
}

/*无评论*/
.comment-none{
    padding-top: 100rpx;
    text-align: center;
    font-size: 30rpx;
    color: #999999;
}

.comment-item {
  display: flex;
  padding: 24rpx 12rpx 0 6rpx;
}

.comment-avatar {
  flex: 0 1 100rpx;
  width: 80rpx;
  height: 80rpx;
}

.comment-avatar image {
  width: 80rpx;
  height: 80rpx;
}

.comment-main {
  flex: 1;
  padding-right: 8rpx;
}

.comment-username {
  margin-bottom: 16rpx;
  font-size: 26rpx;
  color: #666;
}

.comment-content {
  margin-bottom: 28rpx;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  font-size: 30rpx;
  line-height: 1.75em;
  color: #333;
}

.comment-sub{
  display: flex;
  padding-bottom: 28rpx;
  border-bottom: 1rrpx solid #e4e4e4;
  font-size: 24rpx;
  color: #999;
}

.comment-time{
  flex:1;
  text-align: left;
}

.comment-replay-btn{
  flex:1;
  text-align: right;
}

.comment-replay-title{
  padding-left: 8rpx;
  margin-top: 28rpx;
  margin-bottom: 20rpx;
  border-left: 3rpx solid #38cfba;
  font-size: 30rpx;
  color: #999;
}

.comment-replay-content{
  font-size: 30rpx;
  color: #333;
  margin-bottom: 20rpx;
}

/*评论*/
.comment-wrapper{
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: auto;
}
.comment-form{
  position: relative;
  background: #f8f8f8;
  border-top: 1rpx solid #dddddd;
}

 .comment-btn{
  position: absolute;
  bottom: 15rpx;
  right: 50rpx;
}

.comment-text{
  padding-right: 200rpx;
  padding: 15rpx;
}

.comment-text textarea{
  width: 490rpx;
  padding: 15rpx;
  border-radius: 4rpx;
  background: #fff;
}
三、js页面代码如下:
// common utils.js
let utils = require('../../utils/util.js');

// 进度计算器  传入that 和页码index
function timeMeter(that, index) {
  that.data.pagesData[index].playProgress = (that.data.pagesData[index].playTime / that.data.pagesData[index].time) * 100;
  that.data.pagesData[index].playTimeFt = utils.durationFormat(that.data.pagesData[index].playTime);
  // 渲染
  that.setData({
    pages: that.data.pagesData
  });
  if (that.data.pagesData[index].playProgress >= 100) {
    that.setData({
      pages: that.data.pagesData
    });
    return;
  }
  setTimeout(function () {
    that.data.pagesData[index].playTime += 100;
    timeMeter(that, index)
  }, 100)
}

// 自动播放
function autoPlay(autoPlayArray, index) {
  console.log(index);
  console.log(autoPlayArray);
  console.log(autoPlayArray[index].audioUrl);
  let waitTime = 100;
  if (index > autoPlayArray.length) {
    return;
  }

  setTimeout(function (autoPlayArray, index) {
    if (autoPlayArray[index].audioUrl) {
      wx.playVoice({
        filePath: autoPlayArray[index].audioUrl,
        success: function (res) {
          console.log(res);
        }
      });
    }
    autoPlay(autoPlayArray, index+1);
  }, autoPlayArray[index].time);
}

// pages/book/book.js
Page({

  data: {
    bookInfo: {},  //书本信息
    bookInfoData: {}, // 书本信息不更新到页面

    pages: [],//音频数组,更新到页面
    pagesData: [], // 音频数组,不更新到页面
    pageIndex: -1, // 正在播放的页码
    isPlayingTime: {}, // settimeout
    autoPlay: [], // 自动播放

    swiperTime: 5000, // 轮播图切换时间

    bookId: {}, // 书本ID
    bookReader: {}, // 书本类型 
    // 评论
    commentPageNum: 1, // 评论页码
    comments: [], //评论数量
    isComment: 1, // 是否有评论,0 有, 1 无
    showComment: false // 输入评论
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    let that = this;
    that.data.bookId = options.bookId;
    that.data.bookReader = options.reader;

    getApp().getAudio(that.data.bookId, function (data) {
      if (data.code == 0) {
        console.log(data);
        that.data.pagesData = data.payload.bookReadingInfo.pages;
        that.data.pagesData.forEach(function (val, index) {
          that.data.pagesData[index].time = val.duration;
          that.data.pagesData[index].isPlaying = false;
          that.data.pagesData[index].duration = utils.durationFormat(val.duration);
          that.data.pagesData[index].playProgress = 0;
          if (that.data.pagesData[index].time == 0) {
            that.data.pagesData[index].swiperTime = 1000;
          } else {
            that.data.pagesData[index].swiperTime = val.duration - 0 + 1000;
          }
          that.data.pagesData[index].playTime = 1;
          that.data.pagesData[index].playTimeFt = '00:00';
        }, this);
        that.setData({
          bookInfo: data.payload.bookReadingInfo,
          bookInfoData: data.payload.bookReadingInfo,
          pages: that.data.pagesData
        });
        wx.setNavigationBarTitle({
          title: that.data.bookInfo.title
        });

        // 循环下载文件到本地
        that.data.autoPlay = that.data.pagesData;
        that.data.pagesData.forEach(function (val, index) {
          if (val.audioUrl) {
            // 下载缓存到本地 并且播放
            wx.downloadFile({
              url: val.audioUrl,
              success: function (res) {
                // 保存到本地 替换原来远程地址
                that.data.autoPlay[index].audioUrl = res.tempFilePath;
              }
            });
          }
        });

        // 自动播放
        console.log(that.data.autoPlay);
        // autoPlay(that.data.autoPlay, 0);

      } else {
        console.log("error_code:" + data.msg);
      }
    });
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    let that = this;
    // reader 0 书本  1 朗读 
    getApp().getCommentList(that.data.bookId, that.data.bookReader, that.data.commentPageNum, function (res) {
      console.log(that.data.autoPlay);
      if (res.payload.comments.length !== 0) {
        res.payload.comments.forEach(function (element, index) {
          res.payload.comments[index].ts = utils.formatTime(new Date(element.ts * 1000));
        }, this);
        that.setData({
          comments: res.payload.comments,
          isComment: 0
        });
      }
    });

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },

  //点击播放录音  
  onVicesTap: function (event) {
    let that = this;
    console.log(event.currentTarget.dataset.index);
    timeMeter(that, event.currentTarget.dataset.index);
    // 判断播放的页码是否同一
    if (that.data.pageIndex == event.currentTarget.dataset.index) {
      // 同一页面 暂停UI
      that.data.pagesData[event.currentTarget.dataset.index].isPlaying = false;
      that.setData({
        pages: that.data.pagesData
      });
    } else {
      // 不是同一页面 上一个页面关闭,这个页面开启
      if (that.data.pageIndex >= 0) {
        that.data.pagesData[that.data.pageIndex].isPlaying = false;
      }
      that.data.pagesData[event.currentTarget.dataset.index].isPlaying = true;
      that.setData({
        pages: that.data.pagesData
      });

      // 更新播放页面pageIndex
      that.data.pageIndex = event.currentTarget.dataset.index;

      // 清除 setTimeout
      clearTimeout(that.data.isPlayingTime);
      // 设置自动回复停播状态
      that.data.isPlayingTime = setTimeout(function () {
        that.data.pagesData[that.data.pageIndex].isPlaying = false;
        // 修改播放状态
        that.setData({
          pages: that.data.pagesData,
          pageIndex: -1
        });
      }, that.data.pagesData[that.data.pageIndex].time);
    }

    // 下载缓存到本地 并且播放 pagesData
    wx.playVoice({
      filePath: that.data.pagesData[that.data.pageIndex].audioUrl,
      success: function (res) {
        console.log(res);
      }
    });
  },

  // like动作
  likeIt: function (event) {
    let that = this;
    if (that.data.bookInfoData.hasLiked == 1) {
      that.data.bookInfoData.hasLiked = 0;
      that.data.bookInfoData.likeCnt = that.data.bookInfoData.likeCnt - 1;
      that.setData({
        bookInfo: that.data.bookInfoData
      });
      getApp().likeAct(that.data.bookInfo.bookId, that.data.bookInfo.reader, 0, function (res) {
        console.log('取消点赞');
      });
    } else {
      that.data.bookInfoData.hasLiked = 1;
      that.data.bookInfoData.likeCnt = (that.data.bookInfoData.likeCnt - 0) + 1;
      that.setData({
        bookInfo: that.data.bookInfoData
      });
      getApp().likeAct(that.data.bookInfo.bookId, that.data.bookInfo.reader, 1, function (res) {
        console.log('点赞成功');
      });
    }
  },

  // 评论
  palyComment: function () {
    let that = this;
    if (that.data.showComment) {
      that.setData({
        showComment: false
      });
    } else {
      that.setData({
        showComment: true
      });
    }
  },

  //提交评论
  submitComment: function (event) {
    let that = this;
    console.log(event.detail.value.comment);
    if (event.detail.value.comment) {
      getApp().addComment(that.data.bookId, that.data.bookReader, event.detail.value.comment, function (res) {
        if (res.code == 0) {
          res.payload.comment.ts = utils.formatTime(new Date(res.payload.comment.ts * 1000));
          let data = that.data.comments.concat(res.payload.comment);
          wx.showToast({
            title: '评论成功',
            icon: 'success',
            duration: 1000
          });
          that.setData({
            comments: data,
            showComment: false,
            isComment: 0
          });
        }
      });
    } else {
      wx.showToast({
        title: '请输入评论内容',
        icon: 'loading',
        duration: 1000
      })
    }
  }
})  

模板简介:该模板名称为【微信小程序树芽读书书籍朗读页设计制作开发教程】,大小是,文档格式为.,推荐使用打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【小程序教程】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 21,800次
  • 使用软件
  • 文件格式
  • 文件大小
  • 上传时间 07-26
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
html5 微信素材 微信模板 微信图片 微信文章 响应式 单页式简历模板 企业网站 自适应 微信公众平台
您可能会喜欢的其他模板