当前位置: 首页 > news >正文

vue3实现动态路由

文章目录

  • 一、基础信息
    • 1.路由构成
    • 2.菜单配置表
    • 3.vue-router4方法
  • 二、实现思路
    • 1.登录获取菜单配置表
    • 2.导航守卫
    • 3.添加动态路由
    • 4.渲染菜单
    • 5.退出登录删除动态路由
  • 三、实现代码
    • 1.路由守卫
    • 2.基础路由文件
    • 3.添加动态路由逻辑
    • 4.待特殊处理路由配置表
    • 5.404类路由
    • 6.删除动态路由

场景:现场有菜单编辑等功能,可以修改菜单的路径、名称、层级关系。就导致菜单变化后,前端需要在router.js文件手动配置新的对应路由,非常麻烦;
方案使用动态路由自动匹配变更的菜单路由;使用vue-router4实现动态路由,达到后端配置菜单的路由标识,后端可随意变更菜单层级和路径,前端根据标识的component路径动态匹配路由找到前端路径文件;
拓展:动态权限也是类似方案,通过后端返回路径信息,前端使用动态路由处理

一、基础信息

1.路由构成

  • 整体路由 = 基础路由 + 动态路由 + 404类路由
    • 基础路由:包含 /login、/详情类、/基础路径路由
    • 动态路由:包含根据登录成功后返回的菜单配置路由生成动态路由待特殊处理的动态路由
    • 404类路由:包含/404、/403、/:pathMatch(.*)
    • 注意点动态路由逻辑需要添加在404类路由前,否则刷新浏览器会导致找不到动态路由而报错

2.菜单配置表

  • 后端提供了一个菜单配置表,在里面可以配置菜单的ID、菜单名称、菜单地址栏路径url、父级ID、标识。
  • 菜单配置表同系统页面里的菜单管理页面一样,可以修改菜单的上述这些信息。
  • 目的登录成功后,后端的登录接口会返回该用户对应的菜单配置信息和标识

这里是引用

重点 | 重点 | 重点

标识标识字段维护的就是这个菜单路径所对应的前端component文件路径。当该条菜单的名称、路径、层级无论如何变化,前端都负责将该路径匹配到标识对应的页面上。即可实现路由路径变化,页面内容正常匹配,即动态路由。

3.vue-router4方法

添加权限(动态路由): 使用router.addRoute()方法将拥有权限的动态路由添加到路由表系统中
删除权限(动态路由): 使用router.removeRoute(name)方法删除动态路由
判断路由是否存在:使用router.hasRoute(to.name)方法判断路由name是否存在

二、实现思路

这里是引用

1.登录获取菜单配置表

用户登录成功后,登录接口可以拿到有具体component标识的树状层级菜单信息,存入piniapermissionList字段下,用于渲染页面导航栏和侧边栏。同时拍平一份存入flatPermissionList,方便后期遍历生成前端动态路由

2.导航守卫

在导航守卫router.beforeEach中,使用router.hasRoute(to.name)判断是否存在当前路由
有:则进入正常逻辑和next()
无:需要先走动态路由添加逻辑,手动将该路由生成动态路由添加,在进入正常逻辑和next()
退出:需要清除动态路由

3.添加动态路由

动态路由:将后端返回的拍平的菜单信息flatPermissionList,进行遍历。找到标识的值即component路径(我们后端使用flag字段做标识字段,字段无所谓,重要的是具体vue文件路径),结合菜单名称、路径等信息,组装成动态路由,再使用遍历router.addRoute()一次性添加所有动态路由;

待特殊需要处理的动态路由:例如有些路由需要特殊meta配置meta: { title: "标题", inlayout: false, needAside: false },由于后端返回的菜单信息只有路径、名称、标识信息无法满足meta里的inlayout等配置;所以需要在本地有个dynamicRouter.js文件,维护一个需要待特殊处理的路由信息,根据标识去匹配获取。

404类路由:同时记得添加动态的404类路由。

注意:添加动态路由,需要在meta里添加一个标记字段isDynamic,用于标记是动态路由。
目的:后期退出时候需要删除动态路由

4.渲染菜单

使用pinia里的层级菜单信息permissionList,渲染导航栏和侧边栏;
注意:不能使用router.options来获取所有的路由渲染菜单,因为该方法不能获取到动态路由

