播放器的编写(仿某易)

201 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

发现音乐

项目已经创建完毕

布局 已经写好,路由 和 Element-ui 已经整合完毕

项目跑起来 npm run serve

基础模板可点击此处下载(播放器布局)

发现音乐 | 轮播图

  • 安装并导入 axios
  • created生命周期函数中调用 轮播图接口
  • 获取到数据并渲染到页面上

所有接口的请求方式都是get

说明 : 调用此接口 , 可获取 banner( 轮播图 ) 数据

接口地址:autumnfish.cn/banner

import axios from 'axios'
export default {
  name: 'discovery',
  data(){
    return {
      bannerList:[], //轮播图
      recomList:[], //推荐歌单
      newList:[], //最新音乐
      mvList:[], //推荐mv
    }
  },
  created() {
    //调用轮播图接口
    axios({
      url:'https://autumnfish.cn/banner',
      method:'get',
    }).then(res => {
      // console.log(res);
      this.bannerList = res.data.banners
    })
  }
};

发现音乐 | 推荐歌单

说明 : 调用此接口 , 可获取推荐歌单

可选参数 : limit: 获取数量 , 默认为 30 (不支持 offset)

接口地址 : autumnfish.cn/personalize…

  • created生命周期函数中调用 推荐歌单接口
  • 获取到数据并渲染到页面上
//调用推荐歌单接口
axios({
  url:'https://autumnfish.cn/personalized',
  params:{
    limit:15
  },
  method:'get',
}).then(res => {
  // console.log(res);
  this.recomList = res.data.result
})

发现音乐 | 最新音乐

说明 : 调用此接口 , 可获取最新音乐

接口地址 : autumnfish.cn/personalize…

//最新音乐接口
axios({
  url:'https://autumnfish.cn/personalized/newsong',
  method:'get'
}).then(res => {
  // console.log(res);
  this.newList = res.data.result
})

发现音乐 | 点击播放

播放歌曲

说明 : 调用此接口 , 传入音乐 id, 可获得歌曲播放地址

参数 : id: 音乐 id, 如 id=347230

接口地址 : autumnfish.cn/song/url

  • 播放按钮绑定点击事件

    <span class="iconfont icon-play" @click="playMusic(item.id)"></span>
    
  • 调用 获取 播放音乐 接口

  • 把获取到的播放地址,通过$parent传递给父组件(index.vue)

methods:{
    playMusic(id){
      // console.log(id)
      axios({
        url:'https://autumnfish.cn/song/url',
        method:'get',
        params:{
          id // k-v一致可简写
        }
      }).then(res => {
        // console.log(res)
        let url = res.data.data[0].url
        //设置父组件的播放地址
        this.$parent.musicUrl = url
      })
    }
  }

发现音乐 | 推荐MV

说明 : 调用此接口 , 可获取推荐 mv

接口地址 : autumnfish.cn/personalize…

//调用最新mv接口
axios({
  url:'https://autumnfish.cn/personalized/mv',
  method:'get'
}).then(res => {
  //console.log(res);
  this.mvList = res.data.result
})

