练习项目MOU音乐

那就从这里开始吧,马斯克说过不服就干,他都造火箭了,我也不服!

主要完成任务目标:

1.本地接口的配置和使用

2.前端项目的舒适化搭建

3.路由的配置以及使用

4.Vant组件库的使用

5.网络请求的封装

首先需要思考解决的问题:

什么是跨域?

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

当前页面url被请求页面url是否跨域原因
http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com/http://www.test.com:7001/跨域端口号不同(8080/7001)

为什么会出现跨域问题?

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

非同源限制

a.无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB

b.无法接触非同源网页的 DOM

c.无法向非同源地址发送 AJAX 请求

跨域解决方法

1.jsonp 

2.设置document.domain解决无法读取非同源网页的 Cookie问题

3.跨文档通信 API:window.postMessage()

4.CORS

5.webpack本地代理

6.websocket

7.Nginx反向代理

前面提到的跨域问题就是用来解决本地服务器向外部服务器请求数据的方案,接下来开始准备项目初始化阶段。

项目准备:

通过跨域方法拿到自己想要的数据。

1.初始化项目,下载需要的包,引入文件中,配置按需自动引入:

a.初始化工程

b.下载所需第三方包

c.下载vant自动按需引入插件babel-plugin-import

d.在babel.config.js配置—具体查看vant文档

e.引入提前准备好的reset.css以及flexible.js到main.js使用

2.分析项目功能和布局

本次项目需要四个页面:

1.属于布局页面,固定头部和尾部导航

2.在布局页下面会有首页以及搜索页(我的这次项目是这个样子,因项目不同,具体方案不同)

3.还需要一个播放详情页

3.开始创建文件夹,清空默认配置

(我们可以把页面统一放在views或者pages文件当中,然后再在这些文件里边创建文件,需要注       意的是:我们在做引入的时候会默认找Index文件,所以我们都要把每个不同文件里的文件改成

   index)

  例子:

 项目所需文件夹创建完毕之后,可以开始配置路由,嵌套跳转准备,在这一块儿一定要清晰思路,     每个页面的嵌套关系。

4.配置路由

配置步骤:

在router文件中,引入vue,vue-router,定义规则这些(我是把vue-router定义的规则单独放在这个文件夹中统一管理,方便以后的复用,比如我想在其他项目使用这些,我可以直接把这个文件夹拉过去,然后在main.js中实例化使用就可以了。当然这些也可以直接写在main.js里,但是main.js里的东西太多,不利于二次复用)

下面讲下路由具体步骤:

1.下载vue-router

  我是之前创建的时候统一把需要的这些都下载了,在使用过程中遇到了问题,

  当时下载我下载的是默认版本,而我用的是vue2版本,由于vue-router版本过高和2x发起冲突,    导致终端报了二十多个错误,这里也有vant的版本问题,这一点一定要注意。解决方法是进行

 版本降级。可以直接执低版本的下载代码,进行覆盖。

   报错代码:

  

 2.引入,注册使用路由文件:

 3.定义规则:

    这里涉及重定向,路由的嵌套以及语法问题。(注意二级路由需要挂载到一级路由显示)

    

 4.生成路由对象:

 5.注入:

   这一步需要去main.js中执行,因为是要导出使用到页面上的

  

 6.记得挂载到app.vue当中

 知识点:

vue-router的本质其实是改变url的hash值路径,导致对应组件显示

5.组件库的使用

 思考两个问题:

1.用户是不会手动修改代码和url地址切换路由的,所以需要我们在页面给用户准备点击按钮

2.我们是不不是可以在底部准备一个点击导航,让用户点击切换路由界面

我们可以通过vant组件库使用组件完成

需要完成目标:

点击底部导航,可以切换路由页面。

找到vant官网,查看文档

使用:根据官网步骤,把Tabbar组件在Layout.vue底部显示

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

添加底部导航栏:

1.找到组件引入到main.js中

