|
1 | | -import router from './router' |
2 | | -import store from './store' |
3 | | -import { Message } from 'element-ui' |
4 | | -import NProgress from 'nprogress' // progress bar |
5 | | -import 'nprogress/nprogress.css' // progress bar style |
6 | | -import { getToken } from '@/utils/auth' // get token from cookie |
7 | | -import getPageTitle from '@/utils/get-page-title' |
| 1 | +import router from "./router"; |
| 2 | +import store from "./store"; |
| 3 | +import { Message } from "element-ui"; |
| 4 | +import NProgress from "nprogress"; |
| 5 | +import "nprogress/nprogress.css"; |
| 6 | +import getPageTitle from "@/utils/get-page-title"; |
8 | 7 |
|
9 | | -NProgress.configure({ showSpinner: false }) // NProgress Configuration |
| 8 | +NProgress.configure({ showSpinner: false }); |
10 | 9 |
|
11 | | -const whiteList = ['/login'] // no redirect whitelist |
| 10 | +const whiteList = ["/login"]; |
| 11 | + |
| 12 | +// Helper function to check permissions |
| 13 | +const hasRequiredPermission = (userPermissions, requiredRoles) => { |
| 14 | + if ( |
| 15 | + !requiredRoles || |
| 16 | + !Array.isArray(requiredRoles) || |
| 17 | + requiredRoles.length === 0 |
| 18 | + ) |
| 19 | + return true; |
| 20 | + if (!userPermissions || !Array.isArray(userPermissions)) return false; |
| 21 | + return requiredRoles.some((role) => userPermissions.includes(role)); |
| 22 | +}; |
| 23 | + |
| 24 | +// Helper function to handle loading state |
| 25 | +const finishLoading = () => { |
| 26 | + NProgress.done(); |
| 27 | + setTimeout(() => { |
| 28 | + store.dispatch("app/setLoading", false); |
| 29 | + }, 1000); |
| 30 | +}; |
12 | 31 |
|
13 | 32 | router.beforeEach(async (to, from, next) => { |
14 | | - // start progress bar |
15 | | - NProgress.start() |
| 33 | + NProgress.start(); |
16 | 34 | store.dispatch("app/setLoading", true); |
17 | 35 |
|
18 | | - // set page title |
19 | | - document.title = getPageTitle(to.meta.title) |
| 36 | + // Set page title |
| 37 | + document.title = getPageTitle(to.meta?.title); |
20 | 38 |
|
21 | | - // determine whether the user has logged in |
22 | | - const hasToken = getToken() |
| 39 | + // Check whitelist paths |
| 40 | + if (whiteList.includes(to.path)) { |
| 41 | + next(); |
| 42 | + finishLoading(); |
| 43 | + return; |
| 44 | + } |
23 | 45 |
|
24 | | - if (hasToken) { |
25 | | - if (to.path === '/login') { |
26 | | - // if is logged in, redirect to the home page |
27 | | - next({ path: '/' }) |
28 | | - NProgress.done() |
29 | | - } else { |
30 | | - // TODO: When the browser is closed and reopened, the user permission info will be lost. |
31 | | - // If the user navigates directly to another page without going through the login page, |
32 | | - // the permissions need to be re-validated. |
33 | | - const hasGetUserInfo = store.getters.user |
34 | | - if (hasGetUserInfo) { |
35 | | - if (to.meta && to.meta.roles && to.meta.roles.length > 0) { |
36 | | - let curPermissions = to.meta.roles; |
37 | | - let permissions = hasGetUserInfo.permissions; |
38 | | - let hasPermission = false; |
39 | | - if (permissions) { |
40 | | - for (let i = 0; i < curPermissions.length; i++) { |
41 | | - if (permissions.indexOf(curPermissions[i]) >= 0) { |
42 | | - hasPermission = true; |
43 | | - break; |
44 | | - } |
45 | | - } |
46 | | - } |
| 46 | + try { |
| 47 | + const userInfo = store.getters.user; |
47 | 48 |
|
48 | | - if (hasPermission) { |
49 | | - next(); |
50 | | - } else { |
51 | | - next('/401'); |
52 | | - NProgress.done(); |
53 | | - setTimeout(() => { |
54 | | - store.dispatch("app/setLoading", false); |
55 | | - }, 1000); |
56 | | - } |
57 | | - } else { |
58 | | - next(); |
59 | | - } |
60 | | - } else { |
61 | | - try { |
62 | | - // get user info |
63 | | - await store.dispatch('user/getInfo') |
| 49 | + // Redirect to home if logged in user tries to access login page |
| 50 | + if (to.path === "/login" && userInfo && userInfo.name) { |
| 51 | + next({ path: "/" }); |
| 52 | + finishLoading(); |
| 53 | + return; |
| 54 | + } |
64 | 55 |
|
65 | | - next() |
66 | | - } catch (error) { |
67 | | - // remove token and go to login page to re-login |
68 | | - await store.dispatch('user/resetToken') |
69 | | - Message.error(error || 'Has Error') |
70 | | - next(`/login?redirect=${to.path}`) |
71 | | - NProgress.done() |
72 | | - } |
| 56 | + // Handle not logged in or session expired |
| 57 | + if (!userInfo || !userInfo.name) { |
| 58 | + try { |
| 59 | + await store.dispatch("user/getInfo"); |
| 60 | + // Continue to requested page after successful login |
| 61 | + next({ ...to, replace: true }); |
| 62 | + } catch (error) { |
| 63 | + // If getInfo fails, redirect to login |
| 64 | + next(`/login?redirect=${encodeURIComponent(to.fullPath)}`); |
73 | 65 | } |
| 66 | + finishLoading(); |
| 67 | + return; |
74 | 68 | } |
75 | | - } else { |
76 | | - /* has no token*/ |
77 | 69 |
|
78 | | - if (whiteList.indexOf(to.path) !== -1) { |
79 | | - // in the free login whitelist, go directly |
80 | | - next() |
81 | | - } else { |
82 | | - // other pages that do not have permission to access are redirected to the login page. |
83 | | - next(`/login?redirect=${to.path}`) |
84 | | - NProgress.done() |
| 70 | + // Check page permissions |
| 71 | + if ( |
| 72 | + to.meta?.roles && |
| 73 | + !hasRequiredPermission(userInfo.permissions, to.meta.roles) |
| 74 | + ) { |
| 75 | + Message.error("You don't have permission to access this page"); |
| 76 | + next("/401"); |
| 77 | + finishLoading(); |
| 78 | + return; |
85 | 79 | } |
| 80 | + |
| 81 | + next(); |
| 82 | + } catch (error) { |
| 83 | + console.error("Route permission check failed:", error); |
| 84 | + Message.error(error?.message || "Please login first"); |
| 85 | + next(`/login?redirect=${encodeURIComponent(to.fullPath)}`); |
| 86 | + finishLoading(); |
86 | 87 | } |
87 | | -}) |
| 88 | +}); |
88 | 89 |
|
89 | 90 | router.afterEach(() => { |
90 | | - // finish progress bar |
91 | | - NProgress.done(); |
92 | | - setTimeout(() => { |
93 | | - store.dispatch("app/setLoading", false); |
94 | | - }, 1000); |
95 | | -}) |
| 91 | + finishLoading(); |
| 92 | +}); |
0 commit comments