1.安装express第三方库
npm install express --save
var express = require("express") //引入文件,即可使用 var app = express(); //得到express,用来创建服务器
2.安装模板引擎(用于使用模板语法)
npm install art-template express-art-template --save
/*引入配置模板引擎*/ app.engine('html',require('express-art-template')); //'html'和文件后缀名保持一致 /*设置模板默认查找的路径views,第一个参数‘views’,第二个参数是要改变的文件路径*/ app.set('views',path.join(__dirname,'./views'));
3.安装body-parser插件(用于获取表单post请求数据)
npm install body-parser --save
/*配置获取post请求数据的插件*/ app.use(bodyParser.urlencoded({extended:false})); app.use(bodyParser.json());
4.安装mongoose操作MongoDB数据库
npm install mongoose --save
var mongoose = require('mongoose'); //加载mongoose第三方包 /*连接数据库*/ /*第一个参数'mongodb://localhost:27017/user'中user是可变的*/ mongoose.connect('mongodb://localhost:27017/user',{useNewUrlParser: true}); /*得到数据库结构(Schema)*/ var Schema = mongoose.Schema; /*设计数据库结构,约束*/ var userSchema = new Schema({ email: { type: String, required: true }, nickname: { type: String, required: true }, password: { type: String, required: true } }); /*发布为模型并导出*/ module.exports = mongoose.model('User',userSchema);
5.安装密码加密插件
npm install blueimp-md5 --save
var md5 = require("blueimp-md5"); /*给请求过来的body中的密码进行加密*/ request.body.password = md5(md5(body.password));//对密码进行二次加密
6.安装session管理保存一些敏感信息数据状态
npm install express-session
var session = require('express-session'); //加载session /*配置session数据保存状态 * 添加session request.session.属性名 = “值” * 访问session request.session.属性名 * 删除session delete request.session.属性名 * */ app.use(session({ secret: 'keyboard cat', /*配置加密字符串,会在原有的基础上和keyboard cat拼接起来去加密*/ resave: false, saveUninitialized: true /*无论是否使用session,都默认分配一把钥匙*/ }));
app.js(入口文件)
var express = require('express'); //引入express
var path = require('path'); //引入path操作路径
var bodyParser = require('body-parser'); //引入body-parser操作表单post请求数据
var session = require('express-session'); //引入express-session保存敏感信息数据状态
var router = require('./router'); //引入路由接口文件
var app = express(); //得到express
/*开放静态资源*/
app.use('/public/',express.static(path.join(__dirname,'./public')));
app.use('/node_modules',express.static(path.join(__dirname,'./node_modules')));
/*引入配置模板引擎*/
app.engine('html',require('express-art-template'));
app.set('views',path.join(__dirname,'./views'));//更改文件路径默认找views文件目录下的文件
/*配置获取post请求数据的插件*/
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
/*配置session数据保存状态
* 添加session request.session.属性名 = “值”
* 访问session request.session.属性名
* */
app.use(session({
secret: 'keyboard cat', /*配置加密字符串,会在原有的基础上和keyboard cat拼接起来去加密*/
resave: false,
saveUninitialized: true /*无论是否使用session,都默认分配一把钥匙*/
}));
/*加载路由*/
app.use(router);
/*访问页面404处理*/
app.use(function (request,response,next) {
response.render('404.html')
});
/*统一错误处理(四个参数一个都不能少)*/
app.use(function (err,request,response,next) {
response.status(500).json({
err_code:500,
message:err.message /*将错误信息发送出去*/
})
});
/*绑定端口号*/
app.listen('3000',function () {
console.log('Server is running...')
});
router.js(路由文件)
/*路由设置*/
var express = require('express');
var User = require('./module/user');
var md5 = require('blueimp-md5'); //加载密码加密包
/*创建路由*/
var router = express.Router();
/*设置路由*/
/*渲染首页*/
router.get('/',function (request,response) {
response.render('index.html',{
user:request.session.user
});
});
/*渲染注册页面*/
router.get('/register',function (request,response) {
response.render('register.html')
});
/*处理注册请求*/
router.post('/register',function (request,response,next) {
/*获取请求数据*/
/*处理
* 判断邮箱或昵称是否存在(存在则不进行注册)
* 不存在 注册(新建用户信息),永久保存
* */
/*发送响应*/
var body = request.body;
/*查询:看一下注册的用户信息是否存在*/
User.findOne({
$or:[
{email:body.email},
{nickname:body.nickname}
]
},function (err,result) {
if(err){
return next(err)
}
if (result){
/*有数据说明用户存在则不让注册*/
return response.status(200).json({
err_code:1,
message:'邮箱或昵称已存在'
})
}
body.password = md5(md5(body.password));//对密码进行二次加密
/*没有数据,则证明没有这个用户,则将这个数据用来创建用户*/
new User(body).save(function (err,user) {
if(err){
return next(err)
}
/*注册成功,使用session保存登陆状态*/
request.session.user = user; //user是保存数据信息的对象
response.status(200).json({ //创建用户成功
err_code:0,
message:'OK'
})
})
})
});
/*渲染登录页面*/
router.get('/login',function (request,response) {
response.render('login.html')
});
/*处理登录请求*/
router.post('/login',function (request,response,next) {
var body = request.body;
User.findOne({
email:body.email,
password:md5(md5(body.password))
},function (err,user) {
if(err){
return next(err)
}
if(!user){ /*没有查询到,说明输入有误*/
return response.status(200).json({
err_code:1,
message:'邮箱或密码输入错误'
})
}
/*查询到,说明输入正确*/
request.session.user = user; /*通过session保存登陆状态*/
response.status(200).json({
err_code:0,
message:'OK'
})
});
/*获取表单数据*/
/*查询数据库,匹配邮箱和密码是否正确*/
/*发送响应*/
});
/*处理退出请求*/
router.get('/logout',function (request,response) {
/*清除登陆保存状态*/
delete request.session.user;
/*重定向(跳转到登录页)*/
response.redirect('/login')
});
/*导出路由*/
module.exports = router;
user.js(数据库文件)
/*用户数据库模型*/
var mongoose = require('mongoose'); //加载mongoose第三方包
/*连接数据库*/
mongoose.connect('mongodb://localhost:27017/user',{useNewUrlParser: true});
/*得到数据库结构(Schema)*/
var Schema = mongoose.Schema;
/*设计数据库结构,约束*/
var userSchema = new Schema({
email: {
type: String,
required: true
},
nickname: {
type: String,
required: true
},
password: {
type: String,
required: true
},
created_time: {
type: Date,
// 注意:这里不要写 Date.now() 因为会即刻调用
// 这里直接给了一个方法:Date.now
// 当你去 new Model 的时候,如果你没有传递 create_time ,则 mongoose 就会调用 default 指定的Date.now 方法,使用其返回值作为默认值
default: Date.now
},
last_modified_time: {
type: Date,
default: Date.now
},
avatar: {
type: String,
default: '/public/img/avatar-default.png'
},
bio: {
type: String,
default: ''
},
gender: {
type: Number,
enum: [-1, 0, 1],
default: -1
},
birthday: {
type: Date
},
status: {
type: Number,
// 0 没有权限限制
// 1 不可以评论
// 2 不可以登录
enum: [0, 1, 2],
default: 0
}
});
/*发布为模型并导出*/
module.exports = mongoose.model('User',userSchema);