122 lines
2.8 KiB
JavaScript
122 lines
2.8 KiB
JavaScript
/** 本地登录会话(无网络依赖,供 request / auth 共用,避免循环引用) */
|
||
|
||
const TOKEN_KEY = 'zkxw_mobile_token'
|
||
const REFRESH_TOKEN_KEY = 'zkxw_mobile_refresh_token'
|
||
const USER_KEY = 'zkxw_mobile_user'
|
||
const RETURN_URL_KEY = 'zkxw_mobile_return_url'
|
||
|
||
export function setReturnUrl(url) {
|
||
try {
|
||
uni.setStorageSync(RETURN_URL_KEY, url || '')
|
||
} catch (e) {
|
||
/* ignore */
|
||
}
|
||
}
|
||
|
||
export function takeReturnUrl() {
|
||
try {
|
||
const u = uni.getStorageSync(RETURN_URL_KEY) || ''
|
||
uni.removeStorageSync(RETURN_URL_KEY)
|
||
return typeof u === 'string' ? u : ''
|
||
} catch (e) {
|
||
return ''
|
||
}
|
||
}
|
||
|
||
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]
|
||
* @param {string} [returnUrl] 登录成功后回跳路径(写入本地,登录页 takeReturnUrl)
|
||
*/
|
||
export function forceRelogin(message, returnUrl) {
|
||
if (_reloginPending) return
|
||
if (typeof returnUrl === 'string' && returnUrl.trim()) {
|
||
setReturnUrl(returnUrl.trim())
|
||
}
|
||
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)
|
||
}
|