Node.js + Mongodb 建站學習歷程1

前言

最近在學習node.js,本來主要用的是Windows系統,但由於雲服務器上的是Linux系統,就決定直接在雲服務器上進行學習。一方面,可以很好的管理代碼,不用傳來傳去;另一方面,也可以更深層次的學習Linux系統命令。
本次開發系統環境爲:CentOS 6.5

環境安裝

node安裝

網上很多教程,我也是參考了很多教程後才裝好了的,主要要注意一下幾點:

  1. 支撐node所需環境的安裝
  2. 所安裝環境的版本
  3. 安裝時,注意權限控制

    首先進行所需環境的安裝,主要有GCC,如已安裝,請更新到最新版本
    安裝命令:

yum -y install gcc make gcc-c++ openssl-devel wget

進入所要安裝的目錄,一般進入/usr/local/,然後新建node目錄,命令爲:
進入目錄:cd /usr/local
新建node目錄:mkdir node
下載node資源包進行安裝:

wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz
    tar -zvxf node-v0.10.26.tar.gz

編譯安make && make install否安裝成node -v mongodb 安裝
方法很多,可以用下載源碼進行編譯安裝,也可以進行直接下載二進制的配置運行,但最終我還是使用了yum方式安裝,感覺這樣更簡單些

yum install -y mongo-10gen mongo-10gen-server

查看安裝後的mongodb的配置文件,一般存在/etc/mongod.conf,直接用vi打開即可查看。
啓動mongodb服務

service mongod start

連接mongodb方式,需要進入連接客戶端位置,運行bin目錄下的mongo文件。
創建mongodb數據庫:

use web

創建所需表及添加數據

db.login.insert({uid:1,username:'admin',password:'admin',logins:0,logintime:'',loginip:''})

可以改變對應數據,多增加幾條數據,方便開發測試

代碼編寫

路由表編寫

初次編寫,我把路由和業務代碼都寫在了一起,主要入口文件爲app.js
主要使用到的技術爲:

  1. schema與model方式綁定mongodb數據庫表及進行數據庫操作
  2. node的express中jade引擎渲染視圖
  3. mongoose方式連接mongodb數據庫

app.js主要代碼爲:

var express = require('express');
var path = require('path');
var mongoose = require('mongoose');
var _ = require('underscore');
var Login = require('./models/login');  //調用Login的Models
var port = process.env.PORT || 8888;  //node啓動端口綁定
var app = express();
var bodyParser = require('body-parser');

mongoose.connect('mongodb://localhost/web');  //mongoose方式連接mongodb連接字符串

app.set('views','./views/pages');
app.set('view engine','jade');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname,'node_modules')));
app.listen(port);

console.log('web started on port '+ port);

//login page
app.get('/login',function(req,res){
        res.render('login',{
            title:'用戶登錄頁面'
        });
});
//login post page
app.post('/login',function(req,res){
    var username = req.body.username;
    var password = req.body.password;
    var loginObj = req.body;
    var _login;

    if(username !== 'undefined'){
        Login.findById(username,function(err,login){
            if(err){
                console.log(err);
            }

            console.log(login)
            _login = _.extend(login,loginObj);            
            if(login){
                console.log('登錄成功!');
                res.redirect('/');  //跳轉至主頁面
            }else{
                console.log('登錄失敗,請檢查用戶名或密碼!');
                res.render('login',{
                    mes:'登錄失敗,請檢查用戶名或密碼!'
                }) 
            }
        });
    }
    console.log(username);
});

//index page
app.get('/',function(req,res){
   res.render('index',{
    title:'MyWeb首頁'
   })
});
//list page
app.get('/list',function(req,res){
    Login.fetch(function(err,userlist){
        if(err){
            console.log(err);
        }
        console.log(userlist);

        res.render('list',{
            title:'list首頁',
            users:userlist
        });
    });
});
//admin page
app.get('/admin',function(req,res){
   res.render('admin',{
    title:'admin首頁'
   })
});

schema處理數據

schemas/login.js代碼:

var mongoose = require('mongoose');

var LoginSchema = new mongoose.Schema({
    uid:String,
    username:String,
    password:String,
    loginTime:Date,
    logins:Number,
    loginIp:String
});

LoginSchema.pre('save',function(next){
    if(this.isNew){
        this.loginTime = Date.now();
    }
    next();
});

LoginSchema.statics = {
     findById:function(username,cb){
        return this
            .findOne({username:username})
            .exec(cb);
    },
    fetch:function(cb){
        return this.find({}).exec(cb);
    }
}

module.exports = LoginSchema;

modles操作數據庫

models/login.js代碼:

var mongoose = require('mongoose');
var LoginSchema = require('../schemas/login');
var Login = mongoose.model('Login',LoginSchema);

module.exports = Login;

前端頁面代碼

前端頁面主要用jade引擎渲染,其中,login.jade的主要代碼爲:

extends ../layout
include ../style/login

block content
    .container
        .row
            .col-md-5
            .col-md-7
                p.title #{sysname}用戶登錄
        hr
        .row
            .col-md-12
                .center
                    .panel.panel-default
                        .panel-body
                            form.form-horizontal(method="post",action="/login")
                                .form-group
                                    label.col-sm-4.control-label(for="inputName") 用戶名
                                    .col-sm-4
                                        input#inputName.form-control(type="text",name="username")
                                    .col-sm-4
                                .form-group
                                    label.col-sm-4.control-label(for="inputpwd") 密碼
                                    .col-sm-4
                                        input#inputpwd.form-control(type="password",name="password")
                                    .col-sm-4
                                        p #{mes}
                                .form-group
                                    .col-sm-4
                                    .col-sm-4
                                        include ../style/login
                                        input.btn.btn-default.button(type="submit" value="登錄")
                                        input.btn.btn-default.button(type="reset" value="重置")
                                    .col-sm-4

注:jade代碼層級非常重要,要嚴格進行代碼縮進,否則會報錯
layout.jade的主要代碼爲:

doctype
html
    head
        meta(charset="utf-8")
        meta(name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no")
        title #{title}
        include ./includes/head
    body
        include ./includes/header
        block content

至此,大概完成了基本的登錄操作,對於其中處理登錄的業務代碼還不夠完善,值判斷了用戶名,沒進行密碼的驗證,後續將補上。

主要文件結構

根目錄
根目錄

views目錄
views目錄

其中,includes存放一些通用的塊,style放一些樣式塊,pages存放主要的頁面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章