tsimport { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"
// 静态路由
const routes: RouteRecordRaw[] = [
{
name: "home",
path: "/",
meta: { label: "首页" },
component: () => import("../pages/home.vue"),
},
{
name: "login",
path: "/login",
meta: { label: "登录" },
component: () => import("../pages/login.vue"),
},
{
name: "disboard",
path: "/disboard",
meta: { label: "工作台" },
component: () => import("../pages/disboard.vue"),
},
]
// 动态路由
const dynamicRoutes: RouteRecordRaw[] = [
{
name: "list",
path: "/list",
meta: { label: "列表", roles: ["admin", "user"] },
component: () => import("../pages/list.vue"),
},
{
name: "about",
path: "/about",
meta: { label: "关于", roles: ["admin", "user"] },
component: () => import("../pages/about.vue"),
},
{
name: "user",
path: "/user",
meta: { label: "用户", roles: ["admin", "user"] },
component: () => import("../pages/user.vue"),
children: [
{
name: "user-info",
path: "/user/info",
meta: { label: "用户info", roles: ["admin", "user"] },
component: () => import("../pages/user-info.vue"),
children: [
{
name: "user-info.a",
path: "/user/info/a",
meta: { label: "用户info.a", roles: ["admin", "user"] },
component: () => import("../pages/user-info-a.vue"),
},
{
name: "user-info.b",
path: "/user/info/b",
meta: { label: "用户info.b", roles: ["admin", "user"] },
component: () => import("../pages/user-info-b.vue"),
},
],
},
{
name: "user-orders",
path: "/user/orders",
meta: { label: "用户orders", roles: ["user"] },
component: () => import("../pages/user-orders.vue"),
},
],
},
]
// routes 扁平化处理
function loopRoutes(routes: RouteRecordRaw[], role: string = "") {
const result: RouteRecordRaw[] = []
const loopChildren = (children: RouteRecordRaw[] = [], parent: string = "") => {
children.forEach((item) => {
if (item.children) {
const { children, ...rest } = item
if (!rest.meta?.roles || (rest.meta?.roles as string[]).includes(role)) {
result.push(rest)
if (!router.hasRoute(item.name!)) {
if (parent) {
router.addRoute(parent, rest)
}
else {
router.addRoute(rest)
}
}
}
loopChildren(children, rest.name as string)
}
else {
// meta信息中没有roles或者meta信息中roles包含当前登录用户的role
if (!item.meta?.roles || (item.meta?.roles as string[]).includes(role)) {
result.push(item)
if (!router.hasRoute(item.name!)) {
if (parent) {
// 有父级
router.addRoute(parent, item)
}
else {
router.addRoute(item)
}
}
}
}
})
}
loopChildren(dynamicRoutes)
console.log(result)
return [...routes, ...result].filter(item => item.name !== "login")
}
const router = createRouter({
history: createWebHashHistory(),
routes,
})
export default router
export { loopRoutes, routes }
评论区
评论加载中...