推荐歌单 | 分类切换

  • 点击分类时,当前分类 高亮

    <!-- tab栏 顶部 -->
    <div class="tab-bar">
    <span class="item" :class="{active:tag=='全部'}" @click="tag='全部'">全部</span>
    <span class="item" :class="{active:tag=='欧美'}" @click="tag='欧美'">欧美</span>
    <span class="item" :class="{active:tag=='华语'}" @click="tag='华语'">华语</span>
    <span class="item" :class="{active:tag=='流行'}" @click="tag='流行'">流行</span>
    <span class="item" :class="{active:tag=='说唱'}" @click="tag='说唱'">说唱</span>
    <span class="item" :class="{active:tag=='摇滚'}" @click="tag='摇滚'">摇滚</span>
    <span class="item" :class="{active:tag=='民谣'}" @click="tag='民谣'">民谣</span>
    <span class="item" :class="{active:tag=='电子'}" @click="tag='电子'">电子</span>
    <span class="item" :class="{active:tag=='轻音乐'}" @click="tag='轻音乐'">轻音乐</span>
    <span class="item" :class="{active:tag=='影视原声'}" @click="tag='影视原声'">影视原声</span>
    <span class="item" :class="{active:tag=='ACG'}" @click="tag='ACG'">ACG</span>
    <span class="item" :class="{active:tag=='怀旧'}" @click="tag='怀旧'">怀旧</span>
    <span class="item" :class="{active:tag=='治愈'}" @click="tag='治愈'">治愈</span>
    <span class="item" :class="{active:tag=='旅行'}" @click="tag='旅行'">旅行</span>
    </div>
    
  • 顶部数据切换、底部数据切换

    歌单列表 - 精品歌单

    说明 : 调用此接口 , 可获取精品歌单

    可选参数 :

    1. limit: 取出歌单数量 , 默认为 20
    2. cat: 歌单的标签,可选值如下
    全部
    欧美
    华语
    流行
    说唱
    摇滚
    民谣
    电子
    轻音乐
    影视原声
    ACG
    怀旧
    治愈
    旅行
    

    接口地址 : autumnfish.cn/top/playlis…

    歌单列表 - 歌单列表

    说明 : 调用此接口 , 可获取网友精选碟歌单

    可选参数 :

    1. limit:获取的个数
    2. offset: 偏移数量 , 用于分页 , 如 :( 页数 -1)*20, 其中 20 为 limit 的值
    3. cat: 歌单的标签, 可选值如下
    全部
    欧美
    华语
    流行
    说唱
    摇滚
    民谣
    电子
    轻音乐
    影视原声
    ACG
    怀旧
    治愈
    旅行
    

    接口地址 : autumnfish.cn/top/playlis…

  • 在数据改变的时候需要执行逻辑,可以使用侦听器watch来实现

watch:{
    tag(){
      // console.log(this.tag)
      //顶部的 精品歌单
      axios({
        url:'https://autumnfish.cn/top/playlist/highquality',
        methods:'get',
        params:{
          limit:1,
          cat:this.tag
        }
      }).then(res => {
        // console.log(res);
        this.topList = res.data.playlists[0]
      })
​
      //歌单列表
      axios({
        url:'https://autumnfish.cn/top/playlist/',
        method:'get',
        params:{
          limit:10,
          offset:0,
          cat:this.tag
        }
      }).then(res => {
        console.log(res);
        this.playList = res.data.playlists
      })
    }
  }

这里反复用到数据接口代码,可以抽取出重复使用的代码,封装为一个方法,需要的时候调用即可

methods: {
    handleCurrentChange(val) {
      // console.log(`当前页: ${val}`);
      //保存页码
      this.page = val
      //重新获取数据
      this.listData()
    },
​
    //抽取的方法1 顶部的数据
    topData() {
      axios({
        url: "https://autumnfish.cn/top/playlist/highquality",
        methods: "get",
        params: {
          limit: 1,
          //分类数据
          cat: this.tag,
        },
      }).then((res) => {
        // console.log(res);
        this.topList = res.data.playlists[0];
      });
    },
    //抽取的方法2 列表数据
    listData() {
      axios({
        url: "https://autumnfish.cn/top/playlist/",
        method: "get",
        params: {
          limit: 10,
          //起始的值 (页码-1)*每一页多少条数据
          offset: (this.page-1)*10,
          cat: this.tag,
        },
      }).then((res) => {
        // console.log(res);
        //保存总条数
        this.total = res.data.total
        this.playList = res.data.playlists;
      });
    },
  },
created(){
    //顶部的 精品歌单
    this.topData();
    //歌单列表
    this.listData();
  },
watch: {
tag() {
  // console.log(this.tag)
  //顶部的 精品歌单
  this.topData();
  //歌单列表
  this.listData();
  //切换标签时 修改页码为1
  this.page = 1
  },
},

最新音乐 | 歌曲列表

  • created调用 最新音乐接口
  • 获取到数据之后 渲染到页面上

