基于vue+百度音樂api +express + mongodb + elementUi定義自己的音樂播放器(四)

調(diào)用百度api接口,需要跨域,所以先安裝vue-jsonp cnpm i vue-jsonp --save
接口地址參考http://67zixue.com/home/article/detail/id/22.html

1.在main.js里面引入import VueJsonp from 'vue-jsonp'
2.使用Vue.use(VueJsonp)
百度api地址:http://tingapi.ting.baidu.com/v1/restserver/ting
獲取方式:GET
參數(shù):format=json或xml&calback=&from=webapp_music&method=以下不同的參數(shù)獲得不同的數(shù)據(jù)
PS:format根據(jù)開發(fā)需要可選擇json或xmml,其他參數(shù)對(duì)應(yīng)填入,calback是等于空的。
一、獲取列表
例:method=baidu.ting.billboard.billList&type=1&size=10&offset=0
參數(shù): type = 1-新歌榜,2-熱歌榜,11-搖滾榜,12-爵士,16-流行,21-歐美金曲榜,22-經(jīng)典老歌榜,23-情歌對(duì)唱榜,24-影視金曲榜,25-網(wǎng)絡(luò)歌曲榜
size = 10 //返回條目數(shù)量
offset = 0 //獲取偏移

上面的參數(shù)method前面都是公共的部分,我們?cè)赿ata里面定義下參數(shù),dataOb為參數(shù)公共部分,commonParams為查詢列表的參數(shù)

 export default{
        components: {
           myCollect
        },
        data(){
            return{
               ifSearch: false,
               autoplay:true,//是否自動(dòng)播放
               tableData: [],
               myChoose: '我的首頁(yè)',
               myType: [
                   {
                      name: '我的首頁(yè)',
                      icon: 'iconfont icon-shouyefill'
                   },
                   {
                      name: '我的收藏',
                      icon: 'iconfont icon-xiangqufill'
                   },
                   {
                      name: '我的喜歡',
                      icon: 'iconfont icon-zanfill'
                   }
               ],
               auObj: null,
               loading: false,
               musicUrl: '',//獲取到的音樂鏈接
               musicType: '1',//音樂類型
               api: 'http://tingapi.ting.baidu.com/v1/restserver/ting',
               jsonpData: [],
               searchData: [],
               currentPage: 1,//當(dāng)前是那一頁(yè)
               totalMusic: 0,// 列表總數(shù),下面做翻頁(yè)
               dataObj: {// 公共參數(shù)
                    format: 'json',
                    calback: '',
                    from: 'webapp_music'
               },
               commonParams: {// 列表參數(shù)
                    method: 'baidu.ting.billboard.billList',
                    type: '',
                    size: 20,
                    offset: 0 
               },
               searchParams: { //查詢參數(shù)
                    method: 'baidu.ting.search.catalogSug',
                    query: ''
               },
               playParams: { //播放參數(shù)
                    method: 'baidu.ting.song.play',
                    songid: ''
               }
            }
        },

前端html頁(yè)面編寫如下,初始化type類型,定義一個(gè)字段musicType為1也就是新歌榜,具體上面代碼有寫,html頁(yè)面都是基于elementui編寫

<el-radio-group v-model="musicType" size="small" @change="typeChange">
                            <el-radio-button label="1">新歌榜</el-radio-button>
                            <el-radio-button label="2">熱歌榜</el-radio-button>
                            <el-radio-button label="11">搖滾榜</el-radio-button>
                            <el-radio-button label="12">爵士</el-radio-button>
                            <el-radio-button label="16">流行</el-radio-button>
                            <el-radio-button label="21">歐美金曲榜</el-radio-button>
                            <el-radio-button label="22">經(jīng)典老歌榜</el-radio-button>
                            <el-radio-button label="23">情歌對(duì)唱榜</el-radio-button>
                            <el-radio-button label="24">影視金曲榜</el-radio-button>
                            <el-radio-button label="25">網(wǎng)絡(luò)歌曲榜</el-radio-button>
                        </el-radio-group>

方法的調(diào)用

// 獲取音樂列表
           getMusicList() {
               this.loading = true;
               this.commonParams.type = this.musicType;
               // 合并對(duì)象
               const dataMusic = Object.assign({}, this.commonParams, this.dataObj)
               this.$jsonp(this.api, dataMusic).then(json => {               
                  this.jsonpData = json.song_list;
                    this.loading = false;
                  this.totalMusic = parseInt(json.billboard.billboard_songnum);
              })
           }
      mounted(){
            this.getMusicList();
        }

下面是返回?cái)?shù)據(jù)的格式


19.png

然后就是渲染數(shù)據(jù)了