5.退出登录删除动态路由

用户退出登录时需要删除动态路由(权限),因为如果退出登录时不删除动态路由(权限),紧接着登录其他权限不同的用户,该用户没有上一个用户所拥有的权限,所以无法查看上一个用户所看到的菜单以及页面,但是该用户可以使用浏览器的回退功能或者修改url地址栏的路径从缓存中去访问上一个用户能访问的页面,这样该用户就可以访问到不属于自己权限的页面,所以在用户退出登录时需要删除动态路由(权限),来保证权限的准确性。删除动态路由使用到router.removeRoute(),根据之前的标记字段isDynamic删除

三、实现代码

1.路由守卫

/src/router/index.js
作用: 拦截当前路由,判断是否有该动态路由及删除动态路由

import { resetDynamicRoutes } from '@/utils/routeManager' // 删除动态路由方法
import { createRouter, createWebHashHistory } from "vue-router"
import staticRoutesDefault from "./staticRoutesDefault"
import constantRoutes from "./constantRoutes"
import useStore from "@/store/index.js"import { setComponent } from "./setRouter" // 动态路由设置方法const router = createRouter({history: createWebHashHistory(),routes: [...staticRoutesDefault, ...constantRoutes] // 初始这里仅有/login /详情 等基础路由 不包含动态路由 不包含404类路由
})router.beforeEach(async (to, _from, next) => {const { userStore } = useStore()// -------------------------动态路由判断逻辑-------------------------// 退出到登录页 时候需要清除动态路由,否则下一个用户可以通过地址栏拼接方式 使用上一个用户的路由 菜单权限不严谨if (to.path === '/login' || to.name === 'login' || to.path === '/' || to.name === 'sso') {// 清理动态路由resetDynamicRoutes(router)}try {// 1. 检查路由是否存在const routeExists = router.hasRoute(to.name || to.path)console.log('%c【' + '检查路由是否存在' + '】打印', 'color:#fff;background:#0f0', to.name, to.path, routeExists)// 2. 不存在的话去添加if (!routeExists) {// 添加动态路由const addIsSuccessful = setComponent(router)if (addIsSuccessful) {return next({ ...to, replace: true })}}} catch (error) {console.log(error)}// -------------------------动态路由判断逻辑-------------------------// 正常的其他逻辑const token = sessionStorage.getItem("Authorization") || ""let permissionList = [...userStore.flatPermissionList.map(item => item.permissionUrl)]if (!token) {next("/login")} else {if (permissionList.includes(to.path)) {next()} else {next("/403")}}
})export default router

2.基础路由文件

这部分可以不看,就是一些除了动态路由外的基础路由配置

/src/router/constantRoutes.js
存放登录路由

const constantRoutes = [{path: "/",name: "sso",component: () => import("@/views/login/sso/index.vue"),meta: {inlayout: false}},{path: "/login",name: "login",component: () => import("@/views/login/normal/index.vue"),meta: {title: "登录",inlayout: false}},
]
export default constantRoutes

/src/router/staticRoutesDefault.js
存放基础路由、详情路由、系统管理路由

