1新建一个工程
用express快速建立一个项目模板 express -e microblog ,文档如下
进入package.json修改依赖项:
安装模板npm install
2 路由控制:
//路由
app.get('/', routes.index);
app.get('/u/:user', routes.user);
app.get('/post',routes.checkLogin);
app.get('/post',routes.post);
app.post('/post',routes.checkLogin)
app.post('/post', routes.doPost);
app.get('/reg', routes.checkNotLogin);
app.get('/reg', routes.reg);
app.post('/reg', routes.checkNotLogin);
app.post('/reg', routes.doReg);
app.get('/login', routes.checkNotLogin)
app.get('/login', routes.login);
app.post('/login',routes.checkNotLogin);
app.post('/login', routes.doLogin);
app.get('/logout', routes.logout);
get和post获取当前的url地址,回调后面routes里面的函数
/*
* GET home page.
*/
var crypto=require('crypto'),
User=require('../models/user.js'),
Post=require('../models/post.js');
exports.index = function(req, res){
Post.get(null,function(err,posts){
if(err){
posts=[];
}
res.render('index', {
title: '主页' ,
user:req.session.user,
posts:posts,
success:req.flash('success').toString(),
error:req.flash('error').toString()
});
});
};
exports.user = function(req, res){
};
exports.post = function(req, res){
res.render('post',{
title: '发表' ,
});
};
exports.doPost=function(req,res){
var currentUser=req.session.user,
post=new Post(currentUser.name,req.body.title,req.body.post);
post.save(function(err){
if(err){
req.flash('error',err);
return res.redirect('/');
}
req.flash('success','发布成功!');
return res.redirect('/');
});
}
exports.reg = function(req, res){
res.render('reg',{
title:'注册',
user:req.session.user,
success:req.flash('success').toString(),
error:req.flash('error').toString()
});
};
exports.doReg = function(req, res){
console.log(req.body);
//检测输入的口令是否一致
if(req.body['password-repeat']!=req.body['password']){
req.flash('error','两次输入的口令不一致');
console.log("口令不一致");
return res.redirect('/reg');
}
//生成口令的散列值
var md5=crypto.createHash('md5');
var password=md5.update(req.body.password).digest('base64');
var newUser=new User({
name:req.body.username,
password:password
});
console.log(newUser.name);
//检查用户名是否已经存在
User.get(newUser.name,function(err,user){
console.log(user);
if(user)
err='Username already exists';
console.log(user+"1");
if(err){
req.flash('error', err);
console.log(err+"2");
return res.redirect('/reg');
}
//如果不存在则新增用户
newUser.save(function(err){
if(err){
console.log(err);
req.flash('error', err);
return res.redirect('/reg');
}
console.log("成功");
req.session.user=newUser;
req.flash('success', '注册成功');
return res.redirect('/');
});
});
};
exports.login = function(req, res){
res.render('login',{
title:'登录',
user:req.session.user,
success:req.flash('success').toString(),
error:req.flash('error').toString()
});
};
exports.doLogin = function(req, res){
console.log(req.body);
//生成密码的md5值
var md5=crypto.createHash('md5'),
password=md5.update(req.body.password).digest('base64');
//检查用户是否存在
User.get(req.body.name,function(err,user){
if(!user){
console.log('不存在');
req.flash('error','用户名不存在');
return res.redirect('/login');//用户名不存在跳动登录页
}
//检查密码一致
console.log("user.password: "+user.password+"password: "+password);
if(user.password!=password){
console.log('密码错误');
req.flash('error','密码错误');
return res.redirect('/login')
}
console.log('登录成功');
req.session.user=user;
req.flash('success','登录成功!');
return res.redirect('/')
});
};
exports.logout = function(req, res){
req.session.user=null;
req.flash('success','登录成功');
return res.redirect('/')
};
//页面权限控制
exports.checkLogin=function(req,res,next){
if(!req.session.user){
console.log('未登录');
req.flash('error','未登录!');
res.redirect('/login');
}
next();
}
exports.checkNotLogin=function(req,res,next){
if(req.session.user){
console.log('已登录');
req.flash('error','已登录');
res.redirect('back');//返回之前的页面
}
next();
}
写在对面的index里面的接口中的方法,直接调用
3模板引擎
调用views下面的页面模板
当获取的地址是http://127.0.0.1:3000/时,调用routes.index这个方法,在index.js中调用exports.index这个方法,页面模板是res.render('index'用这个来渲染index页面,然后调用views中index.ejs页面,最后展示的是页面
在views下面新建
4 数据库 mongodb
安装mongodb数据库,然后连接数据库
在工程目录下面新建settings.js文件,保存配置信息里面的内容如下:
db是数据库的名称,host是数据库本地的地址
在工程目录下新建models文件夹,里面新建3个文件
user内容如下
var mongodb=require('./db');
function User(user){
this.name=user.name;
this.password=user.password;
this.email=user.email;
}
module.exports=User;
//存储用户信息
User.prototype.save=function(callback){
//要存入数据库的用户文档
var user={
name:this.name,
password:this.password,
email:this.email
};
//打开数据库
mongodb.open(function(err,db){
if(err){
return callback(err);//错误,返回err信息
}
//读取user集合
db.collection('users',function(err,collection){
//console.log(collection);
if(err){
mongodb.close();
return callback(err);//错误,返回err信息
}
//将用户数据插入 user集合
collection.insert(user,{
safe:true
},function(err,user){
mongodb.close();
if(err){
return callback(err)//返回
}
callback(null,user[0]);//成功!err为null,并返回存储后的用户文档
});
});
});
}
User.get=function(name,callback){
//打开数据库
mongodb.open(function(err,db){
if(err) {return callback(err);}
//读取user集合
db.collection('users',function(err,collection){
if(err) {
mongodb.close();
return callback(err);//错误,返回err信息
}
//查找用户名(name键)值为name一个文档
collection.findOne({
name:name
},function(err,user){
mongodb.close();
if(err){
return callback(err)
}
callback(null,user);//成功!返回查询的用户信息
});
});
});
}
5 程序判断
exports.doReg = function(req, res){
console.log(req.body);
//检测输入的口令是否一致
if(req.body['password-repeat']!=req.body['password']){
req.flash('error','两次输入的口令不一致');
console.log("口令不一致");
return res.redirect('/reg');
}
//生成口令的散列值
var md5=crypto.createHash('md5');
var password=md5.update(req.body.password).digest('base64');
var newUser=new User({
name:req.body.username,
password:password
});
console.log(newUser.name);
//检查用户名是否已经存在
User.get(newUser.name,function(err,user){
console.log(user);
if(user)
err='Username already exists';
console.log(user+"1");
if(err){
req.flash('error', err);
console.log(err+"2");
return res.redirect('/reg');
}
//如果不存在则新增用户
newUser.save(function(err){
if(err){
console.log(err);
req.flash('error', err);
return res.redirect('/reg');
}
console.log("成功");
req.session.user=newUser;
req.flash('success', '注册成功');
return res.redirect('/');
});
});
};
是否注册成功,用户名是否存在
检测数据库的数据
内容发表成功