<ul v-if="!ifSearch" class="geBan">
                           <li v-for="(item,index) in jsonpData" :key="index">
                                       <div class="port-1 effect-1">
                                           <div class="image-box">
                                               <img :src="item.pic_premium" alt="pic_premium">
                                           </div>
                                           <div class="text-desc">
                                               <h3>{{item.title}}</h3>
                                               <p>歌手:{{item.author}} 
                                               <span style="padding-left:5px">語言:{{item.language}}</span> </p>
                                               <p>熱度:{{item.hot}}</p>
                                               <a href="javascript:void(0)" @click="playMusic(item.song_id)" class="btn">播放</a>
                                               <a href="javascript:void(0)" @click="addMusic(item)" class="btn">添加</a>
                                               <a href="javascript:void(0)" @click="playMusic(item.song_id)" class="btn">下載</a>
                                           </div>
                                       </div>
                                   </li>
                               </ul>

下面是翻頁(yè)

<el-pagination
                            background
                            layout="prev, pager, next"
                            :current-page.sync="currentPage"http://當(dāng)前是哪頁(yè)
                            @current-change="handleCurrentChange"http://頁(yè)數(shù)改變時(shí)觸發(fā)
                            :page-size="commonParams.size"http://一頁(yè)幾條數(shù)據(jù)
                            :total="totalMusic">//總頁(yè)數(shù)
                        </el-pagination>
// 頁(yè)數(shù)改變
           handleCurrentChange(val) {
               window.scrollTo(0,0);// 請(qǐng)求成功滾動(dòng)條滾到頂部
               this.commonParams.offset = (parseInt(val)-1)*(this.commonParams.size);
               this.getMusicList();//切換頁(yè)數(shù)后重新獲取方法
           },
// 音樂類型改變
           typeChange(val) {
              this.ifSearch = false;
              this.commonParams.offset = 0;
              this.currentPage = 1;//把當(dāng)前頁(yè)設(shè)置為第一頁(yè)
              this.getMusicList();
           },

接下來介紹查詢的接口,代碼差不多

二、搜索
例:method=baidu.ting.search.catalogSug&query=海闊天空
參數(shù):query = '' //搜索關(guān)鍵字

//searchParams.query為綁定的數(shù)據(jù)
<div class="search">
                            <el-input placeholder="請(qǐng)輸入內(nèi)容" v-model="searchParams.query" class="search-input">
                                <el-button slot="append" icon="el-icon-search" @click="searchMusic"></el-button>
                            </el-input>
                        </div>

方法如下

 searchMusic() {
              this.ifSearch = true;
              this.loading = true;
              const dataMusic = Object.assign({}, this.searchParams, this.dataObj)
              this.$jsonp(this.api, dataMusic).then(json => {               
                     this.searchData = json.song;//保存查出來的數(shù)據(jù)
                       this.loading = false;
              })
           },

結(jié)果數(shù)據(jù)如下:


20.png

下面是播放音樂,這里先使用原生的audio組件,在后面的收藏頁(yè)里面在自定義進(jìn)度條等樣式

三、播放
例:method=baidu.ting.song.play&songid=877578
例:method=baidu.ting.song.playAAC&songid=877578
參數(shù):songid = 877578 //歌曲id

//controls為原生的控制樣式,autuplay為是否自動(dòng)播放
<div class="audioUrl">
                        <audio :src="musicUrl" controls="controls" autoplay="autoplay"></audio>
                    </div>

方法如下

 //播放音樂
            playMusic(songId){
                this.playParams.songid = songId;
                const dataMusic = Object.assign({}, this.playParams, this.dataObj)
                this.$jsonp(this.api, dataMusic).then(json => {
                    this.musicUrl = json.bitrate.file_link;
                })
            },

結(jié)果數(shù)據(jù)如下:


21.png

下節(jié)將介紹將音樂信息收藏到數(shù)據(jù)庫(kù)并在頁(yè)面上展示

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS開發(fā)之網(wǎng)絡(luò)音樂播放器(SC音樂) 前言 一直都想做一款自己的網(wǎng)絡(luò)音樂播放器,兩個(gè)月前做了一個(gè)swift版的網(wǎng)...
    chenlingLAL閱讀 2,249評(píng)論 0 50
  • 音樂分類: 1、新歌榜,2、熱歌榜, 11、搖滾榜,12、爵士,16、流行 21、歐美金曲榜,22、經(jīng)典老歌榜,2...
    白如白牙閱讀 11,377評(píng)論 2 8
  • 百度音樂全接口 會(huì)利用使用接口找歌簡(jiǎn)單又快捷http://tingapi.ting.baidu.com/v1/re...
    白如白牙閱讀 2,031評(píng)論 4 0
  • 如何選購(gòu)一款適合自己孩子的兒童早教機(jī)器人 兒童智能機(jī)器人作為人工智能在兒童領(lǐng)域的新應(yīng)用,在陪伴孩子成長(zhǎng),拓展知識(shí)視...
    李經(jīng)勇閱讀 324評(píng)論 0 0
  • 從5月3日開始到今天,一共學(xué)習(xí)了5天古琴,學(xué)會(huì)了滄海一聲笑,仙翁操,以及陽(yáng)關(guān)三疊三首曲,在學(xué)習(xí)的過程中,老師教了指...
    笑開天閱讀 291評(píng)論 0 0

友情鏈接更多精彩內(nèi)容