vite+vue3门户网站菜单栏动态路由控制

news2024/11/20 0:45:31

   门户网站用户端需要分板块展示,板块内容由管理端配置,包括板块名称,访问路径,路由组件,展示顺序,是否展示。如下图所示:

用户访问门户网站时,展示菜单跳转通过板块配置,动态生成路由。

1.后端接口获取路由

 @GetMapping(value = "/router")
    public Result<?> getRouterList() {
        LambdaQueryWrapper<Block> query = new LambdaQueryWrapper<>();
        query.eq(Block::getIsShow, true).orderByAsc(Block::getSort);
        List<Block> blockList = blockService.list(query);
        List<Map<String, Object>> routeMapList = new ArrayList<>();
        blockList.forEach(block -> {
            Map<String, Object> map = new HashMap<>();
            map.put("path", block.getPath());
            map.put("component", block.getComponent());
            map.put("name", block.getComponent());
            routeMapList.add(map);
        });
        return Result.OK(routeMapList);
    }

2.路由配置文件  router/index.ts

import {createRouter, createWebHashHistory} from 'vue-router'

const router = createRouter({
    history: createWebHashHistory(), // hash模式:createWebHashHistory,history模式:createWebHistory
    routes: [
        {
            path: '/404',
            component: () => import('@/views/404.vue'),
            hidden: true
        },
    ]
})

export default router

3.路由守卫  router/guard/index.ts

import {Router} from 'vue-router'
import {getRouterList} from "@/api/block";
import mainStore from "../../store";

let dynamicRouters = []

export async function dynamicRouter(router: Router) {
    const {data: res} = await getRouterList()
    dynamicRouters = res.result
    const routeList = transformObjToRoute(dynamicRouters)
    routeList.forEach((route: any) => {
        //添加路由
        router.addRoute(route);
    });
}

/**
 * views目录下找页面,设置component
 * @param routeList
 */
function transformObjToRoute(routeList: any) {
    let dynamicViewsModules: any = import.meta.glob('../../views/**/*.{vue,tsx}');
    routeList.forEach((route: any) => {
        const component = route.component as string;
        if (component) {
            route.component = dynamicImport(dynamicViewsModules, component)
        }
    });
    return routeList;
}

function dynamicImport(dynamicViewsModules: any, component: string) {
    const keys = Object.keys(dynamicViewsModules);
    const matchKeys = keys.filter((key) => {
        const k = key.replace('../../views', '');
        const startFlag = component.startsWith('/');
        const endFlag = component.endsWith('.vue') || component.endsWith('.tsx');
        const startIndex = startFlag ? 0 : 1;
        const lastIndex = endFlag ? k.length : k.lastIndexOf('.');
        return k.substring(startIndex, lastIndex) === component;
    });
    if (matchKeys?.length === 1) {
        const matchKey = matchKeys[0];
        return dynamicViewsModules[matchKey];
    } else if (matchKeys?.length > 1) {
        return;
    }
}

/**
 * 页面未找到
 */
export const PAGE_NOT_FOUND_ROUTE: any = {
    path: '/:path(.*)*',
    name: "NotFound",
    component: () => import('@/views/404.vue')
};

/**
 * 动态路由权限控制
 * @param router
 */
export function setupPermissionGuard(router: Router) {
    router.beforeEach(async (to, from, next) => {
        //判断是否已经添加过动态路由,添加过,直接放行
        if (mainStore.getters.getIsDynamicAddedRoute) {
            next();
            return;
        }

        //没有添加过,添加,添加后跳转页面
        await dynamicRouter(router)
        router.addRoute(PAGE_NOT_FOUND_ROUTE);

        mainStore.commit('setDynamicAddedRoute', {
            isDynamicAddedRoute: true
        })
        next({...to, replace: true})
    });
}

4.main.ts配置路由守卫

import App from './App.vue'
import router from '@/router'
import {setupPermissionGuard} from '@/router/guard'

async function bootstrap() {
    // 创建应用实例
    const app = createApp(App);
    app.use(router) // 引用路由实例

    setupPermissionGuard(router);

    await router.isReady();

    // 挂载应用
    app.mount('#app', true);
}

bootstrap()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1500622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode : 1137. 高度检查器

学校打算为全体学生拍一张年度纪念照。根据要求&#xff0c;学生需要按照 非递减 的高度顺序排成一行。 排序后的高度情况用整数数组 expected 表示&#xff0c;其中 expected[i] 是预计排在这一行中第 i 位的学生的高度&#xff08;下标从 0 开始&#xff09;。 给你一个整数…

Web3 Summit 2024 柏林重启:与全球 Buidler 共赴创新盛事

时隔五年&#xff0c;Web3 Summit 将于 8 月 19 日至 21 日回归柏林举办。 2019 年&#xff0c;1000 多名开发人员、研究人员和 buidler 齐聚一堂&#xff0c;参加了上一届为期三天的 Web3 Summit&#xff0c;这是一个所有致力于促进在去中心化网络上深耕团队相聚的盛事。 与…

RDB 和 AOF 的实现原理以及优缺点

一个工作了 5 年的粉丝私信我&#xff0c; 关于 RDB 和 AOF 的实现原理 这个问题在面试的时候&#xff0c;应该怎么回答&#xff1f;于是我把之前整理过的一个高手回答整理成文档发给了他&#xff0c;后来他参考这个回复在面试的时候顺利拿到了 offer 今天我把这个文档分享给大…

AI大模型,掀起新一波智能浪潮!

AI大模型的出现&#xff0c;标志着人工智能技术迈入了一个新的阶段。这些巨大的模型不仅在规模上超越了以往任何其他人工智能系统&#xff0c;而且在性能上也取得了巨大的突破。由于其庞大的参数量和复杂的结构&#xff0c;AI大模型在各个领域展现出了强大的学习能力和推理能力…

