当前位置: 首页 > news >正文

如何用VUE实现用户发呆检测?

Vue3 企业级管理系统中的智能发呆检测功能实现

引言

在现代企业级管理系统中,安全性是一个至关重要的考虑因素。用户长时间不操作可能导致会话过期,这不仅影响系统安全,还可能造成数据丢失。本文将详细介绍我们在 Vue3 + Element Plus 管理系统中实现的智能发呆检测功能。

功能概述

发呆检测(Inactivity Detection)是一种自动监控用户活动状态的功能,当用户在一定时间内没有任何操作时,系统会自动提醒用户并最终执行登出操作。我们的实现具有以下特点:

  • 智能监控:实时监听用户的鼠标移动、键盘输入、点击、滚动等操作
  • 优雅提醒:在登出前提供美观的倒计时弹窗
  • 可配置性:支持自定义超时时间、警告时间和倒计时时长
  • 防误操作:采用防抖机制避免频繁重置计时器

技术实现

1. 插件架构设计

我们采用 Vue3 插件的方式实现发呆检测功能,确保代码的可复用性和模块化:

// src/plugins/inactivityDetector/inactivityDetector.ts
export default {install(app, options = {}) {const config = {inactivityTime: 30 * 60 * 1000,   // 默认30分钟不活动登出warningTime: 1 * 60 * 1000,       // 默认提前1分钟警告countdownDuration: 30 * 1000,     // 默认30秒倒计时...options}// ... 实现逻辑}
}

2. 核心功能模块

2.1 活动监听机制
// 监听用户活动
const activityEvents = ['mousemove', 'keydown', 'click', 'scroll', 'touchstart']
activityEvents.forEach(event => {window.addEventListener(event, handleUserActivity, { passive: true })
})// 防抖处理的活动监听
const debouncedResetTimers = debounce(() => {if (!isWarningActive) {resetTimers()}
}, 1000)

我们监听了多种用户活动事件,并使用防抖机制避免频繁触发重置操作。

2.2 智能计时器管理
const resetTimers = () => {if (isWarningActive) returnlastActivityTime = Date.now()const isLoginPage = window.location.pathname.includes('/login')clearTimeout(inactivityTimer)clearTimeout(warningTimer)clearInterval(countdownInterval)if (isLoginPage) returnconst actualWarningTime = config.inactivityTime - config.countdownDuration// 设置不活动超时定时器inactivityTimer = setTimeout(() => {if (Date.now() - lastActivityTime >= config.inactivityTime) {closeExistingDialog()logout()}}, config.inactivityTime)// 设置警告定时器warningTimer = setTimeout(() => {if (Date.now() - lastActivityTime >= actualWarningTime &&!window.location.pathname.includes('/login')) {showWarningDialog()}}, actualWarningTime)
}
2.3 美观的倒计时弹窗

我们使用 Element Plus 的 MessageBox 组件创建了一个带有圆形进度条的倒计时弹窗:

const showWarningDialog = () => {if (window.location.pathname.includes('/login')) returnisWarningActive = truelet seconds = Math.floor(config.countdownDuration / 1000)currentMessageBox = ElMessageBox({title: '会话即将超时',customClass: 'inactivity-warning-dialog',message: `<div class="inactivity-warning-content"><div class="warning-message"><p class="inactivity-warning-text">您即将因不活跃退出系统</p><p class="inactivity-warning-subtext">请点击"保持登录"继续使用</p></div><div class="progress-circle-container"><svg class="progress-ring" width="120" height="120"><circle class="progress-ring__background" r="50" cx="60" cy="60" /><circle class="progress-ring__circle" r="50" cx="60" cy="60" /></svg><div class="progress-count"><span class="inactivity-countdown-num">${seconds}</span></div></div></div>`,dangerouslyUseHTMLString: true,showCancelButton: false,confirmButtonText: '保持登录',closeOnClickModal: false,closeOnPressEscape: false,closeOnHashChange: false})
}

3. 样式设计

我们为倒计时弹窗设计了现代化的样式:

.inactivity-warning-dialog {text-align: center;
}
.progress-circle-container {position: relative;width: 120px;height: 120px;margin: 0 auto 20px;
}
.progress-ring__circle {fill: none;stroke: #409EFF;stroke-width: 8;stroke-linecap: round;stroke-dasharray: 314;transition: stroke-dashoffset 0.5s linear;
}
.inactivity-countdown-num {font-size: 36px;font-weight: bold;color: #409EFF;
}

4. 系统集成

在主应用中注册插件:

// src/main.ts
import inactivityDetector from '@/plugins/inactivityDetector/inactivityDetector'// 发呆检测插件注册
app.use(inactivityDetector, {inactivityTime: 30 * 60 * 1000, // 30分钟不活动登出warningTime: 1 * 60 * 1000,     // 提前1分钟警告countdownDuration: 30 * 1000    // 30秒倒计时
})

功能特性

1. 智能状态管理

  • 登录页排除:在登录页面不启用发呆检测
  • 警告状态控制:防止在警告弹窗显示期间重复触发
  • 路由变化监听:监听页面跳转和哈希变化

2. 用户体验优化

  • 防抖机制:避免频繁的用户操作导致计时器重置
  • 优雅降级:在弹窗关闭失败时提供错误处理
  • 全局方法暴露:提供 $resetInactivityTimer 方法供其他组件调用

3. 安全性保障

  • 强制登出:超时后自动清除用户状态和标签页
  • 状态清理:登出时清理所有相关状态和缓存
  • 页面重定向:自动跳转到登录页面

配置说明

发呆检测功能支持灵活的配置选项:

{inactivityTime: 30 * 60 * 1000,   // 不活动超时时间(毫秒)warningTime: 1 * 60 * 1000,       // 警告提前时间(毫秒)countdownDuration: 30 * 1000      // 倒计时持续时间(毫秒)
}

使用场景

这个发呆检测功能特别适用于以下场景:

  1. 企业管理系统:确保敏感数据的安全性
  2. 在线办公系统:防止长时间不操作导致的数据丢失
  3. 金融交易系统:满足合规性要求
  4. 医疗信息系统:保护患者隐私数据

技术亮点

  1. Vue3 插件化设计:采用插件模式,便于复用和维护
  2. TypeScript 支持:完整的类型定义,提供更好的开发体验
  3. Element Plus 集成:充分利用现有 UI 组件库
  4. 性能优化:使用防抖机制和被动事件监听
  5. 用户体验:美观的倒计时界面和友好的提示信息

总结

通过这个智能发呆检测功能,我们为企业级管理系统提供了一个安全、可靠、用户友好的会话管理解决方案。该功能不仅提升了系统的安全性,还通过优雅的用户界面设计改善了用户体验。

在未来的版本中,我们计划添加更多功能,如:

  • 支持多标签页同步检测
  • 添加用户自定义配置界面
  • 支持不同角色的差异化超时设置
  • 集成更丰富的通知方式

这个功能的实现展示了现代前端技术在安全性方面的应用,为其他开发者提供了一个很好的参考案例。

http://www.lryc.cn/news/602285.html

相关文章:

  • Android通知(Notification)全面解析:从基础到高级应用
  • 【前端】解决Vue3+Pinia中Tab切换与滚动加载数据状态异常问题
  • 05 OpenCV--图像预处理之图像轮廓、直方图均衡化、模板匹配、霍夫变化、图像亮度变化、形态学变化
  • 数据结构:下三角矩阵(Lower Triangular Matrix)
  • MySQL SQL性能优化与慢查询分析实战指南:新手DBA成长之路
  • Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
  • 简明量子态密度矩阵理论知识点总结
  • 搜索二维矩阵Ⅱ C++
  • 【LeetCode】算法详解#10 ---搜索二维矩阵II
  • 秩为1的矩阵的特征和性质
  • 青少年编程高阶课程介绍
  • 青少年编程中阶课
  • 『 C++ 入门到放弃 』- 哈希表
  • 攻防世界-引导-Web_php_unserialize
  • 《LeetCode 热题 100》整整 100 题量大管饱题解套餐 中
  • cacti的RCE
  • 关于“PromptPilot” 之3 -Prompt构造器核心专项能力:任务调度
  • keepalived原理及实战部署
  • MBR和GPT分区的区别
  • 电商项目DevOps一体化运维实战
  • 【Datawhale夏令营】端侧Agent开发实践
  • CodeBuddy的安装教程
  • JAVA东郊到家按摩服务同款同城家政服务按摩私教茶艺师服务系统小程序+公众号+APP+H5
  • 基于BEKK-GARCH模型的参数估计、最大似然估计以及参数标准误估计的MATLAB实现
  • openlayer根据不同的状态显示不同的图层颜色
  • Fortran实现 3维反距离加权(IDW)插值算法
  • 初识 docker [下] 项目部署
  • ETH 交易流程深度技术详解
  • 二、Linux文本处理与文件操作核心命令
  • 从0开始学习R语言--Day60--EM插补法