07、一步一步学thinkjs之实现注销以及判断是否登录

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修改代码

 

登录的用户名是:<%=userinfo.username%>


注销
浏览下看看http://127.0.0.1:8360/user/index

07、一步一步学thinkjs之实现注销以及判断是否登录_第1张图片

很好,可以查看判断是谁登录的了。


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}); 
     } 
   } 
  
 } 




你可能感兴趣的:(thinkjs)