permission.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. * 功能:路由权限和拦截
  3. * 作者:小莫唐尼
  4. * 邮箱:studio@925i.cn
  5. * 时间:2022年07月21日 18:05:24
  6. * 版本:v0.1.0
  7. * 修改记录:
  8. * 修改内容:
  9. * 修改人员:
  10. * 修改时间:
  11. */
  12. /**
  13. * @description 自定义路由拦截
  14. */
  15. import {
  16. checkHasAdminLogin
  17. } from "./auth.js";
  18. // 白名单
  19. const whiteList = [
  20. "/", // 注意入口页必须直接写 '/'
  21. {
  22. pattern: /^\/pages\/list.*/
  23. }, // 支持正则表达式
  24. {
  25. pattern: /^\/pages\/guidePage.*/
  26. }, // 支持正则表达式
  27. {
  28. pattern: /^\/pages\/login\/*/
  29. },
  30. ];
  31. export default async function() {
  32. const list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
  33. // 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
  34. list.forEach((item) => {
  35. uni.addInterceptor(item, {
  36. invoke(e) {
  37. // 获取要跳转的页面路径(url去掉"?"和"?"后的参数)
  38. const url = e.url.split("?")[0];
  39. // 判断当前窗口是白名单,如果是则不重定向路由
  40. let pass;
  41. if (whiteList) {
  42. pass = whiteList.some((item) => {
  43. if (typeof item === "object" && item.pattern) {
  44. return item.pattern.test(url);
  45. }
  46. return url === item;
  47. });
  48. }
  49. // 不是白名单并且没有token
  50. if (!pass && !checkHasAdminLogin()) {
  51. uni.showModal({
  52. title: "未登录",
  53. content: "当前未登录,是否前往登录?",
  54. showCancel: true,
  55. success: ({
  56. confirm,
  57. cancel
  58. }) => {
  59. if (confirm) {
  60. uni.navigateTo({
  61. url: "/pages/login/login",
  62. });
  63. }
  64. },
  65. });
  66. return false;
  67. }
  68. return e;
  69. },
  70. fail(err) {
  71. // 失败回调拦截
  72. console.log(err);
  73. },
  74. });
  75. });
  76. }