功能主頁
這是功能主頁,光是在UI就花了我很多時間OTZ
主要功能有新增/更新/刪除文章,另外配合權限不同UI呈現也有所不同
另如說此畫面的用戶為sj82516,有另一位用戶jacky拜訪留言
所以可以看到自己的PO文才能刪除和新增,其他用戶的拜訪只能瀏覽而已
所以會需要紀錄兩個帳號 1.登入帳號/2.拜訪帳號
登入帳號
這邊我的做法是:用戶登入後用session保留,自己產生一個驗證的middleware驗證用戶權限,要注意的是route會有執行先後順序,因為我希望這個頁面的所有動作都要通過驗證權限,所以擺在最上方。
function authorize(req, res, next){
console.log("authorize");
console.log(req.session);
if(typeof req.session.account === "undefined"){
console.log("illegal");
res.redirect("/");
return;
}
//查詢session保留的登入帳號
User.find({account: req.session.account}, function(err, users){
if(err){
console.log(err);
res.status(401).json('db error');
return;
}
if(users.length===0){
res.status(401).json('not sign in yet');
return;
}
req.authUser = users[0];
next();
})
};
router.use(authorize);
最後保留在request的authUser中,之後會用到
拜訪帳號
拜訪帳號做法比較簡單,就是透過URL裡頭的帳號設置,保留在request的user中,之後會用到
router.param("account", function(req, res, next, account){
console.log("account check");
console.log(account);
User.find({account: account}, function(err, users){
if(err){
console.log(err);
res.status(401).json('db error');
return;
}
if(users.length===0){
console.log("no user error");
res.status(401).json('user not exists');
return;
}
req.user = users[0];
next();
});
});
router.get('/:account', function(req, res, next) {
.....
})
之後在render頁面時都會一次帶入authUser/User資訊
res.render('user/user_person',{
account: req.user.account,
username: req.user.username,
authAccount: req.authUser.account,
authUsername: req.authUser.username,
description: req.user.description,
articles: articles,
title: "WELCOME"
});
頁面渲染時Jade就可以藉此解析畫面,下面是片段的程式碼
div.articleArea
div.articleHead
if article.authorAccount === article.toWhomAccount
a(href="http://127.0.0.1:3000/users/" + article.authorAccount)= article.authorUsername
span -
span= article.title
else
a(href="http://127.0.0.1:3000/users/" + article.authorAccount)= article.authorUsername
span to
a(href="http://127.0.0.1:3000/users/" + article.toWhomAccount)= article.toWhomUsername
span -
span= article.title
if authAccount === article.authorAccount
span
button.pull-right.deleteArticle(type="button")
span.glyphicon.glyphicon-remove
span
button.pull-right.updateArticle(type="button")
span.glyphicon.glyphicon-upload