auth-session.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /** 本地登录会话(无网络依赖,供 request / auth 共用,避免循环引用) */
  2. const TOKEN_KEY = 'zkxw_mobile_token'
  3. const REFRESH_TOKEN_KEY = 'zkxw_mobile_refresh_token'
  4. const USER_KEY = 'zkxw_mobile_user'
  5. const RETURN_URL_KEY = 'zkxw_mobile_return_url'
  6. export function setReturnUrl(url) {
  7. try {
  8. uni.setStorageSync(RETURN_URL_KEY, url || '')
  9. } catch (e) {
  10. /* ignore */
  11. }
  12. }
  13. export function takeReturnUrl() {
  14. try {
  15. const u = uni.getStorageSync(RETURN_URL_KEY) || ''
  16. uni.removeStorageSync(RETURN_URL_KEY)
  17. return typeof u === 'string' ? u : ''
  18. } catch (e) {
  19. return ''
  20. }
  21. }
  22. export function getToken() {
  23. try {
  24. return uni.getStorageSync(TOKEN_KEY) || ''
  25. } catch (e) {
  26. return ''
  27. }
  28. }
  29. export function getRefreshToken() {
  30. try {
  31. return uni.getStorageSync(REFRESH_TOKEN_KEY) || ''
  32. } catch (e) {
  33. return ''
  34. }
  35. }
  36. export function isLoggedIn() {
  37. return !!getToken()
  38. }
  39. export function getUser() {
  40. try {
  41. const raw = uni.getStorageSync(USER_KEY)
  42. return raw ? JSON.parse(raw) : null
  43. } catch (e) {
  44. return null
  45. }
  46. }
  47. export function clearSession() {
  48. try {
  49. uni.removeStorageSync(TOKEN_KEY)
  50. uni.removeStorageSync(REFRESH_TOKEN_KEY)
  51. uni.removeStorageSync(USER_KEY)
  52. } catch (e) {
  53. /* ignore */
  54. }
  55. }
  56. export function saveSession({ token, refreshToken, userInfo }) {
  57. uni.setStorageSync(TOKEN_KEY, token || '')
  58. uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken || '')
  59. uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null))
  60. }
  61. /** 更新本地缓存的用户信息(保留 token)。 */
  62. export function updateStoredUser(userInfo) {
  63. try {
  64. uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null))
  65. } catch (e) {
  66. /* ignore */
  67. }
  68. }
  69. let _reloginPending = false
  70. function isOnLoginPage() {
  71. try {
  72. const pages = getCurrentPages()
  73. const cur = pages && pages[pages.length - 1]
  74. const route = (cur && cur.route) || ''
  75. return String(route).indexOf('pages/login') !== -1
  76. } catch (e) {
  77. return false
  78. }
  79. }
  80. /**
  81. * Token 失效:清本地会话并回到登录页(防抖,避免并发 401 连跳)。
  82. * @param {string} [message]
  83. * @param {string} [returnUrl] 登录成功后回跳路径(写入本地,登录页 takeReturnUrl)
  84. */
  85. export function forceRelogin(message, returnUrl) {
  86. if (_reloginPending) return
  87. if (typeof returnUrl === 'string' && returnUrl.trim()) {
  88. setReturnUrl(returnUrl.trim())
  89. }
  90. clearSession()
  91. if (isOnLoginPage()) return
  92. _reloginPending = true
  93. const title =
  94. (typeof message === 'string' && message.trim()) ||
  95. '登录已失效,请重新登录'
  96. uni.showToast({ title, icon: 'none', duration: 2000 })
  97. setTimeout(() => {
  98. uni.reLaunch({
  99. url: '/pages/login/index',
  100. complete() {
  101. _reloginPending = false
  102. },
  103. fail() {
  104. _reloginPending = false
  105. }
  106. })
  107. }, 400)
  108. }