vue 仿 163musicPC 端项目 (支持歌曲搜索播放等) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ShanaMaid
V2EX    前端开发

vue 仿 163musicPC 端项目 (支持歌曲搜索播放等)

  •  
  •   ShanaMaid
    ShanaMaid 2017-03-21 16:12:43 +08:00 2401 次点击
    这是一个创建于 3139 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    vue2 越来越受欢迎,无奈现在在公司做的平台是以 ng1.x 为主,一直没有机会练手 vue2 ,虽然写过一些小 demo ,但是与完整的项目相比较中间会少很多东西。于是趁在公司空闲的时候以及周末双休,自己用 vue2 复写了 163musicPC 端。相比较之掘金上大大写的很多都是纯静态页面 vue2 ,实际开发中肯定会涉及到接口、数据渲染方面,本项目接口通过http-proxy-middleware, 一个 http 代理的中间件,进行 http 请求转发,实现跨域请求,直接复用网易爸爸的接口,在服务端对返回的 JSON 进行解构即可。

    介绍

    vue-163-music(网易云音乐 web 版),用 vue 仿写 163 音乐客户端版。

    原计划仿写完所有页面,碍于网易的接口 API 有限,实现页面也有限。

    不推荐手机端访问。

    页面高度为670px1366 X 768分辨率及其以下按 F11 全屏浏览效果更佳

    Github 项目地址:https://github.com/ShanaMaid/vue-163-music

    欢迎issueprstar or follow!我将继续开源更多有趣的项目

    在线版

    点击进入 http://www.shanamaid.top:3000/

    腾讯学生云主机,最低配,存在卡顿,建议 clone 到本地进行体验

    使用

    git clone https://github.com/ShanaMaid/vue-163-music.git cd vue-163-music npm install # 开发环境 npm run dev 访问 http://localhost:8080/ # 打包 npm run build # 实际环境 cd server node app.js 访问 http://localhost:3000/ 

    效果截图

    https://github.com/ShanaMaid/vue-163-music/tree/master/screenshot

    工具&技能

    vue + vuex+ vue-router + vue-resource

    express

    http-proxy-middleware 一个 http 代理的中间件,进行 http 请求转发,实现跨域请求

    store.js 一个非常棒的处理localStorage的轮子,原生localStorage只支持存储字符串类型,轮子进行封装后可以直接存储ArrayObjectfunctionSet等类型

    animate.css css 动画库

    vue-slider-component 滑块组件

    postman 接口测试工具

    实现功能

    发现音乐

    • 个性推荐(推荐歌单中除每日歌曲推荐外,其余歌单可点击进入)

    播放音乐

    • 上一曲
    • 播放
    • 暂停
    • 下一曲
    • 进度控制
    • 音量控制

    音乐搜索

    输入搜索关键词,回车键搜索,或者点击放大镜图标

    • 单曲(单击或双击歌曲添加至音乐播放列表,部分音乐会存在版权问题无法播放)
    • 歌手
    • 专辑
    • MV
    • 歌单(左键点击进入歌单列表)
    • 主播电台 (单期节目部分单击或双击歌曲添加至音乐播放列表,目前不存在版权问题)
    • 用户

    歌单

    • 播放全部

    播放列表

    • 切歌(单击切歌)
    • 删歌(鼠标悬浮在要删除的歌曲上,点击右侧小 X)
    • 清空播放列表
    • 本地缓存播放列表

    一些问题

    通过 api 接口获取的 mv 播放量基本不准,尚未找到原因,其余类型的播放量准确

    目录结构

    | | build | config | server 服务端 | | app.js 服务端启动入口文件 | | static 打包后的资源文件 | |__ index.html 网页入口 | | src 资源文件 | | assets 组件静态资源库 | | components 组件库 | | deal 163api 返回的 JSON 字符串解构 | | filters 自定义过滤器 | | router 路由配置 | | store vuex 状态管理 | | App.vue 163SPA | |__ main.js SPA 入口 | |__ static 静态资源目录 

    一些注意事项

    项目中使用了网易爸爸的接口,需要使用http-proxy-middleware进行转发,开发环境下需要在config/index.js中的dev中添加下列配置即可

    proxyTable: { '/api': { target: 'http://music.163.com', changeOrigin: true, headers: { Referer: 'http://music.163.com/' } } } 

    实际环境中,服务器端配置

    var express = require('express'); var proxy = require('http-proxy-middleware'); var app = express(); app.use('/static', express.static('static')); app.use('/api', proxy({ target: 'http://music.163.com', changeOrigin: true, headers: { Referer: 'http://music.163.com/' } } )); app.get('/', function (req, res) { res.sendFile(__dirname + '/index.html'); }); app.listen(3000); 

    对返回的数据解构js文件位于src/components/deal/目录下,比如对单曲搜索结果进行解构

    single: (data) => { let list = [] let count = data.result.songCount if (count === 0) { return {list, count} } for (let item of data.result.songs) { let singer = '' let { name, mp3Url, duration, id, album: { name: albumName } } = item for (let item of item.artists) { singer += item.name + ' ' } list.push({name, mp3Url, duration, id, albumName, singer}) } return {list, count} } 

    vuex状态管理位于src/components/store目录下

    vue-router路由配置管理位于src/components/router目录下

    自定义过滤器位于src/components/filters/目录下

    网易云音乐接口来源于http://moonlib.com/606.html

    Github 项目地址:https://github.com/ShanaMaid/vue-163-music

    总结

    本项目的实际意义在于熟悉 vue 生态链以及 ES6 语法,同时思考如何用 vue 构建实现一个完整的项目。

    最后的感觉 vue2 在开发中带来的体验确实很棒, vue2 能如此之火自然有它的道理。

    如果觉得本项目不错的话,别忘记star哦!

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     948 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 19:23 PVG 03:23 LAX 12:23 JFK 15:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86