export default [{path: "/assetManagement/ipManagement/lanIPManagement/lanIPApproval/:type/:process",name: "LanIPApproval",meta: { title: "局域网IP流程申请" }, // 基础component: () => import("@/views/assetManagement/ipManagement/lanIPManagement/lanIPApproval/index.vue"),beforeEnter: to => {if (to.params.type == "view") {to.meta.title = "局域网IP流程查看"to.matched[to.matched.length - 1].meta.title = "局域网IP流程查看"} else if (to.params.type == "deal") {to.meta.title = "局域网IP流程审批"to.matched[to.matched.length - 1].meta.title = "局域网IP流程审批"} else {to.meta.title = "局域网IP流程申请"to.matched[to.matched.length - 1].meta.title = "局域网IP流程申请"}}},{path: "/securityManagement",name: "SecurityManagement",meta: { icon: "VideoCamera", title: "安全管理" },children: [{path: "versionManagement",name: "VersionManagement",meta: { title: "版本管理" },component: () => import("@/layout/layRouterview.vue"),children: [{path: "problemVersionDevice",name: "ProblemVersionDevice",meta: { title: "查看设备" }, // 基础component: () => import("@/views/securityManagement/versionManagement/problemVersion/viewDevice.vue")},]},]},{path: "/systemManagement",name: "SystemManagement",meta: { icon: "VideoCamera", title: "系统管理" },children: [{path: "menuManagement",name: "MenuManagement",meta: { title: "菜单管理" },component: () => import("@/views/systemManagement/menuManagement/index.vue")},{path: "roleManagement",name: "RoleManagement",meta: { title: "角色管理" },component: () => import("@/views/systemManagement/roleManagement/index.vue")},]}
]

3.添加动态路由逻辑

/src/router/setRouter.js

注意

  • 动态路由使用router.addRoute()添加,需要加一个动态路由isDynamic标识,方便删除
  • 动态路由添加后,需要使用next({ ...to, replace: true })才能导航成功
  • component要使用import.meta.glob的路径引入
import dynamicRouterList from "./dynamicRouter" // 待特殊处理的路由配置表
import routes404 from "./routes404" // 404页面路由
import useStore from "@/store/index.js"// 使用后端返回的权限列表拍平后的结果和标识找到动态路由(可以一次性塞入所有的动态路由)
export const useMarkFindAllRouter = () => {const modules = import.meta.glob(['../views/*/*.vue','../views/*/*/*.vue'])let allList = []const flatPermissionList = useStore().userStore.flatPermissionList // 后端返回的权限列表拍平后的结果console.log('%c【' + 'flatPermissionList拍平' + '】打印', 'color:#fff;background:#0f0', flatPermissionList)flatPermissionList.forEach(ele => {if (ele.flag) { // flag就是后端配置表里的标识字段 返回的是component地址let dynamicJavaRouter = {...ele,name: 'Name' + ele.flag + '_' + ele.id, // 注意自定义组件的name 保持不重复 判断是否存在路由时候用meta: { title: ele.permissionName }, // 配置基础metacomponent: modules[`..${ele.flag}.vue`], // 注意component要使用import.meta.glob的路径path: ele.permissionUrl, // 注意path要使用后端返回的导航栏的path}  // 组装动态路由allList.push(dynamicJavaRouter)}})// 如果你的meta不需要特殊处理就不需要此逻辑for (let index = 0; index < dynamicRouterList.length; index++) {const element = dynamicRouterList[index];for (let i = 0; i < allList.length; i++) {const ele = allList[i];if (ele.flag === element.markId) {ele.meta = element.meta // 根据标识和待特殊处理的路由配置表 匹配 找到后赋值特殊的meta信息}}}return allList
}
// 添加动态路由
export const setComponent = (router) => {console.log('添加动态路由')const dynamicRoutesAllList = useMarkFindAllRouter()// 根据标识或者路径找到对应动态路由dynamicRoutesAllList.forEach(route => {router.addRoute({...route,meta: { ...route.meta, isDynamic: true } // 标记动态路由})// router.options.routes.push(dynamicRoutes)})// 添加404路由routes404.forEach(ele => router.addRoute({...ele,meta: { ...ele.meta, isDynamic: true } // 标记动态路由}))return true
}

4.待特殊处理路由配置表

/src/router/dynamicRouter.js
目的:获取特殊的meta信息

// 根据标识 找到对应的component(建议使用 markId 标识,而不是路径path,这样现场可以随意变动path名称和层级。只需要标识不变即可)
// 注意这里的路由component和markId,其实是和后端菜单配置表里的值一致;只不过这里都是处理特殊meta值用的export default [{path: "/abcd", // 此路径不用,使用动态路径name: "Abcd", // 此name不用,使用动态namemarkId: '/views/assetManagement/ipManagement/mainSiteManagement/mainSiteAddressApplication/index', // 这里就是后端菜单配置表里的标识 值 即component路径meta: { title: "菜单标题", inlayout: false, needAside: false }, // 目的获取特殊的meta信息component: () => import("@/views/assetManagement/ipManagement/mainSiteManagement/mainSiteAddressApplication/index.vue")},
]

5.404类路由

/src/router/routes404.js
注意:404类的路由也要使用动态路由方式添加,而且必须在其他的动态路由添加后再添加404类路由;否则可能导致退出后切换别的角色登录或刷新时候动态路由直接到404页面

