Vue(vue+node.js+mongodb)_登录注册(密码登录)

一、前言

1、密码登录(分析)

2、验证码部分

3、提交表单

4、保存显示

5、完善功能,首页中如果登录成功之后显示的是图标,没有登录显示的是“注册登录”

6、处理bug(当我们一刷新之后当前登录的信息都没有了)

二、主要内容

1、密码登录(分析)

(1)第一步用户输入先提交登录表单信息

2、验证码部分

这里显示的验证码,在通过异步调用获取到,并且在后端存进session中

(1)前端部分

<!--获取验证码:前端-->
 <input type="text" maxlength="11" placeholder="验证码" v-model="captcha">
 <img class="get_verification" src="http://localhost:4000/captcha" alt="captcha"  @click="getCaptcha" ref="captcha">

(2)每次点击的时候获取一个新的图片验证码

 // 获取一个新的图片验证码
      getCaptcha () {
        // 每次指定的src要不一样
        this.$refs.captcha.src = ‘http://localhost:4000/captcha?time=‘+Date.now()
      }

(3)发送http://localhost:4000/captcha请求的时候,后台接受到这个请求,并且将当前的这个保存到session中

/*
一次性图形验证码
 */
router.get(‘/captcha‘, function (req, res) {
  var captcha = svgCaptcha.create({
    ignoreChars: ‘0o1l‘,
    noise: 2,
    color: true
  });
  req.session.captcha = captcha.text.toLowerCase();//将创建的这个新的验证码保存到session中
  console.log(req.session.captcha)
  /*res.type(‘svg‘);
  res.status(200).send(captcha.data);*/
  res.type(‘svg‘);
  res.send(captcha.data)
});

3、提交表单

(1)提交表单的时候触发login()方法,然后调用自己在api/index.js中封装的axios方法

 async login () {
        let result

        // 密码登陆
          const {name, pwd, captcha} = this
          if(!this.name) {
            // 用户名必须指定
            this.showAlert(‘用户名必须指定‘)
            return
          } else if(!this.pwd) {
            // 密码必须指定
            this.showAlert(‘密码必须指定‘)
            return
          } else if(!this.captcha) {
            // 验证码必须指定
            this.showAlert(‘验证码必须指定‘)
            return
          }
          // 发送ajax请求密码登陆
          result = await reqPwdLogin({name, pwd, captcha})

}

(2)reqPwdLogin方法如下

封装的ajax

import axios from ‘axios‘
export default function ajax(url = ‘‘, data = {}, type = ‘GET‘) {
        return new Promise(function (resolve, reject) {
        let promise
        if (type === ‘GET‘) {
        // 准备url query 参数数据
        let dataStr = ‘‘ //数据拼接字符串
        Object.keys(data).forEach(key => {
        dataStr += key + ‘=‘ + data[key] + ‘&‘
        })
        if (dataStr !== ‘‘) {
        dataStr = dataStr.substring(0, dataStr.lastIndexOf(‘&‘))
        url = url + ‘?‘ + dataStr
        }
        // 发送get 请求
        promise = axios.get(url)
        } else {
        // 发送post 请求
        promise = axios.post(url, data)
        }
        promise.then(response => {
        resolve(response.data)
        })
        .catch(error => {
        reject(error)
        })
        })
}

ajax.js

import ajax from ‘./ajax‘
const BASE_URL = ‘/api‘
//5.根据用户名密码登录
export const reqPwdLogin = ({name, pwd, captcha}) => ajax(‘/api‘+‘/login_pwd‘, {name, pwd, captcha}, ‘POST‘)

 (3)执行完第三步之后,会向服务器发送请求,服务器处理post请求

/*
密码登陆
 */