说明 : 调用此接口 , 可获取最新音乐

必选参数 :

type: 地区类型 id,对应以下:

全部:0华语:7欧美:96日本:8韩国:16

接口地址 : autumnfish.cn/top/song

import axios from 'axios'
export default {
  name: 'songs',
  data() {
    return {
      songList:[], //歌曲列表
    };
  },
  created() {
    axios({
      url:'https://autumnfish.cn/top/song',
      method:'get',
      params:{
        type:0
      }
    }).then(res => {
      // console.log(res);
      this.songList = res.data.data
      // 处理时长 毫秒转为分秒
      for(let i=0; i<this.songList.length; i++){
        //获取到总毫秒数
        let duration = this.songList[i].duration
                                           
        let min = parseInt(duration/1000/60)
        min = (min<10 ? '0'+min: min)
        let sec = parseInt(duration/1000%60)
        sec = (sec<10 ? '0'+sec: sec)
        // console.log(min+'|'+sec);
        this.songList[i].duration = `${min}:${sec}`
      }
    })
  }
};

最新音乐 | 分类切换

  • 点击分类时,当前分类高亮

    <span class="item" @click="tag = 0" :class="{ active: tag == 0 }">全部</span>
    <span class="item" @click="tag = 7" :class="{ active: tag == 7 }">华语</span>
    <span class="item" @click="tag = 96" :class="{ active: tag == 96 }">欧美</span>
    <span class="item" @click="tag = 8" :class="{ active: tag == 8 }">日本</span>
    <span class="item" @click="tag = 16" :class="{ active: tag == 16 }">韩国</span>
    
  • 顶部和底部数据切换

  • 数据改变时需要执行逻辑,使用侦听器watch来实现 (同样把重复的代码抽取出来)

import axios from "axios";
export default {
  name: "songs",
  data() {
    return {
      songList: [], //歌曲列表
      tag: "0", // 分类
    };
  },
  methods: {
    //获取列表数据
    getSongList() {
      axios({
        url: "https://autumnfish.cn/top/song",
        method: "get",
        params: {
          //传递设置的数据
          type: this.tag,
        },
      }).then((res) => {
        // console.log(res);
        this.songList = res.data.data;
        // 处理时长 毫秒转为分秒
        for (let i = 0; i < this.songList.length; i++){
          //获取到总毫秒数
          let duration = this.songList[i].duration;
          //
          let min = parseInt(duration / 1000 / 60);
          min = min < 10 ? "0" + min : min;
          let sec = parseInt((duration / 1000) % 60);
          sec = sec < 10 ? "0" + sec : sec;
          // console.log(min+'|'+sec);
          this.songList[i].duration = `${min}:${sec}`;
        }
      });
    },
  },
  created() {
    this.getSongList();
  },
  watch: {
    tag() {
      this.getSongList();
    },
  },
};

播放歌曲

说明 : 调用此接口 , 传入音乐 id, 可获得歌曲播放地址

参数 : id: 音乐 id, 如 id=347230

接口地址 : autumnfish.cn/song/url

给播放图标绑定点击事件

<span class="iconfont icon-play" @click="playMusic(item.id)"></span>

编写播放歌曲的方法(调用播放歌曲接口,获取到歌曲url地址,通过this.$parent传递数据到index.vue页面,从而达到修改musicUrl的值)

//播放歌曲
playMusic(id){
  axios({
    url:'https://autumnfish.cn/song/url',
    method:'get',
    params:{
      id
    }
  }).then(res => {
    // console.log(res);
    let url = res.data.data[0].url
    this.$parent.musicUrl = url;
  })
}

最新MV|MV列表

  • 在 created 调用 全部MV 接口
  • 获取到数据之后 渲染到页面上,先不考虑分类,和分页
  • 播放量的信息,需要处理一下,如果 超过了 10万 就显示 xx万