const constantRoutes = [{path: "/404",name: "404",component: () => import("@/views/common/404.vue"),meta: {title: "404",inlayout: false}},{path: "/403",name: "403",component: () => import("@/views/common/403.vue"),meta: {title: "403",inlayout: false}},{path: "/:pathMatch(.*)",name: "error",redirect: "/404",meta: {title: "错误",inlayout: false}}
]
export default constantRoutes

6.删除动态路由

/src/utils/routeManager.js
目的:退出时候删除动态路由;否则切换个角色登录会导致直接到404页

// 新增清除动态路由方法
export const resetDynamicRoutes = (router) => {// 清除所有动态路由router.getRoutes().forEach(route => {if (route.meta?.isDynamic) {router.removeRoute(route.name)}})// 清除404路由(根据实际情况调整)// router.removeRoute('error')// router.removeRoute('404')// router.removeRoute('403')
}

相关文章:

vue3实现动态路由

文章目录 一、基础信息1.路由构成2.菜单配置表3.vue-router4方法 二、实现思路1.登录获取菜单配置表2.导航守卫3.添加动态路由4.渲染菜单5.退出登录删除动态路由 三、实现代码1.路由守卫2.基础路由文件3.添加动态路由逻辑4.待特殊处理路由配置表5.404类路由6.删除动态路由 场景…...

行为型设计模式

深入理解行为型设计模式&#xff1a;模板方法、观察者、责任链 设计模式是软件开发中解决常见问题的经典方案&#xff0c;而行为型设计模式尤其关注对象之间的职责分配与通信方式。本文将详细讲解模板方法模式、观察者模式和责任链模式。 一、模板方法模式&#xff08;Templat…...

【服务器环境安装指南-指定 cuda 版本】在 Ubuntu 22.04 上完成 cuda-toolkit 12.0 和 cudnn 12.x 的安装教程

0.引言 在深度学习和高性能计算领域&#xff0c;CUDA 和 cuDNN 是不可或缺的工具。为充分发挥硬件性能&#xff0c;我们需要在服务器环境中正确配置这些工具。然而&#xff0c;安装过程中可能会遇到诸多挑战&#xff0c;例如版本兼容性和环境变量设置等问题。本篇文章将以 Ubu…...

蓝桥杯第十届 数的分解

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 把 2019 分解成 3 个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包含数字 2 和 4&#xff0c;一共有多少种不同的分解方法&#xff1f; 注意交换 3 个…...

二叉搜索树

目录 概念 代码实现 成员 基本结构 查找 插入 删除 中序遍历 拷贝构造 赋值运算符重载 析构函数 递归实现 递归实现查找 递归实现插入 递归实现删除 概念 关于二叉树的基本结构已经进行过详细剖析&#xff0c;本篇博客将对一种特殊的二叉树进行分析。 二叉树&…...

Linux多线程详解

Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…...

攻防世界-web-1

Training-WWW-Robots 在URL后面加上/robots.txt 直接在URL后面添加/fl0g.php PHP2 他问我能不能登录这个网站&#xff0c;又因为考察php内容&#xff0c;在URL后面添加/index.php&#xff0c;无任何回显 试试/index.phps 分析一下代码&#xff0c;发现要用get方式上传idadmin,…...

笔记本+移动端维修全套教程

今天分享的是笔记本移动端维修全套教程&#xff08;免费视频资料大全&#xff09; 当自己手机或者电脑坏了&#xff0c;很多人都会想着去维修店铺修&#xff0c;但价格不透明&#xff0c;容易被坑&#xff0c;当自己了解一些之后&#xff0c;即使不会修&#xff0c;也可以对手…...

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…...

【STM32】GPIO

目录 1、什么是GPIO2、什么是GPIO组3、GPIO的基本结构4、GPIO位结构5、GPIO八种工作模式6、GPIO相关寄存器1. 端口配置低寄存器GPIO[x]_CRL和端口配置高寄存器GPIO[x]_CRH, Config Register High和Config Register Low)2. 端口输入数据寄存器(GPIO[x]_IDR)3. 端口输出数据寄存器…...

鸿蒙移动应用开发--UI组件布局

实验要求&#xff1a; 制作一个B站视频卡片界面&#xff0c;大致如下图所示&#xff0c;要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 &#xff1a;DevEco Studio 实验过程&#xff1a; 步骤1&#xff1a;创建项目 1. 在您的开发环境…...

[MySQL]MySQL数据库基础知识与操作

