# 微信小程序音乐项目
**Repository Path**: yanhsama/wechat-app-music-project
## Basic Information
- **Project Name**: 微信小程序音乐项目
- **Description**: 微信小程序音乐项目
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2020-09-05
- **Last Updated**: 2022-04-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 微信小程序项目微音乐
热门歌曲接口
```js
https://api.zsfmyz.top/music/top
https://api.zsfmyz.top/music/list?p=1&n=30&w=蔡徐坤
https://api.zsfmyz.top/music/song?songmid=000aWBBQ2fMyBJ&guid=126548448
https://api.zsfmyz.top/music/lyric?songmid=000wocYU11tSzS
```
前提:不校验接口
# 底部导航(首页,搜索,热门)
```json
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath":"/icons/shouye.png",
"selectedIconPath":"/icons/shouye.png"
},
{
"pagePath": "pages/music/music",
"text": "search",
"iconPath":"/icons/sousuo.png",
"selectedIconPath":"/icons/sousuo.png"
},
{
"pagePath": "pages/hotTop/hotTop",
"text": "hotTop",
"iconPath":"/icons/remen.png",
"selectedIconPath":"/icons/remen.png"
}
]
```
# 热门音乐(hotTop)
步骤1:获取热门音乐列表,将所需数据保存到data的hotMusicName
```js
/**
* 页面的初始数据
*/
data: {
hotMusicName:[]
}
```
```js
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
wx.request({
url: 'https://api.zsfmyz.top/music/top',
success:(res)=>{
this.setData({
hotMusicName:res.data.data.list
//便于后面上一首,下一首农夫
app.globalData.searchData=res.data.data.list
})
console.log(res)
},
fail:(err)=>{
console.log(err)
}
})
}
```
步骤2:将数据渲染到页面
```html
热门歌曲
{{item.songname}}- {{item.singer.name}}
```
步骤3:点击播放歌曲——获取歌曲id
```js
playMusic:function (e) {
console.log(e.currentTarget.dataset)
}
```
```js
//代码输出结果
{songmid: "0013KFa32c9lVn", songname: "不爱我"}
```
步骤4:获取音频播放源
封装wx.request
```js
function getRequest(url,params) {
let promise=new Promise((resolve,reject)=>{
wx.request({
url:url,
data:params,
header:{
'content-type': 'application/json' // 默认值
},
success:(res)=>{
resolve(res)
},
fail:(err)=>{
reject(err)
}
}
)
})
return promise
}
export default getRequest
```
将获取的请求数据保存到data中
```js
playMusic:function (e) {
let songmid=e.currentTarget.dataset.songmid
// console.log(songmid)
let url='https://api.zsfmyz.top/music/song'
let params={
songmid:songmid,
guid:'126548448'
}
console.log(params)
let promise=getRequest(url,params)
promise.then(res=>{
this.setData({
detailMusic:res.data.data
})
})
}
```
全局配置音乐播放配置(app.json)
```json
"requiredBackgroundModes": ["audio", "location"]
```
# 播放音源
步骤1:在全局创建wx.createInnerAudioContext()
```js
const myaudio=wx.createInnerAudioContext()
```
步骤2:示例对象赋予音源地址,自动播放
```js
setTimeout(()=>{
wx.navigateTo({
url:'/pages/lyric/lyric'
})
audio.src=app.globalData.musicData.musicUrl
audio.autoplay=true
},1000)
```
# 搜索音乐
步骤1:基本布局
```html
搜索
```
步骤2:输入音乐名点击搜索
```js
data: {
musicName:'',
searchData:[]
}
```
```js
// 得到要搜索的歌名
getValue:function(e){
this.setData({
musicName:e.detail.value
})
console.log(this.data.musicName)
}
```
将搜索的数据保存到全局和页面data中
```js
// 搜索歌曲
searchMusic:function(){
let url='https://api.zsfmyz.top/music/list'
let data={
p:1,
n:30,
w:this.data.musicName
}
console.log(data)
let promise=getRequest(url,data)
promise.then((res)=>{
app.globalData.searchData=res.data.data.list
this.setData({
searchData:res.data.data.list
})
// console.log(res)
})
console.log(app.globalData)
}
```
步骤3:将歌曲渲染至页面
```html
{{item.songname}}-{{item.singer.name}}
```
步骤4:根据id搜索音频音源与歌词
```js
//点击播放
playSearchMusic:function(e){
// console.log(e)
let songmid=e.currentTarget.dataset.songmid
let params1={
songmid:songmid,
guid:'126548448'
}
//查找音源
let promise1=getRequest('https://api.zsfmyz.top/music/song',params1)
promise1.then((res)=>{
app.globalData.musicData=res.data.data
console.log(res)
})
let params2={
songmid:songmid
}
//查找歌词
let promise2=getRequest('https://api.zsfmyz.top/music/lyric',params2)
promise2.then((res)=>{
app.globalData.lyricData=res.data.data.lyric
console.log(res)
})
//跳转歌词界面
setTimeout(()=>{
wx.navigateTo({
url:'/pages/lyric/lyric'
})
audio.src=app.globalData.musicData.musicUrl
audio.autoplay=true
},1000)
}
```
# 将歌词,海报渲染到页面上
```html
{{item.words}}
```
```js
data: {
lyric:'',
lyricAll:{},
singerImg:""
},
onLoad: function (options) {
this.setData({
lyric:app.globalData.lyricData,
singerImg:app.globalData.singerImg
})
let obj=detailLyric(this.data.lyric)//将处理后的歌词保存到变量obj中
console.log(obj)
this.setData({
lyricAll:obj//将歌词保存到页面的data中
})
```
# 暂停|播放
```js
// 暂停|播放
isplay:function(){
if(audio.paused){
audio.play()
}else{
audio.pause()
}
}
```
# 播放自动条实现
```html
```
```js
data: {
nowTimePre:'',
duration:0
}
```
```js
audio.onTimeUpdate(()=>{
audio.currentTime
audio.duration
this.setData({
nowTimePre:audio.currentTime/audio.duration*100
})
})
```
# 自动播放下一首
步骤1:将搜索的歌曲全部id组成一个数组
```js
data: {
nowTimePre:'',
duration:0,
searchData:[],//歌曲id数组
searchImg:[]//海报id
}
```
```js
let len=app.globalData.searchData.length//搜索歌曲数组长度
let searchSongmid=[]//歌曲id数组
for(let index=0;index{}
```
步骤4:当音源结束时,得到下一个索引的id,并求音源,歌词
```js
num=(num + 1)%len//下一首的索引号
console.log(num)
// console.log(searchSongmid)
let nextsongmid=searchSongmid[num]//下一首歌曲id
app.globalData.singerImg=searchImg[num]//跟新歌手海报
//console.log(nextsongmid)
//console.log('eddd..')
let url1='https://api.zsfmyz.top/music/song'
let params1={
songmid:nextsongmid,
guid:'126548448'
}
// 音源
let promise1=getRequest(url1,params1)
promise1.then((res)=>{
//console.log(res.data.data)
app.globalData.musicData=res.data.data
audio.src=res.data.data.musicUrl
})
// 歌词
let url2='https://api.zsfmyz.top/music/lyric'
let params2={
songmid:nextsongmid
}
let promise2=getRequest(url2,params2)
promise2.then((res)=>{
app.globalData.lyricData=res.data.data.lyric
console.log(res.data.data)
})
```
步骤5:海报,歌词页面渲染更新(lyric.js)
```js
onLoad: function (options) {
this.setData({
lyric:app.globalData.lyricData,
singerImg:app.globalData.singerImg
})
let obj=detailLyric(this.data.lyric)
// console.log(obj)
this.setData({
lyricAll:obj
})
// console.log(this.data.lyricAll)
// console.log(this.data.singerImg)
audio.onEnded(()=>{
setTimeout(()=>{//延迟1s执行
this.setData({
lyric:app.globalData.lyricData,
singerImg:app.globalData.singerImg
})
let obj=detailLyric(this.data.lyric)
// console.log(obj)
this.setData({
lyricAll:obj
})
console.log(this.data.lyricAll)
console.log(this.data.singerImg)
})
})
}
```
完整代码
```js
ready(){
let len=app.globalData.searchData.length//搜索歌曲数组长度
let searchSongmid=[]//歌曲id数组
for(let index=0;index{
num=(num + 1)%len
console.log(num)
// console.log(searchSongmid)
let nextsongmid=searchSongmid[num]
app.globalData.singerImg=searchImg[num]//跟新歌手海报
console.log(nextsongmid)
console.log('eddd..')
let url1='https://api.zsfmyz.top/music/song'
let params1={
songmid:nextsongmid,
guid:'126548448'
}
// 音源
let promise1=getRequest(url1,params1)
promise1.then((res)=>{
console.log(res.data.data)
app.globalData.musicData=res.data.data
audio.src=res.data.data.musicUrl
})
// 歌词
let url2='https://api.zsfmyz.top/music/lyric'
let params2={
songmid:nextsongmid
}
let promise2=getRequest(url2,params2)
promise2.then((res)=>{
app.globalData.lyricData=res.data.data.lyric
console.log(res.data.data)
})
})
//当音频监听,实现进度条自动
audio.onTimeUpdate(()=>{
audio.currentTime
audio.duration
this.setData({
nowTimePre:audio.currentTime/audio.duration*100
})
})
// console.log(this.data.searchData)
}
```
# 下一首
```js
nextplay:function(){
audio.stop()
// console.log('next....')
let len=this.data.searchData.length;//数组长度
console.log(len)
let nowSongmid=app.globalData.nowSongmid//当前播放歌曲id
let searchSongmid=this.data.searchData
let searchImg=this.data.searchImg
console.log(nowSongmid)
let index //当前索引
for(let i in searchSongmid){
// console.log(i)
if(searchSongmid[i]==nowSongmid){
index=i
}
}
console.log('当前索引:'+typeof index)//string
let num =Number(index)
num=(num +1 )%len
console.log('下一个索引:'+num)
let nextsongmid=searchSongmid[num]//下一首id
app.globalData.nowSongmid=nextsongmid
app.globalData.singerImg=searchImg[num]//下一首海报
let url1='https://api.zsfmyz.top/music/song'
let params1={
songmid:nextsongmid,
guid:'126548448'
}
// 音源
let promise1=getRequest(url1,params1)
promise1.then((res)=>{
// console.log(res.data.data)
app.globalData.musicData=res.data.data
audio.src=res.data.data.musicUrl
})
// 歌词
let url2='https://api.zsfmyz.top/music/lyric'
let params2={
songmid:nextsongmid
}
let promise2=getRequest(url2,params2)
promise2.then((res)=>{
app.globalData.lyricData=res.data.data.lyric
})
console.log(app.globalData.singerImg)
}
```
歌词海报更新
```js
audio.onStop(()=>{
setTimeout(()=>{
this.setData({
lyric:app.globalData.lyricData,
singerImg:app.globalData.singerImg
})
let obj=detailLyric(this.data.lyric)
// console.log(obj)
this.setData({
lyricAll:obj
})
// console.log(this.data.lyricAll)
// console.log(this.data.singerImg)
})
})
```
# 上一首
```js
num=(num + (len-1) )%len
```
```js
preplay:function () {
audio.stop()
// console.log('next....')
let len=this.data.searchData.length;//数组长度
console.log(len)
let nowSongmid=app.globalData.nowSongmid//当前播放歌曲id
let searchSongmid=this.data.searchData
let searchImg=this.data.searchImg
console.log(nowSongmid)
let index //当前索引
for(let i in searchSongmid){
// console.log(i)
if(searchSongmid[i]==nowSongmid){
index=i
}
}
console.log('当前索引:'+typeof index)//string
let num =Number(index)
num=(num + (len-1) )%len
console.log('下一个索引:'+num)
let nextsongmid=searchSongmid[num]//下一首id
app.globalData.nowSongmid=nextsongmid
app.globalData.singerImg=searchImg[num]//下一首海报
let url1='https://api.zsfmyz.top/music/song'
let params1={
songmid:nextsongmid,
guid:'126548448'
}
// 音源
let promise1=getRequest(url1,params1)
promise1.then((res)=>{
// console.log(res.data.data)
app.globalData.musicData=res.data.data
audio.src=res.data.data.musicUrl
})
// 歌词
let url2='https://api.zsfmyz.top/music/lyric'
let params2={
songmid:nextsongmid
}
let promise2=getRequest(url2,params2)
promise2.then((res)=>{
app.globalData.lyricData=res.data.data.lyric
})
console.log(app.globalData.singerImg)
}
```
# 模板与组件的区别
# 页面中使用commponent
定义组件play.wxml
```html
上一首
下一首
```
play.js
```js
// components/play/paly.js
Component({
properties: {
},
/**
* 组件的方法列表
*/
methods: {
isplay:function(){
console.log('paly')
}
}
})
```
页面中使用
页面的进行json配置
```json
"usingComponents": {
"play":"../../components/play/play"
}
```
```html
```
页面中使用全局data
```js
globalData: {
developAdmin:'YanHilin',
musicUrl:[]
}
```
```js
const app = getApp()
console.log(app.globalData)
```
将页面中请求的数据保存到全局data
```js
const app=getApp()
promise.then(res=>{
app.musicUrl=res.data.data
this.setData({
detailMusic:res.data.data
})
})
```
# 局部页面中使用全局数据
```js
let app=getApp()
data: {
lyric:''
},
onLoad: function (options) {
this.setData({
lyric:app.globalData.lyricData
})
}
```