cnode系列之登陆注册功能

Express应用的结构其实就是R(路由)+M(模型)+V(视图)+C(控制器)。

今天总结之前写的cnode的登陆注册功能。

前提搭好环境, mongodb + redis。

R路由

var express = require('express');
var router = express.Router();
//引入控制器
var signController = require('../controller/sign');

// 注册页面
router.get('/signup', signController.showSignUp);

// 登陆页面
router.get('/signin', signController.showSignin);

// 提交注册
router.post('/signup', signController.signup);

// 提交登陆
router.post('/signin', signController.signin);

// 登出
router.get('/signout', signController.signout);

module.exports = router;复制代码

M(模型)

// user model
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
// 连接本地数据库
mongoose.connect('mongodb://127.0.0.1/cnode');

// 创建Schema
var UserSchema = new Schema({
  username: String,
  pass: String,
  email: String
});

// 为model添加方法

// getUserBySignupInfo: 根据注册信息查询用户信息
UserSchema.statics.getUserBySignupInfo = function(username, email, callback){
  // 查询条件
  var cond = ['$or', {username: username}, {email: email}];
  this.find(cond, callback);
};

// addUser: 添加用户
UserSchema.statics.addUser = function(user, callback){
  // add user
  this.create(user, callback);
};

// getUser: 获取用户
UserSchema.statics.getUser = function(username, pass, callback){
  this.findOne({username: username, pass: pass}, callback);
};

// 根据Schema导出数据模型
module.exports = mongoose.model('User', UserSchema);复制代码

V(视图)

模板代码就不贴了, 主要有一点注意.前端如何判断是否登陆,进行不同模板渲染

// app.js 
// 中间件: 是否用户登陆
app.use(function(req, res, next){
  app.locals.current_user = req.session.user;
  next(); 
});复制代码
 <% if(typeof(current_user) != 'undefined' && success){%>
<li><a href="/signout">登出</a></li>
<% } else {%>
<li><a href="/signup">注册</a></li>
<li><a href="/signin">登陆</a></li>复制代码

C(控制器)

// 控制器: 处理登陆与注册逻辑

var eventproxy = require('eventproxy');
// 引入user model
var UserModel = require('../model/user');

// 渲染注册页面
exports.showSignUp = function (req, res) {
  res.render('sign/signup');
};

// 提交注册信息
exports.signup = function (req, res) {
  // 获取表单数据
  var username = req.body.loginname;
  var pass = req.body.pass;
  var re_pass = req.body.re_pass;
  var email = req.body.email; 

  var ep = new eventproxy();
  // watch emit event 
  ep.on('info_error', function (msg) {
    res.status(422);
    res.render('sign/signup', {
      error: msg
    });
  });

  // 校验表单数据

  // 空校验
  let userInfoArr = [username, pass, re_pass, email]
  for (let i = 0, len = userInfoArr.length; i < len; i++) {
    if (userInfoArr[i] === '') {
      let msgErr = userInfoArr[i]
      ep.emit('info_error', '表单字段内容不能为空'); // emit错误事件
      break
      return;
    }
  };

  // 密码确认校验
  var passIsDiff = pass !== re_pass;

  if (passIsDiff) {
    ep.emit('info_error', '密码与确认密码不相等!'); // emit错误事件
    return;
  };


  // 保存到数据库

  // 根据注册信息去数据库进行查询验证
  UserModel.getUserBySignupInfo(username, email, function(err, users){
    if (err) {
      ep.emit('info_error', '获取用户信息失败!');
      return;
    };
    if (users.length > 0) {
      ep.emit('info_error', '用户名或者邮箱已存在!');
      return;
    };
    // 保存用户信息
    UserModel.addUser({ username: username, pass: pass, email: email}, function(err, result){
      if (result) {
        res.render('sign/signup', {
          success: '恭喜,注册成功!'
        });
      } else {
        ep.emit('info_error', '注册失败!');
      };
    });
  });

};

// 渲染登陆页面
exports.showSignin = function (req, res) {
  res.render('sign/signin');
};

// 提交登陆信息
exports.signin = function (req, res) {
  // 获取表单数据
  var username = req.body.name;
  var pass = req.body.pass;

  // 空校验
  if (!username || !pass) {
    res.status(422);
    return res.render('sign/signin', {error: '您填写的表单信息不完整!'});
  };
  // 获取用户信息
  UserModel.getUser(username, pass, function(err, user){
    if (user) {
      // 登陆成功, 保存用户信息进入session
      req.session.user = user;
      res.render('sign/signin', {
        success: '登陆成功!'
      });
    } else {
      res.status(422);
      res.render('sign/signin', {
        success: '用户名或者密码有误!'
      });
    };
  });
};

// 处理登出
exports.signout = function (req, res) {
  // 销毁session
  req.session.destroy();
  // 重定向到首页
  res.redirect('/');
};复制代码

原文地址: cnode系列之登陆注册功能
仓库代码:cnode

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值