Haproxy 负载均衡集群

一. Haproxy 1. Haproxy 介绍 HAProxy 是法国开发者威利塔罗 (Willy Tarreau) 在2000年使用C语言开发的一个开源软件&#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则…

基于React低代码平台开发:直击最新应用构建

文章目录 前言一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》编辑推荐内容简介作者简介目录前言为什么要写这本书读者对象如何阅读本书 前言 随着数字化转型的…

【免费资源】Unity真实广阔的沙漠场景等你来解锁!

Unity真实广阔的沙漠场景等你来解锁&#xff01; Unity 每周免费资源上新啦&#xff01;此次更新的是广阔的沙漠场景&#xff0c;其中包含 14 个预制体&#xff0c;每个预制体都包含 LOD、400-2000 顶点和 4K 纹理。现在&#xff0c;只需登录 Asset Store&#xff0c;即可免费领…

ThinkPHP6与支付宝支付集成指南:轻松实现在线收款!

随着移动支付的普及&#xff0c;支付宝成为了越来越多人的首选支付方式。而作为一款高性能、高效率、安全稳定的开源框架&#xff0c;thinkphp6也被众多开发人员所青睐。那么&#xff0c;如何在thinkphp6中快速简便地实现支付宝支付呢&#xff1f; 首先&#xff0c;我们需要在…

openGauss学习笔记-238 openGauss性能调优-SQL调优-SQL执行计划介绍-详解

文章目录 openGauss学习笔记-238 openGauss性能调优-SQL调优-SQL执行计划介绍-详解238.1 详解238.1.1 执行计划238.1.1.1 执行计划层级解读&#xff08;纵向&#xff09;238.1.1.2 执行计划中的关键字说明 238.1.2 执行信息 openGauss学习笔记-238 openGauss性能调优-SQL调优-S…

机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析

一、引言 机器学习在当今社会扮演着日益重要的角色&#xff0c;但黑盒模型的不可解释性限制了其应用范围。因此&#xff0c;可解释性机器学习成为研究热点&#xff0c;有助于提高模型的可信度和可接受性。本文旨在探讨随机森林和fastshap作为可视化模型解析工具的应用&#xff…

nodejs web服务器 -- 搭建开发环境

一、配置目录结构 1、使用npm生成package.json&#xff0c;我创建了一个nodejs_network 文件夹&#xff0c;cd到这个文件夹下&#xff0c;执行&#xff1a; npm init -y 其中-y的含义是yes的意思&#xff0c;在init的时候省去了敲回车的步骤&#xff0c;如此就生成了默认的pac…

Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

在这个博主的基础上&#xff0c;增加两种情况的对比&#xff1a;https://blog.csdn.net/llllllkkkkkooooo/article/details/108068919 可重复读中幻读现象&#xff08;未使用MVCC&#xff09; 设置可重复读的隔离级别 set global transaction isolation level repeatable read…

Java --- springcloud初始项目创建

目录 一、cloud项目创建 1.1、项目编码规范 1.2、注解生效激活 1.3、导入父工程maven的pom依赖 二、创建子工程并导入相关pom依赖 2.1、相关配置文件 2.1.1、数据库配置文件内容 2.1.2、自动生成文件配置内容 三、创建微服务8001子工程 3.1、导入相关pom依赖 3.…

Orange3数据预处理(分组组件)

Group By是Orange3中一个非常有用的组件&#xff0c;它允许用户对数据集进行聚合操作&#xff0c;类似于SQL中的GROUP BY语句或Pandas库中的groupby方法。以下是Group By组件的一些核心功能介绍&#xff1a; 1. Mean (平均数): 数据值的总和除以数据项的数量&#xff0c;显示数…

yolov8多batch推理,nms后处理

0. 背景 在高速公路监控视频场景下&#xff0c;图像分辨率大都是1920 * 1080或者2560 * 1440&#xff0c;远处的物体&#xff08;车辆和行人等&#xff09;都比较小。考虑需要对图像进行拆分&#xff0c;然后把拆分后的数据统一送入模型中&#xff0c;推理的结果然后再做nms&am…

有没有能用蓝牙的游泳耳机?6招解决选购难题,瞄准好货!

在数字化时代&#xff0c;我们越来越依赖各种电子设备来提升生活质量。对于喜欢运动的朋友来说&#xff0c;耳机已经成为他们必不可少的装备之一。无论是跑步、健身还是游泳&#xff0c;耳机都能为我们提供美妙的音乐和清晰的语音通话&#xff0c;让我们的运动体验更加丰富多彩…

React报错 之 Objects are not valid as a React child

原文链接&#xff1a; 1、React报错之Objects are not valid as a React child 2、Objects are not valid as a React child error [Solved] 作者&#xff1a;Borislav Hadzhiev 以下文中涉及到的链接均来自于该作者&#xff0c;他写了很多相关的文章&#xff0c;可以多看看他的…

微信开发者工具 vim 键位绑定

问题&#xff1a;如标题 解决&#xff1a; 最上边点击设置&#xff0c;找到编辑器设置 点击更多编辑器设置&#xff0c;然后会弹出设置这个页面 搜索 vim &#xff0c;并点击 一直往下边滑动&#xff0c;找到 setting.json 然后加入这段代码&#xff1a; "vim.insertM…

python练习题2

1.一下哪项不是python语言的保留字&#xff08;&#xff09; A.False B.and C.true D.if 答案&#xff1a;C&#xff08;应该是True&#xff09; 2.x5&#xff0c;y3&#xff0c;执行x&#xff0c;yy&#xff0c;x之后&#xff0c;x和y的值分别是什么&#xff08;&#xff09; …