优化
This commit is contained in:
+50
-1
@@ -3,6 +3,7 @@ import { resetPickingSession } from '@/stores/picking.js'
|
||||
import { PLATFORM_API_ROOT } from '@/config/runtime.js'
|
||||
|
||||
const SESSION_KEY = 'pda-auth-session'
|
||||
const LOGIN_PREFERENCE_KEY = 'pda-login-account-preference'
|
||||
|
||||
export const session = reactive({ currentUser: null, token: '', refreshToken: '', tenantId: '', apiBase: PLATFORM_API_ROOT })
|
||||
|
||||
@@ -24,10 +25,34 @@ export function decodeAccessToken(token) {
|
||||
}
|
||||
}
|
||||
|
||||
export function isAccessTokenExpiring(token = session.token, skewSeconds = 30) {
|
||||
try {
|
||||
const expiresAt = Number(decodeAccessToken(token).exp || 0) * 1000
|
||||
return !expiresAt || expiresAt <= Date.now() + skewSeconds * 1000
|
||||
} catch (_) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
function storageAvailable() {
|
||||
return typeof uni !== 'undefined' && typeof uni.setStorageSync === 'function' && typeof uni.getStorageSync === 'function'
|
||||
}
|
||||
|
||||
export function loadLoginPreference() {
|
||||
if (!storageAvailable()) return { rememberAccount: true, account: '' }
|
||||
const saved = uni.getStorageSync(LOGIN_PREFERENCE_KEY)
|
||||
if (!saved || typeof saved !== 'object') return { rememberAccount: true, account: '' }
|
||||
return { rememberAccount: saved.rememberAccount !== false, account: String(saved.account || '') }
|
||||
}
|
||||
|
||||
export function saveLoginPreference(rememberAccount, account = '') {
|
||||
if (!storageAvailable()) return
|
||||
uni.setStorageSync(LOGIN_PREFERENCE_KEY, {
|
||||
rememberAccount: Boolean(rememberAccount),
|
||||
account: rememberAccount ? String(account || '').trim() : ''
|
||||
})
|
||||
}
|
||||
|
||||
function persistSession() {
|
||||
if (!storageAvailable()) return
|
||||
uni.setStorageSync(SESSION_KEY, {
|
||||
@@ -51,6 +76,7 @@ export function signIn(account, warehouse, options = {}) {
|
||||
|
||||
export function signInWithTokens(tokens) {
|
||||
if (!tokens?.accessToken) throw new Error('登录响应缺少 accessToken')
|
||||
if (!tokens?.refreshToken) throw new Error('登录响应缺少 refreshToken')
|
||||
const claims = decodeAccessToken(tokens.accessToken)
|
||||
if (claims.app_code !== 'PLATFORM') throw new Error('当前账号不属于平台作业端')
|
||||
if (claims.exp && claims.exp * 1000 <= Date.now()) throw new Error('登录状态已过期')
|
||||
@@ -66,16 +92,39 @@ export function signInWithTokens(tokens) {
|
||||
})
|
||||
}
|
||||
|
||||
export function updateTokenPair(tokens) {
|
||||
if (!tokens?.accessToken) throw new Error('刷新响应缺少 accessToken')
|
||||
if (!tokens?.refreshToken) throw new Error('刷新响应缺少 refreshToken')
|
||||
const claims = decodeAccessToken(tokens.accessToken)
|
||||
if (claims.app_code !== 'PLATFORM') throw new Error('当前账号不属于平台作业端')
|
||||
if (claims.exp && claims.exp * 1000 <= Date.now()) throw new Error('刷新后的登录状态已过期')
|
||||
const previousUser = session.currentUser || {}
|
||||
session.currentUser = {
|
||||
...previousUser,
|
||||
id: String(claims.user_id ?? previousUser.id ?? ''),
|
||||
name: claims.username || previousUser.name || '仓库作业员',
|
||||
role: Array.isArray(claims.roles) ? claims.roles.join('、') : (previousUser.role || ''),
|
||||
roles: claims.roles || previousUser.roles || []
|
||||
}
|
||||
session.token = tokens.accessToken
|
||||
session.refreshToken = tokens.refreshToken
|
||||
session.tenantId = claims.tenant_id == null ? session.tenantId : String(claims.tenant_id)
|
||||
persistSession()
|
||||
return session.token
|
||||
}
|
||||
|
||||
export function restoreSession() {
|
||||
if (!storageAvailable()) return false
|
||||
const saved = uni.getStorageSync(SESSION_KEY)
|
||||
if (!saved?.token || !saved?.currentUser) return false
|
||||
try {
|
||||
const claims = decodeAccessToken(saved.token)
|
||||
if (claims.exp && claims.exp * 1000 <= Date.now()) return false
|
||||
if (claims.app_code !== 'PLATFORM') throw new Error('登录域无效')
|
||||
if (claims.exp && claims.exp * 1000 <= Date.now() && !saved.refreshToken) throw new Error('登录状态已过期')
|
||||
Object.assign(session, saved, { apiBase: saved.apiBase || PLATFORM_API_ROOT })
|
||||
return true
|
||||
} catch (_) {
|
||||
signOut()
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user