网易云音乐
项目截图
准备工作
我们使用 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 | /* |