上一篇遗漏了一个简单的效果没写,见下图:

主页面点击热门推荐和更多之后跳转到歌曲列表页面,现在的页面只是简单的把所有歌曲列出来,没有进行排序。实现起来也很简单,在MainPage的两个链接上添加:

  1. <div id="recommend-head">
  2. <router-link to="/PopularMusic">热门推荐</router-link>
  3. <router-link to="/PopularMusic">更多</router-link>
  4. </div>

表示跳转到PopularMusic页面,该页面下把界面搭好,再利用get请求发送请求并且更新页面,主要代码如下:

  1. created() {
  2. this.$http.get("/query/popularMusic").then(function(response) {
  3. response = response.body
  4. if(response.errno === PMMusic_ok) {
  5. this.musics = response.data
  6. this.musicCount = this.musics.length
  7. }
  8. })
  9. }

musicCount就是上面显示的9,一共9首歌;musics是一个数组,也是后台返回的所有歌曲列表数组。在界面上使用:

  1. <div id="music-list">
  2. <!--这里把曲库所有的音乐按顺序列出来-->
  3. <div id="list-head">
  4. <span>歌曲列表</span>
  5. <span>{{musicCount}}首歌</span>
  6. </div>
  7.  
  8. <table border="none" cellspacing="0" cellpadding="0" id="list">
  9. <tr style="height: 50px;" id="first-line">
  10. <th style="width: 60px;"></th>
  11. <th style="width: 400px;">标题</th>
  12. <th style="width: 140px;">时长</th>
  13. <th style="width: 140px;">歌手</th>
  14. </tr>
  15. <tr v-for="(music, index) in musics" class="other-line">
  16. <td>
  17. <span>{{index+1}}</span>
  18. </td>
  19. <td>
  20. <router-link :to="{path: '/PlayMusic',query: {music:music}}">
  21. <img v-if="index < 3" :src="music.coverPath" class="images" />
  22. <img src="../assets/play-icon.jpg" alt="" class="icon" />
  23. <span>{{music.name}}</span>
  24. </router-link>
  25. </td>
  26. <td>
  27. <span>{{music.time}}</span>
  28. </td>
  29. <td>
  30. <span>{{music.singer}}</span>
  31. </td>
  32. </tr>
  33. </table>
  34. </div>

主要看几个绑定数据的地方:music.name、music.time等等,这样简单的实现了上述效果。

接着昨天的,进行注册功能实现,先是界面的书写,在Login.vue处:

  1. <div id="login" v-show="toLogin">
  2. <h1>登录</h1>
  3. <form id="login">
  4. <div>
  5. <input v-validate="'required|alpha_num|min:6'" @change="change" v-model="username" type="text" name="username" id="email" placeholder="请输入用户名" />
  6. <span class="tips" v-show="errors.has('username')">{{ errors.first('username')}}</span>
  7. <span class="tips" v-show="isShowTips">{{returnUser}}</span>
  8. </div>
  9. <div>
  10. <input v-validate="'required|alpha_num|min:8'" @change="change" v-model="password" type="text" name="password" id="password" placeholder="请输入密码" />
  11. <span class="tips" v-show="errors.has('password')">{{ errors.first('password')}}</span>
  12. <span class="tips" v-show="isShowTips">{{returnPass}}</span>
  13. </div>
  14. <input type="button" @click="checked" name="login" value="提交" />
  15. <input type="button" @click="jump" name="login" value="注册" />
  16. </form>
  17. </div>
  18.  
  19. <!--注册-->
  20. <div id="register" v-show="!toLogin">
  21. <h1>注册</h1>
  22. <form id="login">
  23. <div>
  24. <input v-validate="'required|alpha_num|min:6'" @change="change" v-model="username" type="text" name="username" id="email" placeholder="请输入用户名" />
  25. <span class="tips" v-show="errors.has('username')">{{ errors.first('username')}}</span>
  26. <span class="tips" v-show="isShowTips">{{returnUser}}</span>
  27.  
  28. </div>
  29. <div>
  30. <input v-validate="'required|alpha_num|min:8'" @change="change" v-model="password" type="text" name="password" id="password" placeholder="请输入密码" />
  31. <span class="tips" v-show="errors.has('password')">{{ errors.first('password')}}</span>
  32. <span class="tips" v-show="isShowTips">{{returnPass}}</span>
  33. </div>
  34. <input type="button" @click="checked" name="register" value="提交" />
  35. <input type="button" @click="jump" name="register" value="登录" />
  36. </form>
  37. </div>