MySQL基础知识 为什么要有数据库&#xff1f; 文件存储的缺点 1.没有以某种特定的数据格式存储数据&#xff0c;查找不方便&#xff0c;只能遍历2.安全性&#xff1a;数据误操作后不能回滚3.每次操作数据都要用户自己操作4.数据量大的时候&#xff0c;操作的成本很高 创建一…...

卡诺图化简法的原理

引子 若两个最小项只有一个因子不同&#xff0c;则称这两个最小项具有相邻性。 例如&#xff0c; A ′ B C ′ ABC A′BC′和 A B C ABC ABC两个最小项仅第一个因子不同&#xff0c;所以它们具有相邻性。这两个最小项相加时定能合并成一项并将一对不同的因子消去 A ′ B C ′…...

从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南

本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具&#xff08;一款跨平台、命令行驱动的烧录利器&#xff09;&#xff0c;通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤&#xff0c;帮助用户实现Air780E…...

探秘Transformer系列之(18)--- FlashAttention

探秘Transformer系列之&#xff08;18&#xff09;— FlashAttention 文章目录 0x00 概述0.1 问题0.2 其它解决方案0.3 Flash Attention 0x01 背景知识1.1 GPU相关概念硬件概念运行单元内存 软件概念运行模式线程模型Grid & DeviceBlock & SMThread & SPThread &am…...

VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…...

Android面试总结之Android RecyclerView:从基础机制到缓存优化

引言 在 Android 开发中&#xff0c;RecyclerView是高效展示列表数据的核心组件。其强大的性能源于独特的视图复用机制和四级缓存体系。本文将结合源码与示例&#xff0c;带你深入理解RecyclerView的工作原理与优化策略。 核心组件 RecyclerView&#xff1a;作为容器视图&am…...

【C#语言】C#文件操作实战:动态路径处理与安全写入

文章目录 ⭐前言⭐一、场景痛点⭐二、完整实现代码⭐三、关键技术解析&#x1f31f;1、动态路径处理&#x1f31f;2、智能目录创建&#x1f31f;3、安全的文件写入 ⭐四、进阶扩展方案&#x1f31f;1、用户自定义路径选择&#x1f31f;2、异常处理增强&#x1f31f;3、异步写入…...

react中 useEffect和useLayoutEffect的区别

useEffect 和 useLayoutEffect 都是 React 中用于处理副作用的 Hook&#xff0c;但它们在执行时机和用途上有一些关键区别。理解这些区别可以帮助你更好地选择适合的 Hook 来实现特定的功能。 1. 执行时机 useEffect&#xff1a; 异步执行&#xff1a;useEffect 是在组件渲染完…...

TDengine 中的系统信息统计

简介 TDengine 3.0 版本开始提供一个内置数据库 performance_schema&#xff0c;Performance_Schema 数据库中存储了系统中的各种统计信息&#xff0c;包括存储及性能有关统计数据。本节详细介绍其中的表和表结构。 PERF_APP 提供接入集群的应用&#xff08;客户端&#xff…...

C++可变参数

可变参数C风格的可变参数C风格可变参数的使用 C11可变参数模板递归展开参数包参数列表展开折叠表达式 STL中的emplace插入接口 可变参数 C风格的可变参数 可变参数是一种语言特性&#xff0c;可以在函数声明中使用省略号...来表示函数接受可变数量的参数。 例如典型的printf…...

建造者模式 (Builder Pattern)

建造者模式 (Builder Pattern) 是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 一、基础 1.1 意图 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 1.2 适用场景 当创建复杂对象的算法应该…...

Thales靶机攻略

1.下载导入VBox&#xff0c;并启动靶机 靶机地址&#xff1a;https://download.vulnhub.com/thales/Thales.zip 解压后&#xff0c;在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成&#xff0c;设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...

【redis】哨兵:搭建主从/哨兵节点详解和细节

文章目录 编排步骤搭建主从节点创建容器启动容器 搭建哨兵节点创建容器哨兵节点配置文件配置节点启动容器 主从/哨兵节点连入同一个局域网 编排步骤 分为两组 yml&#xff0c;先后启动 我们其实也可以用于一个 yml 文件&#xff0c;直接启动 6 个容器&#xff0c;但是&#x…...

零基础上手Python数据分析 (9):DataFrame 数据读取与写入 - 让数据自由穿梭

