Vue3 + Vite + Vue Router 4后端返回路由配置动态路由权限管理
25-04-07 05:15
815
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" }); } };
-
移动端充值HTML
340 0 21-06-02 -
播音员训练手册(MP3)
八百标兵 绕口令录音.mp3口部操练习要领.mp3打南边来了个喇嘛 绕口令录音.mp3播音主持创作的规律和原则(杜敏主讲1).mp3播音主持创作的规... 1033 0 24-08-19 -
html多图片上传
378 0 21-06-02 -
简单清爽的confirm确认对话框
352 0 21-06-02 -
仿安卓积分墙APP 学生赚米赚系统手机赚钱APP源码
最新版积分墙APP积分墙采用PHP+MYSQL的数据存储,后台数据实时对接!本手机app赚钱应用,类似于-米赚-学生赚这类应用,时下红火的app应用软... 445 0 21-07-07 -
让你的DeepSeek能力翻倍的使用指南
这两天Deepseek爆火全球,会用的人说巨好用,但是也有很多人说也不过如此,其实这么多国际巨头都震惊,自然是非常惊艳的一款产品。之所以觉... 941 0 25-04-30 -
IntelliJ IDEA 2018开java发软件下载安装
IntelliJ IDEA 2018是一款相当实用的便捷型java开发工具,IDEA2018功能全面,具备了强悍的智能代码助手、代码自动提示、CVS整合、代码分... 1245 0 24-05-28 -
Anlink安卓手机投屏控制软件(带简体中文包)
Anlink中文版是一款基于Scrcpy二次开发的全新轻量级免费安卓投屏软件,也叫多屏协同工具,也是一款简单易用的用Windows控制Android设... 1189 0 25-02-09
发表我的评论
共0条评论
- 这篇文章还没有收到评论,赶紧来抢沙发吧~