![在这里插入图片描述](https://img-blog.csdnimg.cn/5972451e6662499c918b4a25a205e9ca.gif#pic_center)
@[TOC](云音乐)
## 一、基本介绍
本项目使用`vue2+vue-cli`实现了一个简易的网易云音乐(**App版本**),实现了歌曲的首页推荐展示,歌曲的搜索,评论的展示以及歌曲的播放四个主要功能模块,主要用来练手,效果如下图所示:
**首页**
![在这里插入图片描述](https://img-blog.csdnimg.cn/debd13ed61344243805448afdf0a3aae.png#pic_center)
**搜索页面**
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b993688aec1d533d18daea9f9ae7f767.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/843d71d99eff8fd1499b8b67ac980e49.png#pic_center)
**评论**
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/f2fbac620e7a370af0a17dcd8e581a74.png#pic_center)
**音乐播放**
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/40e5b981fa3913ce010776fb5e5f1467.png#pic_center)
## 二、项目使用
### 2.1 安装依赖
```javascript
yarn
```
### 2.2 本地使用
```javascript
yarn serve
```
### 2.3 打包上传
```javascript
yarn build
```
**github地址**:[cloud-music](https://github.com/bosombaby/cloud-music)
**在线预览:**:[云音乐](https://music.vrteam.top)
## 三、开发环境
### 2.1 代理服务器
`api链接`:https://binaryify.github.io/NeteaseCloudMusicApi/#/![3](https://img-blog.csdnimg.cn/img_convert/43f9418ad00c362131e1a17ffd92e818.png)
`总结`:根据文档在后端跑起来代理服务器
### 2.2 搭建前端项目
接下来使用`yarn`代替`npm`,原因:https://blog.csdn.net/qq_39122387/article/details/109675680
#### 2.2.1 脚手架
```js
vue create music-demo
```
`总结`:默认选择`vue2`和`yarn`安装依赖的方式
#### 2.2.2 项目依赖
**进入项目文件夹**
```
cd music-demo
```
**第三方依赖**
```
yarn add axios vant@latest-v2 vue-router@3
```
注意版本,这个是vue2的项目,对应的包有所变化
**生产依赖**
```
yarn add babel-plugin-import postcss postcss-pxtorem@5.1.1 -D
yarn add less less-loader@5.0.0 -D
```
**引入本地样式、图标**
```js
// 字体图标
import '@/assets/fonts/TsangerYuYangT_W01_W01.ttf'
//自适应
import '@/mobile/flexible'
//初始化样式
import '@/styles/reset.css'
```
**在babel.config.js - 添加vant按需引入插件配置**
```js
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}, 'vant']
]
```
**postcss.config.js自定义自适应比例**
```js
module.exports = {
plugins: {
'postcss-pxtorem': {
// 能够把所有元素的px单位转成Rem
// rootValue: 转换px的基准值。
// 例如一个元素宽是75px,则换成rem之后就是2rem。
rootValue: 37.5,
propList: ['*']
}
}
}
```
`注意`:每一次改动`src`目录之外的内容需要**重启服务**
## 四、需求分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/332d48779071ecf252f6ddb92c918f55.png#pic_center)
![1](https://img-blog.csdnimg.cn/img_convert/216da4c66aacddfbd2e07c9fb823eb81.png)
`App`:管理所有的组件
- `Layout`:管理首页和搜索
- `Home`:主页
- `SongItem`:负责音乐的布局
- `Search`:搜索页
- `SongItem`:负责音乐的布局
- `Play`:音乐播放
- `Comment`:评论页
`Play`和`Comment`与`Layout`平级,需要的时候直接调用就行
## 五、路由管理
```js
// 引入Vue
import Vue from 'vue'
// 引入路由
import VueRouter from "vue-router"
Vue.use(VueRouter)
// 引入组件
import Layout from '@/views/Layout'
import HomePage from '@/views/Home'
import SearchPage from '@/views/Search'
import Play from '@/views/Play'
import Comment from '@/views/Comment'
const routes = [
{
path: '/',
redirect:'/layout'
},
{
path: '/layout',
redirect: '/layout/home',
component: Layout,
children: [
{
path: 'home',
component: HomePage,
meta: {
title:'首页'
},
},
{
path: 'search',
component: SearchPage,
meta: {
title:'搜索'
},
}
]
},
{
path: '/play',
component:Play
},
{
path: '/comment',
component:Comment
}
]
const router = new VueRouter({ routes })
export default router
```
## 六、接口管理
```js
//所有api的管理者
import { recommendMusicAPI, newMusicAPI } from "@/api/Home";
import { hotSearchAPI, searchResultAPI } from "@/api/Search";
import { getSongByIdAPI, getLyricByIdAPI } from '@/api/Play'
import { getHotCommentAPI} from '@/api/Comment'
export { recommendMusicAPI,newMusicAPI,hotSearchAPI,searchResultAPI,getSongByIdAPI,getLyricByIdAPI,getHotCommentAPI}
```
## 七、难点分析
### 7.1 搜索页面
**防抖与节流**
`防抖`:像电梯门一样,每一次有人进来之后,电梯门就会重新计时,最终的记时完成,才会触发,相当于setTimeout
`节流`:像英雄的技能一样,触发一次之后要等待一段时间才能继续执行,相当于 setInterval
搜索歌曲避免多次发起请求,使用`防抖`实现
### 7.2 播放页面
`样式`:css的动画样式
`three.js`:打算引入`粒子特效`实现3d音乐效果的(后续需求,一开始未做好规划,不好加了)
### 7.3 评论页面
**评论的刷新与加载**
- vant组件库`List 列表`和` PullRefresh `结合,List 组件通过 `loading` 和 `finished` 两个变量控制加载状态,当组件滚动到底部时,会触发 `load` 事件并将 `loading` 设置成 `true`。此时可以发起异步操作并更新数据,数据更新完毕后,将 `loading` 设置成 `false` 即可。若数据已全部加载完毕,则直接将 `finished` 设置成 `true` 即可
### 7.4 异步
`Promise`:将异步转换为同步`async await`(就近原则使用),等待数据返回之后再继续执行下面的代码
## 八、项目总结
这次主要对`vue2`的项目进行锻炼。学习了模块化处理流程,对待不同的功能模块要进行合理的分区,前期一定要做好项目规划处理,后续开始学习`vue3`以及`three.js`
# 九、GitCode地址
`项目`:https://gitcode.net/qq_53673551/1024