permission.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { getToken } from '@/utils/auth'
  2. // 白名单
  3. const whiteList = [
  4. '/', // 注意入口页必须直接写 '/'
  5. { pattern: /^\/pages\/list.*/ }, // 支持正则表达式
  6. '/pages/home/home',
  7. '/pages/logo/index',
  8. '/pages/login/login',
  9. '/pages/notice/notice',
  10. { pattern: /^\/pages\/visitor\/*/ },
  11. { pattern: /^\/pages\/login\/*/ }
  12. ]
  13. export default async function() {
  14. const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
  15. // 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
  16. list.forEach(item => {
  17. uni.addInterceptor(item, {
  18. invoke(e) {
  19. // 获取要跳转的页面路径(url去掉"?"和"?"后的参数)
  20. const url = e.url.split('?')[0]
  21. // console.log('url', url)
  22. // 判断当前窗口是白名单,如果是则不重定向路由
  23. let pass
  24. if (whiteList) {
  25. pass = whiteList.some((item) => {
  26. if (typeof (item) === 'object' && item.pattern) {
  27. return item.pattern.test(url)
  28. }
  29. return url === item
  30. })
  31. }
  32. // 不是白名单并且没有token
  33. if (!pass && !getToken()) {
  34. uni.showToast({
  35. title: '请先登录',
  36. icon: 'error'
  37. })
  38. setTimeout(()=>{
  39. uni.navigateTo({
  40. url: "/pages/logo/index"
  41. })
  42. },1000)
  43. return false
  44. }
  45. return e
  46. },
  47. fail(err) { // 失败回调拦截
  48. console.log(err)
  49. }
  50. })
  51. })
  52. }