此小程序以网易云音乐为原型进行项目构建,使用网易云音乐真实API接口数据,且最终效果同网易云音乐App保持一致。
内容从基础到高级,涵盖小程序常用的所有知识点,包括:事件、数据绑定、路由、自定义组件、自定义模板、音乐播放、视频播放、性能优化及项目上线前分包操作等。可以快速上手小程序开发,真正做到从入门到精通!
Nodejs作为后端,跨站请求伪造 (CSRF), 伪造请求头 , 调用官方 API
网易云音乐NodeJS版API
使用ES6语法
使用promise对象进行异步请求资源
使用moment.js进行时间日期处理
使用pubsub.js消息的发布订阅,进行组件间数据的传递
XuSHengYun_music // 虚神云音乐
├── components // 组件
├── XuSHengYun_api_server // node版本网易云音乐接口
├── pages // 小程序页面
│ └── index // 首页
│ └── login // 登录页
│ └── personal // 个人中心
│ └── recommendSong // 每日推荐
│ └── search // 搜索页
│ └── songDetail // 音乐详细页
│ └── songListDetail // 歌单页
│ └── video // 视频页
├── utils // 工具
│ └── request.js // 请求封装体
├── static // 静态资源
wechat_devtools_1.02.1911180_x64
工具获取地址:
链接:https://pan.baidu.com/s/1IuotjQTt4vGOKBrGBl_ftg
提取码:vvoz
https://gitee.com/master-xu-shen/xu-sheng-cloud-music
// pages/index/index.js
import request from "../../utils/request";
Page({
/**
* 页面的初始数据
*/
data: {
bannerList: [], // 轮播图数据
recommendList: [], // 推荐歌单
topList: [], // 排行榜数据
listIndex: 0, // 哪个排行榜
musicIndex: 0, // 哪个音乐
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: async function (options) {
/*wx.request({
url:'http://localhost:3000/banner',
data: {type: 2},
success:(res) =>{
console.log('请求成功:',res);
},
fail:(err) => {
console.log('请求失败:',err);
}
})*/
let bannerListData = await request('/banner',{type:2})
this.setData({
bannerList: bannerListData.banners
})
// 获取推荐歌单数据
let recommendListData = await request('/personalized', {limit: 10});
this.setData({
recommendList: recommendListData.result
})
// 获取排行榜数据
/*
* 需求分析:
* 1. 需要根据idx的值获取对应的数据
* 2. idx的取值范围是0-20, 我们需要0-4
* 3. 需要发送5次请求
* 前++ 和 后++的区别
* 1. 先看到是运算符还是值
* 2. 如果先看到的是运算符就先运算再赋值
* 3. 如果先看到的值那么就先赋值再运算
* */
let index = 0;
let resultArr = [];
while (index < 5){
let topListData = await request('/top/list', {idx: index++});
// splice(会修改原数组,可以对指定的数组进行增删改) slice(不会修改原数组)
let topListItem = {name: topListData.playlist.name, tracks: topListData.playlist.tracks.slice(0, 3)};
resultArr.push(topListItem);
// 不需要等待五次请求全部结束才更新,用户体验较好,但是渲染次数会多一些
this.setData({
topList: resultArr
})
}
// 更新topList的状态值, 放在此处更新会导致发送请求的过程中页面长时间白屏,用户体验差
// this.setData({
// topList: resultArr
// })
// 订阅来自 songDetail 页面的事件
PubSub.subscribe('switchMusic', (msg, data) => {
let {
topList,
listIndex,
musicIndex
} = this.data
if (data === 'pre') {
// 上一首
if (musicIndex === 0) {
musicIndex = topList[listIndex].tracks.length - 1
} else {
musicIndex -= 1
}
} else {
// 下一首
if (musicIndex === topList[listIndex].tracks.length - 1) {
musicIndex = 0
} else {
musicIndex += 1
}
}
this.setData({
musicIndex
})
let musicId = topList[listIndex].tracks[musicIndex].id
console.log(musicId);
PubSub.publish('musicId', musicId)
})
},
//跳转到每日推荐歌曲页面
toRecommendSong(){
wx.navigateTo({
url: '/songPackage/pages/recommendSong/recommendSong',
})
},
// 跳转至 songListDetail
toSongListDetail(event) {
wx.redirectTo({
url: '/pages/songListDetail/songListDetail?id=' + event.currentTarget.dataset.id
})
},
//跳转到搜索页面
toSearch(){
wx.navigateTo({
url: '/pages/search/search',
})
},
toSongDetail(event){
let songDetail = event.currentTarget.dataset
let {
song,
listIndex,
musicIndex
} = songDetail
this.setData({
listIndex,
musicIndex
})
wx.navigateTo({
url: '/songPackage/pages/songDetail/songDetail?song=' + event.currentTarget.id
})
},
//跳转到歌单歌曲列表页面
toPlayList(event){
wx.navigateTo({
url: '/pages/playlist/playlist?id=' + event.currentTarget.id
})
},
toOther(){
wx.navigateTo({
url:'/songPackage/pages/other/other'
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
(1)git到本地,或者下载zip包解压
(2)进入 硅谷音乐_server 目录
(3)在路径栏输入cmd
(4)npm start开启服务
可能会提示nodemon不是内外部程序,则通过npm install -g nodemon解决
找不到 module(双引号出现什么单词,就 npm install 那个单词,或者直接 npm install)
1、此项目仅供学习与交流使用
2、 有问题大家可以留言呦