router.post(‘/login_pwd‘, function (req, res) {
  const name = req.body.name   //将表单提交的数据存下来
  const pwd = md5(req.body.pwd)
  const captcha = req.body.captcha.toLowerCase()
  console.log(‘/login_pwd‘, name, pwd, captcha, req.session)

  // 可以对用户名/密码格式进行检查, 如果非法, 返回提示信息
  if(captcha!==req.session.captcha) {
    return res.send({code: 1, msg: ‘验证码不正确‘})
  }
  // 删除之前保存的验证码
  delete req.session.captcha

  UserModel.findOne({name}, function (err, user) {
    if (user) {
      console.log(‘findUser‘, user)
      if (user.pwd !== pwd) {
        res.send({code: 1, msg: ‘用户名或密码不正确!‘})
      } else {
        req.session.userid = user._id
        res.send({code: 0, data: {_id: user._id, name: user.name, phone: user.phone}})
      }
    } else {
      const userModel = new UserModel({name, pwd})
      userModel.save(function (err, user) {
        // 向浏览器端返回cookie(key=value)
        // res.cookie(‘userid‘, user._id, {maxAge: 1000*60*60*24*7})
        req.session.userid = user._id
        const data = {_id: user._id, name: user.name}
        // 3.2. 返回数据(新的user)
        res.send({code: 0, data})
      })
    }
  })
})

  (4)后台验证成功后需要做两步操作

第一步:将后台返回的user信息保存在vuex的state中去

第二步:实现路由跳转

 async login () {
        let result
       // 密码登陆
          const {name, pwd, captcha} = this
          if(!this.name) {
            // 用户名必须指定
            this.showAlert(‘用户名必须指定‘)
            return
          } else if(!this.pwd) {
            // 密码必须指定
            this.showAlert(‘密码必须指定‘)
            return
          } else if(!this.captcha) {
            // 验证码必须指定
            this.showAlert(‘验证码必须指定‘)
            return
          }
          // 发送ajax请求密码登陆
          result = await reqPwdLogin({name, pwd, captcha})

        // 停止计时
        if(this.computeTime) {
          this.computeTime = 0
          clearInterval(this.intervalId)
          this.intervalId = undefined
        }

        // 根据结果数据处理
        if(result.code===0) {
          const user = result.data
          // 将user保存到vuex的state
          this.$store.dispatch(‘recordUser‘, user)
          // 去个人中心界面
          this.$router.replace(‘/profile‘)
        } else {
          // 显示新的图片验证码
          this.getCaptcha()
          // 显示警告提示
          const msg = result.msg
          this.showAlert(msg)
        }
      }

4、保存显示

  (1)用vuex来管理状态

state.js中定义userinfo来存放提交成功的用户名和密码

export default{

    userInfo:{}//保存提交的用户信息
}

mutation-types.js中定义

export const RECEIVE_USER_INFO = ‘receive_user_info‘//接受用户信息

mutations.js

/*
vuex的mutations.js模块
*/
import {
      RECEIVE_USER_INFO,
} from ‘./mutation-types‘
export default{
    //这个是方法名,action 和mutation交互的时候传的是包含这个数据的对象
      [RECEIVE_USER_INFO] (state, {userInfo}){
            state.userInfo = userInfo
      }
}

actions.js

/*
vuex的actions.js模块
*/
import {
    RECEIVE_USER_INFO,
} from ‘./mutation-types‘

//三个接口函数
import {
    reqUserInfo,

} from ‘../api‘

export default{
    //同步记录用户信息
    recordUser ({commit},userInfo){
        commit(RECEIVE_USER_INFO,{userInfo})
    },
}

(2)在app.vue中用,模块actions中记录的保存用户信息事件,

// 根据结果数据处理
        if(result.code===0) {
          const user = result.data
          // 将user保存到vuex的state
          this.$store.dispatch(‘recordUser‘, user)
          // 去个人中心界面
          this.$router.replace(‘/profile‘)
        } else {
          // 显示新的图片验证码
          this.getCaptcha()
          // 显示警告提示
          const msg = result.msg
          this.showAlert(msg)
        }

(3)登录成功之后显示用户名,实现如下效果

第一步:需要从state中取出保存的userInfo,然后显示在页面中

import {mapState} from ‘vuex‘
    export default{
       components:{
           HeaderTop
       },

       computed:{
           ...mapState([‘userInfo‘])
       }

    }
</script>

第二步:显示

