参考文档:

  • 网易云音乐接口下载地址:GitHub - Binaryify/NeteaseCloudMusicApi: 网易云音乐 Node.js API service网易云音乐 Node.js API service. Contribute to Binaryify/NeteaseCloudMusicApi development by creating an account on GitHub.https://github.com/Binaryify/NeteaseCloudMusicApi
  • vant移动组件库:Vant 2 - Mobile UI Components built on VueMobile UI Components built on Vuehttp://vant-contrib.gitee.io/vant/v2/#/zh-CN/quickstart

1.0 本地接口部署

目标:下载网易云音乐node接口项目,在本地期待,为我们vue项目提供数据支持

如何做反向代理解决跨域问题

本地node服务器开启cors,负责请求的转发和数据接收回传

1.1 本地接口准备

原理:跨站请求伪造 (CSRF), 伪造请求头 , 调用官方 API

  • 文档地址:网易云音乐 NodeJS 版 API网易云音乐 NodeJS 版 APIhttps://binaryify.github.io/NeteaseCloudMusicApi/#/?id=neteasecloudmusicapi

1 安装

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

在要下载的目录文件夹下,拉去github的分支,然后自己下载第三方的包用(npm 或者 yarn)

2 运行

在对应目录下启动终端

$ node app.js

1.2 前端项目准备

目标:初始化项目,下载必备包,引入初始文件,配置按需自动引入Vant

  • 初始化工程(vue create music-demo)
vue create music-deom
  • 下载这三个包(注意下载的路径)
yarn add axios vant vue-router@3
  • 下载Vant自动按需引入插件babel-plugin-import
// 这个是在开发(development)环境用的
yarn add babel-plugin-import -D
  • 在babel.config,js配置-看Vant文档
 // 从Vant手册拿plugins: [['import', {libraryName: 'vant',libraryDirectory: 'es',style: true}, 'vant']]
  • 引入提前准备好的reset.css,flexible.js到main,js使用

    • reset:Normalize.css: Make browsers render all elements more consistently.http://necolas.github.io/normalize.css/
    • flexible: https://download.csdn.net/download/qq_42316056/87221654?spm=1001.2014.3001.5503https://download.csdn.net/download/qq_42316056/87221654?spm=1001.2014.3001.5503

1.3 需求分析

  • 根据需求创建4个页面组件

    • views/Layout/index.vue
    • views/Home/index.vue
    • views/Search/index.vue
    • views/Play/index.vue

1.4 路由准备

目标:准备路由配置,显示不同路由页面

  • router/index.js - 配置路由规则和对应路由页面
