网易云音乐
项目截图
 
 
 
 
 
准备工作
我们使用 jsonp配合node代理 借用了qq音乐接口实现的 音乐播放器
这是jsonp代码
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 /**
* Created by majunchang on 2017/7/23.
*/
import originJsonp from 'jsonp'
// 三个参数粉笔为 目标url 需要拼接在url上的参数 以及jsonp插件 需要的option
export default function jsonp(url,paramdata,options) {
// 在这里引入一个 拼接字符串的方法
url += (url.indexOf('?')< 0 ? '?':'&')+param(paramdata);
// 在这里返回一个Promise对象
return new Promise((resolve,reject)=>{
// 在这里的data 跟上面的paramdata是不一样的 一个是 json的返回对象 一个是你传入的参数
originJsonp(url,options,(err,data)=>{
if(!err){
resolve(data)
}
else {
reject(err)
}
})
})
}
function param(paramdata) {
let url='';
for(var k in paramdata){
// 对参数对象里的每一项进行判断
let value = paramdata[k] == undefined ? '': paramdata[k];
url+= `&${k}=${encodeURIComponent(value)}`
}
// 循环结束 url 拼接完毕 将其返回
return url
}这是配置接口的js
1  | /**  | 
这是nodejs 代码 仅仅推荐页面 用到了这个axios 其余的都是使用接口配置jsonp实现的
1  | var app = express()  | 
推荐页面
使用jsonp的方式 获取到数据
轮播图部分
https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg
部分代码如下:
1  | <slider>  | 
1  | methods: {  | 
- 使用 better-scroll插件 将轮播图部分抽象成为一个组件 使用solt插槽 往里面填充内容
 - 使用插件的内容的相关api 和轮播组件里面的 props的 控制图片的轮播速度 间隔时间 和是否轮播 在此基础上 增加dots 也就是图片底部的圆点
 - 监听window的resize事件 当用户改变屏幕的时候 轮播效果不会发生改变
 - 访问连接 以及返回格式 数据
 
歌单列表部分
https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg
- 由于qq音乐 对访问对象 做了限制 所以我们通过配置代理的方式 进行访问 npm run dev的时候 会在dev-server中运行 我们结合axios和express框架 配置使用代理
 - 加入loading组件和懒加载组件 在网速较低的情况下 提高了用户的体验
 - 后台代理代码
 
1  | var app = express()  | 
歌手页面
分为歌手列表页和歌手详情页 歌手列表页需要做出左右联动 类似于 手机通讯录那样的 歌手详情页要要出模拟原生app的 滑动感觉
歌手列表页
将他封装成了 一个 基本组件 我们需要实现以下功能
- 滑动左边 右边的不同字母 要显示当相应的颜色
 - 点击右边的首字母 左右要滚动到响应的位置
 
实现详解:
- 子组件使用事件监听 scroll事件 然后触发父组件的方法 根据滑动距离(也就是y值)来跟高度数组作比较
 - 点击右边的首字母之后 触发父组件的点击事件 将高度数组的相应索引的值 赋给scrolly 然后使用watch 去监听这个值 最后调用better-scroll的方法 使页面滑动到相应的位置
 - 要配合移动端的touch事件 start move end 以及使用e.touches[0]
 
相关的代码
1  | onShortcutTouchStart(e){  | 
歌手详情页
技术实现难点:模拟原生移动应用实现 上滑和下滑的时候的效果
更多的是在于如何使用css+scroll组件 实现这些效果
1  | scrollY(newVal){  | 
播放详解
music的获取,播放以及和vuex的联动原理详解
1  | graph TD  | 
我们在 vuex中存储的信息 是为了我们在多个组件之中可以 获取到歌曲的状态 从而操作audio标签 来实现我们想要的功能
歌曲播放界面—》 player.vue文件
切换动效部分使用了贝塞尔曲线 唱片的旋转部分使用了 css的旋转特效
对于歌词的解析部分使用了 插件lyric-parser https://github.com/ustbhuangyi/lyric-parser
底部的圆圈 使用了svg 以及相关一些属性模拟进度
排行页面
排行页面与歌手页面非常相似 对于这样的基础组件 我们进行了复用 代码如下 文件是song—list 区别就是
在排行页面中 我们点击的歌单 使用奖杯图片以及排名的
1  | <template>  | 
搜索页面
有一个searchBox组件 充当搜索框 下面是一些热门搜索的标签 当我们进行搜索的时候 搜索结果 会复用scroll组件
对于搜索框 也就是search-box的input进行截流处理
1  | export function debounce(func,delay) {  | 
在搜索之后的建议中 点击 会对你点击的对象 也就是包括了歌手和歌曲的对象进行区别
1  | selectItem(item) {  | 
比较经典的方法
封装jsonp方法
1  | /**  | 
混乱数组方法
1  | // 此处 添加一个 混乱数组的方法 将一个数组内部的元素 全部打乱  | 
使用localstorage存储最近喜欢的
1  | 
  | 
actions中在原先的歌曲列表中插入一首歌曲的方法
1  | /*  | 