回顾一下,上篇博客我们学习了 Pandas 的核心数据结构 Series 和 DataFrame。 DataFrame 作为 Pandas 的 “王牌” 数据结构,是进行数据分析的基石。 但 DataFrame 的强大功能,还需要建立在 数据输入 (Input) 和 数据输出 (Output) 的基础上。 数据从哪里来? 分析结果又如何…...

Emacs 折腾日记(十九)——配置输入法和vim操作方式

上一篇文章中&#xff0c;我们将Emacs变得稍微好看了点。换成了自己喜欢的主题和颜色&#xff0c;这样每天用起来也比较养眼&#xff0c;不会特别排斥。本篇文章的主要任务就是配置输入法方便输入中文以及将vim的操作模式搬到Emacs中。进一步提到Emacs的可用性 配置中文输入法…...

Docker 镜像构建与优化

一、Dockerfile 构建镜像 1.1.拉取所需镜像 首先 docker pull 拉取一个 centos7 的镜像。 docker pull centos:7 下载 nginx 源码包。 官网&#xff1a;nginx: download wget https://nginx.org/download/nginx-1.26.3.tar.gz 1.2.解决 CentOS 7 安装源问题 因为原本的 …...

Mininet--moduledeps.py源码解析

整体构架概述 1. What is it moduledeps.py是Mininet网络模拟框架的模块依赖管理工具&#xff0c;用于动态管理Linux内核模块&#xff08;如Open vSwitch、TUN/TAP&#xff09;和验证系统环境。其核心目的是确保Mininet运行所需的底层模块和可执行文件已正确加载或存在&#…...

JAVA EE_多线程-初阶(一)

1.认识线程 1.1概念 1&#xff09;线程是什么 线程是在进程内部中进行运行的&#xff0c;可以把它想成一个“执行流“&#xff0c;每个线程负责执行线程内的部分代码&#xff0c;多个线程之间可以”同时“执行多个代码。 “同时”&#xff1a;指并行&#xff0c;采用分时复用…...

批量优化与压缩 PPT,减少 PPT 文件的大小

我们经常能够看到有些 PPT 文档明明没有多少内容&#xff0c;但是却占用了很大的空间&#xff0c;存储和传输非常的不方便&#xff0c;这时候通常是因为我们插入了一些图片/字体等资源文件&#xff0c;这些都可能会导致我们的 PPT 文档变得非常的庞大&#xff0c;今天就给大家介…...

AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道

文章目录 一、啥是 AI 的 Hallucination&#xff1f;二、啥时候容易出现幻觉&#xff1f;1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现&#xff1f;原理是啥&#xff1f;1. 概率预测的本质2. 训练…...

加载huggingface数据集报token无效错误解决方案

加载huggingface数据集报错 import pandas as pddf pd.read_json("hf://datasets/udell-lab/NLP4LP/data/test.jsonl", linesTrue) print(df)PS C:\Users\pengkangzhen\PythonProjects\llm-ecr> & C:/Users/pengkangzhen/.conda/envs/py3.12_ml/python.exe …...

Java面试题及知识点Day1

自动拆箱和自动装箱 装箱就是自动将基本数据类型转换为包装器类型 拆箱就是自动将包装其类型转化为基本数据类型 重写和重载 重写 1.发生在子类和父类之间 2.参数的方法名&#xff0c;参数&#xff0c;返回值&#xff0c;必须相同 3.权限修饰符不能小于重写方法的权限修饰符…...

【动态规划】-- 三步问题(easy)

文章目录 1. 题目2. 题目解析3. 代码 1. 题目 在线oj 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有 n 阶台阶&#xff0c;小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模 1000000007。…...

字符流Reader/Writer

一、Reader相关介绍及其子类 Reader是所有字符输入流的超类。它提供了读取字符流的基本方法&#xff0c;如read(), read(char[] cbuf, int off, int len)等&#xff1b;由于Reader是抽象类&#xff0c;通常使用它的子类如FileReader, BufferedReader等来创建字符输入流对象。 …...

字符串交替合并问题

问题&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&#xff1a; 输入&#xff1a;w…...

shell脚本一键安装docker+docker-compose,支持x86_64、arm64双架构

