微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序

文章目录

  • 一、项目简介
  • 二、项目结构
  • 三、开发工具
  • 四、项目截图
  • 五、项目地址
  • 六、部分代码
  • 七、项目运行
  • 八、特别声明

一、项目简介

此小程序以网易云音乐为原型进行项目构建,使用网易云音乐真实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
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第1张图片
工具获取地址:
链接:https://pan.baidu.com/s/1IuotjQTt4vGOKBrGBl_ftg
提取码:vvoz

四、项目截图

(1)主页面
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第2张图片

(2)视频页面
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第3张图片

(3)个人页面
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第4张图片

(4)推荐页面
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第5张图片

(5)播放页面
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第6张图片

五、项目地址

https://gitee.com/master-xu-shen/xu-sheng-cloud-music
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第7张图片

六、部分代码

// 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开启服务
微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序_第8张图片

可能会提示nodemon不是内外部程序,则通过npm install -g nodemon解决
找不到 module(双引号出现什么单词,就 npm install 那个单词,或者直接 npm install)

八、特别声明

1、此项目仅供学习与交流使用
2、 有问题大家可以留言呦

你可能感兴趣的:(小程序,项目实战,小程序,微信小程序)