网易云项目 【前端】【黑马】
参考文档:
- 网易云音乐接口下载地址: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: ["*"]}}
}
网易云项目 【前端】【黑马】相关推荐
- 仿网易云项目前端服务器部署+Nodejs部署
做了几天的仿网易云移动端项目,做出来了不知道怎么部署上线?搞了好久!!!!记录一下! 1.首先(优化 + 检查)项目 1.1 vue.config.js种配置: 安装 npm i compressio ...
- 网易云音乐前端模块动态下发系统
关注 前端瓶子君,回复"加群" 加入我们一起学习,天天进步 作者:康东扬 https://zhuanlan.zhihu.com/p/91386560 本文是<滨江前端技术沙龙 ...
- 01、Vue简易版网易云——项目简介
1.项目介绍 在经过一段时间Vue的学习之后,本人决定用一个简易版的网易云项目,对Vue的知识进行进一步的巩固. 项目完整github地址 2.项目技术 1.后台技术 本次后台使用的是,别人写好的网络 ...
- 微信小程序之网易云项目实战(一)
微信小程序之网易云项目实战(一) 1.全局app.json 配置 {"pages": ["pages/index/index","pages/logs ...
- 2019届网易云音乐前端实习生电面心得
电面进行了38分钟,虽然总的来说回答的并不是很好,但是也初步了解了一线技术岗对前端岗位的需求和要求,收获很大. 之前学习前端的心一直飘来飘去,没有静下来学习基础知识和深入理解原理,只停留在对工具框架的 ...
- 网易云项目(Vue)
网易云音乐项目开发笔记 准备 项目描述 此项目为一个前后台分离的后台管理的SPA,包括前端PC应用和后端应用 包括发现音乐.我的音乐.朋友.商城等功能模块 前端:使用Vue + Antd + Axio ...
- 网易云项目播放组件中的进度条拖动bug(elementUI)
因遇到的bug相同,此处部分参考引用了以下文章:vue+element制作音乐播放器播放进度条bug(鼠标拖拽slider滑块滑动到指定位置无效)_hhhhhhhssss的博客-CSDN博客_vue音 ...
- 网易云音乐前端实习二面
(base:杭州,时长40min,一面居然给我过了) 1.position所有属性 2.absolute相对于哪些元素定位 3.fixed和absolute区别 4.sticky有了解吗? 5.浏览器 ...
- 网易云课堂前端微专业各部分作业解答
买了云课堂的前端微专业课程,在这里记录下解题的过程,一来防止自己偷懒,二来希望朋友们看到能提提意见,共同进步. 主要放大题自己写的答案,有些会提提思路,代码基本都在在线代码平台上. 注:除注明作者外, ...
最新文章
- 子查询引用外表_轻松搞定慢查询?这一文就够了(内附大量实例助你看懂Explain)...
- php 请求转发 重定向,PHP怎么实现页面重定向?(图文+视频)
- MATLAB Simulink 做BP PID报错:Error :*** during flag=* call must be a real vector of length 3
- 技术干货 | JavaScript 之事件循环(Event Loop)
- 智能家居物联网化将成为AWE大会最大看点
- 机器学习笔记(4):多变量线性回归
- Android高手的六大境界
- SAP中的“定单状态”
- 北京理工大学计算机学院研究生培养方案,北京理工大学2018版学术型研究生培养方案.PDF...
- (83)FPGA时钟抖动和时钟偏斜-面试必问(七)(第17天)
- 计算机二级c语言考点变化,计算机二级C语言考点归纳汇总.doc
- c语言串逐位和 思路,蓝桥杯c语言练习题答案.doc
- 华为手机所有图标变黑_华为手机字体白色变黑色 华为图标字体怎么变黑
- MIL图像处理那些事:MIL的安装和MIL工具箱
- Node.js 环境性能监控探究
- windows 下 c++ 二维码生成库
- 百度地图标记点加点击事件和鼠标移入事件并添加数据
- phpstudy php56 zend,关于shopex 4.9 php5.6版安装环境问题
- 利用python实现微信自动回复群发等操作(不需要登录网页版微信)
- Spring Boot进阶(13):如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值 | 超级详细,建议收藏
热门文章
- LabVIEW版本与所支持的DAQmx版本
- 关于前n个自然数的平方和公式的证明方法
- 2023就业难,大学生该如何提升自己的职场竞争力?
- 传承经典青出于蓝:索尼WI-1000XM2评测体验
- html radio 背景颜色,用纯CSS改变html radio/checkbox默认背景颜色样式
- radio设置颜色html,HTML下使用Radio设置选择样式。
- 计算机学院表白情书,【计算机学院】大学生的别样表白情书——计算机学院成功举办南华大学第一届代码情书大赛...
- 旷视 好玩的Thunder Net ,一个超轻量型的检测网络
- 为何EAN-13码的防护条没有出头
- 二进制、八进制、十进制、十六进制之间转换