上一篇文章讲到的是如何利用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搭建简单音乐网站(五)的更多相关文章

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

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

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

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

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

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

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

    上一篇遗漏了一个简单的效果没写,见下图: 主页面点击热门推荐和更多之后跳转到歌曲列表页面,现在的页面只是简单的把所有歌曲列出来,没有进行排序.实现起来也很简单,在MainPage的两个链接上添加: & ...

  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. NOI2017退役记

    Day1 全世界都200+我162,考场上fread和fwrite写挂了直接删了,然后就被卡了48也是没谁了. Day2 2-SAT写挂,就没有然后了. 明明退役前一直都在做自己最想做的事情,连这就是 ...

  2. 查看mysql连接情况,以及连接超时时间设置

    查看连接: show processlist;   只展示100个连接 show full processlist;    展示所有连接 查看超时时间: show variables like  '% ...

  3. FFmpeg常用命令 (一)

    常用参数说明: 主要参数:-i 设定输入流-f 设定输出格式-ss 开始时间视频参数:-b 设定视频流量,默认为200Kbit/s-r 设定帧速率,默认为25-s 设定画面的宽与高-aspect 设定 ...

  4. 关于try catch finally的执行顺序解释

    偶然遇到了被问到finally的执行问题,忽然发现一直用的都是try catch 没有用过finally的情况,所以目前总结一下. 先抛出结论: 1.try内部正常执行try的内部逻辑,异常则执行ca ...

  5. HDOJ-1263

    水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  6. linux磁盘存储管理基本命令和工具

    1 磁盘在linux表示方法 (1) IDE硬盘:hd[a~z]x,主设备号+次设备号+磁盘分区编号/hd(0-n,y) (2)SCSI硬盘:sd[a~z]x/hd(0-n,y) 注:主设备号可以唯一 ...

  7. Flutter实战视频-移动电商-49.详细页_Stack制作底部工具栏

    49.详细页_Stack制作底部工具栏 一直悬浮在最下面的 Stack层叠组件.里面用Row 可以横向布局 开始 stack如果想定位就要用position去定位. 修改return返回值的这个地方 ...

  8. msql 初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中, 毫无疑问, 一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题, 并且假设程序所有 ...

  9. myeclipse 去掉spring特性支持

    myeclipse10.0 去掉spring支持  手工修改工程目录下的.project文件中相关的内容 删除<nature>com.genuitec.eclipse.springfram ...

  10. TextBox禁用与启用的方法

    $('#text1').textbox('enable');// 启用 $('#text1').textbox('disable');// 禁用 注:以上方法也适用于datebox等等