<script>
//导入axios
import axios from 'axios'
export default {
  name: 'mvs',
  data() {
    return {
      // 总条数
      total: 20,
      // 页码
      page: 1,
      // 页容量
      limit: 8,
      //地区
      area:"全部",
      //排序
      order:"上升最快",
      //类型
      type:"全部",
      //查询的结果
      list:[],
    };
  },
  created(){
    axios({
      url:'https://autumnfish.cn/mv/all',
      method:'get',
      params:{
        area:this.area,
        type:this.type,
        order:this.order,
        //数量
        limit:this.limit,
        //偏移值 分页 (页码-1)*数量
        offset:(this.page-1)*this.limit,
      }
    }).then(res => {
      // console.log(res);
      this.list = res.data.data
      //处理次数
      for(let i=0; i<this.list.length; i++){
        if(this.list[i].playCount > 100000)
        this.list[i].playCount = parseInt(this.list[i].playCount/10000)+'万'
      }
    })
  },
  methods: {
    toMv(id) {
      this.$router.push(`/mv?id=${id}`);
    },
    handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
    }
  }
};
</script>

渲染数据到页面:

mv数据获取

<div class="items">
    <div class="item" v-for="(item,index) in list" :key="item.id">
      <div class="img-wrap">
        <img :src="item.cover" alt="" />
        <div class="num-wrap">
          <div class="iconfont icon-play"></div>
          <div class="num">{{item.playCount}}</div>
        </div>
      </div>
      <div class="info-wrap">
        <div class="name">{{item.name}}</div>
        <div class="singer">{{item.artistName}}</div>
      </div>
    </div>
</div>

最新MV页面 接口文档:

所有接口的请求方式都是get

全部MV

说明 : 调用此接口 , 可获取全部 mv

可选参数 :

  1. area: 地区,可选值为:全部、内地、港台、欧美、日本、韩国、不填则为全部
  2. type: 类型,可选值为:全部、官方版、原生、现场版、网易出品,不填则为全部
  3. order: 排序,可选值为:上升最快、最热、最新、不填则为上升最快
  4. limit: 取出数量 , 默认为 30
  5. offset: 偏移数量 , 用于分页 , 如 :( 页数 -1)*50, 其中 50 为 limit 的值 , 默认 为 0

接口地址 : autumnfish.cn/mv/all

最新MV|分类切换

  • 点击分类时,高亮 当前分类

  • 顶部数据切换,底部数据切换

  • 在数据改变的时候要执行逻辑,可以使用侦听器 watch 来实现,多写几个分类即可

    此处列出一个排序(其余分类是类似的)

<div class="order-wrap">
        <span class="order-type">排序:</span>
        <ul class="tabs-wrap">
          <li class="tab">
            <span
              class="title"
              :class="{ active: order == '上升最快' }"
              @click="order = '上升最快'"
              >上升最快</span
            >
          </li>
          <li class="tab">
            <span
              class="title"
              :class="{ active: order == '最热' }"
              @click="order = '最热'"
              >最热</span
            >
          </li>
          <li class="tab">
            <span
              class="title"
              :class="{ active: order == '最新' }"
              @click="order = '最新'"
              >最新</span
            >
          </li>
        </ul>
      </div>
//侦听器
 watch: {
    area(){
      //获取数据
      this.getList()
    },
    type(){
      //获取数据
      this.getList()
    },
    order(){
      //获取数据
      this.getList()
    }
 },
 // methods里对获取数据 封装为一个方法 需要时调用即可

最新MV|数据分页

  • MV数据 获取到之后,设置 总条数 给 分页组件
  • 为分页组件绑定 页码 和 页容量 ,以便进行联动,在调用接口时,一起传递
  • 切换分类时,获取 第一页 的数据
  • 分页组件 页码切换 时,获取对应页的数据
// 在methods定义分页处理方法
handleCurrentChange(val) {
      // console.log(`当前页: ${val}`);
      // 保存页码 重新获取数据
      this.page = val
      this.getList()
  },

在侦听器里加上一些处理逻辑:(切换分类时,获取 第一页 的数据)

