feat(auth): 登录态改为滑动续期(后台 24h/7d,打手 7d/30d)

This commit is contained in:
yml2213
2026-10-25 13:28:58 +08:00
parent 81edf530db
commit 2fb7aae13f
31 changed files with 510 additions and 64 deletions
+41
View File
@@ -6,6 +6,16 @@ const ADMIN_DISPLAY_NAME_KEY = 'order-site-admin-display-name'
const ADMIN_ROLE_KEY = 'order-site-admin-role'
const ADMIN_PERMISSIONS_KEY = 'order-site-admin-permissions'
const ADMIN_SESSION_STORAGE_KEYS = new Set([
ADMIN_TOKEN_KEY,
ADMIN_EXPIRES_AT_KEY,
ADMIN_USER_ID_KEY,
ADMIN_USERNAME_KEY,
ADMIN_DISPLAY_NAME_KEY,
ADMIN_ROLE_KEY,
ADMIN_PERMISSIONS_KEY,
])
const ADMIN_ROLE_LEVEL: Record<'support' | 'operator' | 'admin' | 'finance', number> = {
support: 1,
operator: 2,
@@ -143,6 +153,37 @@ export function clearAdminSession() {
localStorage.removeItem(ADMIN_PERMISSIONS_KEY)
}
/** 滑动续期:只更新本地空闲到期时间,Token 本身不重签(exp 是绝对上限)。 */
export function setAdminSessionExpiresAt(expiresAt: string) {
const normalized = String(expiresAt || '').trim()
if (!normalized || normalized === getAdminTokenExpiresAt()) return
localStorage.setItem(ADMIN_EXPIRES_AT_KEY, normalized)
if (typeof window !== 'undefined') {
window.dispatchEvent(new Event('admin-session-renewed'))
}
}
/** 清理失效会话并通知当前标签页,避免并发请求各自重复跳转。 */
export function expireAdminSession() {
const hadSession = Boolean(getAdminToken() || getAdminTokenExpiresAt())
clearAdminSession()
if (hadSession && typeof window !== 'undefined') {
window.dispatchEvent(new Event('admin-session-expired'))
}
return hadSession
}
export function isAdminSessionStorageKey(key: string | null) {
return Boolean(key && ADMIN_SESSION_STORAGE_KEYS.has(key))
}
export function getAdminSessionExpiryDelay(expiresAt: string, now = Date.now()) {
if (!expiresAt) return null
const expiresAtMs = Date.parse(expiresAt)
if (!Number.isFinite(expiresAtMs)) return null
return Math.max(0, expiresAtMs - now)
}
export function hasAdminSession() {
const token = getAdminToken()
const expiresAt = getAdminTokenExpiresAt()
+14
View File
@@ -73,6 +73,16 @@ export function clearWorkerSession() {
localStorage.removeItem(WORKER_STATUS_KEY)
}
/** 滑动续期:只更新本地空闲到期时间,Token 本身不重签(exp 是绝对上限)。 */
export function setWorkerSessionExpiresAt(expiresAt: string) {
const normalized = String(expiresAt || '').trim()
if (!normalized || normalized === getWorkerTokenExpiresAt()) return
localStorage.setItem(WORKER_EXPIRES_AT_KEY, normalized)
if (typeof window !== 'undefined') {
window.dispatchEvent(new Event('worker-session-renewed'))
}
}
/** 清理失效会话并通知当前标签页,避免并发请求各自重复跳转。 */
export function expireWorkerSession() {
const hadSession = Boolean(getWorkerToken() || getWorkerTokenExpiresAt())
@@ -87,6 +97,10 @@ export function isWorkerSessionStorageKey(key: string | null) {
return Boolean(key && WORKER_SESSION_STORAGE_KEYS.has(key))
}
export function isWorkerSessionExpiryKey(key: string | null) {
return key === WORKER_EXPIRES_AT_KEY
}
export function getWorkerSessionExpiryDelay(expiresAt: string, now = Date.now()) {
if (!expiresAt) return null
const expiresAtMs = Date.parse(expiresAt)