本章主要講什么(一句話)?
本章主要講解:完善博客系統(tǒng)路由功能
一、前言
? ? ? 上一章主要對項目引入MongoDB進行數(shù)據(jù)存儲,并導(dǎo)入mongoose第三方組件,完成mongodb數(shù)據(jù)庫配置及連結(jié)代碼及利用面向?qū)ο蟮乃枷雽ongoose組件做了封裝。
二、技術(shù)關(guān)健詞
Node、MongoDB、Angular2、Mongoose、Route
三、本章涉及核心技術(shù)點
四、內(nèi)容
4.1、導(dǎo)入相關(guān)模塊
打開routes/index.js 代碼,繼續(xù)完善內(nèi)容:
var crypto = require('crypto'),
User = require('../models/user.js'),
Post = require('../models/post.js');
settings = require('../settings');
module.exports = function(app) {
。。。。。。
}
1. var crypto = require('crypto') ?用于導(dǎo)入將來用來MD5方式加密密碼的第三方Node類
2. User = require('../models/user.js') ?導(dǎo)入上一章封裝的moongose操作User文檔的類
3. Post = require('../models/post.js');? 導(dǎo)入上一章封裝的moongose操作Post文檔的類
4. settings = require('../settings'); ? 導(dǎo)入數(shù)據(jù)庫配置的類,后面會用到
4.2、獲取博客列表
說明:本接口用于獲取博客列表的信息的。http://localhost:8800/get/post?name=zzz
1.get/:說明是get請求
2.如果傳遞了name參數(shù),則說明是:請求某一個人的博文。如:http://localhost:8800/get/post?name=zzz
3.如果沒傳遞name參數(shù),則說明是請求所有人的博文列表,顯示在首頁
代碼如下:
app.get('/get/post', function(req, res) {
// add at 2016-12-23
var username = null;
if (req.query.name != null) {
username = req.query.name;
} else if (req.session.user != null) {
username = req.session.user.name;
}
//代表查詢所有
if (req.query.isAll){
username=null;
}
Post.get(username, function(err, posts) {
if (err) {
posts = [];
}
res.send(posts);
});
});
1.? req.query.name ,用于獲取get訪問的url鏈結(jié),如:http://localhost:8800/get/post?name=zzz
這里獲取到的就是zzz
2. req.session.user ?, 從Session中獲取用戶信息(PS:這里Session的知識點及配置在下一章講,這里暫略)
3. if (req.query.isAll){
username=null;
},即如果傳遞過來的參數(shù)有isAll,則代表查詢所有,如:http://localhost:8800/get/post?isAll=1
4.3、請求某個用戶的信息
/*
說明:本接口用于獲取用戶信息的。http://localhost:8800/get/user?name=zzz
1.get:說明是get請求
2.如果傳遞了name參數(shù),則說明是:請求某個用戶的信息。如:http://localhost:8800/get/user?name=admin
3.如果沒傳遞name參數(shù),則說明是請求所有用戶的信息
*/
app.get('/get/user', function(req, res) {
// add at 2016-12-23
var username = null;
if (req.query.name != null) {
username = req.query.name;
}
User.get(username, function(err, users) {
if (err) {
users = [];
}
res.send(users);
});
});
User.get(username, function(err, users) { ?//調(diào)用Model層里的User類get方法查詢特定用戶信息
if (err) { ? //錯誤處理
users = [];
}
res.send(users); ? //回調(diào)獲取得到的用戶集合傳遞給客戶端
});
4.4、用戶注冊
代碼如下:
/*
說明:本接口用于提交注冊用戶信息的。http://localhost:8800/post/reg
1.post/:說明是post請求
2.注冊未成功,返回Json格式如下:{status:'failed',message:"xxxxxx!"}
3.注冊成功,返回Json格式如下:{status:'success',message:"注冊成功!",user:user}
*/
app.post('/post/reg', function(req, res) {
var name = req.body.name,
password = req.body.password, ? //注意這是Post方式提交的,不能用req.query.xxx方式獲取
password_re = req.body['password_repeat'];
//檢驗用戶兩次輸入的密碼是否一致
if (password_re != password) {
res.send({ status: 'failed', message: "兩次輸入的密碼不一致!" });
return;
}
//生成密碼的 md5 值
var md5 = crypto.createHash('md5'), ? //對密碼采用MD5方式加密
password = md5.update(req.body.password).digest('hex');
var newUser = new User({
name: name,
password: password,
email: req.body.email
});
//檢查用戶名是否已經(jīng)存在
User.get(newUser.name, function(err, user) {
if (err) {
res.send({ status: 'error', message: "出錯了,原因如下:" + err });
return;
}
if (user) {
res.send({ status: 'failed', message: "用戶已存在!" });
return;
}
//如果不存在則新增用戶
newUser.save(function(err, user) {
if (err) {
res.send({ status: 'error', message: "出錯了,原因如下:" + err });
return;
}
res.send({ status: 'success', message: "注冊成功!", user: user });
});
});
});
4.5、用戶登錄
代碼如下(相關(guān)代碼解釋已經(jīng)寫在了代碼注釋中):
/*
說明:本接口用于提交用戶登錄信息的。http://localhost:8800/post/login
1.post/:說明是post請求
2.登錄未成功,返回Json格式如下:{status:'failed',message:"xxxxxx!"}
3.登錄成功,將用戶對象保存到Session
4.登錄成功,返回Json格式如下:{status:'success',message:"登陸成功!",user:user}
*/
app.post('/post/login', function(req, res) {
//生成密碼的 md5 值
var md5 = crypto.createHash('md5'),
password = md5.update(req.body.password).digest('hex');
//檢查用戶是否存在
User.get(req.body.name, function(err, user) {
if (!user) {
res.send({ status: 'failed', message: "用戶不存在!" });
} else if (user.password != password) {
res.send({ status: 'failed', message: "密碼錯誤!" });
} else {
//用戶名密碼都匹配后,將用戶信息存入 session
req.session.user = user;
//console.log(req.session.user);
res.send({ status: 'successed', message: "登陸成功!", user: user });
}
});
});
4.6、判斷用戶是否已經(jīng)登錄成功
代碼如下:
/*
說明:本接口用于提供給前臺,用于判斷用戶是否已經(jīng)登錄成功了。http://localhost:8800/get/checklogin
1.get/:說明是get請求
2.原理是檢查服務(wù)端的session.user是否存在(登錄成功時保存的)
3.返回true:代表用戶已登錄
4.返回false,代表用戶未登錄
*/
app.get('/get/checklogin', function(req, res) {
if (req.session.user) {
res.send({ status: 'successed', message: "已經(jīng)登錄!" ,userName:req.session.user.name});
} else {
res.send({ status: 'failed', message: "沒有登錄!" ,userName:null});
}
});
4.7、提交用戶的編寫的博文
代碼如下:
/*
說明:本接口用于提交用戶的編寫的博文的。http://localhost:8800/post/post
1.post/:說明是post請求
2.提交未成功,返回Json格式如下:{status:'failed',message:"出錯了,原因如下:"+err}
3.提交成功,返回Json格式如下:{status:'successed',message:"保存成功!"}
*/
app.post('/post/post', function(req, res) {
var currentUser = req.session.user,
post = new Post(currentUser.name, req.body.title, req.body.post);
//console.log(post);
post.save(function(err) {
if (err) {
res.send({ status: 'failed', message: "出錯了,原因如下:" + err });
} else {
res.send({ status: 'successed', message: "保存成功!" });
}
});
});
4.8、用戶注銷
代碼如下:
/*
說明:本接口用于用戶注銷。http://localhost:8800/get/logout
1.get/:說明是get請求
2.注銷用戶,即清除服務(wù)端的Session
*/
app.get('/get/logout', function(req, res) {
try {
req.session.user = null;
req.session.destroy(); ?//銷毀服務(wù)端Session
res.send({ status: 'successed', message: "登出成功!" });
} catch (err) {
res.send({ status: 'failed', message: "出錯了,原因如下:" + err });
}
});
五、后述
本章代碼下載:http://pan.baidu.com/s/1pKH1qdl
下章劇透:
《項目實戰(zhàn):基于Angular2+Mongodb+Node技術(shù)實現(xiàn)的多用戶博客系統(tǒng)教程(10)》
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- ?完成Node后臺加入Session支持及前臺跨域訪問配置