从零开始利用vue-cli搭建简单音乐网站(五)
上一篇文章讲到的是如何利用mongoose从数据库读取数据然后更新页面,接下来要实现的就是用户注册登录功能,这个功能涉及到的东西太多了,今天只实现了登录功能,登陆之后更新导航条界面,最后效果如下:
登录之前:
登陆之后(用户名:oujiamin):
这是登陆界面(还没有设置css):
主要实现步骤:
1、校验
所谓校验就是对用户的输入进行限制并且给出一点提示,这里使用的是vee-validate插件,该插件主要作用就在于可以很方便地绑定input标签并且给出校验规则和提示语,使用步骤:
安装:npm install --save-dev vee-validate
在main.js引入:import VeeValidate, { Validator } from 'vee-validate'
默认为英文提示,所以要修改成中文:import zh from 'vee-validate/dist/locale/zh_CN.js'
最后:Validator.addLocale(zh)
const config = {
locale: "zh_CN"
}
Vue.use(VeeValidate, config)
完成此步骤后,vee-validate插件已经可以使用了,在需要的组件处使用:
<template>
<div id="login">
<h1>Login</h1>
<form id="login">
<div>
<input v-validate="'required|alpha_num|min:6'" v-model="username" type="text" name="username" id="email" placeholder="请输入用户名" />
<span class="tips" v-show="errors.has('username')">{{ errors.first('username')}}</span>
</div>
<div>
<input v-validate="'required|alpha_num|min:8'" v-model="password" type="text" name="password" id="password" placeholder="请输入密码" />
<span class="tips" v-show="errors.has('password')">{{ errors.first('password')}}</span>
</div>
<input type="button" @click="checked" value="提交" />
</form>
</div>
</template>
主要看input标签处,在input标签上添加属性v-validate=""就可以使用,里面的属性值‘required|alpha_num|min:6’分别表示:
alpha_num:输入必须为字母或者数字
min:6:输入最少长度为6
注意:v-validate=""的属性必须再用''括起来,不然不会有提示语句,我就是被这个坑了很长时间。关于vee-validate更详细的用法,可以参考博客:
http://www.cnblogs.com/zishang91/p/7609460.html
http://www.cnblogs.com/xxwang/p/6104715.html
最后效果如下:
2、使用vue-resource发送post请求进行登录操作,这里在component文件夹新建了一个Login.vue文件,就是上面的Login界面
首先“提交“按钮绑定checked()方法:<input type="button" @click="checked" value="提交" />
在组件下定义checked方法:
methods: {
checked: function() {
this.$validator.validateAll().then((result) => {
// 如果输入不满足条件,则阻止提交表单
if(!result) {
return false
} else {
var userData = {
username: this.username,
password: this.password
}
this.$http.post('query/userLogin', userData).then(function(response) {
response = response.body
// 根据返回的errno采取相应动作
// errno:0 表示成功登陆,跳转到MainPage,并且更新主页面
this.setUser(response.data.username, true)
})
}
})
}
这里实现的效果有两个,第一个是在校验规则不通过的情况下不允许请求发送(return false):
this.$validator.validateAll().then((result) => {
// 如果输入不满足条件,则阻止提交表单
if(!result) {
// 不发送
return false
} else {
... // 发送
}
}
第二个是发送post请求,判断账号是否存在数据库并且获得该账号信息:
this.$http.post('query/userLogin', userData).then(function(response) {
response = response.body
this.setUser(response.data.username, true)
})
注意这里的setUser方法,这里是假设账号合法并且已经成功把账号信息返回之后所执行的操作,目的在于把username返回给App.vue页面,更新导航条界面(隐藏登录/注册按钮,显示用户名)实现的方法也不复杂,利用了父子组件之间传递数据的方法。在Login.vue组件(子组件)定义setUser方法,post请求得到返回数据之后调用setUser方法,把username传递过去,第二个参数true是为了给App.vue页面的v-show判断然后改变状态。下面是setUser方法代码:
setUser: function(msg, check) {
this.$emit('transferUser', msg, check)
}
接下来需要在App.vue界面(父组件)响应该方法并且更新界面,如下:
<router-view @transferUser='getUser'></router-view>
上面使用getUser方法响应transferUser,transferUser就是子组件传递过来的值,下面定义getUser方法:
methods: {
getUser: function(msg, check) {
this.username = msg
this.check = check
this.$router.push("/MainPage")
}
}
最后一句是”this.$router.push("/MainPage")“,表示路由自动触发跳转到MainPage页面。App.vue完整代码如下:
<template>
...
<div id="login-page">
<router-link to="/Login" v-show="!check">登录/注册</router-link>
<span v-show="check">{{username}}</span>
<router-view @transferUser='getUser'></router-view>
</div>
</template> <script>
import Login from '@/components/Login.vue'
export default {
name: "app",
data() {
return {
check: false,
username: ""
}
},
methods: {
getUser: function(msg, check) {
this.username = msg
this.check = check
this.$router.push("/MainPage")
}
},
components: {
Login
}
}
</script>
上述是在post请求成功情况下实现的操作,成功与否还需要根据校验结果来判定。已经事先在数据库创建了users集合并且插入了一条信息,主要两条数据:username和password
下面是修改build/dev-server.js文件代码:
先是创建了userSchema和userModel(上一篇讲到的,使用Mongoose的方法),利用userModel.find方法获得数据库数据,并且在回调函数中执行操作,data就是数据库返回的数组对象
usersModel.find({}, function(error, data) {
...
}
在函数中绑定路由的post请求:
queryRoutes.post('/userLogin', function(req, res) {
...
}
然后再post请求的回调函数里面判断用户名和密码是否符合:
var resData = data.concat()
var resUser = {} //返回匹配用户对象
var reqData = req.body
var username = req.body.username
var password = req.body.password for(var key in resData) {
if(username === resData[key].username) {
if(password === resData[key].password) {
resUser = {
username: resData[key].username,
password: resData[key].password
} res.send({
errno: 0,
data: resUser
})
} else {
res.send({
errno: 1,
data: "密码错误"
})
}
}
} res.send({
errno: 2,
data: "用户不存在"
})
简单解释一下,利用for循环遍历resData数组(resData就是data的一个复制数组,不是把地址赋值给它,而是复制了一份新的),当发现username === resData[key].username的时候,表示该用户名已经存在,进一步判断密码是否相等,相等则直接返回data数据,errno置为0。不相等表示密码错误,返回字符串”密码错误“,errno置为1,如果都不想等则直接返回”用户不存在“,errno置为2。
完整代码:
usersModel.find({}, function(error, data) {
queryRoutes.get('/user', function(req, res) {
res.send({
errno: 0,
data: data
})
})
queryRoutes.post('/userLogin', function(req, res) {
var resData = data.concat()
var resUser = {} //返回匹配用户对象
var reqData = req.body
var username = req.body.username
var password = req.body.password for(var key in resData) {
if(username === resData[key].username) {
if(password === resData[key].password) {
resUser = {
username: resData[key].username,
password: resData[key].password
} res.send({
errno: 0,
data: resUser
})
} else {
res.send({
errno: 1,
data: "密码错误"
})
}
}
} res.send({
errno: 2,
data: "用户不存在"
}) })
})
app.use('/query', queryRoutes)
这里有一个问题需要注意就是使用express.router模块发送post请求的时候,一直在后台接收req为空,这里需要在代码前面添加:
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
至此已经实现了用户登录功能,后面将要实现用户注册以及相应的音乐收藏,评论等与用户有关的功能。
从零开始利用vue-cli搭建简单音乐网站(五)的更多相关文章
- 从零开始利用vue-cli搭建简单音乐网站(一)
最近在学习vue框架,练习了一些例子之后,想着搭建一个vue项目,了解到官方有提供一个vue-cli工具来搭建项目脚手架,尝试了一下,写下博客来记录一下. 一.工具环境 1.node.js 6.10. ...
- 从零开始利用vue-cli搭建简单音乐网站(七)
这几天完成了歌曲收藏功能,先看最后效果: 新注册用户:“newuser”,进入“我的音乐界面如下所示” 点击新建歌单,输入:“新歌单”,确认,如下: 目前还没有歌曲,打开音乐界面,点击收藏功能,如下, ...
- 从零开始利用vue-cli搭建简单音乐网站(八)
这是完成了预想中的最后两个功能:歌曲评论以及歌曲搜索. 1.评论效果: 用户点击评论按钮,评论框获取焦点. 输入之后点击提交,下方显示评论,用户名称以及日期.相应的用户也可以删除自己评论. 当然只能删 ...
- 从零开始利用vue-cli搭建简单音乐网站(六)
上一篇遗漏了一个简单的效果没写,见下图: 主页面点击热门推荐和更多之后跳转到歌曲列表页面,现在的页面只是简单的把所有歌曲列出来,没有进行排序.实现起来也很简单,在MainPage的两个链接上添加: & ...
- 从零开始利用vue-cli搭建简单音乐网站(二)
1.利用vue-router实现页面跳转 程序可以正常运行之后,下面我们需要配置路由实现页面的局部刷新,这一功能将用来实现网站页面的跳转. 打开程序目录,进入"src\router\inde ...
- 从零开始利用vue-cli搭建简单音乐网站(四)
上一篇文章中说到这一篇博客会实现音乐播放功能,只是令我意外的是,如果利用h5的audio标签,几行代码就实现了......先来看一下最终效果吧. 这里直接用了audio标签,样式没有怎么管,能获得音乐 ...
- 从零开始利用vue-cli搭建简单音乐网站(三)
1.利用router-link在组件之间传递数据 如上图,MainPage.vue中主要有8个推荐曲目数据,主要实现方式是建立好主页面模板,然后用v-for循环获取返回的music对象,然后分别绑定曲 ...
- vue cli搭建项目及文件引入
cli搭建方法:需安装nodejs先 1.npm install -g cnpm --registry=https://registry.npm.taobao.org //安装cnpm,用cnpm下载 ...
- Koa2+MySQL+VUE+ElementIUI搭建简单的后台管理小系统
如题,前端入坑许久,还是写个小东西出来吧 想要搭建自己的一个后台管理,实现简单的增删改查,看起来很简单 其实是真的简单,没有想的那么难,我也就写了一个月吧, 当然是假的,其实也就每天一两个小时,花了大 ...
随机推荐
- poi word 转html (.DOC .DOCX )
注:不支持图片,支持表格 package com.bjhy.platform.report.commons; import java.io.BufferedWriter; import java.io ...
- bzoj2687
整体二分+决策单调性 这个方法已经忘了... 决策单调性是指dp[i]由dp[1]->dp[i-1]更新,那么当dp[j]比dp[k]优且j>k时,对于i->n j都比k优 通过这个 ...
- 非侵入式JavaScript(Unobtrusive javaScript)理解
转载自 https://my.oschina.net/leegq/blog/279750 在Web的早期阶段,也就是在jQuery出现以前,在同一个文件中混杂JavaScript代码和HTML标记是非 ...
- 为Docker容器设置静态IP
此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 创建docker容器 docker run -it --name=yh -h yh --net=none de ...
- js点击复制某段文本方法
百度很多说这个方法 window.clipboardData.setData ("Text", "demo"); 实践证明只有ie支持. 改成下面这个方式来复制 ...
- 201621123016 《Java程序设计》第七周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 关键词:事件源,事件监听器,事件处理方法,事件适配器 ...
- Android教程
转载,但请务必在明确位置注明出处! http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/ Android Killer ...
- 51nod 1102 【单调栈】
思路: 对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w; 利用单调栈就行了: #include <cstdio> #include <stack> #inc ...
- JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...
- IT兄弟连 JavaWeb教程 JSP访问JavaBean
在JSP网页中,既可以通过程序代码来访问JavaBean,也可以通过特定的JSP标签来访问JavaBean.采用后一种方法,可以减少JSP网页中的程序代码,使他更接近与HTML页面.下面介绍访问Jav ...