vue项目实现---用户在页面没有操作5分钟时退出登录

方案1: 后端处理

(1)用户切换页面或者点击按钮时需要发送请求接口,如果后端判断在5分钟之内没有请求,然后将前端的token失效

方案2: 前端处理

(1)在main.js中创建全局的事件监听器来实现对键盘抬起事件和鼠标点击事件的监听

试例:Vue 项目中全局监听键盘抬起事件和鼠标点击事件:`

// main.js

import Vue from 'vue';
import App from './App.vue';

const app = new Vue({
  render: h => h(App),
}).$mount('#app');

// 监听键盘抬起事件
window.addEventListener('keyup', function(event) {
  // 这里可以添加处理键盘抬起事件的逻辑
  console.log('键盘抬起事件:', event.key);
});

// 监听鼠标点击事件
window.addEventListener('click', function(event) {
  // 这里可以添加处理鼠标点击事件的逻辑
  console.log('鼠标点击事件:', event.clientX, event.clientY);
});

// 在Vue实例上挂载,方便在组件中使用
app.$on('keyup', function(event) {
  console.log('键盘抬起事件:', event.key);
});

app.$on('click', function(event) {
  console.log('鼠标点击事件:', event.clientX, event.clientY);
});

(2)当用户登录成功后,创建定时器,开始计时,当5分钟之内如果触发了鼠标点击事件或者键盘抬起事件,定时器重新计时,当时间累计满5分钟时,发送退出登录接口即可;;;

(3)如果涉及到打开了两个tab需要数据共享时,需要将计时时间存储在localeStroge或者BroadCast Channel,两个tab页面共享一个时间计时器

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!将 Vue-element-admin 的开发模板与 Django 后台对接,需要进行以下步骤: 1. 安装 Vue-element-admin,创建项目; 2. 配置 Axios,设置请求拦截器和响应拦截器; 3. 在 Vue-element-admin 中编写登录页面,使用 Axios 向 Django 后台发送登录请求; 4. 在 Django 后台编写登录 API 接口; 5. 在 Vue-element-admin 中编写路由守卫,判断用户是否已经登录; 6. 在 Vue-element-admin 中编写退出登录的代码。 具体操作步骤如下: 1. 安装 Vue-element-admin,创建项目 安装 Vue-element-admin,可以使用以下命令: ``` vue init PanJiaChen/vue-element-admin my-project ``` 安装完成后,进入项目目录并启动项目: ``` cd my-project npm install npm run dev ``` 2. 配置 Axios,设置请求拦截器和响应拦截器 在 `src/utils/request.js` 文件中,配置 Axios,设置请求拦截器和响应拦截器: ``` import axios from 'axios' import { Message } from 'element-ui' import store from '@/store' import { getToken } from '@/utils/auth' // 创建 Axios 实例 const service = axios.create({ baseURL: process.env.BASE_API, timeout: 5000 }) // 请求拦截器 service.interceptors.request.use( config => { // 设置请求头中的 Authorization 字段 if (store.getters.token) { config.headers['Authorization'] = getToken() } return config }, error => { console.log(error) return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response => { const res = response.data if (res.code !== 20000) { Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 }) return Promise.reject(new Error(res.message || 'Error')) } else { return res } }, error => { console.log('err' + error) Message({ message: error.message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } ) export default service ``` 3. 在 Vue-element-admin 中编写登录页面,使用 Axios 向 Django 后台发送登录请求 在 `src/views/login/index.vue` 文件中,编写登录页面,使用 Axios 向 Django 后台发送登录请求: ``` <template> <div class="login-container"> <div class="login-box"> <h2 class="login-title">Login</h2> <el-form :model="loginForm" :rules="rules" ref="loginForm" class="login-form"> <el-form-item prop="username"> <el-input v-model="loginForm.username" placeholder="Username"></el-input> </el-form-item> <el-form-item prop="password"> <el-input type="password" v-model="loginForm.password" placeholder="Password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="login">Login</el-button> </el-form-item> </el-form> </div> </div> </template> <script> import { login } from '@/api/user' import { setToken } from '@/utils/auth' export default { name: 'Login', data() { return { loginForm: { username: '', password: '' }, rules: { username: [{ required: true, message: 'Please input username', trigger: 'blur' }], password: [{ required: true, message: 'Please input password', trigger: 'blur' }] } } }, methods: { async login() { try { await this.$refs.loginForm.validate() const res = await login(this.loginForm) setToken(res.token) this.$router.push({ path: '/' }) } catch (error) { console.log(error) } } } } </script> ``` 在 `src/api/user.js` 文件中,定义登录接口: ``` import request from '@/utils/request' export function login(data) { return request({ url: '/api/login/', method: 'post', data }) } ``` 4. 在 Django 后台编写登录 API 接口 在 Django 后台编写登录 API 接口,例如: ``` from django.contrib.auth import authenticate, login from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['POST']) def login_view(request): username = request.data.get('username') password = request.data.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return Response({'token': 'your_token_here'}) else: return Response({'error': 'Invalid username or password'}, status=status.HTTP_401_UNAUTHORIZED) ``` 5. 在 Vue-element-admin 中编写路由守卫,判断用户是否已经登录 在 `src/permission.js` 文件中,编写路由守卫,判断用户是否已经登录: ``` import router from './router' import { getToken } from '@/utils/auth' const whiteList = ['/login'] router.beforeEach(async(to, from, next) => { const hasToken = getToken() if (hasToken) { if (to.path === '/login') { next({ path: '/' }) } else { next() } } else { if (whiteList.indexOf(to.path) !== -1) { next() } else { next(`/login?redirect=${to.path}`) } } }) ``` 6. 在 Vue-element-admin 中编写退出登录的代码 在 `src/views/layout/components/Header.vue` 文件中,编写退出登录的代码: ``` <template> <div class="header"> <div class="header-left"> <img src="@/assets/logo.png" alt="" class="logo"> <el-menu class="menu" :default-active="$route.path" mode="horizontal" background-color="#fff" text-color="#333" active-text-color="#409EFF"> <el-menu-item index="/">Dashboard</el-menu-item> <el-submenu index="user"> <template slot="title">User</template> <el-menu-item index="/user">User List</el-menu-item> </el-submenu> </el-menu> </div> <div class="header-right"> <el-dropdown trigger="click"> <span class="user-info"> <span class="name">{{ $store.getters.name }}</span> <img :src="$store.getters.avatar" alt="" class="avatar"> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item @click="logout">Logout</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </div> </div> </template> <script> import { logout } from '@/api/user' import { removeToken } from '@/utils/auth' export default { name: 'Header', methods: { async logout() { try { await logout() removeToken() this.$router.push({ path: '/login' }) } catch (error) { console.log(error) } } } } </script> ``` 在 `src/api/user.js` 文件中,定义退出登录接口: ``` import request from '@/utils/request' export function logout() { return request({ url: '/api/logout/', method: 'post' }) } ``` 以上就是将 Vue-element-admin 的开发模板与 Django 后台对接的基本步骤,具体实现还需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值