fix(auth): 长任务活跃期间续期会话

This commit is contained in:
caoxiaozhu
2026-07-25 18:15:49 +08:00
parent 4f8aff5fc4
commit ea0013b99c
5 changed files with 70 additions and 9 deletions

View File

@@ -3,6 +3,13 @@ import { ref, computed } from 'vue'
import { login as loginApi } from '@/api/modules/system'
import { SESSION_TIMEOUT } from '@/constants'
import type { PermissionCode, SystemUser } from '@/types'
import {
clearSessionActivity,
sessionActivityTime,
startSessionActivity,
syncSessionActivity,
touchSessionActivity,
} from '@/utils/sessionActivity'
const USER_STORAGE_KEY = 'currentUser'
@@ -60,7 +67,7 @@ export const useAuthStore = defineStore('auth', () => {
if (currentUser.value?.role === 'operator') return '操作员'
return '观察员'
})
const loginTime = ref<number>(parseInt(localStorage.getItem('loginTime') || '0', 10) || 0)
const loginTime = sessionActivityTime
const isLoggedIn = computed(() => {
if (!loginTime.value) return false
@@ -71,10 +78,9 @@ export const useAuthStore = defineStore('auth', () => {
async function login(user: string, password: string) {
const response = await loginApi(user, password)
currentUser.value = response.user
loginTime.value = Date.now()
startSessionActivity()
localStorage.setItem('username', response.user.username)
localStorage.setItem(USER_STORAGE_KEY, JSON.stringify(response.user))
localStorage.setItem('loginTime', String(loginTime.value))
}
/** 检查当前账号是否拥有指定模块权限。 */
@@ -85,19 +91,20 @@ export const useAuthStore = defineStore('auth', () => {
/** 续期会话(活跃时刷新) */
function refresh() {
if (isLoggedIn.value) {
loginTime.value = Date.now()
localStorage.setItem('loginTime', String(loginTime.value))
}
if (currentUser.value) touchSessionActivity()
}
/** 在路由判断前吸收其他标签页写入的最后活跃时间。 */
function syncSession() {
syncSessionActivity()
}
/** 退出 */
function logout() {
currentUser.value = null
loginTime.value = 0
clearSessionActivity()
localStorage.removeItem('username')
localStorage.removeItem(USER_STORAGE_KEY)
localStorage.removeItem('loginTime')
}
return {
@@ -110,6 +117,7 @@ export const useAuthStore = defineStore('auth', () => {
hasPermission,
login,
refresh,
syncSession,
logout,
}
})