从零开始利用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搭建简单的后台管理小系统
如题,前端入坑许久,还是写个小东西出来吧 想要搭建自己的一个后台管理,实现简单的增删改查,看起来很简单 其实是真的简单,没有想的那么难,我也就写了一个月吧, 当然是假的,其实也就每天一两个小时,花了大 ...
随机推荐
- 图片轮播和C3动画
值得注意的地方是:如果在图片下面的li做背景图片,可以把li上的数字或者文本设置为transparent(透明色),这样的话既可以实现轮播的定时器效果,也可以让li上有C3动画效果.如果li上的文字不 ...
- vue-router 安装
如果在一个模块化工程中使用它,需要通过Vue.use() 明确的安装路由功能,如果使用全局的script标签,则不需要手动安装. Vue Router是Vue.js官方的路由管理器.它和Vue.js的 ...
- storyBoard学习教程一(页面跳转)
今天为了给伙伴作一篇storyBoard快速编程的教程,所以才写下了这篇博客. 有过storyBoard 编程经验的伙伴还是不要阅读本篇博客了,我自己认为,太基础太简单了,为了方便别人学习使用,我还是 ...
- E - Jolly Jumpers
E - Jolly Jumpers Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- Httpclient爬取优酷网
参考:http://www.cnblogs.com/lchzls/p/6277210.html /httpClient/src/main/java/com/louis/youku/Page.java ...
- docker的安装与卸载
卸载老版本docker sudo apt-get remove docker docker-engine docker.io /var/lib/docker/目录下存放着 images, contai ...
- java泛型基础、子类泛型不能转换成父类泛型--未完待续
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- Flutter实战视频-移动电商-22.JSON解析和复杂数据模型转换技巧
22.JSON解析和复杂数据模型转换技巧 json转Model类 创建model文件夹,在里面新建category.dart类 主要根据这个json来分析我们要做成类的样子 { ", &qu ...
- C 语言实例 - 计算 int, float, double 和 char 字节大小
C 语言实例 - 计算 int, float, double 和 char 字节大小 C 语言实例 C 语言实例 使用 sizeof 操作符计算int, float, double 和 char四种变 ...
- unicode官网 unicode码表和标准下载