来自一个大三想学前端的小白内心独白:小左:诶~你要写小程序?还想仿网易云?小右:是啊,不行吗?小左:你会吗?小右:不会啊 小左:那你写个蛇皮 小右:因为喜欢啊!哪有人一开始就会,慢慢学嘛!我还年轻,不就应该年少轻狂吗?青春本就该无限嚣张! 好了,下面该严肃点了,因为我觉得写代码是件很严肃的事情。
前言
先说说写这个小程序的初衷吧!学了一段时间的微信小程。其实刚开始学的时候就打算仿网易云了,因为每天都会用,所以毫不犹豫的选择了它。我比较喜欢听歌,刚开始是用酷狗,相信大家对那句hello酷狗一定不陌生,然后就是qq音乐,最后就是网易了。总的来说还是更喜欢网易。它最吸引我的是它的风格吧!很简约,样式也是我喜欢的风格。最喜欢的是它的朋友界面可以看到大家分享的歌,还有许多很好看的壁纸吧(个人很喜欢收藏自己看起来舒服的壁纸)。我喜欢看每首歌的热评,与其说它是一个个故事更为贴切点,也让我对这首歌有了新的感触。很喜欢这种感觉。还有那个签到功能,每天一次签到送你一句正能量的话,感觉美好的一天又开始了。嗯,总结一下,就是一见钟情的热爱吧,仅此而已。废话到此结束....
嘻嘻,骗你的,还有一句废话。一开始写,就觉得自己太狂妄自大了。因为功能实在是太多了。所以只实现了一些最基本的功能(其实根本没有功能,就是些页面的数据渲染。吹一下,显得有底气一点!)。
正文
写小程序所需要的一些东西
- 注册一个小程序账号,得用一个没注册过公众号的邮箱注册。
- 注册过程中需要很多认证,有很多认证,比较繁琐,如果暂时只是开发测试,不进行提审、发布的话,只要完成营业执照号填写就可以了,不需要完成微信认证。
- 注册完账号,登录,在主页面左边列表中点击设置,然后再设置页面中选开发设置就可以看到AppID,用于登录开发工具。
- 可以到官网下载开发工具微信开发者工具
- 然后创建项目就行
小程序中用到的一些组件库与文档
- colorUi 一款高颜值的微信小程序组件库
- vant(十分好用的一款轻量级组件库)
- 微信官方文档
- iconfont(一个十分强大的图标库,你要的样子它都有)
- 网易云API(十分良心的一个开源API)
小白的代码历程
嗯,现在就看看这个比的写的小程序到底长个啥样吧!


主要界面功能讲解
index界面

刚开始想直接用组件写那个最上面的tabbar,后面一想,等以后用习惯了岂不是这么简单的tabbar都写不出,所以能自己写就自己写。这是个菜鸟的基本素养。 我是用TabCur来判断当前页,从而添加一个show或hide类来控制该页面是显示还是隐藏。
//切换tabbar
click(e){
const id = e.currentTarget.dataset.id;
if(id==1){
wx.navigateTo({
url: '../songSquare/songSquare'
})
}
if(id==2){
wx.navigateTo({
url: '../songTop/songTop'
})
}
},
这个代码就是通过绑定的事件来实现页面的跳转
发现页面的结构

