1、紧接上章内容,我们判断下是否登录成功。打开 F:\thinkjs\2hwl\src\home\controller\user.js indexAction中加入代码
let userinfo =await this.session('userinfo');
if (!think.isEmpty(userinfo)){
this.assign('userinfo',userinfo);
}else{
return this.redirect('login');
}
打开F:\thinkjs\2hwl\view\home\user_index.html修改代码
<header>
<div class="wrap">
<h1>登录的用户名是:<%=userinfo.username%> </h1><br>
<a href='logout'>注销</a>
</div>
</header>
浏览下看看http://127.0.0.1:8360/user/index
很好,可以查看判断是谁登录的了。
2、实现注销:打开 F:\thinkjs\2hwl\src\home\controller\user.js中加入如下代码:
async logoutAction(){
await this.session();
return this.redirect('login');
}
原理是一样的将session清空即可。
完整 F:\thinkjs\2hwl\src\home\controller\user.js内容如下:
'use strict';
import Base from './base.js';
export default class extends Base {
/**
* index action
* @return {Promise} []
*/
async indexAction(){
let userinfo =await this.session('userinfo');
//auto render template file user_index.html
if (!think.isEmpty(userinfo)){
this.assign('userinfo',userinfo);
}else{
return this.redirect('login');
}
return this.display();
}
async loginAction(){
if (this.isPost()){//判断是否发送信息给后台了,post数据过来.注意:isPost中的P是大写,js是对大小写敏感的。
let username = this.post('username');//获取用户名给username变量
let password = this.post('password');
let data = await this.model('user').where({username:username,password:password}).find();//到数据库中去查找看是否有数据(用户名密码同时相符)
if (think.isEmpty(data)){//这里我直接用isEmpty居然不能用。查了下资料需要用think.isEmpty()
return this.error(403,'账号密码错误!请重新填写');//登录不成功,返回错误信息。
}else{
this.session('userinfo',data);
this.redirect('index');//登录成功将用户信息写入session,返回到user首页。
}
}
return this.display();
}
async logoutAction(){
await this.session();//这里一定要加await,否则异步执行清除的,直接就转login了,之前没加await,怎么调试都有session。
return this.redirect('login');
}
}
总结下:实际上登录就是this.session(‘userinfo’,data)将查询到的data存入session定义名为userinfo,查询就是this.session('userinfo')将session读取出来判断是否登录,退出就是this.session()清空session。
我们这里只是举例实现。对于session的详细讲解见官网内容, https://thinkjs.org/zh-cn/doc/2.2/adapter_session.html
如果所有页面都需要实现登录才能访问我们对controller中的base.js进行修改即可(因为其他controller以及action都是继承自base.js)。粘贴base.js代码以作参考。
'use strict';
export default class extends think.controller.base {
/**
* before
*/
async __before(){ //__before()是在所有action执行之前调用
let http = this.http;
if(http.controller === 'user' && http.action === 'login'){ //如果是user_login那么久不验证了,直接返回给予登录。
return;
}
let userInfo = await this.session('userInfo') || {};
if(think.isEmpty(userInfo)){//为空返回失败告知没有登录
if(this.isAjax()){
return this.fail('NOT_LOGIN');
}
}
this.userInfo = userInfo;
if(!this.isAjax()){ //返回userinfo,
this.assign('userInfo', {id: userInfo.id, name: userInfo.username});
}
}
}