Git Product home page Git Product logo

vue-music-webapp's Introduction

Vue 网易云音乐 WebApp

🎹 基于 Vue(2.5) + vuex + vue-router + vue-axios +better-scroll + Scss + ES6 等开发一款移动端音乐 WebApp,UI 界面参考了安卓版的网易云音乐、flex 布局适配常见移动端。

😋 项目演示地址:移动端音乐 WebApp,或者可以扫描二维码访问:

  • 推荐使用手机预览,电脑在 Chrome 调试模式下食用效果更佳,开启调试模式的手机模式后,如果不能滚动,刷新一下页面即可

预览

图片虽然压缩过了,但是几张加载一起还是有 3MB 左右,所以请耐心等待一下啦:joy:。感觉不错的可以去上面 :point_up:的地址体验一下呦~

推荐、排行榜、歌手

推荐、排行、歌手

歌单详情、个人中心

详情页面

播放器、播放列表

播放器

搜索页面

搜索

开发目的

通过学习开发一个 Vue 全家桶项目,让自己更熟练的使用 Vue 全家桶、模块化开发、ES6 等等知识,提高自己的技术能力。

技术栈

前端

  • Vue:用于构建用户界面的 MVVM 框架
  • vue-router:为单页面应用提供的路由系统,使用了 Lazy Loading Routes 技术来实现异步加载优化性能
  • vuex:Vue 集中状态管理,在多个组件共享某些状态时非常便捷
  • vue-lazyload:实现图片懒加载,节省用户流量,优化页面加载速度
  • better-scroll:解决移动端各种滚动场景需求的插件,使移动端滑动体验更加流畅
  • SCSS:css 预编译处理器
  • ES6:ECMAScript 新一代语法,模块化、解构赋值、Promise、Class 等方法非常好用

后端

  • Node.js:利用 Express 搭建的本地测试服务器
  • vue-axios:用来请求后端 API 音乐数据
  • NeteaseCloudMusicApi:网易云音乐 NodeJS 版 API,提供音乐数据

其他工具

  • vue-cli:Vue 脚手架工具,快速初始化项目代码
  • eslint:代码风格检查工具,帮助我们规范代码书写(一定要养成良好的代码规范)
  • iconfont :阿里巴巴图标库,谁用谁知道
  • fastclick :消除 click 移动游览器 300ms 的延

实现功能

播放器内核、推荐页面、热榜页面、歌手页面、歌单详情、歌手详情、排行榜详情、搜索页面、播放列表、用户中心等等功能。

推荐页面

推荐页分成三个部分,分别是 banner 轮播图、推荐歌单、推荐歌曲,数据都是使用 axios 请求 API 获取得到的,图片都使用 vue-lazyload 实现懒加载。

轮播图:使用 better-scroll 实现,具体可以看这里 Slide点击跳转方面只实现歌曲和歌单的跳转,因为暂时只实现了这两个功能。

推荐歌单,推荐歌曲:使用 vuex 管理数据,方便组件之间的数据交互(播放器播放歌曲)。因为数据上还有播放数量,所以就顺便也加上去了。

排行榜页面

同样是通过 API 获取到排行榜的数据,但是因为 API 获取到的是排行榜中所有歌曲的数据,所以难免在加载速度上有点慢,后期再看能不能优化一下,加载的慢毕竟太影响用户体验了,别的就没什么了。

歌手页面

实现歌手列表的左右联动(这个需要理解理解),因为之前已经写过和这个有关的博客,所以就不多写了,具体可以看我之前的这个笔记 ➡️ 移动端字母索引导航

歌曲列表组件

用来显示歌曲列表,在很多的地方都进行了复用,例如:歌单详情页、排行榜详情页、歌手详情页、搜索结果、用户中心等等。

歌单详情页

通过歌单的 ID 来获取歌单中的歌曲数据,然后还做了一些体验上面的交互,比如上滑显示状态栏然后将状态栏标题变为歌单名,具体可以尝试一下就知道了。

然后就是复用 歌曲列表组建 来显示歌曲。

排行榜详情、歌手详情

和歌单详情基本上没有什么区别,除了 UI 界面方面有细微的改动(根据不同的内容作出不同的优化)。