watch: {
    area(){
      //返回第一页
      this.page = 1
      //获取数据
      this.getList()
    },
    type(){
      //返回第一页
      this.page = 1
      //获取数据
      this.getList()
    },
    order(){
      //返回第一页
      this.page = 1
      //获取数据
      this.getList()
    }
 },

搜索

  • 组件名叫 result.vue
  • 路由地址是:/result
  1. 页面跳转
  2. 歌曲搜索
  3. 歌单搜索
  4. MV搜索

搜索 | 页面跳转

  • 从顶部的 搜索栏 搜索跳转
  • 携带数据去往 搜索结果(/result) 页
  • 把搜索的关键字渲染到顶部
<!-- 搜索框 -->
<input
  type="text"
  autocomplete="off"
  placeholder="搜索"
  class="el-input__inner"
  v-model="inputValue"
  @keyup.enter="toSearch"
/>
export default {
  name: "top",
  data() {
    return {
      query: "",
      inputValue: "", // 输入的内容
    };
  },
  methods: {
    toSearch() {
      //如果为空,提示
      if (this.inputValue == "") {
        alert("请输入内容!");
      } else {
        //否则跳转
        // this.$router.push('/result')
        //携带数据
        // this.$router.push("/result?q="+this.inputValue)
        this.$router.push(`/result?q=${this.inputValue}`)
      }
    },
  },
};
// 在`result.vue`文件对应位置把携带过去的数据,渲染到页面即可:
// 注意这里参数名 可自行定义(保持一致即可)
<h2 class="title">{{$route.query.q}}</h2>

搜索|歌曲搜索

  • 导入 axios
  • 在 created 生命周期函数中调用 搜索 接口
  • 默认先查询 歌曲 类型
  • 把获取到的数据渲染到页面上,顶部的数量 别忘了
  • mv图标 和 歌曲时长 需要处理一下
  • 这里没有单独的播放按钮,我们双击播放
<el-tab-pane label="歌曲" name="songs">
    <table class="el-table">
      <thead>
        <th></th>
        <th>音乐标题</th>
        <th>歌手</th>
        <th>专辑</th>
        <th>时长</th>
      </thead>
      <tbody>
        <tr
          class="el-table__row"
          v-for="(item, index) in songList"
          :key="index"
          @dblclick="playMusic(item.id)"
        >
          <td>{{ index + 1 }}</td>
          <td>
            <div class="song-wrap">
              <div class="name-wrap">
                <span>{{ item.name }}</span>
                <!-- mv 图标 -->
                <span v-if="item.mvid != 0" class="iconfont icon-mv"></span>
              </div>
              <span></span>
              <!-- 二级标题 alias -->
              <span v-if="item.alias.length != 0">{{ item.alias[0]}}</span>
            </div>
          </td>
          <td>{{ item.artists[0].name }}</td>
          <td>{{ item.album.name }}</td>
          <td>{{ item.duration }}</td>
        </tr>
      </tbody>
    </table>
  </el-tab-pane>
<script>
//导入axios
import axios from "axios";
export default {
  name: "result",
  data() {
    return {
      activeIndex: "songs",
      // 保存 查询到的歌曲
      songList: [],
      //搜索结果的总数
      count: 0,
    };
  },
  created() {
    // console.log(this.$route.query.q);
    axios({
      url: "https://autumnfish.cn/search",
      method: "get",
      params: {
        keywords: this.$route.query.q,
        type: 1,
        limit: 10, // 获取的数据量
      },
    }).then((res) => {
      // console.log(res);
      this.songList = res.data.result.songs;
      //计算歌曲时间 转换为时分秒
      for (let i = 0; i < this.songList.length; i++) {
        let min = parseInt(this.songList[i].duration / 1000 / 60);
        let sec = parseInt((this.songList[i].duration / 1000) % 60);
        if (min < 10) {
          min = "0" + min;
        }
        if (sec < 10) {
          sec = "0" + sec;
        }
        // console.log(min+':'+sec);
        //设置给duration即可
        this.songList[i].duration = min + ":" + sec;
      }
      //保存总数
      this.count = res.data.result.songCount;
    });
  },
  methods: {
    playMusic(id) {
      // console.log(id);
      axios({
        url: "https://autumnfish.cn/song/url",
        method: "get",
        params: {
          id, // k-v一致可简写
        },
      }).then((res) => {
        // console.log(res)
        let url = res.data.data[0].url;
        //设置父组件的播放地址
        this.$parent.musicUrl = url;
      });
    },
  },
};
</script>

