Files
zkxw/mobile-h5/utils/auth-session.js
T
2026-08-12 15:48:15 +08:00

99 lines
2.2 KiB
JavaScript

/** 本地登录会话(无网络依赖,供 request / auth 共用,避免循环引用) */
const TOKEN_KEY = 'zkxw_mobile_token'
const REFRESH_TOKEN_KEY = 'zkxw_mobile_refresh_token'
const USER_KEY = 'zkxw_mobile_user'
export function getToken() {
try {
return uni.getStorageSync(TOKEN_KEY) || ''
} catch (e) {
return ''
}
}
export function getRefreshToken() {
try {
return uni.getStorageSync(REFRESH_TOKEN_KEY) || ''
} catch (e) {
return ''
}
}
export function isLoggedIn() {
return !!getToken()
}
export function getUser() {
try {
const raw = uni.getStorageSync(USER_KEY)
return raw ? JSON.parse(raw) : null
} catch (e) {
return null
}
}
export function clearSession() {
try {
uni.removeStorageSync(TOKEN_KEY)
uni.removeStorageSync(REFRESH_TOKEN_KEY)
uni.removeStorageSync(USER_KEY)
} catch (e) {
/* ignore */
}
}
export function saveSession({ token, refreshToken, userInfo }) {
uni.setStorageSync(TOKEN_KEY, token || '')
uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken || '')
uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null))
}
/** 更新本地缓存的用户信息(保留 token)。 */
export function updateStoredUser(userInfo) {
try {
uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null))
} catch (e) {
/* ignore */
}
}
let _reloginPending = false
function isOnLoginPage() {
try {
const pages = getCurrentPages()
const cur = pages && pages[pages.length - 1]
const route = (cur && cur.route) || ''
return String(route).indexOf('pages/login') !== -1
} catch (e) {
return false
}
}
/**
* Token 失效:清本地会话并回到登录页(防抖,避免并发 401 连跳)。
* @param {string} [message]
*/
export function forceRelogin(message) {
if (_reloginPending) return
clearSession()
if (isOnLoginPage()) return
_reloginPending = true
const title =
(typeof message === 'string' && message.trim()) ||
'登录已失效,请重新登录'
uni.showToast({ title, icon: 'none', duration: 2000 })
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/index',
complete() {
_reloginPending = false
},
fail() {
_reloginPending = false
}
})
}, 400)
}