2.找到对应Tab标签栏,把对应的代写贴到Layout组件上,这步执行完毕之后,可以在页面看到导     航栏内容,但是它们目前还只是个样式,不会路由跳转,需要我们添加其他属性,进行跳转操作

3.查看vant文档,看有没有做路由跳转的属性或者方法。

4.底部Tabbar导航栏

给Tab标签添加route属性,和 replace to="/layout/home",可以通过这两行代码进行跳转操作,

   

 Tab导航集成路由:

加入route属性和to集成路由切换功能

5.头部Navbar导航栏

   查找vant组件库,这个导航栏还可以添加其他属性和类名,我这里只是需要显示标题就够了,所     以只留了title

 

6.头部Navbar导航栏切换

   当用户点击首页时,我们希望头部信息和首页信息显示一致,点击搜索时,头部信息与搜索页信     息显示一致。

   方法:

(1)我们可以给首页和搜索页的路由添加meta,通过这个meta可以添加一些额外信息给路由。

     

(2)我们回到Layout页面,把Navbar导航的 title 属性改成动态属性

   

(3)我们在data里面需要声明 activeTitle 这个变量

        这里有个知识点就是$route,通过它可以拿到路由里边的属性值

(4)那么上一步骤可以实现打开页面头部导航栏默认的头部信息,接下来我们要实现当点击首页           和搜索切换的时候,头部标题信息也跟着发生变化。我们可以通过watch监听路由信息的变             化。(当我们点击切换底部导航的时候,路由也会跟着发生变换,我们通过这个watch监听

         路由的变化,并且把变化的值赋给activeTitle这个变量,那么这个变量拿到这个值之后,会             通过头部导航标签上的动态属性 :title 获得meta里的 title的值。

6.网络请求的封装

我们的目的:让网络请求,不散落在各个逻辑页面里,封装起来方便以后的修改和复用

我们可以新建文件夹:

(1)utils/request.js 对axios进行二次封装,并且制定项目的根地址

(2)api/Home.js 统一管理所有需要的url地址,封装网络请求方法并导出,(api做统一管理,在

        api下面的js文件管理对应的页面所需要的url请求地址以及方法,每个页面的js文件名字尽量   

        和 对应文件相同,方便以后查找使用)

(3)api/index.js  统一导出接口写在这里

(4)在main.js里引入API方法请求测试

下面是操作执行步骤:

1.对axios进行二次封装,引入到request.js(这个文件只做基地址配置,并向外导出)文件中,配置    基地址,向外导出axios

 2.基地址配置好之后,我们要通过基地址配合具体的地址拿到需要的数据,我们可以把配置具体的

   地址方法放到单独文件夹统一管理。

 3.我们在api下边再建一个index.js,每个请求模块的js都统一放到Index.js再向外导出

4.我们可以在main.js中使用一下,同样先引入API这个方法,然后我们通过async 这个函数拿到

  API里边请求过来的数据,用res变量接收一下,log 打印查看

5.我们通过上面的方法检测封装的api是没有问题的,那么接下来我们要开始铺设页面,我们在vant

  组件库拿到合适的样式放到home页面,具体操作详见vant组件库,里边都有具体的操作方法,      页面效果铺设完毕以后,我们可以把上面的检测方法拿过来,放到Home页面

  具体步骤如下:

(1)在main.js中引入vant组件的布局样式

       

 (2)通过查找文档,引入之后要把vant的标签放在对应页面上

(3) 页面铺设完毕,开始获取对应数据:

 (4)把数据渲染到页面当中,通过v-for进行渲染

 总结:网络请求封装,以及如何获取数据,到这一步,基本就都已经完成,涉及的知识点:axios,

           vant组件库的使用,async 和await的使用,v-for的使用。那么这里我把网络请求和推荐歌               单一起做出来了,下面我们在做其他功能。

6.刚刚我们铺设了首页的推荐歌单这一块,现在我们需要完成的是推荐歌曲这一项,那么我们刚刚 

   对于页面的铺设已经有了一定的经验,按照上面的方法再来一遍就可以了,那么我还是会把代码

   截屏出来

(1)去vant组件库下载对应需要的画面结构,并在main.js中引入并且使用

  

(2)引入之后,我们需要在首页把对应标签结构按照顺序写上去,同时修改标签上需要显示的内           容。

(3)对应的样式结构完成之后,我们需要去请求数据,回到Home.js中,重新向外导出一份数据请        求 。

(4)然后我们回到index.js中,把这个接口做统一管理并且向外暴露

 

 (5) 我们需要的网络请求做完之后,我们回到Home.vue文件,拿回数据,进行页面渲染

 (6)开始渲染,其实在(5)中我要强调一下,我们要在data里声明一个空数组,用来转化接收           数据。然后我们可以通过这个数组进行v-for循环渲染数据。

7首页铺设渲染完毕,我们可以开始做Search页面了。

 完成目标:搜索框和热搜关键字的显示

  搜索框 - van-search组件库

 api/Search.js - 热搜关键字-接口方法

 Search/index.vue引入热搜关键字-铺设页面

(1)还是先做页面铺设,去vant组件库找到需要的样式结构,引入/ 使用/ 对应标签放到搜索页面

(2)需要样式铺设完毕之后,开始写网络请求,在api/ Search.js封装方法,再去api/index.js向外           暴露,应用到搜索页面

 

(3)下面是应用到搜索页面的步骤:

 a.先引入

 b.定义方法

  

 c.给热搜词添加点击样式

d.在点击事件的方法里获取b图的数据(resultList 是在data里声明的空数组),数据渲染完毕

 

(4)渲染完毕之后,我们要做一个互斥显示,就是说当我们得到搜索结果的时候。把热搜关键词            去掉,我们可以给两个容器添加v-if 和v-else进行判断具体代码如下

8.搜索结果-加载更多

  完成目标:下拉触底后可以加载下一页数据

 a.van-list 组件检测触底执行onload事件

 b.配合后台接口,传递下一页的标识

 c,拿到下一页数据后追加到当前数组末尾即可

(1)我们可以通过vant组件库有这么一个van-list组件,来实现触底之后可以加载更多数据,先引          入组件,然后通过文档把相对应的标签嵌套上去,注意查阅文档了解Loading和finished的作            用,这两个属性其实是配合load使用的。使用van-list组件把热门搜索结果包裹起来,对其生            效。

 (2)然后我们需要去method里声明一下onLoad,当滚动条触底之后,loading和自动变成true,并且

          执行onLoad事件。

 (3)设置触底之后 要拿到的偏移量

   知识总结:input事件和change事件区别?

    input:只要内容改变实时触发

    change: 失去焦点内容改变才触发

  9.加载更多-bug修复

     完成目标:如果没有数据怎么办?

     无数据/只有一页数据,finished为true 

   (1)在input方法里写上这一步判断,如果输入框里的内容没有数据,让热门搜索的数组为空

 (2)在onLoad方法里执行这句,如果没有加载更多的数据,把finished改为true

(3)当我们再次点击的时候,很有可能就是会有新的关键词,新的数据过来,那么我们要在点击事         件里把 finished重新改成false

 (4)同理,如果输入框发生改变也是会有新的数据传进来,我们也是要把finished改成false

 (5)点击完成之后,我们要把loading改成false代表加载完成,可以进行下次的重新加载

  

 (6)同理,输入框执行完数据之后,也要改一下,可以进行下次加载,这个是这样的,因为你执            行一次之后,loading自动改成了true,所以我们要手动把它改过来,以便于我们再做点击事           件或者输入框输入内容时loading可以正常再次运行

 (7)当我们加载触底没有更多的数据的时候,也要把loading改成false

 (8)数据正常加载完毕之后,也要设置这一项,保证下一次还可以触发onload

 这一块我们就写完了,那么搜索结果请求分为哪三块

 点击热搜

 输入框输入

 listj加载更多

10.防抖使用

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

比如:输入框输入‘asdbdjashjas’

接着我们快速删除,这样的话会出现一个现象,就是我们每次改变,马上会发送网络请求,

网络请求异步耗时 - 数据回来后还没有铺设页面,浪费资源

解决方法:引入防抖功能(延时函数)

防抖:计时n秒,最后执行一次,如果再次触发,重新计时

效果:用户在n秒内不触发这个事件了,才会开始执行逻辑代码

11.页码bug修复

目标:修复page

加载更多时,page已经往后计数了

重新获取时,page不是从第一页获取的

点击搜索/输入框搜索时,把page改回1

(1)执行下图中代码

 12.Layout优化

目标:顶部导航固定,留好上下空间

我们的顶部导航和底部导航挡住了中间内容

给中间路由页面设置上下内边距就可以解决

13.SongItem封装

目标,搜索结果和首页使用的是相同的标签结构

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

标签样式功能相同

封装SongItem.vue到这两个地方复用即可 

(1)新建一个文件,用来封装这个组件

 (2)进行复用,在复用中,我把计算属性单词写错,报错提示如下

 写错位置如下,我是如何检测出来的内,首先我不是大佬级别的人,那么就只能用笨方法,切记

代码敲一点一定要去后台和终端看一下,如果不这样写太多再看真的就是没有办法排错了。根据报错提示翻译它的意思,或者查找CSDN之类,解决

 (3)正确复用:引入/注册

   

 (4)使用如下:两个页面相同,把数组信息换一下就好了

14.跳转播放

 点击播放按钮 - 播放页面

组件SongItem里添加点击事件

api/Play.js - 提前准备好接口

跳转到Play页面 - 把歌曲id带过去

(1)因为我们给按钮做了封装,所以我们只要在封装的文件里做点击事件就好了,然后引入网络            请求就可以使用

 

(2)播放页面具体内容在这不做处理,直接应用之前写过的,那么接下来就可以使用这个网页啦

                                                                                               (完成学习目的............)

    


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53490.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MuseScore入门教程(三、添加声部)

目录 前面教程汇总第一讲第二讲 写在前面添加声部 前面教程汇总 第一讲 MuseScore入门教程(一、下载,并新建乐谱) 第二讲 MuseScore入门教程(二、添加基本音乐符号) 写在前面 前面我们已经学习了如何下载MuseSco…

计算机乐谱吃鸡,Capo可自动识别音乐生成乐谱

作为一位音乐和吉他爱好者,Capo这款应用真的放我们非常喜欢。Capo可以让用户对其iTunes媒体库中的所有音乐进行“逆向扫描”,自动生成歌曲的指法谱。此外,对于比较难弹的曲子还可以在不影响其音调的同时放慢音速,以便添加有用的标…

使用Python扩展库spleeter分离MP3音乐文件中的伴奏和人声

推荐图书: 《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年9月第10次印刷,山…

推荐这几个不错的提取伴奏在线软件给大家

不知道大家有没有接触过视频后期制作,它不仅需要我们掌握视频剪辑技术,还需要我们能熟练地进行音频剪辑操作,包括分割、合并等,甚至有时候还需要提取歌曲的伴奏。 那今天就让我来告诉大家歌曲提取伴奏的软件有哪些?一…

MP3歌词的同步与拖拽设计

原文地址:http://blog.csdn.net/mc_hust/article/details/51534901 自从准备毕业论文开始,就没写过博客了,关注量也明显呈下滑趋势(虽然本来就少)。到现在已经入职一个多月了,抽空把之前做的一个项目整理一…

使用leangoo领歌单团队敏捷开发项目管理

概述 单团队敏捷开发主要是针对10人以下、只有一个Scrum团队的小型产品或项目的敏捷开发。 对于小型团队来说,在Leangoo中创建一个单团队敏捷开发项目就可以很好地支持团队产品或项目的开发。 适用场景 适用于单个团队进行Scrum敏捷开发协作,Leangoo项目…

Amper Music:AI创意音乐工具

【产品介绍】 Amper Music 是一家位于美国纽约的人工智能音乐技术公司,成立于2014年。 Amper Music是一个AI创意音乐工具,能让任何人为自己的内容制作原创音乐。无论你需要为视频、播客或互动内容配乐,Amper Music都能提供一个简单而强大的解…

【NLP】Transformer—用注意力机制改进自然语言处理

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

CLIP对比图文预训练 (Contrastive Language-Image Pretraining)论文阅读笔记

任务: video captioning, 视频描述生成,简单来说就是给定一段视频(目前以几秒到几分钟的短视频为主),计算机输出描述这段视频的文字(目前以英文为主)。往往一个视频对应多个人工标注…

干货|免费文本语料训练数据集

关于Word2Vec,上篇文章文本分类特征提取之Word2Vec中已有还算详尽的叙述。简单总结下:word2vec是Google在2013年提出的一款开源工具,其是一个Deep Learning模型(实际上该模型层次较浅,严格上还不能算是深层模型&#x…

​GENIUS: 根据草稿进行文本生成的预训练模型,可用于多种NLP任务的数据增强...

©PaperWeekly 原创 作者 | 郭必扬 单位 | 上海财经大学信息管理与工程学院AI Lab 论文标题: GENIUS: Sketch-based Language Model Pre-training via Extreme and Selective Masking for Text Generation and Augmentation 论文作者: Biyang Guo,…

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.csdn.net/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗…

企业微信接入群聊机器人详细步骤

目录 一、 创建群机器人 二、机器人配置 三、机器人信息推送 四、线上使用 五、推送效果 一、 创建群机器人 先选择一个企业微信群右键添加机器人完善机器人的头像、名称即可 二、机器人配置 查看生成的机器人webhook地址点击地址,里面可以查看文档和一些简单的配…

每日学术速递2.1

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.Cv 1.SeaFormer: Squeeze-enhanced Axial Transformer for Mobile Semantic Segmentation 标题:SeaFormer:用于移动语义分割的挤压增强型轴向变换器 作者: Qian…

chatgpt赋能python:Python轨迹可视化:用数据讲故事

Python轨迹可视化:用数据讲故事 介绍 随着物联网、智能城市等领域的发展,越来越多的数据被收集下来并存储在数据库中。这些数据对于决策者来说是非常重要的,但是如何将这些数据进行展示和分析呢?这时候Python轨迹可视化就可以派…

AutoCV第八课:3D基础

目录 3D基础注意事项一、2023/5/11更新二、2023/5/15更新前言1. nuScenes数据集2. nuScenes数据格式3. 点云可视化4. 点云可视化工具5. 点云可视化(补充)总结 3D基础 注意事项 一、2023/5/11更新 新增工具可视化点云,即第 4 节内容 二、2023/5/15更新 经杜老师…

chatgpt赋能python:Python轨迹绘制:让数据可视化更易懂

Python轨迹绘制:让数据可视化更易懂 在数据可视化中,轨迹图应该是最为常见的一种类型了。轨迹图通过展示物体或用户在一定时间范围内移动的路径,帮助我们更加直观地理解和分析数据。 在Python中,我们可以使用多种库来绘制轨迹图…

chatgpt赋能python:Python坐标表示:让您的数据可视化更加精确!

Python坐标表示:让您的数据可视化更加精确! 在数据可视化中,通过准确的坐标表示数据点的位置是非常重要的。Python作为最受欢迎的编程语言之一,有多种方法来表示坐标。在本文中,我们将深入探讨Python中坐标表示的不同…

chatgpt赋能python:Python色板介绍:让数据可视化更加迷人

Python色板介绍:让数据可视化更加迷人 在数据可视化中,合适的配色方案是非常重要的。Python色板是一种常用的工具,可以帮助数据分析师和科学家创建漂亮、易于阅读的图表。本文将为大家介绍Python色板,包括一些主流的Python色板、…

人生意义

一块蛋糕最终还是会被吃完,那么你吃它的目的是什么? 1.你不能因为一样美好的东西最终会消失而否定它的意义。 2.生命是一场馈赠。它和所有我们收到的其它礼物,比如蛋糕一样,本身并没有意义, 但如果你能享受它的美好…