搜索 | 歌单搜索

  • 在切换到歌单分类的时候,搜索对应的数据,这里使用 watch 实现
  • 获取到数据并渲染到页面上,播放次数超过10W 特殊处理一下
<el-tab-pane label="歌单" name="lists">
    <div class="items">
      <div v-for="(item, index) in playlists" :key="index" class="item">
        <div class="img-wrap">
          <div class="num-wrap">
            播放量:
            <span class="num">{{item.playCount}}</span>
          </div>
          <img :src="item.coverImgUrl" alt="" />
          <span class="iconfont icon-play"></span>
        </div>
        <p class="name">{{item.name}}</p>
      </div>
    </div>
  </el-tab-pane>
​
​
<script>
//导入axios
import axios from "axios";
export default {
  name: "result",
  data() {
    return {
      //tab切换时 会改变的数据
      activeIndex: "songs",
      // 保存 查询到的歌曲
      songList: [],
      //搜索结果的总数
      count: 0,
      //保存歌单的字段
      playlists:[],
    };
  },
  
  //侦听器
  watch: {
    activeIndex() {
      //songs 歌曲
      //lists 歌单
      //mv    mv
      let type = 1;
      switch (this.activeIndex) {
        case 'songs':
          type = 1;
          break;
        case 'lists':
          type = 1000;
          break;
        case 'mv':
          type = 1004;
          break;
        default:
          break;
      }
      axios({
        url: "https://autumnfish.cn/search",
        method: "get",
        params: {
          keywords: this.$route.query.q,
          type: type, //简写为: type
          limit: 10, // 获取的数据量
        },
      }).then((res) => {
        console.log(res);
        if(type==1){
          this.songList = res.data.result.songs;
          //计算歌曲时间 转换为时分秒
          for (let i = 0; i < this.songList.length; i++) {
            let min = parseInt(this.songList[i].duration / 1000 / 60);
            let sec = parseInt((this.songList[i].duration / 1000) % 60);
            if (min < 10) {
              min = "0" + min;
            }
            if (sec < 10) {
              sec = "0" + sec;
            }
            // console.log(min+':'+sec);
            //设置给duration即可
            this.songList[i].duration = min + ":" + sec;
          }
        //保存总数
        this.count = res.data.result.songCount;
        }else if(type==1000){
          //歌单的逻辑
          this.playlists = res.data.result.playlists
          //总数
          this.count = res.data.result.playlistCount
          //播放次数 处理
          for (let i = 0; i < this.playlists.length; i++) {
            if(this.playlists[i].playCount>100000){
              this.playlists[i].playCount = parseInt(this.playlists[i].playCount/10000) + '万'
            }
          }
        }
      });
    },
  },
};
</script>

搜索 | MV搜索

  • 在切换到MV分类的时候,搜索对应的数据,这里使用 watch 实现
  • 为了页面布局美观,在获取MV时,个数可以稍微调整一下
<el-tab-pane label="MV" name="mv">
    <div class="items mv">
      <div v-for="(item, index) in mv" :key="index" class="item">
        <div class="img-wrap">
          <!-- 封面 -->
          <img :src="item.cover" alt="" />
          <span class="iconfont icon-play"></span>
          <div class="num-wrap">
            <div class="iconfont icon-play"></div>
            <!-- 播放次数 -->
            <div class="num">{{ item.playCount }}</div>
          </div>
          <!-- 持续时间 -->
          <span class="time">{{ item.duration }}</span>
        </div>
        <div class="info-wrap">
          <!-- mv名 -->
          <div class="name">{{ item.name }}</div>
          <!-- 歌手名 -->
          <div class="singer">{{ item.artistName }}</div>
        </div>
      </div>
    </div>
  </el-tab-pane>