// 配置路由模块
import Vue from 'vue'
import VueRouter from 'vue-router'
// 定义的页面
import Layout from '@/views/Layout'
import Home from '@/views/Home'
import Play from '@/views/Play'
import Search from '@/views/Search'
import Not404 from '@/components/Not404'Vue.use(VueRouter)
// 定义规则
const routes = [{path: '/',redirect: '/layout' // 重定向},{path: '/layout',component: Layout,children: [//儿子里面不用再加/了{path: 'home',component: Home},{path: 'search',component: Search},]},{path: '/play',component: Play},{path: '*',component: Not404},
]
// 生成路由对象
const router = new VueRouter({routes,//ES6 简写// mode: 'history'// 默认不写是 'hash'
})
// 使用
// 向外导出
export default router 
  • main.js - 引入路由对象注入到vue中
// 引入路由模块
import router from '@/router'
new Vue({router,//路由模块注入render: h => h(App),
}).$mount('#app')
  • App.vue - 留好router-view显示路由页面

1.5 Tabbar组件

目标:点击底部导航,切换路由页面显示

使用:根据图示,把Tabbar组件在Layout.vue底部显示出来

功能:点击以后,需配合路由切换页面功能

1.6 NavBar导航组件

目标:实现顶部标题展示

使用:把NavBar注册引入使用,静态效果

template部分:

    <van-nav-bar :title="activeTitle" />

1.7 NavBar导航切换

  • 网页打开默认显示
  • 侦听路由切换显示对应标题

在router/index.js路由规则里:(先定义一个meta添加一个额外信息对象)

children: [{path: 'home',component: Home,meta: { //meta保存路由对象额外信息的title: '首页'}},

在Layout/indx.vue 的script部分:

 data() {return {activeTitle: this.$route.meta.title,//默认情况 顶部显示(默认获取当前路由对象里的meta中的title值)};},
 watch: {$route() {// console.log(this.$route);// 提取切换后路由信息对象里的titlethis.activeTitle = this.$route.meta.title}}

1.8 网络请求封装

目标:网络请求,不散落在各个逻辑页面里,封装起来方便以后修改

代码分层,便于以后的修改,无需触碰逻辑页面

  • src/utlis/request.js - 设置基地址,导出axios函数
// 引入axios 创建网络请求,方便散落vue各地,不方便修改
import axios from "axios";
axios.defaults.baseURL = 'http://localhost:3000'
export default axios
  • src/api/Home.js - 请求方法 axios({url:'具体地址'})
import request from '@/utils/request'
// 首页 - 推荐歌单数据
export const recommendMusic = params => request({url: '/personalized',params//  params: params// 将来外面可能传入params的值 params = {limit:20} //取20行数据
})
  • src/api/index.js - 把Home.js里函数引入过来 统一导出
import { recommendMusic } from './Home'
export const recommendMusicAPI = recommendMusic //请求推荐歌单的方法导出去
  • 具体逻辑页面,引入api/index.js请求方式,async+await等待 axios 的结果回来
// 在 main.js页面下:
// 测试封装的API方法-按需导入
import { recommendMusicAPI } from '@/api'
async function fn() {const res = await recommendMusicAPI()//api 方法原地会得到 axios 请求在原地的Promise 对象(里面有一个ajax请求)console.log(res)
}
fn()//执行一下试试看

1.9 首页  推荐歌单

  • 布局van-row和van-col
  • van-image显示图片,p标签显示歌名
  • 引入api里的网络请求方法,把数据请求回来,循环铺设

铺设页面思路:

一套标签样式准备好,然后拿回数据,循环赋予进去

<p class="title">推荐歌单</p><van-row gutter="10"><van-col span="8" v-for="obj in reList" :key="obj.id"><van-image radius=".75rem" width="100%" fit="cover" height="7.5rem" :src="obj.picUrl" /><p class="song_name">{{ obj.name }}</p></van-col></van-row>

1.10 首页 - 最新音乐

目标:完成最新音乐单元格列铺设

  • 引入注册使用van-cel,并且设置一套标签和样式准备
  • 在api/Home,js一最新音乐的接口方法
  • 引入到Home/index.vue中,数据铺设到页面

单元格定义右侧图标:

van-cel组件支持具名插槽设置右侧的内容

1.11 热搜词关键字

  • 搜索框 - van-search 组件
  • api/Search.js - 热搜关键字 - 接口方法
  • Search/index.vue引入获取热搜关键字 - 铺设页
  • 点击文字填充到输入框

给输入框 v-mode 绑定变量,然后给他赋值就可以实现,按钮文字填入输入框

1.12 搜索结果 - 点击获取

  • api/Search,js - 搜索结果,接口方法
  • Search/index.vue引入-获取搜索结果-铺设页面
  • 和热搜关键字容器-互斥显示

  • 点击文字填充到输入框,请求搜索结果铺设

1.13 搜索结果 - 输入框

目标:监测输入框改变

  • 观察van-search组件是否支持和实现input事件
  • 绑定@input事件和方法(说明书有)
  • 在事件处理方法中获取对应的值使用

1.14 网易云音乐-搜索结果-加载更多

目标:触底后加载下一页数据

  • van-list组件监测触底执行onload事件
  • 配合后台接口,传递下一页的标识
  • 拿到下一页数据后追加到当前数组末尾即可

高级的写法:原数组等于原数组展开加上新加载的数组也展开,再合并成一个数组

this.resultList = [...this.resultList, ...res.data.result.songs]

1.15 网易云音乐-防抖使用

目标:修复输入框删除过快-效果错误

  • 输入框输入"asdfghjkl"
  • 接着快速的删除
    • 每次改变-马上发送网络请求

1.16 页码bug修复

  • 加载更多时,page已经往后计数了
  • 重新获取时,page不是从第一页获取的
  • 点击搜索/输入框搜索时,把page改回1
async fn(str) { // 点击热搜关键词this.page = 1 // 点击重新获取第一页数据this.finished = false // 点击新关键词 - 可能有新的数据了this.value = str//选中的词赋值给搜索框绑定的变量上const res = await this.getListFn()this.resultList = res.data.result.songsthis.loading = false// console.log(this.resultList);},

1.17 Songitem封装

目标:搜索结果和首页使用相同标签结构

  • 首页的最新音乐和搜索结果的音乐

  • 标签样式功能相同
  • 封装Songltem.vue到这2处复用即可
 // 让他们走的时候去播放页面,并且带走id参数methods: {playFn() {// 点击跳转路由this.$router.push({path: '/play',query: {id: this.id  //歌曲id,通过路由跳转传递过去}})}}

重复的标签尽量封装成组件,然后去复用

1.18 跳转播放

  • 组件SongItem.里-点击事件
  • api/Play.js-提前准备好-接口方法
  • 跳转到Play页面-把歌曲id带过进去
 let id = this.$route.query.id//接收路由跳转过来的id

1.19 Vant 组件适配

  • postcss-配合webpack翻译css代码
  • postcss-pxtorem-配合webpack,自动把px转成rem
  • 新建postcss.config.js-设置相关配置
module.exports = {plugins: {"postcss-pxtorem": {//能够把所有元素的px单位转成Rem//rootValue:转换px的基准值//例如一个元素宽是24px,则换成rem之后就是1rem。rootValue: 18,//18px为...和你自己自定义的flexjs有关propList: ["*"]}}
}

网易云项目 【前端】【黑马】相关推荐

  1. 仿网易云项目前端服务器部署+Nodejs部署

    做了几天的仿网易云移动端项目,做出来了不知道怎么部署上线?搞了好久!!!!记录一下! 1.首先(优化 + 检查)项目 1.1 vue.config.js种配置: 安装 npm i compressio ...

  2. 网易云音乐前端模块动态下发系统

    关注 前端瓶子君,回复"加群" 加入我们一起学习,天天进步 作者:康东扬 https://zhuanlan.zhihu.com/p/91386560 本文是<滨江前端技术沙龙 ...

  3. 01、Vue简易版网易云——项目简介

    1.项目介绍 在经过一段时间Vue的学习之后,本人决定用一个简易版的网易云项目,对Vue的知识进行进一步的巩固. 项目完整github地址 2.项目技术 1.后台技术 本次后台使用的是,别人写好的网络 ...

  4. 微信小程序之网易云项目实战(一)

    微信小程序之网易云项目实战(一) 1.全局app.json 配置 {"pages": ["pages/index/index","pages/logs ...

  5. 2019届网易云音乐前端实习生电面心得

    电面进行了38分钟,虽然总的来说回答的并不是很好,但是也初步了解了一线技术岗对前端岗位的需求和要求,收获很大. 之前学习前端的心一直飘来飘去,没有静下来学习基础知识和深入理解原理,只停留在对工具框架的 ...

  6. 网易云项目(Vue)

    网易云音乐项目开发笔记 准备 项目描述 此项目为一个前后台分离的后台管理的SPA,包括前端PC应用和后端应用 包括发现音乐.我的音乐.朋友.商城等功能模块 前端:使用Vue + Antd + Axio ...

  7. 网易云项目播放组件中的进度条拖动bug(elementUI)

    因遇到的bug相同,此处部分参考引用了以下文章:vue+element制作音乐播放器播放进度条bug(鼠标拖拽slider滑块滑动到指定位置无效)_hhhhhhhssss的博客-CSDN博客_vue音 ...

  8. 网易云音乐前端实习二面

    (base:杭州,时长40min,一面居然给我过了) 1.position所有属性 2.absolute相对于哪些元素定位 3.fixed和absolute区别 4.sticky有了解吗? 5.浏览器 ...

  9. 网易云课堂前端微专业各部分作业解答

    买了云课堂的前端微专业课程,在这里记录下解题的过程,一来防止自己偷懒,二来希望朋友们看到能提提意见,共同进步. 主要放大题自己写的答案,有些会提提思路,代码基本都在在线代码平台上. 注:除注明作者外, ...

最新文章

  1. 子查询引用外表_轻松搞定慢查询?这一文就够了(内附大量实例助你看懂Explain)...
  2. php 请求转发 重定向,PHP怎么实现页面重定向?(图文+视频)
  3. MATLAB Simulink 做BP PID报错:Error :*** during flag=* call must be a real vector of length 3
  4. 技术干货 | JavaScript 之事件循环(Event Loop)
  5. 智能家居物联网化将成为AWE大会最大看点
  6. 机器学习笔记(4):多变量线性回归
  7. Android高手的六大境界
  8. SAP中的“定单状态”
  9. 北京理工大学计算机学院研究生培养方案,北京理工大学2018版学术型研究生培养方案.PDF...
  10. (83)FPGA时钟抖动和时钟偏斜-面试必问(七)(第17天)
  11. 计算机二级c语言考点变化,计算机二级C语言考点归纳汇总.doc
  12. c语言串逐位和 思路,蓝桥杯c语言练习题答案.doc
  13. 华为手机所有图标变黑_华为手机字体白色变黑色 华为图标字体怎么变黑
  14. MIL图像处理那些事:MIL的安装和MIL工具箱
  15. Node.js 环境性能监控探究
  16. windows 下 c++ 二维码生成库
  17. 百度地图标记点加点击事件和鼠标移入事件并添加数据
  18. phpstudy php56 zend,关于shopex 4.9 php5.6版安装环境问题
  19. 利用python实现微信自动回复群发等操作(不需要登录网页版微信)
  20. Spring Boot进阶(13):如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值 | 超级详细,建议收藏

热门文章

  1. LabVIEW版本与所支持的DAQmx版本
  2. 关于前n个自然数的平方和公式的证明方法
  3. 2023就业难,大学生该如何提升自己的职场竞争力?
  4. 传承经典青出于蓝:索尼WI-1000XM2评测体验
  5. html radio 背景颜色,用纯CSS改变html radio/checkbox默认背景颜色样式
  6. radio设置颜色html,HTML下使用Radio设置选择样式。
  7. 计算机学院表白情书,【计算机学院】大学生的别样表白情书——计算机学院成功举办南华大学第一届代码情书大赛...
  8. 旷视 好玩的Thunder Net ,一个超轻量型的检测网络
  9. 为何EAN-13码的防护条没有出头
  10. 二进制、八进制、十进制、十六进制之间转换