一、需求说明一、需求说明一、需求说明昨天后端开发人员让我实现一个网页锁屏,当时我一头雾水,问他为啥搞的跟安卓系统一样。他的回复是"看起来帅点"。首先我们梳理下逻辑,先来个简化版的,用户长时间未操作时,返回登录页二、思路二、思路二、思路使用 mouseover 事件来监测是否有用户操作页面,写一个定时器间隔特定时间检测是否长时间未操作页面,如果是,退出登陆,清除token,返回登录页三、实现三、实现三、实现【1】在util文件夹下创建一个storage.js封装localStorage方法【1】在util文件夹下创建一个storage.js封装localStorage方法
export default {
setItem(key, value) {
value = JSON.stringify(value);
window.localStorage.setItem(key, value)
},
getItem(key, defaultValue) {
let value = window.localStorage.getItem(key)
try {

value = JSON.parse(value);
} catch {}
return value || defaultValue
},
removeItem(key) {
window.localStorage.removeItem(key)
},
clear() {
window.localStorage.clear()
},
}
export default {
setItem(key, value) {
value = JSON.stringify(value);
window.localStorage.setItem(key, value)
},
getItem(key, defaultValue) {
let value = window.localStorage.getItem(key)
try {

value = JSON.parse(value);
} catch {}
return value || defaultValue
},
removeItem(key) {
window.localStorage.removeItem(key)
},
clear() {
window.localStorage.clear()
},
} 【2】在util文件夹下创建一个astrict.js【2】在util文件夹下创建一个astrict.js每隔30s去检查一下用户是否过了30分钟未操作页面
// 引入路由和storage工具函数
import storage from '@/utils/storage'
import router from "@/common/router"

let lastTime = new Date().getTime()
let currentTime = new Date().getTime()
let timeOut = 30 * 60 * 1000 //设置超时时间: 30分钟

window.onload = function () {
window.document.onmousedown = function () {
stroage.setItem("lastTime", new Date().getTime())
}
};

function checkTimeout() {
currentTime = new Date().getTime()

//更新当前时间
lastTime = stroage.getItem("lastTime");

if (currentTime - lastTime > timeOut) { //判断是否超时

// 清除storage的数据(登陆信息和token)
storage.clear()
// 跳到登陆页
if(router.currentRouter.name == 'login') return // 当前已经是登陆页时不做跳转
router.push({ name: 'login' })
}
}

export default function () {
/* 定时器 间隔30秒检测是否长时间未操作页面 */
window.setInterval(checkTimeout, 30000);
}
// 引入路由和storage工具函数
import storage from '@/utils/storage'
import router from "@/common/router"

let lastTime = new Date().getTime()
let currentTime = new Date().getTime()
let timeOut = 30 * 60 * 1000 //设置超时时间: 30分钟

window.onload = function () {
window.document.onmousedown = function () {
stroage.setItem("lastTime", new Date().getTime())
}
};

function checkTimeout() {
currentTime = new Date().getTime()

//更新当前时间
lastTime = stroage.getItem("lastTime");

if (currentTime - lastTime > timeOut) { //判断是否超时

// 清除storage的数据(登陆信息和token)
storage.clear()
// 跳到登陆页
if(router.currentRouter.name == 'login') return // 当前已经是登陆页时不做跳转
router.push({ name: 'login' })
}
}

export default function () {
/* 定时器 间隔30秒检测是否长时间未操作页面 */
window.setInterval(checkTimeout, 30000);
} 【2】在main.js引入astrict.js【2】在main.js引入astrict.js
import Astrict from '@/utils/astrict'
Vue.use(Astrict)
import Astrict from '@/utils/astrict'
Vue.use(Astrict)四、锁屏四、锁屏四、锁屏实现网页锁屏的思路和上面自动退出登录类似,稍微改动实现如下:【1】用户长时间未操作,弹出设置锁屏密码弹框设置锁屏密码【2】密码(password)和锁屏状态(isLock)存入localStorage 和vuex【3】设置成功后跳转到锁屏登录页【4】 在路由里面判断vuex里面的isLock(为true锁屏状态不能让用户后退url和自行修改url跳转页面否则可以)【5】用户在锁屏登录页输入刚刚设置的锁屏密码,即可解开锁屏总结总结总结