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存放主要的页面。

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