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

调用百度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
参数:format=json或xml&calback=&from=webapp_music&method=以下不同的参数获得不同的数据
PS:format根据开发需要可选择json或xmml,其他参数对应填入,calback是等于空的。
一、获取列表
例:method=baidu.ting.billboard.billList&type=1&size=10&offset=0
参数: type = 1-新歌榜,2-热歌榜,11-摇滚榜,12-爵士,16-流行,21-欧美金曲榜,22-经典老歌榜,23-情歌对唱榜,24-影视金曲榜,25-网络歌曲榜
size = 10 //返回条目数量
offset = 0 //获取偏移

上面的参数method前面都是公共的部分,我们在data里面定义下参数,dataOb为参数公共部分,commonParams为查询列表的参数

 export default{
        components: {
           myCollect
        },
        data(){
            return{
               ifSearch: false,
               autoplay:true,//是否自动播放
               tableData: [],
               myChoose: '我的首页',
               myType: [
                   {
                      name: '我的首页',
                      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,//当前是那一页
               totalMusic: 0,// 列表总数,下面做翻页
               dataObj: {// 公共参数
                    format: 'json',
                    calback: '',
                    from: 'webapp_music'
               },
               commonParams: {// 列表参数
                    method: 'baidu.ting.billboard.billList',
                    type: '',
                    size: 20,
                    offset: 0 
               },
               searchParams: { //查询参数
                    method: 'baidu.ting.search.catalogSug',
                    query: ''
               },
               playParams: { //播放参数
                    method: 'baidu.ting.song.play',
                    songid: ''
               }
            }
        },

前端html页面编写如下,初始化type类型,定义一个字段musicType为1也就是新歌榜,具体上面代码有写,html页面都是基于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">经典老歌榜</el-radio-button>
                            <el-radio-button label="23">情歌对唱榜</el-radio-button>
                            <el-radio-button label="24">影视金曲榜</el-radio-button>
                            <el-radio-button label="25">网络歌曲榜</el-radio-button>
                        </el-radio-group>

方法的调用

// 获取音乐列表
           getMusicList() {
               this.loading = true;
               this.commonParams.type = this.musicType;
               // 合并对象
               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();
        }

下面是返回数据的格式


19.png

然后就是渲染数据了

<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>

下面是翻页

<el-pagination
                            background
                            layout="prev, pager, next"
                            :current-page.sync="currentPage"//当前是哪页
                            @current-change="handleCurrentChange"//页数改变时触发
                            :page-size="commonParams.size"//一页几条数据
                            :total="totalMusic">//总页数
                        </el-pagination>
// 页数改变
           handleCurrentChange(val) {
               window.scrollTo(0,0);// 请求成功滚动条滚到顶部
               this.commonParams.offset = (parseInt(val)-1)*(this.commonParams.size);
               this.getMusicList();//切换页数后重新获取方法
           },
// 音乐类型改变
           typeChange(val) {
              this.ifSearch = false;
              this.commonParams.offset = 0;
              this.currentPage = 1;//把当前页设置为第一页
              this.getMusicList();
           },

接下来介绍查询的接口,代码差不多

二、搜索
例:method=baidu.ting.search.catalogSug&query=海阔天空
参数:query = '' //搜索关键字

//searchParams.query为绑定的数据
<div class="search">
                            <el-input placeholder="请输入内容" 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;//保存查出来的数据
                       this.loading = false;
              })
           },

结果数据如下:


20.png

下面是播放音乐,这里先使用原生的audio组件,在后面的收藏页里面在自定义进度条等样式

三、播放
例:method=baidu.ting.song.play&songid=877578
例:method=baidu.ting.song.playAAC&songid=877578
参数:songid = 877578 //歌曲id

//controls为原生的控制样式,autuplay为是否自动播放
<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;
                })
            },

结果数据如下:


21.png

下节将介绍将音乐信息收藏到数据库并在页面上展示

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,848评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,529评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,824评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,329评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,227评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,879评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,218评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,877评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,159评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,155评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,987评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,736评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,273评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,407评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,663评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,158评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,517评论 2 339

推荐阅读更多精彩内容

  • iOS开发之网络音乐播放器(SC音乐) 前言 一直都想做一款自己的网络音乐播放器,两个月前做了一个swift版的网...
    chenlingLAL阅读 2,096评论 0 50
  • 音乐分类: 1、新歌榜,2、热歌榜, 11、摇滚榜,12、爵士,16、流行 21、欧美金曲榜,22、经典老歌榜,2...
    白如白牙阅读 11,013评论 2 8
  • 百度音乐全接口 会利用使用接口找歌简单又快捷http://tingapi.ting.baidu.com/v1/re...
    白如白牙阅读 1,705评论 4 0
  • 如何选购一款适合自己孩子的儿童早教机器人 儿童智能机器人作为人工智能在儿童领域的新应用,在陪伴孩子成长,拓展知识视...
    李经勇阅读 290评论 0 0
  • 从5月3日开始到今天,一共学习了5天古琴,学会了沧海一声笑,仙翁操,以及阳关三叠三首曲,在学习的过程中,老师教了指...
    笑开天阅读 235评论 0 0