最近在学习node.js,本来主要用的是Windows系统,但由于云服务器上的是Linux系统,就决定直接在云服务器上进行学习。一方面,可以很好的管理代码,不用传来传去;另一方面,也可以更深层次的学习Linux系统命令。
本次开发系统环境为:CentOS 6.5
网上很多教程,我也是参考了很多教程后才装好了的,主要要注意一下几点:
安装时,注意权限控制
首先进行所需环境的安装,主要有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
主要使用到的技术为:
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首页'
})
});
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;
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
至此,大概完成了基本的登录操作,对于其中处理登录的业务代码还不够完善,值判断了用户名,没进行密码的验证,后续将补上。
其中,includes存放一些通用的块,style放一些样式块,pages存放主要的页面。