userAuth.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /**
  2. * 用户认证和ID管理工具类
  3. */
  4. export default {
  5. /**
  6. * 智能获取用户ID(修复版)
  7. * @returns {number|null} 用户ID或null
  8. */
  9. getUserId() {
  10. // 首先检查是否真的已登录(通过token和userInfo判断)
  11. const token = uni.getStorageSync('token')
  12. const userInfo = uni.getStorageSync('userInfo')
  13. const storedUserId = uni.getStorageSync('userId')
  14. // 如果有token和userInfo,说明确实已登录
  15. if (token && userInfo) {
  16. // 1. 优先从直接存储的userId获取(包括ID为1的情况)
  17. if (storedUserId !== null && storedUserId !== undefined && storedUserId !== '') {
  18. const finalUserId = parseInt(storedUserId)
  19. return finalUserId
  20. }
  21. // 2. 从userInfo中获取
  22. const userIdFromInfo = userInfo.userId || userInfo.id || userInfo.user_id
  23. if (userIdFromInfo !== null && userIdFromInfo !== undefined) {
  24. const finalUserId = parseInt(userIdFromInfo)
  25. // 同步更新userId存储
  26. uni.setStorageSync('userId', finalUserId)
  27. return finalUserId
  28. }
  29. // 3. 如果有登录信息但无法提取userId,使用默认值1
  30. uni.setStorageSync('userId', 1)
  31. return 1
  32. }
  33. // 4. 未登录状态
  34. return null
  35. },
  36. /**
  37. * 检查用户是否已登录
  38. * @returns {boolean} 是否已登录
  39. */
  40. isLoggedIn() {
  41. const token = uni.getStorageSync('token')
  42. const userInfo = uni.getStorageSync('userInfo')
  43. const userId = this.getUserId()
  44. // 修复:允许userId为1的用户(测试用户)也被认为是已登录状态
  45. return !!(token && userInfo && userId)
  46. },
  47. /**
  48. * 获取用户信息
  49. * @returns {object|null} 用户信息对象或null
  50. */
  51. getUserInfo() {
  52. return uni.getStorageSync('userInfo') || null
  53. },
  54. /**
  55. * 获取用户token
  56. * @returns {string|null} token或null
  57. */
  58. getToken() {
  59. return uni.getStorageSync('token') || null
  60. },
  61. /**
  62. * 保存登录信息
  63. * @param {string} token - 登录token
  64. * @param {object} userInfo - 用户信息
  65. */
  66. saveLoginInfo(token, userInfo) {
  67. // 保存token和用户信息
  68. uni.setStorageSync('token', token)
  69. uni.setStorageSync('userInfo', userInfo)
  70. // 提取并保存用户ID - 支持多种字段名和数据类型
  71. const userId = userInfo?.userId || userInfo?.id || userInfo?.user_id
  72. if (userId !== null && userId !== undefined) {
  73. // 确保userId是数字类型
  74. const finalUserId = parseInt(userId)
  75. uni.setStorageSync('userId', finalUserId)
  76. } else {
  77. console.warn('⚠️ 用户信息中未找到userId字段')
  78. console.warn('userInfo keys:', Object.keys(userInfo || {}))
  79. }
  80. },
  81. /**
  82. * 清除登录信息
  83. */
  84. clearLoginInfo() {
  85. uni.removeStorageSync('token')
  86. uni.removeStorageSync('userInfo')
  87. uni.removeStorageSync('userId')
  88. uni.removeStorageSync('rememberedAccount')
  89. },
  90. /**
  91. * 检查并处理登录状态
  92. * @param {object} options - 配置选项
  93. * @param {boolean} options.requireLogin - 是否要求必须登录
  94. * @param {boolean} options.allowTestUser - 是否允许使用测试用户(ID=1)
  95. * @param {string} options.redirectUrl - 登录后重定向的URL
  96. * @returns {Promise<number|null>} 返回用户ID或null
  97. */
  98. async checkLoginStatus(options = {}) {
  99. const {
  100. requireLogin = true,
  101. allowTestUser = false,
  102. redirectUrl = ''
  103. } = options
  104. const token = this.getToken()
  105. const userInfo = this.getUserInfo()
  106. const userId = this.getUserId()
  107. // 未登录情况
  108. if (!token || !userInfo) {
  109. if (requireLogin) {
  110. return new Promise((resolve) => {
  111. uni.showModal({
  112. title: '需要登录',
  113. content: '请先登录后继续使用',
  114. showCancel: !requireLogin,
  115. cancelText: '取消',
  116. confirmText: '去登录',
  117. success: (res) => {
  118. if (res.confirm) {
  119. const loginUrl = `/pages/page3/page3${redirectUrl ? '?redirect=' + encodeURIComponent(redirectUrl) : ''}`
  120. uni.navigateTo({ url: loginUrl })
  121. }
  122. resolve(null)
  123. }
  124. })
  125. })
  126. }
  127. return null
  128. }
  129. // 登录信息异常情况
  130. if (!userId || userId === 1) {
  131. if (allowTestUser && userId === 1) {
  132. return 1
  133. }
  134. return new Promise((resolve) => {
  135. uni.showModal({
  136. title: '登录信息异常',
  137. content: '登录信息不完整,是否重新登录?',
  138. showCancel: allowTestUser,
  139. cancelText: '使用测试账号',
  140. confirmText: '重新登录',
  141. success: (res) => {
  142. if (res.confirm) {
  143. this.clearLoginInfo()
  144. const loginUrl = `/pages/page3/page3${redirectUrl ? '?redirect=' + encodeURIComponent(redirectUrl) : ''}`
  145. uni.navigateTo({ url: loginUrl })
  146. resolve(null)
  147. } else if (allowTestUser) {
  148. resolve(1)
  149. } else {
  150. resolve(null)
  151. }
  152. }
  153. })
  154. })
  155. }
  156. // 登录正常
  157. return userId
  158. }
  159. }