<!--如果有userInfo信息,这里就显示用户信息,否则就显示注册/登录-->
<p class="user-info-top">{{userInfo._id|| ‘注册|登录‘}}</p>

5、完善功能,首页中如果登录成功之后显示的是图标,没有登录显示的是“注册登录”

 (1)已登录

 (2)未登录

<router-link class="header_login" slot=‘right‘ :to="userInfo._id? ‘/userInfo‘:‘/login‘">
                   <span class="header_login_text" v-if="!userInfo._id">登录注册</span>
                   <span class="header_login_text" v-else>
                         <i class="iconfont icon-geren"></i>
                   </span>
</router-link>

6、处理bug(当我们一刷新之后当前登录的信息都没有了)

session是以赖与cookie的,

一般有两种cookie,一种是会话级别的(当刷新浏览器,或者关闭浏览器之后,在cookie中保存的信息就没有了),一种是持久化的(可以在cookie中将信息保存一段时间)

(1)在后台中设置保存的时间

app.use(session({
  secret: ‘12345‘,
  cookie: {maxAge: 1000*60*60*24 },  //设置maxAge是80000ms,即80s后session和相应的cookie失效过期
  resave: false,
  saveUninitialized: true,
}));

(2)服务器中会根据session中的userid,查询对应的user

/*
根据sesion中的userid, 查询对应的user
 */
router.get(‘/userinfo‘, function (req, res) {
  // 取出userid
  const userid = req.session.userid
  // 查询
  UserModel.findOne({_id: userid}, _filter, function (err, user) {
    // 如果没有, 返回错误提示
    if (!user) {
      // 清除浏览器保存的userid的cookie
      delete req.session.userid

      res.send({code: 1, msg: ‘请先登陆‘})
    } else {
      // 如果有, 返回user
      res.send({code: 0, data: user})
    }
  })
})

    (3)前台最开始肯定要向后台发送一个请求,如果查询到了,当前的用户信息是session中保存的信息,就免登陆

在actions.js模块中添加一个方法

//异步获取用户信息,让应用一开始就调用这个方法
    //获取商家列表
    async getUserInfo ({commit, state}){
        //1.发送异步ajax请求,调用上面那个方法,现在的数据是在state里面
        const result = await reqUserInfo()
        //2.提交一个mutation
        if(result.code == 0){
            const userInfo = result.data
            commit(RECEIVE_USER_INFO,{userInfo:result.data})
        }
    }

(4)在前台调用这个方法

<script>
  import FooterGuide from ‘./components/FooterGuide/FooterGuide.vue‘
  import {mapActions} from ‘vuex‘
export default {
  name: ‘App‘,
  components:{
    FooterGuide
  },
  mounted(){
   this.getUserInfo()
  }
  ,
  methods:{
    ...mapActions([‘getUserInfo‘])
  }
}
</script>

三、总结

原文地址:https://www.cnblogs.com/xxm980617/p/10848780.html

时间: 2024-11-10 01:09:59

Vue(vue+node.js+mongodb)_登录注册(密码登录)的相关文章

Vue(vue+node.js+mongodb)_退出登录

一.前言 二.主要内容 1.当用户登录之后才会出现“退出登录按钮” 2.登录之后  3.这里使用mint-ui, “退出登录”按钮的显示隐藏和是否有userInfo的值是一样的,如果存在userInfo就显示这个退出按钮,如果没有登录就不显示 <section class="profile_my_order border-1px"> <mt-button type="danger" style="width: 100%" @cl

Vue.js实践:一个Node.js+mongoDB+Vue.js的博客内容管理系统

项目来源 以前曾用过WordPress搭建自己的博客网站,但感觉WordPress很是臃肿.所以一直想自己写一个博客内容管理器. 正好近日看完了Vue各个插件的文档,就用着Vue尝试写了这个简约的博客内容管理器(CMS). 嗯,我想完成的功能: 一个基本的博客内容管理器功能,如后台登陆,发布并管理文章等 支持markdown语法实时编辑 支持代码高亮 管理博客页面的链接 博客页面对移动端适配优化 账户管理(修改密码) Demo 登陆后台按钮在页面最下方"站长登陆",可以以游客身份登入后

