/** 本地登录会话(无网络依赖,供 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) }