天天看点

Vue综合应用--音乐播放器

Vue综合应用--音乐播放器

代码附在最后。

1、歌曲搜索

(1)输入歌手或歌手,按回车键(v-on .enter)

(2)查询数据(axios 接口 v-model )

(3) 渲染数据(v-for 数组 that)

Vue综合应用--音乐播放器

2、点击播放按钮,播放歌曲,歌曲id依赖歌曲搜索的结果。

(1) 点击播放(v-on 自定义参数)

  (2)歌曲地址获取(接口 歌曲id)

(3) 歌曲地址设置(v-bind)

Vue综合应用--音乐播放器

3、歌曲封面

(1)点击播放(增加逻辑,当点击歌曲时出现对应的封面)

(2)歌曲封面获取(接口 歌曲id)

(3)歌曲封面设置(v-bind,在vue中通过v-bind操纵属性)

Vue综合应用--音乐播放器

4、歌曲评论

(1)点击播放(增加逻辑,当点击歌曲时出现对应的评论)

(2)歌曲评论获取(接口 歌曲id)

(3)歌曲评论渲染(v-for生成列表)

Vue综合应用--音乐播放器

5、播放动画(胶片转动)

(1) 监听音乐播放(v-on play)

(2)监听音乐暂停(v-on pause)

(3)操纵类名(v-bind 对象)

 注释: audio标签的play事件会在音频播放的时候触发, audio标签的pause事件会在音频暂停的时候触发。通过对象的方式设置类名,类名生效与否取决于后面值的真假

Vue综合应用--音乐播放器

6、MV播放

(1)mv图标显示(v-if)

(2)mv地址获取(接口 mvid)

(3)遮罩层(v-show v-on)

(4)mv地址设置(v-bind)

Vue综合应用--音乐播放器

注释:不同的接口需要的数据是不同的,响应式的数据都需要定义在data中定义。

主体代码:

<!DOCTYPE html>
<html >

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>悦听player</title>
  <!-- 样式 -->
  <link rel="stylesheet" href="./css/playerIndex.css" target="_blank" rel="external nofollow" >
  <script type="text/javascript"  src=" js/vue.js"></script>
  <script type="text/javascript"  src="js/axios.min.js"></script>
</head>

<body>
  <div class="wrap">
    <!-- 播放器主体区域 -->
    <div class="play_wrap" id="player">
      <div class="search_bar">
        <img src="images/player_title.png" alt="" />
        <!-- 搜索歌曲 -->
        <input type="text" autocomplete="off" v-model="query" @keyup.enter="searchMusic" />
      </div>
      <div class="center_con">
        <!-- 搜索歌曲列表 -->
        <div class='song_wrapper'>
          <ul class="song_list">
           <li v-for="song in songs"><a href="javascript:;" target="_blank" rel="external nofollow"  @click="player(song.id)"></a> <b>{{song.name}}</b> <span v-show="song.mvid!=0"><i @click="playMv(song.mvid)"></i></span></li>
          </ul>
          <img src="images/line.png" class="switch_btn" alt="">
        </div>
        <!-- 歌曲信息容器 -->
        <div class="player_con" :class="{playing:isplaying}">
          <img src="images/player_bar.png" class="play_bar" />
          <!-- 黑胶碟片 -->
          <img src="images/disc.png" class="disc autoRotate" />
          <img :src="picUrl" class="cover autoRotate" />
        </div>
        <!-- 评论容器 -->
        <div class="comment_wrapper">
          <h5 class='title'>热门留言</h5>
          <div class='comment_list'>
            <dl v-for="comment in comments">
              <dt><img :src="comment.user.avatarUrl" alt=""></dt>
              <dd class="name">{{comment.user.nickname}}</dd>
              <dd class="detail">
                {{comment.content}}
              </dd>
            </dl>
          </div>
          <img src="images/line.png" class="right_line">
        </div>
      </div>
<!--      音乐播放器-->
      <div class="audio_con">
        <audio ref='audio'  v-bind:src="songUrl" controls autoplay loop class="myaudio" @play="isplaying=true" @pause="isplaying=false"></audio>
      </div>
      <div class="video_con"  v-show="isShowMv">
        <video  controls="controls" :src="mvUrl"></video>
        <div class="mask" ></div>
      </div>
    </div>
  </div>

</body>
  <script>
    var app=new Vue({
      el:"#player",
      data:{
        query:"",
        //搜索
        songs:[],
        //歌曲播放路径
        songUrl:"",
        comments:[],
        mvUrl:"",
        //是否打开mv
        isShowMv:false,
        //获取碟片图片
        picUrl:"",
        //碟片旋转
        isplaying:false,
      },
      methods:{
        //搜索
        searchMusic(){
          var that=this;
          axios.get(`https://autumnfish.cn/search?keywords=${this.query}`).then(function (result) {
            that.songs=result.data.result.songs;
          })
        },
        //歌曲播放
        player(id){
          var that=this;
          this.isplaying=true;
          axios.get(`https://autumnfish.cn/song/url?id=${id}`).then(function (result) {
            that.songUrl=result.data.data[0].url;
          })
          //热门评论
          axios.get(`https://autumnfish.cn/comment/hot?type=0&id=${id}`).then(function (result) {
            that.comments=result.data.hotComments;
          })
          axios.get(`https://autumnfish.cn/song/detail?ids=${id}`).then(function (result) {
              that.picUrl=result.data.songs[0].al.picUrl;
          })
        },
        //播放mv
        playMv(mid){
          var that=this;
          axios.get(`https://autumnfish.cn/mv/url?id=${mid}`).then(function (result) {
            that.isShowMv=true;
            that.mvUrl=result.data.data.url;
          })
        }
      },
    })
  </script>
</html>

















           
vue