群控系统服务端开发模式-应用开发-前端退出功能
我们从未登录一直到退出,现在已经登录到操作,现在完成退出。退出有两种情况下会退出:第一种情况下是手动点击退出按钮,第二种情况下是登录过期时间到了自动退出的。
一、手动退出
因退出及个人信息页面都在公有页面,所以存放的位置不同。具体位置在根目录下src文件夹下layout文件夹下components文件夹下Navbar.vue文件中。
1、修改退出按钮字样
<el-dropdown-item divided @click.native="logout">
<span style="display:block;">退出</span>
</el-dropdown-item>
2、修改退出方法
在根目录下src文件夹下store文件夹下modules文件夹下user.js文件中,修改logout方法,代码如下
logout({ commit, state, dispatch }) {
return new Promise((resolve, reject) => {
logout().then(res => {
if (res.code === 50034) {
reject(res.message)
} else if (res.code === 50000) {
warn(res.message)
} else {
succ(res.message)
commit('SET_TOKEN', '')
commit('SET_BUTTS', [])
commit('SET_ROLES', [])
commit('SET_USERNAME', '')
commit('SET_AVATAR', '')
commit('SET_EMAIL', '')
commit('SET_REALNAME', '')
commit('SET_DEPARTMENT_TITLE', '')
commit('SET_GRADE_TITLE', '')
commit('SET_ROLENAME', '')
removeToken()
resetRouter()
dispatch('tagsView/delAllViews', null, { root: true })
resolve()
}
}).catch(error => {
reject(error)
})
})
},
二、自动退出
1、工作原理
因我们的token存在Redis中,而Redis有一个键自动过期回调方法,只要采用thinkphp6的命令工具就行检测到,然后清理服务器上过期登录者数据状态即可。如果不做此操作,只是影响登录者的token记录真实退出时间而已。
2、创建监听过期时间命令
在根目录下config文件夹下console.php文件中,添加如下命令
<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
// 指令定义
'commands' => [
'redisClusterControlApiExpireToken' => 'app\command\ExpireToken',
],
];
3、创建监听过期时间方法
在根目录下app文件夹下创建command文件夹,然后在command文件夹下创建ExpireToken命令控制方法,具体代码如下
<?php
/**
* 过期清理token命令
* User: 龙哥·三年风水
* Date: 2024/11/13
* Time: 10:15
*/
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class ExpireToken extends Command
{
protected function configure(){
// 指令配置
$this->setName('redisClusterControlApiExpireToken')->setDescription('the redisClusterControlApiExpireToken command');
}
protected function execute(Input $input, Output $output){
$redis = new \Redis();
$redis->connect('172.20.36.144',6379);
$redis->auth('QXtr@@PxjoLenGon');
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
$redis->psubscribe(array("__keyevent@126__:expired"), function ($redis, $pattern, $channel, $msg){
$res = explode('_', $msg);
if(count($res) == 2){
if(!is_numeric($res[1])){
$expireTime = time();
$dbconnect = new \PDO("mysql:host=172.20.36.143;dbname=cluster_control", 'cluster_control', '7%Qh3ar@TiA5Rt#gNPT');
$sqlTokenUpdate = "Update nc_permission_token SET expire_time = {$expireTime} WHERE token = '{$res[1]}'";
$dbconnect->exec($sqlTokenUpdate);
}
}
});
}
}
三、提前说明
其实,在总控制base里面的token里面也可以做这个事情,但是这样不是很好。这样的想法也是需要通过前端去刷新页面才得来的结果。