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

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

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

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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python笔记(四)—— Python函数

4.1 函数的初体验 函数 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段 name "itheima" length len(name) print(length) 运行结果&#xff1a; 思考&#xff1a;为什么随时都可以使用len()统计长度 因为&#xff…

c++ 开发环境 LNK1104: 无法打开文件“avcodec.lib”

别人分享&#xff0c; 和自己最近遇到问题一摸一样。以为没什么用的静态资源&#xff0c;结果 无法编译。 昨天安装配置了&#xff0c;结果今天早上打开电脑&#xff0c;所以dll的工程全部报错&#xff1a; 1>------ 已启动全部重新生成: 项目: Dll_test, 配置: Debug x64…

使用插件vue-seamless-scroll 完成内容持续动态

1、安装插件 npm install vue-seamless-scroll --save 2、项目中引入 //单独引入import vueSeamlessScroll from vue-seamless-scrollexport default {components: { vueSeamlessScroll},}//或者在main.js引入import scroll from vue-seamless-scrollVue.use(scroll)3、页面使…

导游百度百科创建词条的条件?如何才更有效的通过审核

导游在如今的社会中扮演着重要的角色&#xff0c;他们不仅仅是旅行中的引路人&#xff0c;更是旅客们了解目的地地域文化和历史的窗口。因此&#xff0c;作为导游&#xff0c;有必要在百度百科上建立自己的词条&#xff0c;以展现自身的专业知识和经验。那导游百度百科词条创建…

[C++]类和对象,explicit,static,友元,构造函数——喵喵要吃C嘎嘎4

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

uniapp实现---类似购物车全选

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 一、实现思路 点击商家复选框&#xff0c;可选中当前商家下的所有商品。点击全选&#xff0c;选中全部商家的商品 添加单个多选框&#xff0c;在将多选…

【C++】十大排序算法之 归并排序 快速排序

本次介绍内容参考自&#xff1a;十大经典排序算法&#xff08;C实现&#xff09; - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序…

蓝桥杯2023年-买瓜(dfs,类型转换同样耗时)

题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜&#xff0c;每个瓜的重量为 Ai 。 小蓝刀功了得&#xff0c;他可以把任何瓜劈成完全等重的两份&#xff0c;不过每个瓜只能劈一刀。 小蓝希望买到的瓜的重量的和恰好为 m 。 请问小蓝至少要劈多少个瓜才能买到重量恰好…

官宣!百度智能云千帆产品发布会3月21日北京见!

回望2023大模型狂奔的一年&#xff0c;百度智能云千帆大模型平台无疑是浓墨重彩的一笔。自2023年3月27日正式问世后&#xff0c;百度智能云千帆大模型平台以突飞猛进的速度持续发展。从模型、应用到生态&#xff0c;“千帆”书写着自身在大模型时代的答卷。 作为全球首个一站式…

CN错题1

千兆以太网的MAC子层仍然使用 CSMA/CD , 支持半双工 和 全双工通信 。 与INTERNET 连接有 局域网 和 拨号上网 两种方式。 在计算机网络中&#xff0c;服务器提供的共享资源主要是指 硬件 、软件 和 数据库 资源。 在局域网中&#xff0c;硬件地址又称为 MAC地址 或 物理地址 报…

NIO核心二:通道Channel

一、简单介绍 通道(Channel)是java.nio的第二个创建概念。Channel用于在缓冲区和位于通道另一侧的实体(通常是一个文件或者是一个套接字)之间有效的传输数据。只不过Channel本身不能直接访问数据&#xff0c;Channel只能和Buffer进行交互。 1.NIO的通道和流的区别 通道可以同…

基于springboot+vue的周边游平台个人管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多&#xff0c;如果要出的话&#xff0c;可能模型都会差不多&#xff0c;因为不会出太难的题&#xff0c;难题基本上都是贪心、DP之类的&#xff0c;所以好好刷题刷熟练就行了&#xff0…

Qt初识 - 编辑框 | 按钮 | 命名规范

目录 一、编辑框 (一) Designer中的编辑框 (二) Code中的编辑框 二、按钮 (一) Designer中的按钮 (二) Code中的按钮 三、Qt中的命名规范 一、编辑框 (一) Designer中的编辑框 进入到Designer界面中 找到Input Widgets目录 找到该目录下的 将这个控件拉出去 双击就可…

STM32CubeIDE基础学习-代码编译介绍

STM32CubeIDE基础学习-代码的编译介绍 前言 当写完代码后&#xff0c;即在调试和下载代码之前都是需要对工程代码进行编译的操作&#xff0c;不然是无法正常进行代码调试和下载的&#xff0c;所以编译这一步是一个关键步骤。 下面就来介绍下STM32CubeIDE软件环境的代码编译方…

用python写一个自动进程守护,带UI

功能是指定程序关闭后自动重启&#xff0c;并点击1作为启动 原来的想法是群成员说的某软件打包后&#xff0c;软件进程被杀后&#xff0c;界面白屏。所以写了个计算器重启demo进行进程守护 import subprocess import time import pyautogui import psutil #用计算器做演示。 d…

数据库压力测试方法概述

一、前言 在前面的压力测试过程中&#xff0c;主要关注的是对接口以及服务器硬件性能进行压力测试&#xff0c;评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说&#xff0c;整个系统的瓶颈在于数据库。 原因很简单&#xff1a;Web应用中的其他因素&#xff0c;…

【Kafka系列 07】Kafka 如何保证消息不丢失

一、Kafka 消息不丢失的边界 一直以来&#xff0c;很多人对于 Kafka 丢失消息这件事情都有着自己的理解&#xff0c;因而也就有着自己的解决之道。在讨论具体的应对方法之前&#xff0c;我觉得我们首先要明确&#xff0c;在 Kafka 的世界里什么才算是消息丢失&#xff0c;或者…

IQmath库移植至ST系列单片机实战教程1

使用注意事项&#xff1a; 1.注意IQmath库使用的数据范围&#xff0c;如果使用IQ24格式&#xff0c;其范围不能超过-128~128&#xff1b; 如果输入的时候不注意其使用范围&#xff0c;会导致数据溢出&#xff0c;出现一直为0的情况。 如定义 _iq24 a 0; a _IQ24(380)其结果…

史上最细,接口自动化测试用例设计编写总结,一篇带你打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 说到自动化测试&a…