Vue3 + Vite + Vue Router 4后端返回路由配置动态路由权限管理
25-04-07 05:15
814
0
动态路由
// 路由递归处理 const AllRouter = import.meta.glob("@/views/**/*.vue"); interface RouterItem { path: string; name: string; component: () => any; children?: RouterItem[]; meta: { title: string; icon: string; }; } const routerFormat = (routerList: any): RouterItem[] => { if (!routerList || !Array.isArray(routerList)) return []; return routerList.map((item: any) => { return { ...item, component: AllRouter[`/src/views/${item["component"]}`], children: routerFormat(item["children"]) }; }); }; // 动态路由挂载 const addDynamicRoutes = (layoutRoute: RouteRecordRaw | undefined, page: RouteLocationNormalizedLoaded) => { const newRouteStr = localStorage.getItem("routerList"); if (layoutRoute && newRouteStr && layoutRoute.children!.length < 1) { const newRouteArr = routerFormat(JSON.parse(newRouteStr) as RouteRecordRaw[]); layoutRoute.children = newRouteArr; router.addRoute(layoutRoute); router.push(page); } };
路由守卫
// 路由守卫 router.beforeEach(async (to, from, next) => { // 每次请求判断动态路由是否挂载 const layoutRoute: RouteRecordRaw | undefined = router.options.routes.find(route => route.name === "Layout"); addDynamicRoutes(layoutRoute, to); // 路由拦截规则 const TOKEN_STATIC: string | null = localStorage.getItem("session"); if (to.path === "/login" && TOKEN_STATIC) { next("/Layout"); } else { !TOKEN_STATIC && to.path !== "/login" ? next("/login") : next(); } });
Login 获取路由信息
// 路由递归处理 const routerFormat = (routerList: any[]): any[] => { if (!routerList) return []; return routerList.map((item: any) => { return { path: item["url"], name: item["title"], component: item["component"], children: routerFormat(item["children"]), meta: { title: item["title"], icon: item["ico"] } }; }); }; // 获取用户信息 const getUserInfoFn = async (session: any) => { localStorage.setItem("session", session); const res = await getUserInfo(); if (res.code == 0) { const routerList = routerFormat(res.data.router_list); localStorage.setItem("userInfo", JSON.stringify(res.data.user_info)); localStorage.setItem("routerList", JSON.stringify(routerList)); router.push({ name: "Layout" }); } };
-
中医执业医师(2018)-基础学习笔记
01、中医执业-中医基础理论(2018)【全】02、中医执业-中医诊断学(2018)【全】03、中医执业-中药学(2018)【全】04、中医执业-方剂学(... 1462 0 24-08-20 -
瞬间无损截取合并视频的方法!终于能一秒收藏视频片段
视频剪辑相关的问题:有没有那种给视频加文字水印后,文件不变大的软件?有没有可以截取部分视频画面的剪辑软件?怎么合并视频,生成的文件... 619 0 25-04-27 -
粒子效果文字动画特效支持文本,时间,倒计时,矩形,圆形状的文字
356 0 21-06-01 -
Umi-OCR 一款强大的开源光学字符识别(OCR)工具
Umi-OCR是一款强大的开源光学字符识别(OCR)工具,致力于打破现实与数字世界的界限,通过先进的算法,实现对各类复杂图像中的文字信息进行... 993 0 25-02-05 -
支持弹出图片视频和页面jQuery插件
546 0 21-06-04 -
2012英语专业教师招聘试题
【豆丁★教育百科】09英语全国高考真题____初中英语教师应聘资料.doc【豆丁★教育百科】10教师招聘小学英语模拟试卷五.doc【豆丁★教育百科... 967 0 24-08-20 -
如何在冬季避免皮肤干燥
冬季里,皮肤特别容易干燥,尤其是手很容易龟裂。下面介绍7个不错的方法可以让你在冬季远离皮肤干燥: ... 673 0 25-03-03 -
除了百度网盘,我们还可以选择什么网盘
百度网盘令人诟病的龟速,网络上对百度网盘的不满愈来愈烈,那么目前我们国内还有什么别的网盘可以选择呢?最近几天我就测评了一下现在国内... 668 0 25-03-10
发表我的评论
共0条评论
- 这篇文章还没有收到评论,赶紧来抢沙发吧~