|
|
@@ -1,5 +1,7 @@
|
|
|
import { createRouter, createWebHashHistory } from 'vue-router';
|
|
|
import { systemRoutes } from './route';
|
|
|
+import { kuky_Authorization } from '../base/storage';
|
|
|
+import { initializeRoutes } from '../utils/permission';
|
|
|
|
|
|
const router = createRouter({
|
|
|
history: createWebHashHistory(),
|
|
|
@@ -7,4 +9,50 @@ const router = createRouter({
|
|
|
scrollBehavior: () => ({ left: 0, top: 0 })
|
|
|
});
|
|
|
|
|
|
+/** 免验证白名单 */
|
|
|
+const whiteList = ['/login', '/reg', '/noPer'];
|
|
|
+
|
|
|
+/** 是否已经生成过路由表 */
|
|
|
+let hasRouteFlag = false;
|
|
|
+export const resetHasRouteFlag = () => {
|
|
|
+ hasRouteFlag = false;
|
|
|
+};
|
|
|
+// 扁平路由表
|
|
|
+let flatRoutes = [];
|
|
|
+
|
|
|
+router.beforeEach(async (to, from, next) => {
|
|
|
+ const isAuthorized = kuky_Authorization.get(); // 获取用户授权状态
|
|
|
+ const isLoginPage = to.path === '/login'; // 判断目标路径是否为登录页
|
|
|
+ const isInWhiteList = whiteList.includes(to.path); // 检查目标路径是否在白名单中
|
|
|
+
|
|
|
+ // 用户已授权的情况
|
|
|
+ if (isAuthorized) {
|
|
|
+ if (!hasRouteFlag) {
|
|
|
+ const { formattedRoutes, accessFlatRoutes } = await initializeRoutes();
|
|
|
+ formattedRoutes.forEach((route) => {
|
|
|
+ if (route.path && route.component) {
|
|
|
+ router.addRoute(route); // 动态添加可访问路由表
|
|
|
+ }
|
|
|
+ });
|
|
|
+ flatRoutes = accessFlatRoutes;
|
|
|
+ hasRouteFlag = true;
|
|
|
+ next({ ...to, replace: true });
|
|
|
+ } else if (isLoginPage) {
|
|
|
+ next('/');
|
|
|
+ } else if (!flatRoutes.some((route) => route.path == to.path) && !isInWhiteList) {
|
|
|
+ next('/noPer'); // 如果用户无访问权限且不在白名单中,重定向到无权限页面
|
|
|
+ } else {
|
|
|
+ next(); // 其他情况,正常访问
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 用户未授权的情况
|
|
|
+ if (isInWhiteList) {
|
|
|
+ // 如果目标路径在免登录白名单中
|
|
|
+ next(); // 允许进入
|
|
|
+ } else {
|
|
|
+ next('/login'); // 否则重定向到登录页面
|
|
|
+ }
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
export default router;
|