Vue2.0+Node.js+MongoDB 全栈打造商城系统

第1章 课程介绍简单回顾前端近几年的框架模式,了解不同时期下的框架特点.其次介绍Vue框架的背景和核心思想,以及同其它MV*框架的对比.1-1 课程-导学1-2 前端框架回顾1-3 vue概况以及核心思想1-4 vue框架优缺点对比 第2章 Vue基础从0到1,如何搭建一个简单的Vue项目:本章节主要讲解Node和Npm环境的搭建,其次介绍vue-cli脚手架的使用,以及通过详细拆解介绍脚手架生成的配置文件信息,最后给大家介绍了Vue涵盖的基础语法.2-1 nodejs和npm的安装和环境搭建2

node.js+mongodb 爬虫

demo截图: 本demo爬瓜子二手车北京区的数据 (注:需要略懂 node.js / mongodb 不懂也没关系 因为我也不懂啊~~~) 之所以选择爬瓜子二手车网站有两点: 一.网站无需登录,少做模拟登录: 二.数据连接没有加密,直接可以用: 网上很多node.js爬虫的栗子 但大多是一个页面的栗子,很少跟数据库结合的 所以我这个栗子是糖炒的 我的基本思路是这样的 1.先在mongodb里存所有页的连接地址的集合 2.在根据这些链接地址 一个一个的把详细信息爬下来 第一步在搜索页找到翻页的规

Node.JS + MongoDB技术浅谈

看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座          云计算 +大数据 = 未来. 在中国的云计算上基本上是一个概念,个人感觉与当初的SOA没有太大的差别,空泛的理论. 中小型开发的未来 = Node.JS + MongoDB解决,并非说Java就没用了. 1.在前面的话 Java技术始终作为高端软件用户的首选,仅仅要从事大型的软件开发,那么Java都是必需要使用的技

使用Node.js + MongoDB 构建restful API

很多天前已经翻译了一大半了,今天收收尾~ RESTful API With Node.js + MongoDB Translated By 林凌灵 翻译目的:练练手,同时了解别人的思维方式 原文地址:RESTful API With Node.js + MongoDB 12 Sep 2013 我是一名移动应用开发者,我需要某种后端服务用来频繁地处理用户数据到数据库中.当然,我可以使用后端即服务类的网站(Parse, Backendless, 等等-),(译者:国内比较出名的有Bmob).但自己解

《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想

总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and AngularJS Web Development>,总的来说是一本讲述如何用Javascript进行B/S架构全栈开发的书. 该书主要讲解4种技术(框架),分为6个部分29个章节.4种技术即Node.js.MongoDB.Express.AngularJS,业内称为MEAN:6个部分我个人理解为: 基础(引言).

AngularJS + Node.js + MongoDB开发的基于位置的通讯录(by vczero)

一.闲扯 有一天班长说了,同学们希望我开发一个可以共享位置的通讯录,于是自己简单设计了下功能.包括用户角色.发表微博.共享位置等等.这次也是有点私心的,为了锻炼最近看的angularjs,于是果断选择Node.js + MongoDB + angular.js的方案.当然,开发Node.js的体会越来越深刻.记得,去年leader告诉我说尽量让node的每一个服务只支撑一个业务功能,这样才能更方便的维护.当时特别想把一个Node服务做的特别强大.现在看来leader的做法是对的,我更加倾向于把n

Node.js+MongoDB+AngularJS Web开发

这篇是计算机类的优质预售推荐>>>><Node.js+MongoDB+AngularJS Web开发> MEAN全栈工程师首部实战书 从服务器到浏览器基于JavaScript的Web应用程序权威指南 内容完整细致可直接用来入门任一技术 编辑推荐 Node.js是一种领先的服务器端编程环境,MongoDB是最流行的NoSQL数据库,而AngularJS正迅速成为基于MVC的前端开发的领先框架.它们结合在一起使得Web程序员能够完全用JavaScript创建从服务器到客户端