这里写了两个div分别用于登录和注册,两者用v-show进行切换,v-show参数为toLogin,当用户点击登陆或者注册按钮,都会改变toLogin的值,实现切换,效果如下:

  

下面是用户输入用户名,发送至后台校验,如果名称已经存在则返回提示消息,如果不存在则存进数据库并且跳转页面。

显示发送数据,仍然是Login.vue页面:

  1. checked: function(e) {
  2. this.$validator.validateAll().then((result) => {
  3. // 如果输入不满足条件,则阻止提交表单
  4. if(!result) {
  5. return false
  6. } else {
  7. var userData = {
  8. username: this.username,
  9. password: this.password
  10. }
  11.  
  12. if(e.target.name === "login") {
  13. // 登陆的话执行
  14. this.$http.post('query/userLogin', userData).then(function(response) {
  15. response = response.body
  16. // 根据返回的errno采取相应动作
  17. // errno:0 表示成功登陆,跳转到MainPage,并且更新主页面
  18. if(response.errno === 0) {
  19. setCookie('username', this.username, 1000 * 60)
  20. this.toMyMusic(response.data)
  21. this.setUser(response.data, true)
  22. } else if(response.errno === 1) {
  23. // alert("密码错误")
  24. this.isShowTips = true
  25. this.returnUser = ""
  26. this.returnPass = "密码错误"
  27. } else {
  28. this.isShowTips = true
  29. this.returnPass = ""
  30. this.returnUser = "用户不存在"
  31. }
  32. })
  33. } else {
  34. // 注册执行
  35. this.$http.post('query/userRegister', userData).then(function(response) {
  36. response = response.body
  37. // 根据返回的errno采取相应动作
  38. // errno:0 表示注册成功,自动登录,跳转到MainPage,并且更新主页面
  39. if(response.errno === 0) {
  40. alert("注册成功,即将跳转到主页面")
  41. setCookie('username', this.username, 1000 * 60)
  42. this.toMyMusic(response.data)
  43. this.setUser(response.data, true)
  44. } else {
  45. // 注册失败,用户已存在
  46. this.isShowTips = true
  47. this.returnPass = ""
  48. this.returnUser = "用户已存在"
  49. }
  50. })
  51. }
  52. }
  53. })
  54. },

可以看到是在登录功能基础上加上注册请求"this.$http.post('query/userRegister', userData)",返回结果中,根据errno进行不同动作,0的话表示成功,跳转页面,其余表示不成功,提示信息设置成“用户已存在”。这里发送数据的方法:setUser,发送至App.vue页面,方法如下:

setUser: function(msg, check) {
  this.$emit('transferUser', msg, check)
}

然后App.vue页面接收:

  1. <router-view @transferUser='getUser'></router-view>
    ...
    getUser: function(msg, isLogin) {
  2. this.userObj.username = msg.username
  3. this.isLogin = isLogin
  4. this.$router.push("/MainPage")
  5.   }

下面是post请求发送后实现校验,在\build\dev-server.js处:

  1. queryRoutes.post("/userRegister", function(req, res) {
  2. usersModel.find({}, function(error, data) {
  3. // 判断
  4. var resData = data.concat()
  5. var resUser = {} //返回匹配用户对象
  6. var reqData = req.body
  7. var username = req.body.username
  8. var password = req.body.password
  9.  
  10. for(var key in resData) {
  11. if(username === resData[key].username) {
  12. res.send({
  13. errno: 1,
  14. data: "用户名已存在"
  15. })
  16. return
  17. }
  18. }
  19.  
  20. var usersEntity = new usersModel({
  21. username: req.body.username,
  22. password: req.body.password,
  23. })
  24. usersEntity.save(function(error, data) {
  25. if(error) {
  26. // 错误,不返回
  27. res.send({
  28. errno: 2,
  29. data: "未知错误,尝试重新操作"
  30. })
  31. } else {
  32. res.send({
  33. errno: 0,
  34. data: usersEntity
  35. })
  36. }
  37. })
  38. })
  39. })

