guard.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. /**
  2. * 登录守卫工具(三端通用:train-frontend 小程序)
  3. *
  4. * 需求:登录前可浏览课程信息,但班级/报名/投票/打卡/支付等实际操作必须登录。
  5. * 未登录触发 requireLogin() 时:toast 提示 + 跳回首页 tab + 触发登录浮层(showLoginSheet)。
  6. */
  7. export function requireLogin() {
  8. var loggedIn = false
  9. try {
  10. if (getApp() && getApp().$store && getApp().$store.getters && getApp().$store.getters.isLoggedIn) {
  11. loggedIn = true
  12. }
  13. } catch (e) {
  14. console.error('[guard] store 判定异常,改用 storage', e)
  15. }
  16. // 兜底:mp-weixin 下 getApp().$store 可能不可达,此时直读 storage token。
  17. // storage token 是登录态唯一可信载体(setToken 总是同步写入,401 清理时同步移除)
  18. if (!loggedIn && uni.getStorageSync('token')) {
  19. loggedIn = true
  20. }
  21. if (loggedIn) return true
  22. uni.showToast({ title: '请先登录', icon: 'none' })
  23. setTimeout(function() {
  24. uni.switchTab({ url: '/pages/index/index' })
  25. }, 600)
  26. setTimeout(function() {
  27. uni.$emit('showLoginSheet', {})
  28. }, 800)
  29. return false
  30. }
  31. /** 页面级守卫:在 onShow/onLoad 首行调用,未登录返回 false 阻止后续加载 */
  32. export function guardPage() {
  33. return requireLogin()
  34. }