《移动应用开发》实验报告——音乐播放器

系统管理员 2023-01-22 04:52 303阅读 0赞

代码仓库: https://gitee.com/shentuzhigang/demo-project/tree/master/vue-music-player

Blog: https://shentuzhigang.blog.csdn.net/article/details/116936161

实验目标

1.掌握使用Vue-CLI脚手架工具在自己的电脑上建立项目,并会运行调试工具。
2.了解vue-aplayer插件的使用方法。
3.理解如何使用 axios 发起 http 请求的方法。
4.使用QQ音乐、网易云音乐等API接口开发简单音乐播放手机应用,学习通过网络接口的调用,培养复杂问题简单化思维。

实验内容

1.要求使用Vue-CLI脚手架工具搭建一个Web项目vue-music(本次实验必须用Vue-CLI脚手架搭建项目)。实验报告要求将项目文件结构截图,并简单介绍。
2.安装依赖,使用Node.js运行mock-serve中server服务,运行Music-play-front中源码,参照运行效果,实现一个简单手机音乐播放应用网页。
3.使用Vue组件编程方法完成主要功能,具体使用的编程技术不限。
4.实现最基本的音乐播放功能即可完成实验基础内容(基础部分满分96分)。
5.自选扩展实验:模仿手机上的QQ音乐播放器,实现一个手机音乐播放器Web应用。本条扩展内容请根据自己的学习情况选做(4分)。


截图展示

请添加图片描述
在这里插入图片描述

主要代码及实现方法简介(请尽量配合截图,描述清楚编程和开发过程和方法)

  1. <div class="playBox" v-if="songDATA">
  2. <div class="bg">
  3. <img :src="songDATA.pic" alt/>
  4. </div>
  5. <div class="content">
  6. <div class="header">
  7. <h2 v-text="songDATA.title"></h2>
  8. <p v-text="songDATA.author"></p>
  9. </div>
  10. <div class="lyric swiper-container" ref="lyric">
  11. <div class="wrapper swiper-wrapper">
  12. <p v-for="(item,index) in songDATA.lyric" v-text="item.content" :key="index" :class="`swiper-slide ${lyricIndex===index?'active':''}`" ></p>
  13. </div>
  14. </div>
  15. <div class="handle">
  16. <i @click="openVideo(songDATA.id)"></i>
  17. <i ref="audioBtn"></i>
  18. <i></i>
  19. </div>
  20. </div>
  21. <audio :src="songDATA.music" style="display:none" ref="audio"></audio>
  22. <!-- 热门推荐 -->
  23. <recommend></recommend>
  24. </div>
  25. audioHandle() {
  26. // 控制音乐的自动播放
  27. let play = () => {
  28. this.audioPlay();
  29. document.removeEventListener("touchstart", play);
  30. };
  31. play();
  32. document.addEventListener("WeixinJSBridgeReady", play);
  33. document.addEventListener("touchstart", play);
  34. // 点击按钮控制暂停或者继续播放
  35. let { audio, audioBtn} = this.$refs;
  36. if (!audio) return;
  37. audioBtn.onclick = () => {
  38. if (audio.paused) {
  39. this.audioPlay();
  40. return;
  41. }
  42. this.audioPause();
  43. };
  44. },
  45. lyricAuto() {
  46. let { audio} = this.$refs;
  47. if (!audio) return;
  48. window.clearInterval(this.lyricTimer);
  49. this.lyricTimer = window.setInterval(() => {
  50. let duration = audio.duration,
  51. currentTime = audio.currentTime;
  52. if (currentTime >= duration) {
  53. this.audioComplete();
  54. return;
  55. }
  56. // 歌词对应和跟着动
  57. if (!this.songDATA) return;
  58. let n;
  59. this.songDATA.lyric.find((item, index) => {
  60. let { minutes, seconds} = item;
  61. if (minutes * 60 + parseInt(seconds) === Math.round(currentTime)) {
  62. n = index;
  63. return true;
  64. }
  65. return false;
  66. });
  67. if (n && n !== this.lyricIndex) {
  68. this.lyricIndex = n;
  69. let index = this.lyricIndex - 3;
  70. index < 0 ? (index = 0) : null;
  71. this.$swiper.slideTo(index, 200);
  72. }
  73. }, 1000);
  74. }
  75. <template>
  76. <div>
  77. <div style="padding:10px 0;">
  78. <a-player
  79. v-model:music="currentMusic"
  80. :list="songList"
  81. :showlrc="3"
  82. :narrow="false"
  83. theme="#b7daff"
  84. mode="circulation"
  85. v-if="flag"
  86. listmaxheight='96px'
  87. ref="player"></a-player>
  88. </div>
  89. </div>
  90. </template>
  91. <script>
  92. import axios from 'axios'
  93. // Vue3 不支持vue-router
  94. import VueAplayer from 'vue3-aplayer'
  95. export default {
  96. name: "NeteaseCloudMusicPlayer",
  97. components: {
  98. 'a-player': VueAplayer
  99. },
  100. data() {
  101. return {
  102. flag:false,
  103. currentMusic: {},
  104. songList:[]
  105. }
  106. },
  107. async mounted () {
  108. //异步加载,先加载出player再使用
  109. await this.init();
  110. let aplayer = this.$refs.player;
  111. this.currentMusic = this.songList[0]
  112. aplayer.play();
  113. },
  114. methods:{
  115. async init () {
  116. //这边是引入了axios然后使用的get请求的一个音乐列表接口
  117. //这边url随大家更改了
  118. let data = await axios.get("http://localhost:3000/playlist/detail?id=24381616"); //使用await ,data会等到异步请求的结果回来后才进行赋值
  119. //以下就是这边对请求的一个处理,看接口了
  120. if(data && data.code===200){ //200: '服务器成功返回请求的数据
  121. let getMusicList=data.playlist.tracks;
  122. for(let i=0;i<getMusicList.length;i++){
  123. let obj={};
  124. obj.title = getMusicList[i].name;
  125. obj.artist = getMusicList[i].ar[0].name;
  126. obj.pic = getMusicList[i].al.picUrl;
  127. obj.id = getMusicList[i].id;
  128. let url =await axios.get("http://localhost:3000/song/url?id="+obj.id);
  129. obj.src =url.data[0].url
  130. //把数据一个个push到songList数组中,在a-player标签中使用 :music="songList" 就OK了
  131. this.songList.push(obj);
  132. }
  133. //因为是异步请求,所以一开始播放器中是没有歌曲的,所有给了个v-if不然会插件默认会先生成播放器,导致报错(这个很重要)
  134. this.flag = true;
  135. }
  136. }
  137. }
  138. }
  139. </script>

