auth.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /**
  2. * 用户认证相关工具函数
  3. */
  4. // 检查用户是否已登录
  5. export function isLoggedIn() {
  6. const token = uni.getStorageSync('userToken')
  7. const loginTime = uni.getStorageSync('loginTime')
  8. if (!token || !loginTime) {
  9. return false
  10. }
  11. // 检查登录是否过期(7天)
  12. const now = Date.now()
  13. const expired = now - loginTime > 7 * 24 * 60 * 60 * 1000
  14. if (expired) {
  15. clearUserData()
  16. return false
  17. }
  18. return true
  19. }
  20. // 获取用户信息
  21. export function getUserInfo() {
  22. if (!isLoggedIn()) {
  23. return null
  24. }
  25. const userInfo = uni.getStorageSync('userInfo')
  26. if (userInfo) {
  27. return userInfo
  28. }
  29. // 兼容老版本数据
  30. return {
  31. token: uni.getStorageSync('userToken'),
  32. phone: uni.getStorageSync('userPhone'),
  33. loginTime: uni.getStorageSync('loginTime')
  34. }
  35. }
  36. // 清除用户数据
  37. export function clearUserData() {
  38. uni.removeStorageSync('userToken')
  39. uni.removeStorageSync('userInfo')
  40. uni.removeStorageSync('userPhone') // 兼容老版本
  41. uni.removeStorageSync('loginTime')
  42. // 更新全局状态
  43. try {
  44. const app = getApp()
  45. if (app && app.globalData) {
  46. app.globalData.isLoggedIn = false
  47. app.globalData.userInfo = null
  48. }
  49. } catch (error) {
  50. console.log('更新全局状态失败,可能App还未初始化完成')
  51. }
  52. }
  53. // 需要登录权限的操作类型
  54. export const PROTECTED_ACTIONS = {
  55. ADD_TO_CART: 'add_to_cart', // 加入购物车
  56. BUY_NOW: 'buy_now', // 立即购买
  57. VIEW_MY_PAGE: 'view_my_page', // 点击"我的"
  58. VIEW_LEGOU: 'view_legou' // 点击"乐购"
  59. }
  60. // 需要登录权限的页面列表(已废弃,仅保留4个动作的权限控制)
  61. export const PROTECTED_PAGES = []
  62. // 检查页面是否需要登录权限
  63. export function isProtectedPage(url) {
  64. return PROTECTED_PAGES.some(page => url.includes(page))
  65. }
  66. // 跳转到登录页面
  67. export function navigateToLogin(returnUrl = '') {
  68. const loginUrl = '/pages/auth/login'
  69. if (returnUrl) {
  70. uni.setStorageSync('returnUrl', returnUrl)
  71. }
  72. uni.navigateTo({
  73. url: loginUrl,
  74. fail() {
  75. // 如果是tabBar页面,使用reLaunch
  76. uni.reLaunch({
  77. url: loginUrl
  78. })
  79. }
  80. })
  81. }
  82. // 登录后返回原页面
  83. export function navigateBack() {
  84. const returnUrl = uni.getStorageSync('returnUrl')
  85. // tabBar页面列表
  86. const tabBarPages = [
  87. '/pages/index/index',
  88. '/pages/community/index',
  89. '/pages/legou/index',
  90. '/pages/cart/index',
  91. '/pages/user/index'
  92. ]
  93. if (returnUrl) {
  94. uni.removeStorageSync('returnUrl')
  95. console.log('导航返回原页面:', returnUrl)
  96. if (tabBarPages.includes(returnUrl)) {
  97. uni.switchTab({
  98. url: returnUrl
  99. })
  100. } else {
  101. uni.reLaunch({
  102. url: returnUrl
  103. })
  104. }
  105. } else {
  106. console.log('导航到首页')
  107. // 使用switchTab跳转到tabBar页面
  108. uni.switchTab({
  109. url: '/pages/index/index'
  110. })
  111. }
  112. }
  113. // 权限拦截器 - 在需要权限的操作前调用
  114. export function requireAuth(callback, options = {}) {
  115. if (isLoggedIn()) {
  116. // 已登录,执行回调
  117. if (typeof callback === 'function') {
  118. callback()
  119. }
  120. return true
  121. } else {
  122. // 未登录,显示提示并跳转登录
  123. const actionMessages = {
  124. [PROTECTED_ACTIONS.ADD_TO_CART]: '加入购物车需要先登录',
  125. [PROTECTED_ACTIONS.BUY_NOW]: '立即购买需要先登录',
  126. [PROTECTED_ACTIONS.VIEW_MY_PAGE]: '访问"我的"页面需要先登录',
  127. [PROTECTED_ACTIONS.VIEW_LEGOU]: '访问"乐购"页面需要先登录'
  128. }
  129. const message = options.message || actionMessages[options.action] || '请先登录后再进行此操作'
  130. uni.showModal({
  131. title: '提示',
  132. content: message,
  133. confirmText: '去登录',
  134. cancelText: '暂不登录',
  135. success(res) {
  136. if (res.confirm) {
  137. navigateToLogin(options.returnUrl)
  138. }
  139. }
  140. })
  141. return false
  142. }
  143. }
  144. // 静默权限检查(不显示弹窗)
  145. export function checkAuth() {
  146. return isLoggedIn()
  147. }
  148. // 手机号格式验证
  149. export function validatePhoneNumber(phone) {
  150. const phoneRegex = /^1[3-9]\d{9}$/
  151. return phoneRegex.test(phone)
  152. }
  153. // 验证码格式验证
  154. export function validateSmsCode(code) {
  155. const codeRegex = /^\d{6}$/
  156. return codeRegex.test(code)
  157. }
  158. // 用户权限级别(已废弃,仅保留4个动作的权限控制)
  159. export const USER_LEVELS = {
  160. GUEST: 0, // 游客
  161. NORMAL: 1 // 普通用户
  162. }
  163. // 获取用户权限级别(已废弃)
  164. export function getUserLevel() {
  165. const userInfo = getUserInfo()
  166. return userInfo?.level || USER_LEVELS.GUEST
  167. }
  168. // 检查用户是否有特定权限(已废弃)
  169. export function hasPermission(requiredLevel) {
  170. const userLevel = getUserLevel()
  171. return userLevel >= requiredLevel
  172. }