【WEB开发】如何做用户超过24小时没有操作页面而跳转至登录?
|
admin
2025年7月3日 7:47
本文热度 232
|
在现代前端开发中,我们常常需要做一个长期停留在某页面不操作而跳转至登录页面的效果。这个看似简单的需求,背后却关联着用户体验、数据分析和系统性能等多个重要方面,如下是从vue项目中摘出逻辑代码供大家参考。
config中
* @description 导出通用配置
*/
module.exports = {
keepStorageTime: 24,
}
1,登录的时候会调用该setUserInfor方法,也更新保存时间localStorage keepStorageTime(现在的时间加上24小时)
2,每次进内页前调方法getUserInfor,如果Date.now()<缓存的keepStorageTime,便清除用户信息(没有用户信息就过不了路由守卫,而跳转至登录界面)
import { keepStorageTime } from '@/config'
let expires = Date.now() + 1000 * 60 * 60 * keepStorageTime
* @description 存储用户信息,登录的时候会调用该方法
* @param token
* @returns {void|*}
*/
export function setUserInfor(userInfor) {
localStorage.setItem('keepStorageTime', JSON.stringify(expires))
return localStorage.setItem(userInforTableName, userInfor)
}
* @description 获取用户信息,进内页都会调用
* @returns {string|ActiveX.IXMLDOMNode|Promise<any>|any|IDBRequest<any>|MediaKeyStatus|FormDataEntryValue|Function|Promise<Credential | null>}
*/
export function getUserInfor() {
let item = JSON.parse(localStorage.getItem('keepStorageTime'))
if (item) {
if (item < Date.now()) {
removeUserInfor()
}
}
if ('localStorage' === storage) {
return localStorage.getItem(userInforTableName)
}
}
3,路由守卫中,进到内页后时,更新保存时间 localStorage keepStorageTimeimport {
keepStorageTime,
} from '@/config'
router.beforeEach(async (to, from, next) => {
const { showProgressBar } = store.getters['settings/theme']
if (showProgressBar) VabProgress.start()
let hasToken = store.getters['user/token']
if (!loginInterception) hasToken = true
if (hasToken) {
if (store.getters['routes/routes'].length) {
if (to.path === '/login') {
next({ path: '/' })
if (showProgressBar) VabProgress.done()
} else {
let expires = Date.now() + 1000 * 60 * 60 * keepStorageTime
localStorage.setItem('keepStorageTime', JSON.stringify(expires))
next()
}
} else {
try {
if (loginInterception) await store.dispatch('user/getUserInfo')
else await store.dispatch('user/setVirtualRoles')
await store.dispatch('routes/setRoutes', authentication)
next({ ...to, replace: true })
} catch (err) {
console.error('vue-admin-beautiful错误拦截:', err)
await store.dispatch('user/resetAll')
next(toLoginRoute(to.path))
}
}
} else {
if (routesWhiteList.includes(to.path)) {
if (supportVisit && !store.getters['routes/routes'].length) {
await store.dispatch('routes/setRoutes', 'visit')
next({ ...to, replace: true })
} else next()
} else next(toLoginRoute(to.path))
}
})
user/resetAll:
退出的时候调用重置的时候清除keepStorageTime和用户信息及token async resetAll({ commit, dispatch }) {
removeUserInfor()
localStorage.removeItem('keepStorageTime')
},
阅读原文:https://mp.weixin.qq.com/s/TiuElk4Q9FgxL9pAV2T02g
该文章在 2025/7/3 23:46:09 编辑过