播放器

最最最重要的组件,毕竟是个音乐播放器,不能放歌那啥都是扯淡了。

实现功能:顺序播放、单曲循环、随机播放、收藏等。

播放、暂停使用 HTML5 的 audio 实现。

数据、播放状态、播放历史、习惯歌曲等方面使用了 vuex 来进行管理,因为数据太多,组件直接传递的话是会死人的,所以还是老老实实的用 vuex 吧,数据之前的传递真的很方便。

图标使用 iconfont 阿里巴巴图标库,中间的唱片旋转动画使用了 animation 实现。

歌词部分获取到网易的歌词数据,然后使用 第三方库 lyric-parser 进行处理。实现显示歌词、拖动进度条歌词同步滚动、歌词跟随歌曲进度高亮。

通过 localstorage 存储喜欢歌曲、播放历史数据。

audio 标签在移动端不能够自动播放的问题

电脑端是没有这个问题的,这个问题真的是让我很头大,最后是用了很鬼畜的方法解决了(使用 addEventListener 监听 touchend 事件,然后在回调函数中让 audio 播放一次,具体看 App.vue 文件,注释有写)。

播放列表

显示和管理当前播放歌曲,可以用来删除列表中的歌曲、以及选择播放歌曲。

搜索功能

实现功能:搜索歌手、歌单、歌曲、热门搜索、数据节流、上拉刷新、保存搜索记录。

通过关键字请求 API 获取搜索数据,显示歌手、歌单、歌曲。

实现了上刷新,因为搜索可以设置请求数据的条数,所以可以用来实现上刷新的功能。

通过节流函数实现数据节流,通过 localstorage 存储搜索数据。

用户中心

将在本地存储的数据显示出来,方便用户使用,后期准备添加更多功能。

TODO

  1. 优化排行榜加载速度
  2. 优化重复代码
  3. 增加歌曲评论
  4. 增加 MV、电台 功能
  5. emm,更多功能容我再想想哈

感谢

最后

如果觉得我的项目还不错的话 👏,就给个 star ⭐ 鼓励一下吧~

Build Setup

克隆代码到本地之后,需要运行 NeteaseCloudMusicApi,来起一个音乐的 API 接口。

如果需要在服务器上搭建的话就需要将 API 放到自己的服务器上面。

# install dependencies
npm install

# serve with hot reload at localhost:8080
npm run dev

# build for production with minification
npm run build

vue-music-webapp's People

Contributors

caijinyc avatar dependabot[bot] avatar vintotsai avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vue-music-webapp's Issues

Couldnot Play Any Music

I tried the demo you posted,however,none of music can be played on my phone,neither on my computer(Chrome).
Also I wrote a Dockerfile to build it on my VPS.The same problem appears.

请教:我用vue写的播放器,点击下一曲的时候偶尔不会更新音乐src

附上代码

 <audio id="musicAudio" autoplay="autoplay" :src="tracksAudioPlay.length>0?tracksAudioPlay[playingIndex].src:defaultMusic">
  </audio>
解释:src是根据接口返回的播放列表的list的每一项的url获取的,例如list=[{url:'111.mp3'}]
点击下一曲:
nextMusic(){
        let playingIndex = this.playingIndex
//this.playway是播放方式的index,0循环1随机2单曲,randomIndex是产生随0-length的随机整数函数
        switch (this.playWay){
          case 1:
            this.playingIndex = randomIndex(0,this.tracksAudioPlay.length)
            break;
          default:
            this.playingIndex=(++playingIndex)%(this.tracksAudioPlay.length);
            break;
        }
        this.isPaused = false
      },

song.js里没有recommendsonglist()呀

我也是,我在国外怀疑是服务器的问题,然后网易云文档说需要在网易云api的/utils/request.js 中改变header的服务器。但是我改变了没有用

我已经改好了,其实是api接口变了。你去song.js里面找那个recommendsonglist()方法,然后把api接口的参数改一下

Originally posted by @angrebobo in #37 (comment)

关于获取不到歌单列表

在点开歌单后,控制台输出
Uncaught (in promise) TypeError: Cannot read property 'map' of undefined
at singerName (song.js?38db:17)
应该是生成SingerName的方法里面有错,但是我不会改,所以求求大大看一下,告诉我怎么改

