cnode系列之登陸註冊功能

小諾哥發表於2019-03-03

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

相關文章