运行说明

mock

mock 部分程序是后台Web服务,这里使用Express 框架创建后台服务。

Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。

第一步:

  1. 使用cmd打开控制台;
  2. 进入mock文件夹,使用
    yarn install 安装依赖;
  3. 输入node serve.js运行后台服务。
    请添加图片描述

第二步:

  1. 使用cmd打开控制台;
  2. 进入根文件夹,使用yarn install 安装依赖;
  3. 输入yarn run或者yarn serve运行代码(或者IDE);
    请添加图片描述

第三步:

  1. 通过手机或电脑浏览器访问网站。
    http://localhost:8080/MusicPlayer/1

NeteaseCloudMusicApi

  1. 安装NeteaseCloudMusicApi

    $ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
    $ npm install

或者

  1. $ git clone https://github.com/Binaryify/NeteaseCloudMusicApi.git
  2. $ npm install

手动下载:

下载网易云音乐 NodeJS 版 API GitHub:https://github.com/Binaryify/NeteaseCloudMusicApi

  1. 运行NeteaseCloudMusicApi

    $ node app.js

服务器启动默认端口为 3000,若不想使用 3000 端口,可使用以下命令: Mac/Linux

  1. $ PORT=4000 node app.js

windows 下使用 git-bash 或者 cmder 等终端执行以下命令:

  1. $ set PORT=4000 && node app.js
  1. 访问
    http://localhost:8080/NeteaseCloudMusicPlayer

心得体会

  1. 掌握使用Vue-CLI脚手架工具在自己的电脑上建立项目,并运行调试工具。
  2. 学习Vue组件编程方法。
  3. 实现最基本的音乐播放功能。
  4. 搭建Mock。
  5. 了解vue-aplayer插件的使用方法。
  6. 理解如何使用 axios 发起 http 请求的方法。

常见问题

  • Vue Swiper 找不到swiper.css 报错This dependency was not found:swiper/dist/css/swiper.css
  • vue中vuex添加Logger插件

参考文档

  • NeteaseCloudMusicApi
  • Vue APlayer

参考文章

  • vue-aplayer 音乐播放,实现播放与音乐列表
  • 在vue中使用NeteaseCloudMusicApi并调用这个接口获取数据

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读