从零开始利用vue-cli搭建简单音乐网站(八)

news/2024/5/9 22:34:41/文章来源:https://blog.csdn.net/nqxcwl/article/details/102874887

这是完成了预想中的最后两个功能:歌曲评论以及歌曲搜索。

1、评论效果:

用户点击评论按钮,评论框获取焦点。

输入之后点击提交,下方显示评论,用户名称以及日期。相应的用户也可以删除自己评论。

当然只能删除自己的评论,鼠标放置其他人评论上面不会显示删除按钮。

2、搜索歌曲

搜索可以搜索歌曲或者歌手,这里搜索"LiSA",结果如下:

也可以只输入“A”,显示如下:

这里有一个歌手页面,显示的是所有歌手的歌曲,如点击"Aimer"歌手:

至此,基本功能就展示完成,下面看实现。

先是评论功能,在评论按钮监听点击事件:“<button class="btn" @click="focusToComment">评论</button>”

focusToComment事件,id=comment就是评论输入框:

focusToComment: function() {// 点击跳转评论document.getElementById("comment").focus()},

然后是输入框提交按钮监听事件:“<input type="button" id="submitBtn" name="submitBtn" value="评论" @click="submitComment" />”

submitComment事件提交所输入的评论,实现如下:

            submitComment: function() {if(this.PlayMusicMsg.username == "") {alert("请先登录")} else {// 这里把评论,用户名,评论日期作为一个对象,然后和歌曲名称一起作为对象传递给后台var message = this.messagevar username = this.PlayMusicMsg.username// 这里获取当前时间var date = new Date()var year = date.getFullYear()var month = date.getMonth()   1var day = date.getDate()var commentDate = year   "年"   month   "月"   day   "日"var musicName = this.music.namevar commentObj = {message: message,username: username,commentDate: commentDate,pos: 0}var commentData = {musicName: musicName,commentObj: commentObj}// 发送请求this.$http.post('/query/insertMusicComment', commentData).then(function(response) {if(response.body.errno === 0) {// 成功,更新界面var newpos = response.body.datavar commentObj = {message: message,username: username,commentDate: commentDate,pos: newpos}this.comments.push(commentObj)alert("评论成功")}})}},

先是利用App.vue页面传递过来的PlayMusicMsg参数检测用户名是否存在,不存在表示还没有登录,所以提示先登录。然后登陆的话,把用户名username,评论message,评论日期Date封装为commentObj对象,注意该对象还有一个pos,表示评论位置,这是我实现评论删除的思路,因为每一首歌曲下面只有一个评论数组,所以后面只需要找到对应pos的评论就可以从数据库去除。接着把commentObj对象和歌曲名musicName封装在一起发送给后台,成功的话用this.comments.push(commentObj)把评论显示在页面上。

接着是后台处理评论数据,如下:

// 插入歌曲评论
queryRoutes.post('/insertMusicComment', function(req, res) {var musicName = req.body.musicNamevar commentObj = req.body.commentObjmusicCommentModel.find({musicName: musicName}, function(error, data) {console.log(data)if(data[0] != null) {// 数据存在,更新// 这里给每个评论添加一个序号var length = data[0].comments.lengthvar pos;if(length === 0) {pos = 1} else {var last = data[0].comments.length - 1pos = data[0].comments[last].pos   1}commentObj.pos = posdata[0].comments.push(commentObj)musicCommentModel.update({musicName: musicName}, {comments: data[0].comments}, function(error, data) {res.send({errno: 0,data: pos})})} else {// 数据不存在,插入var comments = []commentObj.pos = 1comments.push(commentObj)var musicCommentEntity = new musicCommentModel({musicName: musicName,comments: comments})musicCommentEntity.save({}, function(error, data) {res.send({errno: 0,data: pos})})}})
})

先获取到musicName和commentObj,利用find方法查找musicName是否存在,存在则更新数据。先获取该musicName下的评论数组的长度length,如果length=0,则pos设置为1,也就是将要插入的评论的序号,这也是为了将来删除所用。如果length不等于0那么pos等于评论数组最后一位的pos 1。接着利用data[0].comments.push(commentObj)把评论插入数组最后,最后利用update方法更新数据库。另一种情况,如果查找的musicName不存在的时候,pos设置为1,评论插入新数组comments.push(commentObj),新建musicCommentEntity实体,用其save方法保存到数据库。

下面是删除功能,在PlayMusic.vue页面,监听每一个评论项<li @mouseenter="show(index,value.username)" @mouseleave="hide" id="each-comment">,show方法显示“删除评论“字样,hide隐藏。实现如下:

<!--这里是删除评论元素绑定-->
<span v-show="index === i" @click="delComment(value.pos)" id="del-comment">删除评论</span>

show: function(index, username) {// 显示删除按钮,但是先判断当前用户名和评论用户名是否相等if(this.PlayMusicMsg.username === username) {this.i = index}},hide: function() {// 隐藏删除按钮this.i = -1},

这里的删除元素处绑定的是v-show="index===i",因为这是在一个v-for循环中,index是循环序号,i默认值为-1,当show事件触发的时候,把所有i赋值为index,也就是触发show事件的元素所在的序号,那么自然只有该元素的index才等于i,也就会显示出”删除按钮“了,具体可以参考博客:https://segmentfault.com/q/1010000005160077

这里用户点击删除按钮时候触发delComment事件,事件传递一个参数value.pos,也就是我上面保存时候所说的pos,这里的pos和数据库中的是一一对应的。delComment事件实现如下:

            delComment: function(pos) {// 删除评论var delCommentData = {musicName: this.music.name,pos: pos}this.$http.post('/query/delComment', delCommentData).then(function(response) {if(response.body.errno === 0) {// 删除成功,更新界面var comments = this.commentsconsole.log(comments)for(var key in comments) {if(comments[key].pos === pos) {comments.splice(key, 1)break}}this.comments = comments}})}

实现很简单,封装delCommentData对象,musicName和pos,发送请求,成功的话界面也更新,更新思路是利用pos找到删除评论所在位置,用splice方法删除,更新。接着是后台接收请求然后实现的代码:

// 删除歌曲评论
queryRoutes.post('/delComment', function(req, res) {var musicName = req.body.musicNamevar pos = req.body.posmusicCommentModel.find({musicName: musicName}, function(error, data) {var comments = data[0].commentsfor(var key in comments) {if(comments[key].pos === pos) {comments.splice(key, 1)break}}musicCommentModel.update({musicName: musicName}, {comments: comments}, function(error, data) {res.send({errno: 0,data: data})})})
})

后台的思路其实是一样的,根据pos找到序号,删除,再用update更新。

评论功能之后,是歌曲搜索功能。实现思路是利用了mongoose的模糊搜索,匹配一个正则表达式对象,如果数据包含所匹配的字符串则返回,如下:

// 关键词搜索音乐
queryRoutes.post('/search', function(req, res) {var searchStr = req.body.strvar reg = new RegExp(searchStr)// 关键词索引
    musicDataModel.find({$or: [{name: reg}, {singer: reg}]}, function(error, data) {res.send({errno: 0,data: data})})
})

以上就是搜索的全部实现要点了,注意musicDataModel.find()方法里面的$or,这是mongoose提供的选择查找,属性值是一个数组,这里我分别查找了name和singer两个数据,也就是根据关键词匹配歌曲名称或者匹配歌手,参考链接:https://segmentfault.com/a/1190000008161345

然后返回前台,前台接收到数据更新在页面。关于前台有一点要提的就是,我是在App.vue的导航条处设置的搜索栏,这里用户点击确定后路由会渲染新组件SearchResult.vue,此时App会把用户输入数据发送给该子组件,具体实现如下:

            search: function(e) {if(e.keyCode === 13) {// 跳转到搜索结果页面,把数据发送过去this.$router.push({name: 'SearchResult',query: {str: this.searchStr}})this.$router.go(0)}}

SearchResult.vue组件接收数据:”this.str = this.$route.query.str“

上面是用了路由的query参数,我要说的问题就是,当用户第一次搜索的时候跳转很成功,但是如果在SearchResult搜索结果页面再次在搜索框输入数据之后,是必须刷新一次页面的数据才会更新,不然会完全没有反应,也就是search函数继续执行,但是str就是不更新。所以注意上面我写的this.$router.go(0),这是路由跳转函数,go(0)就表示跳转到浏览器历史纪录中的当前地址,全局路由一定要设置mode:history,否则会出错。

下面实现的就是歌手页面,也没有什么特别的技术,就不赘述了。以上

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

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

相关文章

从零开始利用vue-cli搭建简单音乐网站(四)

上一篇文章中说到这一篇博客会实现音乐播放功能&#xff0c;只是令我意外的是&#xff0c;如果利用h5的audio标签&#xff0c;几行代码就实现了......先来看一下最终效果吧。 这里直接用了audio标签&#xff0c;样式没有怎么管&#xff0c;能获得音乐文件并且播放就足够了。 所…

免费建站系统 Joomla 3.9.5 发布

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> Joomla 3.9.5现已推出。这是针对3.x系列Joomla的安全修复程序版本&#xff0c;它解决了三个安全漏洞&#xff0c;包含20多个错误修复和改进。 什么是3.9.5&#xff1f; Joomla 3.9…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

网站优化--让你的网页飞起来

摘要&#xff1a; 网站快要上线了&#xff0c;但是网站打开速度很慢怎么办&#xff1f;这里介绍一下对网页进行优化的方法和技巧&#xff0c;加快网页浏览速度&#xff0c;让网页速度飞起来 测试网页性能工具 ⑴Page Speed&#xff1a; 是开源 Firefox/Firebug 插件。网站管理员…

网站优化--让你的网页飞起来

摘要&#xff1a; 网站快要上线了&#xff0c;但是网站打开速度很慢怎么办&#xff1f;这里介绍一下对网页进行优化的方法和技巧&#xff0c;加快网页浏览速度&#xff0c;让网页速度飞起来 测试网页性能工具 ⑴Page Speed&#xff1a; 是开源 Firefox/Firebug 插件。网站管理员…

让网站飞起来02--服务器缓存

前提提要&#xff1a; 第一个介绍的是《让网站飞起来01---浏览器缓存技术》 介绍服务器&#xff0c;肯定要先支持服务器在网站架构中的位置和作用&#xff0c;然后在介绍几种常见的服务器缓存配置。 正文 对服务器在网站中位置作用有个大概了解&#xff1a;lamp架构图 上图主要…

Digital Ocean 搭建属于自己的网站

首先&#xff0c;需要Digital Ocean账号申请以及环境搭建的参考博客&#xff1a;https://blog.csdn.net/hunzhangzui9837/article/details/85209245 下面&#xff0c;开始Digital Ocean 网站搭建 1、WDCP的安装和管理 WDCP相当于一个服务器管理界面&#xff0c;可以直接在we…

Mozilla出了个网站安全评估工具 93%的网站居然都不合格

2019独角兽企业重金招聘Python工程师标准>>> Mozilla的安全工程师April King发现&#xff0c;世界上绝大多数的网站 - 高达93.45&#xff05; - 并没有实施许多现代安全技术&#xff0c;为用户提供安全的连接&#xff0c;并保护他们免受跨站点的攻击脚本&#xff08…

构架高性能WEB网站的几点知识

构架高性能WEB网站的几点知识 前言&#xff1a; 对于构架高性能的web网站大家都很感兴趣&#xff0c;本文从几点粗谈高性能web网站需要考虑的问题。 HTML静态化 什么是html静态化&#xff1f; 说得简单点&#xff0c;就是把所有不是.htm或者.html的页面改为.htm或者.html 1.纯静…

高性能建站之前端优化篇

高性能建站之前端优化篇 2011-10-25 17:50 by PHP淮北, 560 visits,收藏,编辑 前言&#xff1a; 这算是对前端优化的总结吧&#xff0c;之前零零星星总结和学习&#xff0c;这次做一个完整的总结。 测试网页性能工具 ⑴Page Speed&#xff1a; 谷歌开发的工具&#xff0c;网…

8个应该去逛逛JQuery的学习网站

根据国外科技网站 W3Techs 一项调查了近100万个网站数据显示&#xff0c;jQuery是目前最流行的 JavaScript 库。对于初学者来说&#xff0c;有的时候很难找到一个好的学习jQuery的网站&#xff0c;所以本文收集了8个很棒的 jQuery 学习网站推荐给大家。 1. Learning jQuery 最…

Hexo博客yilia主题使用cnzz统计网站访问量

使用友盟第三方的统计插件&#xff0c;网址&#xff1a;http://www.umeng.com/ 进入网站先注册账号然后根据下列图片进入添加站点。 添加站点&#xff0c;自己搭建的博客&#xff0c;需要统计访问量的网站(这里加入我的博客网站)&#xff0c;然后点击统计代码进入代码页 代码页…

网站刷关键词_关键词快速排名靠谱吗?应该如何判断

企业要想在竞争激烈的市场中&#xff0c;赢得更多用户的关注&#xff0c;如果没有把网站的排名优化到显眼的地方&#xff0c;是很难实现变现的。如果想提升网站的排名&#xff0c;通过不断优化网站关键词而实现的。企业想快速实现关键词排名&#xff0c;于是网络上就出现很多“…

Linux系列-Red Hat5平台下的LAMP网站服务搭建(一

Linux系列-Red Hat5平台下的LAMP网站服务搭建&#xff08;一&#xff09; 编译安装Apache服务器&httpd服务的基本配置 LAMP架构是目前最为成熟的一种企业网站应用模式&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够…

蝉知网站模板常用的Jquery

1.因为蝉知调用到ZUI的缘故&#xff0c;所有class类名会比较多&#xff0c;有时候方便操作样式&#xff0c;常用到去除类名&#xff1a; <p class"chanzhi">Its a wonderful website.</p> 如果class有样式设计复杂影响设计&#xff0c;则可以去除class类…

仿站和模板建站的区别_建站方式多种,哪个比较适合?

网站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需进入网站右上角注册快速建站即可(需要电脑登录注册)&#xff0c;需要联系我吧&#xff01;电话&#xff1a;13752214574&#xff0c;微信号&#xff1a;m1078582894做网站一般分为…

mobi格式电子书_几个超赞的免费电子书下载网站(支持kindle)

作者 / 青柠学术来源 / 公众号(青柠学术)全文共1312字&#xff0c;推荐阅读时间4分钟。现在有很多电子书阅读爱好者&#xff0c;下面分享给大家一些电子书的下载网站&#xff0c;相信你会在这些网站找到你想要看的电子书、以及你想要的格式的电子书&#xff01;--壹--书语者书语…

mixamo网站_使用mixamo动捕数据在blender中实现写实动画

Mixamo是adobe旗下的一个基于web的在线3D人物动画制作平台&#xff0c;最重要的是它提供了丰富、免费的动作捕捉数据供下载。下面介绍如何将动捕数据下载并导入blender制作动画。1.mixamo动捕数据下载。网站地址&#xff1a;https://www.mixamo.com首先完成注册&#xff0c;只有…

免费音乐素材网站推荐 视频剪辑自媒体运营必备

各位各位各位&#xff01;各位宝贝&#xff01;今天俺又来跟大家推荐宝藏音乐素材网站了&#xff01;不管是日常剪辑还是自媒体运营我们都会用到一些BGM&#xff0c;但是有很多网站是收费的&#xff0c;又或者免费但音乐十分难听&#xff0c;今天就来跟大家分享一波小V君私藏的…

自媒体运营、平面设计封面如何搭配?3大色彩搭配网站推荐

之前给大家分享了很多无版权的图片网站、音乐素材网站&#xff0c;但日常设计我们常常会遇到配色的问题&#xff0c;不管是设计作图、动效制作还是自媒体封面都需要用到配色&#xff0c;不同的色彩搭配也会出现不同的效果。今天就来跟大家分享一波神仙配色设计网站。 一、Cool…