音乐播放的node跑的接口是否有问题呢

你的接口是music/url?id=33894312,我这本地跑的是node用song//url?id=33894312才可以呢。
还有你的项目和我的项目都报这个错:
Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().
这是什么原因呢

几点改进的建议

用户体验很好啊,居然是自己不靠UI框架写出来的,不错。
关于几点改进的建议
1.axios promise后面最好跟一下catch捕获错误,then里面只能打印请求成功但非200的错误信息。
2.既然用了Vuex,那么异步方法全部写到action里面去,用生命周期控制。尽量少用ref,props等,保持代码整洁。
3.一些接口有点变化,比如newsong,lyric。
我也试试大改一下你的代码

播放进度条锚点位置有bug

全屏播放器的进度条锚点图标位置有些问题,如果是使用mini播放器点击暂停时,再点击打开全屏播放器,此时进度条的progress-btn定位在初始位置,只有点击播放时,progress-btn才会再次自动移动到正确的位置。经过分析代码,主要是这里的代码导致的
文件:src/base/progress-bar/progress-bar.vue
watch: { percent (newPercent) { if (newPercent >= 0 && !this.touch.initiated) { const barWidth = this.$refs.progressBar.clientWidth - progressBtnWidth const offsetWidth = newPercent * barWidth this._offset(offsetWidth) } } }

当全屏播放器隐藏时,this.$refs.progressBar.clientWidth = 0,所以此时设置offsetWidth就变成在初始位置了。

暂时还在想办法修复,等修复完了,再回来评论。

vue2.5.2调用audio的play()移动端无法播放

楼主,请教下您,有没有遇到过类似的问题,在vue2.5.2中执行audio play()方法,音乐无法播放,下面是我的代码:
<div class="song-list-wrap" ref="songListWrap"> <div class="wrapper" v-if="songList && songList.tracks.length"> <div class="song-item" v-for="song in songList.tracks" :key="song.id" @click.stop="getSong(song.id)"> <div class="song-name ellipsis">{{ song.name }}</div> <p class="song-singer ellipsis">{{ song.ar[0].name }}</p> </div> </div> </div>
`methods: {
getSong (id) {
let musicPlayer = document.getElementById('audio')
console.log('获取audio对象', musicPlayer)
// 异步获取歌曲的url
getSongUrl(id).then(urlData => {
console.log('获取歌曲url', urlData)
if (urlData.code === 200) {
this.songUrl = urlData.data[0].url
// this.$store.state.musicPlayer

      musicPlayer.src = urlData.data[0].url
      musicPlayer.play()
      console.log('musicPlayer', musicPlayer)
    }

}
}`
这样写,在浏览器下是可以播放的,但是在移动端无法播放;不知道楼主遇到过没?麻烦指点下,先谢谢你了

关于需要更新音乐播放url的提示

本项目中安装完之后执行npm run dev之后运行起来的平台是无法实现音乐播放的,其他功能均可实现,缘由是cloud-node-api:3000的api参数变了:
本项目请求音乐播放地址:/music/url?id=xxxx
对应的请求音乐播放地址:/song/url?id=xxxx

将地址中的music改成song便可运行

音乐播放

我这项目 跑起来后,音乐播放报错
image

vuex 的使用

vuex 的state改变不是应该在mutation里处理吗?不知道在您的代码里为何处理state放在了action里?是有什么原因吗?

推荐页轮播图未显示

初步判断项目缺少一个文件。
base/slider/slider.vue 与 base/scroll/scroll.vue 都有引用slot组件,但整个项目并未找到slot组件。能否解决一下?

安卓 ios audio无法自动播放如何自动解决

想问你一下大神,你是如何解决这个安卓 ios audio无法自动播放,你点击播放列表中的某一首歌进入播放界面,如何实现自动播放呢。我在写demo的时候通过程序来触发play事件也无法播放。

搜索功能

搜索不到时没有提示!(比如搜索在人间)

歌词好像与唱的内容不一样啊

我在听薛之谦的演员的时候,我发现唱的会比歌词快一点。其他的好多歌曲都有这个bug,请问作者您知道这个是因为什么嘛?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.