后端控制及动态路由详解
一、引言
在现代化的Web应用中,动态路由扮演着至关重要的角色,它允许我们根据用户的权限或其他条件动态地加载和展示不同的页面。本文将详细讲解如何使用Vue Router实现后端控制及动态路由,并通过实际代码示例进行说明。
二、环境搭建
首先,确保你的项目中已经安装了Vue Router。你可以通过以下命令进行安装
npm install vue-router
三、基础路由配置
导入路由和页面
import { createRouter, createWebHashHistory } from "vue-router";
import { useStore } from "../stores/user";
这里,我们导入了createRouter
和createWebHashHistory
用于创建路由实例,同时导入了useStore
用于获取Pinia存储的状态。
2.
定义基础路由
const baseRoutes = [
{ path: "/", name: "login", component: () => import("../views/login.vue") },
{ path: "/totalTwo", component: () => import("../views/total/totalTwo.vue"), children: [] },
{ path: "/totalOne", component: () => import("../views/total/totalOne.vue"), children: [] },
{ path: "/home", name: "home", component: () => import("../views/home.vue"), meta: { title: "首页" } },
];
这些是应用的基本路由,无论用户权限如何,都将可用。
四、全部路由配置
const totalArray = [
// ...其他路由配置
{ id: 2, pid: 0, path: "/comp", name: "门诊", meta: { permissions: ["1"] }, children: [...] },
{ id: 8, pid: 0, path: "/hospital", name: "住院", meta: { permissions: ["1"] }, children: [...] },
// ...更多路由配置
];
这里定义了全部的路由配置,包括每个路由的ID、父ID、路径、名称、元信息(如权限)和子路由。
五、动态路由配置
const dynamicRoutes = [
{ path: "/home", name: "首页", component: () => import("../views/home.vue"), meta: { title: "首页" } },
{ id: 2, pid: 0, path: "/outpatient", name: "门诊", meta: { permissions: ["1"] }, children: [...] },
// ...更多动态路由配置
];
动态路由是根据用户权限或其他条件动态添加到路由实例中的。
六、过滤和存储匹配的路由
1.过滤匹配的路由
const matchedRoutes = dynamicRoutes.filter((route1) =>
totalArray.some(
(route2) => route1.name === route2.name || route1.path === route2.path
)
);
这段代码通过比较名称(name)和路径(path)来过滤出匹配的路由
2.存储匹配的路由
localStorage.setItem("matchedRoutes", JSON.stringify(matchedRoutes));
过滤后的路由被存储在本地存储中,以便在菜单页面中使用
七、导航守卫
router.beforeEach(async (to, from, next) => {
const store = useStore();
const isLogin = !!store.id;
if (!isLogin) {
return to.path === "/" ? next() : next("/");
}
if (to.path === "/") {
return next("/about");
}
if (!store.id) {
return next("/");
}
if (store.role) {
const role = String(store.role);
for (let i in dynamicRoutes) {
const permission = String(dynamicRoutes[i].meta.permissions);
if (permission === role) {
let myRoute = [
{ path: "/home", name: "home", component: () => import("../views/home.vue"), meta: { title: "首页" } },
];
const isRouteExist = baseRoutes.some(
(baseRoute) => baseRoute.path === dynamicRoutes[i].path
);
if (!isRouteExist) {
myRoute.push(dynamicRoutes[i]);
}
store.getRoutes(myRoute);
}
}
}
next();
});
导航守卫用于在路由跳转前进行权限验证和动态路由的添加。
八、菜单页面
在菜单页面获取一下匹配的路由
const matchedRoutes = JSON.parse(localStorage.getItem('matchedRoutes'))
菜单页面使用Element Plus组件库进行布局,并通过循环渲染动态路由来生成菜单。
<template>
<div>
<el-menu :default-active="activeMenu" class="el-menu-vertical" :collapse="isCollapse" background-color="#fff"
text-color="#000" active-text-color="#409EFF">
<!-- 循环渲染动态路由 -->
<template v-for="route in matchedRoutes" :key="route.id">
<!-- 有子路由的菜单项 -->
<el-sub-menu v-if="route.children && route.children.length" :index="route.path">
<template #title>
<el-icon>
<component :is="getIcon(route.name)" />
</el-icon>
<span>{{ route.name }}</span>
</template>
<!-- 渲染子菜单 -->
<el-menu-item v-for="child in route.children" :key="child.id" :index="child.path"
@click="dayun(child.path, child.name)">
<el-icon>
<component :is="getIcon(child.name)" />
</el-icon>
<span>{{ child.name }}</span>
</el-menu-item>
</el-sub-menu>
<!-- 没有子路由的单独菜单项 -->
<el-menu-item v-else :index="route.path" @click="dayun(route.path, route.name)">
<el-icon>
<component :is="getIcon(route.name)" />
</el-icon>
<span>{{ route.name }}</span>
</el-menu-item>
</template>
</el-menu>
</div>
</template>
九、总结
通过以上步骤,我们实现了基于后端控制的动态路由功能。这种实现方式不仅提高了路由管理的灵活性,还增强了应用的安全性。在实际项目中,你可以根据具体需求进行调整和优化。