ThinkJS的控制器有个初始化init方法: 在init方法里判断是否已经登录,并且把这个promise返回,后续的action执行则是在这个then之后执行。
下面说说具体代码:
在App/Lib/Controller/Admin/增加一个BaseController.js:
init: function (http) {
this.super('init', http);
/**
* 其他的通用逻辑
*/
//login请求不判断当前是否已经登录
if (this.http.action === 'login') {
return;
}
var self = this;
return self.session('userInfo').then(function (userInfo) {
//用户信息为空
if (isEmpty(userInfo)) {
//ajax访问返回一个json的错误信息
if (self.isAjax()) {
return self.error(403);
} else {
//跳转到登录页
return self.redirect('login');
}
} else {
//用户已经登录
self.userInfo = userInfo;
self.assign('userInfo', userInfo);
}
});
}
这样,当你进入后台任何一个页面时,都会先检测你是否登录,如果没有登录,则跳转到/admin/index/login页面;如果已经登录,则保存session登录信息,以供具体的页面调用。
假设你要在后台首页admin/index/index显示登录的用户名,则可以这么做:
//首页
indexAction: function () {
var userInfo = this.userInfo;
var self = this;
if (!isEmpty(userInfo)) {
self.assign({'title': '管理-首页', 'user': userInfo});
return self.display();
}
}
然后在模版中显示即可:
<h4>当前登录用户:<%= user.name %>,<a href="logout">注销</a></h4>
//注销
logoutAction: function () {
var self = this;
self.session('userInfo', '');
self.redirect('login');
}
注销后跳转到登录页面。
未完待续。。。
水平有限,如果文章有啥错误,还请不吝赐教 :)
扫码关注w3ctech微信公众号
共收到0条回复