可以看到校验主要用到了usersModel.find(),获得所有用户数据,for循环查找,判断用户名是否存在,找不到用户的话用usersEntity.save方法保存用户,返回成功,找到的话返回错误信息。

注册功能实现还是不难,只是有个问题就是对于数据库的操作,不可能每次都使用usersModel.find()这样的方法去访问数据库,一旦用户多了起来这样的效率是极低的,但是现在的自己也没有学习到太多关于数据库的知识,后面基本功能完成后可能会回来继续优化性能。

从零开始利用vue-cli搭建简单音乐网站(六)的更多相关文章

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

    最近在学习vue框架,练习了一些例子之后,想着搭建一个vue项目,了解到官方有提供一个vue-cli工具来搭建项目脚手架,尝试了一下,写下博客来记录一下. 一.工具环境 1.node.js 6.10. ...

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

    这几天完成了歌曲收藏功能,先看最后效果: 新注册用户:“newuser”,进入“我的音乐界面如下所示” 点击新建歌单,输入:“新歌单”,确认,如下: 目前还没有歌曲,打开音乐界面,点击收藏功能,如下, ...

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

    这是完成了预想中的最后两个功能:歌曲评论以及歌曲搜索. 1.评论效果: 用户点击评论按钮,评论框获取焦点. 输入之后点击提交,下方显示评论,用户名称以及日期.相应的用户也可以删除自己评论. 当然只能删 ...

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

    上一篇文章讲到的是如何利用mongoose从数据库读取数据然后更新页面,接下来要实现的就是用户注册登录功能,这个功能涉及到的东西太多了,今天只实现了登录功能,登陆之后更新导航条界面,最后效果如下: 登 ...

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

    1.利用vue-router实现页面跳转 程序可以正常运行之后,下面我们需要配置路由实现页面的局部刷新,这一功能将用来实现网站页面的跳转. 打开程序目录,进入"src\router\inde ...

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

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

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

    1.利用router-link在组件之间传递数据 如上图,MainPage.vue中主要有8个推荐曲目数据,主要实现方式是建立好主页面模板,然后用v-for循环获取返回的music对象,然后分别绑定曲 ...

  8. vue cli搭建项目及文件引入

    cli搭建方法:需安装nodejs先 1.npm install -g cnpm --registry=https://registry.npm.taobao.org //安装cnpm,用cnpm下载 ...

  9. Koa2+MySQL+VUE+ElementIUI搭建简单的后台管理小系统

    如题,前端入坑许久,还是写个小东西出来吧 想要搭建自己的一个后台管理,实现简单的增删改查,看起来很简单 其实是真的简单,没有想的那么难,我也就写了一个月吧, 当然是假的,其实也就每天一两个小时,花了大 ...

随机推荐

  1. C++之new和delete

    new 和 delete 是 C++ 用于管理 堆内存 的两个运算符,对应于 C 语言中的 malloc 和 free,但是 malloc 和 free 是函数,new 和 delete 是运算符.除 ...

  2. bzoj 3745 [Coci2015]Norma——序列分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...

  3. 红帽系统制作yum本地源

    1 首先得吐槽吐槽,机房冷就算了,不能用手机(哈哈你懂的),没有站的位置,显示屏看不清楚.就这样开始制作yum本地源. 2 记下注意得两点,以防以后会忘记 a:可能是因为红帽系统,加上是实用光盘挂载的 ...

  4. Uploadify API在项目上的应用

    在项目开发中,前端使用easyui,jq的时候,我么涉及到导入的时候都要用到这个上传插件,用法是: 1:先初始化上传控件 2:打开导入的easyui dialog弹出框,dialog里面将上传的inp ...

  5. POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47960   Accepted: 23210 Descriptio ...

  6. ZOJ3163【思维题】

    每天取最远的那面 int main() { init(); int n,x,y; while(~scanf("%d%d%d",&n,&x,&y)) prin ...

  7. 2013 Noip提高组 Day1

    3285 转圈游戏 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description ...

  8. cogs 1176. [郑州101中学] 月考

    1176. [郑州101中学] 月考 ★   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中Bug ...

  9. c3p0连接池的简单使用和测试1

  10. JS中一个new到底做了哪些事情?

    1.https://www.cnblogs.com/faith3/p/6209741.html 2.https://www.cnblogs.com/AaronNotes/p/6529492.html