- 先用swiper写了个轮播
<swiper class="card-swiper {{DotStyle?'square-dot':'round-dot'}}" indicator-dots="true" circular="true" autoplay="true" interval="5000" duration="500" bindchange="cardSwiper" indicator-color="#8799a3" indicator-active-color="#0081ff">
<swiper-item wx:for="{{swiperList}}" wx:key class="{{cardCur==index?'cur':''}}">
<view class="swiper-item">
<image src="{{item.url}}" mode="aspectFill" wx:if="{{item.type=='image'}}"></image>
<video src="{{item.url}}" autoplay loop muted show-play-btn="{{false}}" controls="{{false}}" objectFit="cover" wx:if="{{item.type=='video'}}"></video>
</view>
</swiper-item>
</swiper>
- 推荐歌单那一块是自己写了个组件叫card,在调用card组件的页面给card传了个images的数组取名为repo,这样card组件上就能用这个数组了
<card repo="{{images}}"></card>
card.html
<view class="songCard">
<view class="n-rcmd">
<view class="v-hd2">
<navigator class="tit f-ff2 f-tdn" url="https://music.163.com/discover/playlist/">
推荐歌单
</navigator>
<button class="btn" bindtap="music">
<text class="s-fc3">歌单广场</text>
</button>
</view>
</view>
<view class="music">
<view class="item" wx:for="{{repo}}" wx:key="index" wx:if="{{index<6}}" data-id="{{item.id}}" bindtap="getSong">
<view class="container u-cover">
<image src="{{item.coverImgUrl}}" />
<text class="text">{{item.name}}</text>
</view>
</view>
</view>
</view>
card.js
// components/card/dard.js
const app = getApp();
Component({
/**
* 组件的属性列表
*/
properties: {
repo:{
type:Array,
value:[]
}
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
music : function(){
wx.navigateTo({
url: '/pages/songSquare/songSquare'
})
},
getSong(e){
console.log(e);
console.log(this.properties.repo);
var id = e.currentTarget.dataset.id;
//跳转到歌单详情页面
wx.navigateTo({
url: '/pages/songDetail/songDetail'
})
,
app.globalData.getSongId = id;
}
}
})
点击歌单会进入歌单详情页,后面再讲。 3. mv视频和推荐歌单一样也是一个组件 card2.xtml
<view class="cards">
<view class="card" wx:for="{{mvId}}" wx:key="index" wx:if="{{index<6}}" data-id="{{index}}" >
<video src="{{item.brs[240]}}" hidden="{{currentVid !== item.id}}" id="{{item.id}}" duration="{{item.duration}}" poster="{{item.cover}}" />
<image style="width:100%" data-vid="{{item.id}}" src="{{item.cover}}" hidden="{{currentVid == item.id}}" bindtap="play">
<view class="label">
{{item.duration}}
</view>
</image>
<navigator url="/pages/show/index" >
<view class="content">
<view class="header">
{{item.briefDesc}}
</view>
<view class="cu-list menu-avatar">
<view class="cu-item">
<view class="content flex-sub">
<view class="line text-grey">{{item.desc}}</view>
<view class="text-gray text-sm flex justify-between">
{{item.publishTime}}
<view class="text-gray text-sm">
<text class="cuIcon-attentionfill margin-lr-xs"></text>
{{item.playCount}}
<text class="cuIcon-appreciatefill margin-lr-xs"></text>
{{item.likeCount}}
<text class="cuIcon-messagefill margin-lr-xs"></text>
{{item.subCount}}
</view>
</view>
</view>
</view>
</view>
</view>
</navigator>
</view>
</view>
card2.js
let currentVideo = null;
Component({
/**
* 组件的属性列表
*/
properties: {
mvId :{
type:Array,
value:[]
}
},
/**
* 组件的初始数据
*/
data: {
id : null,
author:[],
videoimage: "block",
currentVid: null
},
options: {
addGlobalClass: true,
},
/**
* 组件的方法列表
*/
methods: {
//点击播放按钮,封面图片隐藏,播放视频
play(event){
if(this.data.currentVid !== null){
currentVideo.pause();
}
const vid = event.target.dataset.vid;
if (vid){
currentVideo = wx.createVideoContext(`${vid}`);
currentVideo.play();
this.setData({
currentVid:vid
})
}
}
},
})
这个地方的video标签下面放了个image标签,就是用这张图片来控制video只能同时播放 一个视频。刚开始是显示图片,你点击图片它就把图片隐藏,显示video.还有一个判断就是当你点另外的video时你刚在播放的video会停止播放,然后再播放当前你点击的视频,这样就做到了同一时间只能播放一个视频。
歌单广场页面
songSqueare.wml
<scroll-view scroll-x class="bg-white nav" scroll-with-animation scroll-left="{{scrollLeft}}">
<view class="cu-item {{index==TabCur?'text-green cur':''}}" wx:for="{{list}}" wx:key bindtap="tabSelect" data-name="{{item.name}}" data-id="{{index}}" wx:if="{{index<10}}">
{{item.name}}
</view>
</scroll-view>
<!-- 轮播 -->
<view class="tower-swiper" bindtouchmove="towerMove" bindtouchstart="towerStart" bindtouchend="towerEnd">
<view class="tower-item {{item.zIndex==1?'none':''}}" wx:for="{{swiperList}}" wx:key style="--index:{{item.zIndex}};--left:{{item.mLeft}}">
<view class="swiper-item">
<image src="{{item.url}}" mode="aspectFill" wx:if="{{item.type=='image'}}"></image>
<video src="{{item.url}}" autoplay loop muted show-play-btn="{{false}}" controls="{{false}}" objectFit="cover" wx:if="{{item.type=='video'}}"></video>
</view>
</view>
</view>
<!-- 歌单 -->
<view class="music {{TabCur == index ? 'show' : 'hide'}}" wx:for="{{list}}" wx:key wx:if="{{index<6}}" data-index="{{index}}">
<view class="item" wx:for="{{images}}"wx:key="index" data-id="{{item.id}}" bindtap="getSong">
<view class="container u-cover">
<image src="{{item.coverImgUrl}}" />
<text class="text">{{item.name}}</text>
</view>
</view>
</view>
songSqueare.js
// miniprogram/pages/songSquare/songSquare.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
images:[],
TabCur: 0,
isActive : 0,
scrollLeft:0,
name : '',
list:['推荐','精品','华语','民谣','轻音乐','电子','摇滚'],
swiperList: [{
id: 0,
type: 'image',
url: 'http://p1.music.126.net/9R7PD9p03LLxykyibHiKEw==/109951163804524121.jpg?param=140y140'
}, {
id: 1,
type: 'image',
url: 'http://p1.music.126.net/1zOMcO4a3Pxo8c5xhiVZ1Q==/109951163637220918.jpg?param=140y140',
}, {
id: 2,
type: 'image',
url: 'http://p1.music.126.net/O4ee-Bl6Z7R-8rikBflpzQ==/109951164036483747.jpg?param=140y140'
}, {
id: 3,
type: 'image',
url: 'http://p1.music.126.net/JXo18VuEJ4J6ymOn1QhBlQ==/109951164068405964.jpg?param=140y140'
}],
},
//
getSong(e){
console.log(e);
var id = e.currentTarget.dataset.id;
//跳转到歌单详情页面
wx.navigateTo({
url: '/pages/songDetail/songDetail'
})
,
app.globalData.getSongId = id;
},
tabSelect(e) {
var name = e.currentTarget.dataset.name;
console.log(name);
wx.request({
url: app.globalData.API_BASE + '/top/playlist?cat='+name,
data: {
idx: 1
},
success: res => {
console.log(name);
console.log(res);
this.setData({
images:res.data.playlists
})
// console.log(this.data.images)
wx.hideLoading();
}
}),
this.setData({
TabCur: e.currentTarget.dataset.id,
scrollLeft: (e.currentTarget.dataset.id-1)*60,
name : name
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.towerSwiper('swiperList');
wx.request({
url: app.globalData.API_BASE + '/top/playlist/highquality',
data: {
idx: 1
},
success: res => {
console.log(res.data.playlists);
this.setData({
images:res.data.playlists
})
wx.hideLoading();
}
}),
//歌单种类列表
wx.request({
url: app.globalData.API_BASE + '/playlist/catlist',
data: {
idx: 1
},
success: res => {
console.log(res.data.sub);
this.setData({
list:res.data.sub
})
wx.hideLoading();
}
})
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
DotStyle(e) {
this.setData({
DotStyle: e.detail.value
})
},
// cardSwiper
cardSwiper(e) {
this.setData({
cardCur: e.detail.current
})
},
// towerSwiper
// 初始化towerSwiper
towerSwiper(name) {
let list = this.data[name];
for (let i = 0; i < list.length; i++) {
list[i].zIndex = parseInt(list.length / 2) + 1 - Math.abs(i - parseInt(list.length / 2))
list[i].mLeft = i - parseInt(list.length / 2)
}
this.setData({
swiperList: list
})
},
// towerSwiper触摸开始
towerStart(e) {
this.setData({
towerStart: e.touches[0].pageX
})
},
// towerSwiper计算方向
towerMove(e) {
this.setData({
direction: e.touches[0].pageX - this.data.towerStart > 0 ? 'right' : 'left'
})
},
// towerSwiper计算滚动
towerEnd(e) {
let direction = this.data.direction;
let list = this.data.swiperList;
if (direction == 'right') {
let mLeft = list[0].mLeft;
let zIndex = list[0].zIndex;
for (let i = 1; i < list.length; i++) {
list[i - 1].mLeft = list[i].mLeft
list[i - 1].zIndex = list[i].zIndex
}
list[list.length - 1].mLeft = mLeft;
list[list.length - 1].zIndex = zIndex;
this.setData({
swiperList: list
})
} else {
let mLeft = list[list.length - 1].mLeft;
let zIndex = list[list.length - 1].zIndex;
for (let i = list.length - 1; i > 0; i--) {
list[i].mLeft = list[i - 1].mLeft
list[i].zIndex = list[i - 1].zIndex
}
list[0].mLeft = mLeft;
list[0].zIndex = zIndex;
this.setData({
swiperList: list
})
}
}
})
原谅我因为实在没找到轮播图的接口在哪而用了假数据,谁让我是小白呢,你们就应该宠着我。 那个轮播图用的是colorUI组件库里的,因为我觉得它的轮播效果好看。唉~别人好看也是有理由的,一个towerSwiper写了那么一大串js。只能说一句大佬,优秀了。
现在来说说点击歌单之后会干嘛吧!它会跳到一个叫歌单详情的页面 songDetail.wml
<view class=" cu-card article {{isCard?'no-card':''}}">
<view class="cu-item shadow">
<view class="content">
<image src="{{songList.coverImgUrl}}" mode="aspectFill"></image>
<view class=" line desc">
<view class="text-content">{{songList.name}}</view>
<view>
<view class="cu-avatar round margin-left" style="background-image:url({{songList.creator.avatarUrl}});"></view>
<text>{{songList.creator.nickname}}</text>
<image class="trans" style="width:18px;height:18px; margin-left:6px;" src="/images/bing.png" />
<view class="text-content">{{songList.description}}</view>
<!-- <view class="cu-tag bg-red light sm round"></view> -->
</view>
</view>
</view>
</view>
</view>
<view class="page">
<view class="page__bd">
<wux-sticky scrollTop="{{ scrollTop }}">
<wux-sticky-item class="wux-sticky-item">
<view class="title" slot="title">
<text >播放全部</text>
</view>
<view slot="content">
<view class="demo-item" wx:for="{{searchHot}}" wx:key="index" data-index="{{index}}" data-tracksId="{{item.id}}" bindtap="audioPlay" data-author="{{item.ar[0].name}}" data-name="{{item.name}}" data-poster="{{item.al.picUrl}}">
<view class="cu-list menu-avatar">
<view class="cu-item">
<view class="cu-avatar round lg" style="background-image:url({{item.al.picUrl}});"></view>
<view class="content">
<view class="text-grey">{{item.name}}</view>
<view class="text-gray text-sm flex">
<text class="text-cut">{{item.ar[0].name}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</wux-sticky-item>
</wux-sticky>
</view>
<view class="center">
<view class="play fix">
<audio poster="{{poster}}" name="{{name}}" author="{{author}}" src="{{src}}" id="myAudio" controls loop bindplay="funplay" bindpause="funpause" bindtimeupdate="" bindended="funended" binderror="funerror"></audio>
<view class="constrol">
<view class="left" bindtap="bindLeft">
<image src="../../images/left.png" />
</view>
<view class="right" bindtap="bindRight">
<image src="../../images/right.png" />
</view>
</view>
</view>
</view>
</view>
songDetail.js
// miniprogram/pages/songDetail/songDetail.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
currentIndex:null,
songList:[],
searchHot:[],
scrollTop: 0,
poster: 'https://p2.music.126.net/hti_a0LADoFMBHvOBwAtRA==/1369991500930171.jpg',
name: '刚刚好',
author: '薛之谦',
src: 'http://m10.music.126.net/20190527001601/a50b490e6d56b2bd1dbc96eebaf0992e/ymusic/ffb9/a7e1/383b/b1a4c190345688313650bfae7ffb54c4.mp3',
id : null,
},
/**
* 生命周期函数--监听页面加载
*/
onPageScroll(e){
// console.log('onPageScroll', e.scrollTop)
this.setData({
scrollTop: e.scrollTop,
})
},
onLoad: function (options) {
//获取这个id的歌单详情
wx.request({
url: app.globalData.API_BASE + '/playlist/detail?id='+app.globalData.getSongId,
// url: app.globalData.API_BASE + '/playlist/detail?id=24381616',
data: {
},
success: res => {
console.log(res);
this.setData({
searchHot:res.data.playlist.tracks,
songList : res.data.playlist
})
wx.hideLoading();
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function (e) {
// 使用 wx.createAudioContext 获取 audio 上下文 context
this.audioCtx = wx.createAudioContext('myAudio')
},
audioPlay (e){
console.log(e);
//获取这首歌的数据
wx.request({
url: app.globalData.API_BASE + '/song/url?id='+e.currentTarget.dataset.tracksid,
data: {
},
success: res => {
console.log(res.data.data[0].url);
let src = res.data.data[0].url;
this.setData({
src:src
})
}
}),
this.setData({
author : e.currentTarget.dataset.author,
name : e.currentTarget.dataset.name,
poster : e.currentTarget.dataset.poster,
id : e.currentTarget.dataset.tracksid,
currentIndex : e.currentTarget.dataset.index,
})
setTimeout( ()=>{
this.audioCtx.play()
},500)
},
//上一首
bindLeft(e){
let song = this.audioCtx;
console.log(song)
return new Promise((resolve, reject) => {
//异步一定要有个回调函数
let index = this.data.currentIndex;
if(index==0){
index=this.data.searchHot.length
}
wx.request({
url: app.globalData.API_BASE + '/song/url?id='+this.data.searchHot[index-1].id,
data: {
},
success: res => {
console.log(res);
let src = res.data.data[0].url;
// let author = this.data.searchHot[index-1].artists[0].name
let author = this.data.searchHot[index-1].al.name
this.setData({
currentIndex : index-1,
src:src,
author : author,
})
},
});
//获取这首歌歌曲的信息
wx.request({
url: app.globalData.API_BASE + '/song/detail?ids='+this.data.searchHot[index-1].id,
data: {
},
success: res => {
// console.log(res)
// console.log(res.data.songs[0].al.picUrl)
// console.log(e.currentTarget.dataset.index);
let poster = res.data.songs[0].al.picUrl;
this.setData({
poster:poster,
name : res.data.songs[0].name
})
}
})
setTimeout( ()=>{
this.audioCtx.play()
},500)
}).then(this.play())
},
play(){
this.audioCtx.play()
},
//下一首
bindRight(e){
return new Promise((resolve, reject) => {
//异步一定要有个回调函数
let index = this.data.currentIndex;
if(index==this.data.searchHot.length-1){
index=-1
}
console.log(index)
wx.request({
url: app.globalData.API_BASE + '/song/url?id='+this.data.searchHot[index+1].id,
data: {
},
success: res => {
console.log(res);
let src = res.data.data[0].url;
let author = this.data.searchHot[index+1].al.name
this.setData({
currentIndex : index+1,
src:src,
author : author,
})
},
});
//获取这首歌歌曲的信息
wx.request({
url: app.globalData.API_BASE + '/song/detail?ids='+this.data.searchHot[index+1].id,
data: {
},
success: res => {
// console.log(res)
// console.log(res.data.songs[0].al.picUrl)
// console.log(e.currentTarget.dataset.index);
let poster = res.data.songs[0].al.picUrl;
this.setData({
poster:poster,
name : res.data.songs[0].name
})
}
})
setTimeout( ()=>{
this.audioCtx.play()
},1000)
});
},
})
这里最难的一个感觉就是那个播放全部的那个吸顶容器,找了好多组件库才找到。 还有很难受的一个地方就是当时写这个的时候,因为请求数据的时候存在异步,当时还不知道promise。但知道是存在异步的,我就用了个setTimeout函数让它晚点请求,从而解决异步,现在再去看,就感觉好傻啊,改也不太好改了(尝试了一下没改成),就算了。 还有在audio上加了两个控制播放上一首和下一首的view。其他的就没啥好说的了。
search页面
search.wml
<view class="search">
<view class="search-header">
<view class="cu-bar bg-white search fixed" style="top:{{CustomBar}}px;">
<view class="search-form round">
<text class="cuIcon-search"></text>
<input type="text" placeholder="输入搜索的关键词" confirm-type="search" bindinput="forName"></input>
</view>
<view class="action">
<button class="cu-btn bg-gradual-green shadow-blur round" bindtap="search">搜索</button>
</view>
</view>
</view>
<view class="search-content">
<view class="search-item" wx:for="{{searchHot}}" wx:key="index" bindtap="audioPlay" data-index="{{index}}" data-id="{{item.id}}" data-singer ="{{item.artists[0].name}}">
<view class="search-item-top">
<text class="title">{{item.first}}{{item.name}}</text>
</view>
<view class="search-item-desc">
<text class="desc">{{item.artists[0].name}} - {{item.name}}</text>
</view>
</view>
</view>
<view class="play fix">
<audio poster="{{poster}}" name="{{name}}" author="{{author}}" src="{{src}}" id="myAudio" controls loop bindplay="funplay" bindpause="funpause" bindtimeupdate="" bindended="funended" binderror="funerror"></audio>
<view class="constrol">
<view class="left" bindtap="bindLeft">
<image src="../../images/left.png" />
</view>
<view class="right" bindtap="bindRight">
<image src="../../images/right.png" />
</view>
</view>
</view>
</view>
search.js
// miniprogram/pages/discover/discover.js
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
currentIndex:null,
searchHot : [],
poster: 'https://p2.music.126.net/hti_a0LADoFMBHvOBwAtRA==/1369991500930171.jpg',
name: '刚刚好',
author: '薛之谦',
src: 'http://m10.music.126.net/20190527001601/a50b490e6d56b2bd1dbc96eebaf0992e/ymusic/ffb9/a7e1/383b/b1a4c190345688313650bfae7ffb54c4.mp3',
id : null,
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
//热搜
wx.request({
url: app.globalData.API_BASE + '/search/hot',
data: {
},
success: res => {
console.log(res.data);
this.setData({
searchHot:res.data.result.hots
})
}
});
// 使用 wx.createAudioContext 获取 audio 上下文 context
this.audioCtx = wx.createAudioContext('myAudio')
},
//单击播放音乐
audioPlay (e){
console.log(e);
//获取这首歌的数据
wx.request({
url: app.globalData.API_BASE + '/song/url?id='+e.currentTarget.dataset.id,
data: {
},
success: res => {
// console.log(res);
let src = res.data.data[0].url;
this.setData({
src:src,
author : e.currentTarget.dataset.singer,
})
}
}),
//获取这首歌歌曲的信息
wx.request({
url: app.globalData.API_BASE + '/song/detail?ids='+e.currentTarget.dataset.id,
data: {
},
success: res => {
// console.log(res)
// console.log(res.data.songs[0].al.picUrl)
console.log(e.currentTarget.dataset.index);
let poster = res.data.songs[0].al.picUrl;
this.setData({
currentIndex : e.currentTarget.dataset.index,
poster:poster,
name : res.data.songs[0].name
})
}
}),
setTimeout( ()=>{
this.audioCtx.play()
},500)
},
//获取到input框的内容
forName(e){
console.log(e.detail.value);
this.setData({
keywords : e.detail.value
})
},
//根据keywords查找歌曲
search(e){
wx.request({
url:app.globalData.API_BASE +'/search?keywords='+this.data.keywords,
success:res =>{
console.log(res.data.result.songs);
this.setData({
searchHot : res.data.result.songs,
})
}
})
},
//上一首
bindLeft(e){
let song = this.audioCtx;
console.log(song)
return new Promise((resolve, reject) => {
//异步一定要有个回调函数
let index = this.data.currentIndex;
if(index==0){
index=this.data.searchHot.length
}
wx.request({
url: app.globalData.API_BASE + '/song/url?id='+this.data.searchHot[index-1].id,
data: {
},
success: res => {
console.log(res);
let src = res.data.data[0].url;
let author = this.data.searchHot[index-1].artists[0].name
this.setData({
currentIndex : index-1,
src:src,
author : author,
})
},
});
//获取这首歌歌曲的信息
wx.request({
url: app.globalData.API_BASE + '/song/detail?ids='+this.data.searchHot[index-1].id,
data: {
},
success: res => {
// console.log(res)
// console.log(res.data.songs[0].al.picUrl)
// console.log(e.currentTarget.dataset.index);
let poster = res.data.songs[0].al.picUrl;
this.setData({
poster:poster,
name : res.data.songs[0].name
})
}
})
setTimeout( ()=>{
this.audioCtx.play()
},500)
}).then(this.play())
},
play(){
this.audioCtx.play()
},
//下一首
bindRight(e){
return new Promise((resolve, reject) => {
//异步一定要有个回调函数
let index = this.data.currentIndex;
if(index==this.data.searchHot.length-1){
index=-1
}
console.log(index)
wx.request({
url: app.globalData.API_BASE + '/song/url?id='+this.data.searchHot[index+1].id,
data: {
},
success: res => {
console.log(res);
let src = res.data.data[0].url;
let author = this.data.searchHot[index+1].artists[0].name
this.setData({
currentIndex : index+1,
src:src,
author : author,
})
},
});
//获取这首歌歌曲的信息
wx.request({
url: app.globalData.API_BASE + '/song/detail?ids='+this.data.searchHot[index+1].id,
data: {
},
success: res => {
// console.log(res)
// console.log(res.data.songs[0].al.picUrl)
// console.log(e.currentTarget.dataset.index);
let poster = res.data.songs[0].al.picUrl;
this.setData({
poster:poster,
name : res.data.songs[0].name
})
}
})
setTimeout( ()=>{
this.audioCtx.play()
},500)
});
},
})
主要功能就是,通过你输入的字来搜索你想听的歌。也是用的网易的接口。 其他页面就算了,感觉自己说了一大堆也没讲明白。哦,对了。那个朋友界面的接口网易云官方文档上有点问题,明明不需要登录就能获取,但我要先在浏览器打开一遍,才能再去微信者开发工具调用一遍接口请求才能获取的数据。 这是这个小程序的github地址想要的可以看下(其实没啥软用)
感觉也没人能坚持看到这里,毕竟好无聊。
这个还有好多东西没写,最近还要忙别的。所以先搁一搁。等以后有空我肯定还会回来的。因为那个签到功能和朋友界面的看评论,点赞啊还没写,那是自己最喜欢的。
其实我还有一个很喜欢的app就是最右,等以后变成厉害一点的小白,还想仿个最右。最右上的神评是真的有意思(默默的给最右推广一下)。毕竟喜欢的东西就应该去追求! 啦啦啦,完结。 祝你们都能自己想要的样子!