目录 脚本内容 运行效果 安装包和脚本 脚本内容 [roottest1 docker]# cat install.sh #!/bin/bash set -e export pathpwd export docker_data"/data/docker_data"function check_arch() {if [ -f /etc/redhat-release ]; thenOS"RedHat"elif [ -f /e…...

Elasticsearch 面试备战指南

Elasticsearch 面试备战指南 一、基础概念 什么是Elasticsearch&#xff1f; Elasticsearch是一个基于Lucene的分布式搜索和分析引擎&#xff0c;提供近实时搜索、高可用性和水平扩展能力。常用于日志分析&#xff08;ELK&#xff09;、全文检索、商业智能等场景。 Elasticsea…...

新手村:逻辑回归-理解04:熵是什么?

新手村&#xff1a;逻辑回归04&#xff1a;熵是什么? 熵是什么? 前置条件 在开始学习逻辑回归中的熵理论之前&#xff0c;需要掌握以下基础知识&#xff1a; 概率论与统计学&#xff1a; 概率分布&#xff08;如伯努利分布、正态分布&#xff09;。条件概率和贝叶斯定理。期…...

Javaweb后端登录会话技术jwt令牌

jwt生成与校验 是base4补位的 最后面是签名&#xff0c;签名不是base64&#xff0c;是通过签名算法加密后来的 令牌长度不是固定的&#xff0c;长度取决于原始内容&#xff0c;载荷&#xff0c;大小 头有&#xff0c;类型&#xff0c;签名算法 base64可以对任意的二进制数据进…...

图像对比分析并生成报告

pip install pyautogui """ 图像对比分析工具 功能&#xff1a;实现像素级差异、结构相似性(SSIM)、直方图相似度和特征匹配率四种对比方法 作者&#xff1a;智能助手 版本&#xff1a;1.2 日期&#xff1a;2025-02-27""" import os import cv2 …...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例1,TableView16_01.vue 基础行拖拽排序示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例1,TableView16_01.vu…...

vue-如何将组件内容作为图片生成-html2canvas

1.引入必要的库 这里呢我们使用 html2canvas 库来将 HTML 元素转换为画布&#xff08;canvas&#xff09;&#xff0c;然后再将其导出为图片。首先&#xff0c;确保在项目中安装了 html2canvas&#xff1a; npm install html2canvas 2. 组件结构 然后在我们的vue文件里面&a…...

单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结

RAM 与 内存 RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 和 内存 这两个术语通常是 同义词&#xff0c;即 内存 常常指的就是 RAM。 1. RAM&#xff08;内存&#xff09; 定义&#xff1a;RAM 是计算机中的 主存储器&#xff0c;用于临时存…...

Linux 练习一 NFS和DNS

练习四 任务需求&#xff1a;客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#…...

aab 转 apk

googleplay发布的游戏对外前&#xff0c;测试同学要安装到手机上先行测试&#xff0c;所以就有了这个需求。网上找了一篇文章讲的很详细了&#xff0c;文档是英语的&#xff0c;这里摘抄重要的部分做下记录&#xff1a; https://www.geekdashboard.com/extract-apk-files-from…...

JAVA开发:实例成员与静态成员

判断Java中的实例成员与静态成员 在Java中&#xff0c;可以通过以下几种方式判断一个成员是实例成员还是静态成员&#xff1a; 1. 通过声明方式判断 静态成员使用static关键字修饰&#xff0c;实例成员不使用&#xff1a; public class MyClass {// 实例成员int instanceVa…...

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…...

[项目]基于FreeRTOS的STM32四轴飞行器: 十二.角速度加速度滤波

基于FreeRTOS的STM32四轴飞行器: 十二.滤波 一.滤波介绍二.对角速度进行一阶低通滤波三.对加速度进行卡尔曼滤波 一.滤波介绍 模拟信号滤波&#xff1a; 最常用的滤波方法可以在信号和地之间并联一个电容&#xff0c;因为电容通交隔直&#xff0c;信号突变会给电容充电&#x…...

《基于SpringBoot的图书网购平台的设计与实现》开题报告

个人主页&#xff1a;大数据蟒行探索者 一、选题的依据及意义 1.1选题来源 市场需求驱动&#xff1a;如今&#xff0c;互联网深度融入人们生活&#xff0c;阅读场景愈发多元化&#xff0c;线上购书成为主流趋势之一。读者期望随时随地浏览海量图书资源&#xff0c;对比价格…...