99 lines
2.2 KiB
JavaScript
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)
|
|
}
|