//导入axios
import axios from "axios";
export default {
  name: "result",
  data() {
    return {
      //tab切换时 会改变的数据
      activeIndex: "songs",
      // 保存 查询到的歌曲
      songList: [],
      //搜索结果的总数
      count: 0,
      //保存歌单的字段
      playlists: [],
      //保存mv的字段
      mv: [],
    };
  },
  //回调函数
  created() {
    // console.log(this.$route.query.q);
    axios({
      url: "https://autumnfish.cn/search",
      method: "get",
      params: {
        keywords: this.$route.query.q,
        type: 1,
        limit: 10, // 获取的数据量
      },
    }).then((res) => {
      // console.log(res);
      this.songList = res.data.result.songs;
      //计算歌曲时间 转换为时分秒
      for (let i = 0; i < this.songList.length; i++) {
        let min = parseInt(this.songList[i].duration / 1000 / 60);
        let sec = parseInt((this.songList[i].duration / 1000) % 60);
        if (min < 10) {
          min = "0" + min;
        }
        if (sec < 10) {
          sec = "0" + sec;
        }
        // console.log(min+':'+sec);
        //设置给duration即可
        this.songList[i].duration = min + ":" + sec;
      }
      //保存总数
      this.count = res.data.result.songCount;
    });
  },
  //侦听器
  watch: {
    activeIndex() {
      //songs 歌曲
      //lists 歌单
      //mv    mv
      let type = 1;
      //获取个数
      let limit = 10;
      switch (this.activeIndex) {
        case "songs":
          type = 1;
          limit = 10;
          break;
        case "lists":
          type = 1000;
          limit = 10;
          break;
        case "mv":
          type = 1004;
          limit = 8;
          break;
        default:
          break;
      }
      axios({
        url: "https://autumnfish.cn/search",
        method: "get",
        params: {
          keywords: this.$route.query.q,
          type: type, //简写为: type
          //limit: 10, // 获取的数据量
          limit,
        },
      }).then((res) => {
        console.log(res);
        // 获取歌曲
        if (type == 1) {
          this.songList = res.data.result.songs;
          //计算歌曲时间 转换为时分秒
          for (let i = 0; i < this.songList.length; i++) {
            let min = parseInt(this.songList[i].duration / 1000 / 60);
            let sec = parseInt((this.songList[i].duration / 1000) % 60);
            if (min < 10) {
              min = "0" + min;
            }
            if (sec < 10) {
              sec = "0" + sec;
            }
            // console.log(min+':'+sec);
            //设置给duration即可
            this.songList[i].duration = min + ":" + sec;
          }
          //保存总数
          this.count = res.data.result.songCount;
        }
        // 获取歌单
        else if (type == 1000) {
          //歌单的逻辑
          this.playlists = res.data.result.playlists;
          //总数
          this.count = res.data.result.playlistCount;
          //播放次数 处理
          for (let i = 0; i < this.playlists.length; i++) {
            if (this.playlists[i].playCount > 100000) {
              this.playlists[i].playCount =
                parseInt(this.playlists[i].playCount / 10000) + "万";
            }
          }
        }
        else {
          //保存mv数据
          this.mv = res.data.result.mvs;
          //总数
          this.count = res.data.result.mvCount;
          //处理数据 播放次数 时间
          for (let i = 0; i < this.mv.length; i++) {
            //时间
            let min = parseInt(this.mv[i].duration/1000/60);
            let sec = parseInt(this.mv[i].duration/1000%60);
            if(min < 10){
              min = '0'+min
            }
            if(sec < 10){
              sec = '0'+sec
            }
            this.mv[i].duration = min + ":" + sec;
            //播放次数
            if (this.mv[i].playCount > 100000) {
              this.mv[i].playCount = parseInt(this.mv[i].playCount/10000) + '万';
            }
          }
        }
      });
    },
  },
};
</script>