/
page-type.js
150 lines (128 loc) · 3.41 KB
/
page-type.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*!
* LetsBlog
* Pre-execute functions of different page types
* Released under MIT license
*/
'use strict';
var Promise = require('bluebird'),
util = require('../lib/util'),
optionsBLL = require('../bll/options'),
categoryBLL = require('../bll/category'),
linkBLL = require('../bll/link'),
userModel = require('../entity/user'),
userBLL = require('../bll/user'),
userGroupBLL = require('../bll/usergroup');
// 在数组最前面插入元素
function prepend(elt, arr) {
if ( Array.isArray(arr) ) {
arr = arr.slice();
} else if (arr) {
arr = [arr];
} else {
arr = [ ];
}
if (elt) { arr.unshift(elt); }
return arr;
}
exports.prepend = prepend;
// 基础页面
function basicPage(callbacks) {
return prepend(function(req, res, next) {
var user;
return userBLL.readByUsernameAndPassword(
req.cookies.username,
req.cookies.password
).then(function(result) {
user = result;
}).catch(function(e) {
// error的情况下表示没有登录
// 无需处理异常
}).then(function() {
// 如果用户未登录或不存在,则生成一个访客对象
user = user || userModel.createEntity({
userid: 0,
username: '',
groupid: 2
});
return userGroupBLL.read(user.groupid);
}).then(function(result) {
if (result) {
user.group = result;
req.currentUser = user;
var userData = user.toPureData();
// 删除较为敏感的密码信息,防止误输出
delete userData.password;
if (res.routeHelper.type() === 'html') {
res.routeHelper.viewData('currentUser', userData);
}
if (user.userid) {
// 更新用户最后在线状态
return userBLL.updateActivity(req.ip, user.userid);
}
} else {
throw util.createError('用户组不存在');
}
});
}, callbacks);
}
exports.basic = basicPage;
// 标准页面
function normalPage(callbacks) {
return basicPage(
prepend(function(req, res, next) {
var isHTMLPage = res.routeHelper.type() === 'html';
if (isHTMLPage) { res.routeHelper.viewData('categoryid', -1); }
var tasks = [
// 加载网站设置
optionsBLL.read().then(function(result) {
if (!result) {
err = util.createError('网站设置丢失', 500);
} else if (!result.isopen) {
err = util.createError(result.tipstext || '网站已关闭');
} else {
if (res.routeHelper.type() === 'html') {
res.routeHelper.appendTitle(result.sitename);
res.routeHelper.appendKeywords( result.keywords.split(/\s*,\s*/) );
res.routeHelper.viewData({
description: result.description,
currentOptions: result,
currentYear: ( new Date() ).getFullYear()
});
}
}
})
];
if (isHTMLPage) {
tasks.push(
// 加载可见分类
categoryBLL.list(1).then(function(result) {
res.routeHelper.viewData('categoryList', result);
}),
// 加载可见链接
linkBLL.list(1).then(function(result) {
res.routeHelper.viewData('linkList', result);
})
)
}
return Promise.all(tasks);
}, callbacks)
);
}
exports.normal = normalPage;
// 管理后台页面
function adminPage(callbacks) {
return basicPage(
prepend(function(req, res, next) {
if (req.currentUser.userid) {
next();
} else {
res.redirect(
'/user/login' +
'?referrer=' + encodeURIComponent(req.originalUrl) +
'&msg=' + encodeURIComponent('请先登录')
);
}
}, callbacks)
);
}
exports.admin = adminPage;