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

vue-router查漏补缺

一、动态路由匹配

1.带参数的动态路由匹配
import User from './User.vue'// 这些都会传递给 `createRouter`
const routes = [// 动态字段以冒号开始{ path: '/users/:efg', component: User },
]

这种方式的路由会匹配到/users/abc或者/users/123,路径参数用冒号:表示,并且将值abc放在route.params里面

//当前路由/users/abc
import {useRoute} from "vue-router";
const route = useRoute();
console.log(route.params,"route");  // {efg:abc}

注意: 这种路径匹配不上 /users/abc/name,需要把path修改为/users/:efg/name

const routes = [// 动态字段以冒号开始{ path: '/users/:efg/name', component: User },  //这样能匹配上,
]
console.log(route.params,"route");  //{efg:abc}
//或者下面这种写法====================================================================
const routes = [// 动态字段以冒号开始{ path: '/users/:efg/:hhh', component: User },  //这样能匹配上,
]
console.log(route.params,"route");  //{efg:abc,hhh:name}

具体匹配规则

匹配模式匹配路径route.params
/users/:username/users/eduardo{ username: ‘eduardo’ }
/users/:username/posts/:postId/users/eduardo/posts/123{ username: ‘eduardo’, postId: ‘123’ }
/users-:id(.*)/users-/123{ id: ‘123’ }

需要注意的是,如果路由从/users/abc变到/users/123,因为都是用的同一个component,所以会重复使用,并不会销毁,这就会导致页面不会重新创建,不会触发生命周期钩子,也获取不到最新的route.params,需使用下面的方法来解决

<script setup>
import { watch } from 'vue'
import { useRoute } from 'vue-router'const route = useRoute()watch(() => route.params.id, (newId, oldId) => {// 对路由变化做出响应...
})
</script>

也可以使用beforeRouteUpdate导航守卫

<script setup>
import { onBeforeRouteUpdate } from 'vue-router'
// ...onBeforeRouteUpdate(async (to, from) => {// 对路由变化做出响应...userData.value = await fetchUser(to.params.id)
})
</script>
2.捕获所有路由或 404 Not found 路由

常规参数只匹配url片段之间的字符,用/分隔。如果我们想匹配任意路径,我们可以使用自定义的路径参数正则表达式,在路径参数后面的括号中加入 正则表达式

const routes = [// 将匹配所有内容并将其放在 `route.params.pathMatch` 下{ path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },// 将匹配以 `/user-` 开头的所有内容,并将其放在 `route.params.afterUser` 下{ path: '/user-:afterUser(.*)', component: UserGeneric },
]

注意: 这种匹配方式的优先级最低,优先级高低为 /test > /test/:id > /test:afterUser(.*)* > /:pathMatch(.*)*,就一句话,越精准的匹配上,优先级越高

二、路由的匹配语法

路由的匹配可以通过正则来更加灵活、精确的匹配

const routes = [// /:orderId -> 仅匹配数字{ path: '/:orderId(\\d+)' },// /:productName -> 匹配其他任何内容{ path: '/:productName' },
]
const routes = [// /:chapters ->  匹配 /one, /one/two, /one/two/three, 等{ path: '/:chapters+' },// /:chapters -> 匹配 /, /one, /one/two, /one/two/three, 等{ path: '/:chapters*' },
]

这个具体就看官网了,难得写了

1.Sensitive 与 strict 路由配置

默认情况下,所有路由是不区分大小写的,并且能匹配带有或不带有尾部斜线的路由。例如,路由/users将匹配 /users/users/、甚至 /Users/。这种行为可以通过strictsensitive选项来修改,它们既可以应用在整个全局路由上,又可以应用于当前路由上:

const router = createRouter({history: createWebHistory(),routes: [// 将匹配 /users/posva 而非:// - /users/posva/ 当 strict: true// - /Users/posva 当 sensitive: true{ path: '/users/:id', sensitive: true },// 将匹配 /users, /Users, 以及 /users/42 而非 /users/ 或 /users/42/{ path: '/users/:id?' },],strict: true, // 严格匹配,不允许带有尾部斜线sensitive: true, //区分大小写
})

三、嵌套路由

在子路由中的path加/和不加有很大的区别,以 /开头的嵌套路径将被视为根路径

  {path: "/test",name: "test",hidden: false,component: () => import("@/pages/test/test.vue"),children: [{//path: "center",  //path不加 / ,将匹配到http://localhost:9527/#/test/centerpath: "/center",  //path加 /,将匹配到http://localhost:9527/#/centername: "center",component: () => import("@/pages/center/center.vue"),},],},
1.忽略父组件(4.1+版本)
const routes = [{path: "/test",name: "test",hidden: false,// component: () => import("@/pages/test/test.vue"),children: [{path: "center",name: "center",component: () => import("@/pages/center/center.vue"),},],},
]

由于父级没有指定路由组件,顶级<router-view>将跳过父级并仅使用子路由组件。
在这里插入图片描述

  {path: "/test",name: "test",hidden: false,component: () => import("@/pages/test/test.vue"),children: [{path: "center",name: "center",component: () => import("@/pages/center/center.vue"),},],},

在这里插入图片描述

四、命名路由

当创建一个路由时,可以选择给路由一个name

const routes = [{path: '/user/:username',name: 'user', component: User}
]

这个路由name在整个路由中是唯一的,可以通过router.push({ name: 'user', params: { username: 'erina' } })这种方式来进行路由跳转,将创建一个指向 /user/erina的链接。可以通过route.params来获取参数,使用name有很多优点:

  • 没有硬编码的 URL
  • params的自动编码/解码
  • 防止你在 URL 中出现打字错误
  • 不用关心路由嵌套,就算是100层也能直接使用name来直接定位

命名路由通过params来传递参数,一定要使用动态路由,这样才能获取到传递的参数

### 五、命名视图
有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上用场了。可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果`router-view`没有设置名字,那么默认为 default```html
<router-view class="view left-sidebar" name="LeftSidebar" />
<router-view class="view main-content" />
<router-view class="view right-sidebar" name="RightSidebar" />
const router = createRouter({history: createWebHashHistory(),routes: [{path: '/',components: {default: Home,// LeftSidebar: LeftSidebar 的缩写LeftSidebar,// 它们与 `<router-view>` 上的 `name` 属性匹配RightSidebar,},},],
})

六、别名

重定向是指当用户访问 /home 时,URL 会被 / 替换,然后匹配成 /。那么什么是别名呢?

/别名为/home,意味着当用户访问/home 时,URL 仍然是 /home,但会被渲染/的内容。

const routes = [{path: '/users',component: UsersLayout,children: [// 为这 3 个 URL 呈现 UserList// - /users// - /users/list// - /people{ path: '', component: UserList, alias: ['/people', 'list'] },],},
]

如果路由有参数,请确保在任何绝对别名中包含它们:

const routes = [{path: '/users/:id',component: UsersByIdLayout,children: [// 为这 3 个 URL 呈现 UserDetails// - /users/24// - /users/24/profile// - /24{ path: 'profile', component: UserDetails, alias: ['/:id', ''] },],},
]

注意 如果别名和另一个路由path相同,谁在前面谁显示

const routes = [{path: "/homePage",name: "homePage",alias: "/webgpu",  //就算下面有/webgpu的路由,一样会渲染/homePage的内容component: () => import("@/pages/home/children/homePage.vue"),},{path: "/webgpu",name: "webgpu",component: () => import("@/pages/home/children/webgpu.vue"),},
]

七、路由组件传参

props设置为true时,route.params将被设置为组件的props

const routes = [{ path: '/user/:id', component: User, props: true }
]

路由为/user/123456

<!-- User.vue -->
<script setup>
defineProps({id: String   //值为123456
})
</script><template><div>User {{ id }}</div>
</template>

props是一个对象时,它将原样设置为组件props。当 props 是静态的时候很有用。

const routes = [{ path: '/user/:id', component: User, props: {username:"admin"}}
]

可以创建一个返回props的函数。这允许你将参数转换为其他类型,将静态值与基于路由的值相结合等等。

const routes = [{path: '/search',component: SearchUser,props: route => ({ abc: "13456" })}
]

全局传参

<RouterView v-slot="{ Component }"><component:is="Component"view-prop="value"/>
</RouterView>

这样每一个路由组件都能获取到view-prop参数

八、路由守卫

1. 全局路由前置守卫
const router = createRouter({ ... })router.beforeEach((to, from) => {//通过一个路由地址重定向到一个不同的地址,如同调用 router.push(),且可以传入诸如 replace: true 或 name: 'home' 之类的选项。它会中断当前的导航,同时用相同的 from 创建一个新导航。//  return { name: 'Login' } //返回true或者返回undefine来调用下一个守卫//return true// 返回 false 以取消导航return false
})

如果遇到了意料之外的情况,可能会抛出一个Error。这会取消导航并且调用router.onError()注册过的回调

2. 全局解析守卫

你可以用router.beforeResolve注册一个全局守卫。这和router.beforeEach类似,因为它在每次导航时都会触发,不同的是,解析守卫刚好会在导航被确认之前、所有组件内守卫和异步路由组件被解析之后调用

router.beforeResolve((to,from) =>{console.log(to,from,"beforeResolve");
});
3. 在守卫内的全局注入

从 Vue 3.3 开始,你可以在导航守卫内使用inject()方法

// main.ts
const app = createApp(App)
app.provide('global', 'hello injections')// router.ts or main.ts
router.beforeEach((to, from) => {const global = inject('global') // 'hello injections'// a pinia storeconst userStore = useAuthStore()// ...
})
4. 路由独享的守卫

beforeEnter守卫 只在进入路由时触发,不会在 params、query 或 hash 改变时触发。例如,从 /users/2 进入到 /users/3 或者从 /users/2#info 进入到 /users/2#projects。它们只有在 从一个不同的 路由导航时,才会被触发。

function removeQueryParams(to) {if (Object.keys(to.query).length)return { path: to.path, query: {}, hash: to.hash }
}function removeHash(to) {if (to.hash) return { path: to.path, query: to.query, hash: '' }
}const routes = [{path: '/users/:id',component: UserDetails,beforeEnter: [removeQueryParams, removeHash],},{path: '/about',component: UserDetails,beforeEnter: [removeQueryParams],},
]

当配合嵌套路由使用时,父路由和子路由都可以使用beforeEnter。如果放在父级路由上,路由在具有相同父级的子路由之间移动时,它不会被触发。例如:

const routes = [{path: '/user',beforeEnter() {// ...},children: [{ path: 'list', component: UserList },{ path: 'details', component: UserDetails },],},
]

示例中的 beforeEnter 在 /user/list /user/details 之间移动时不会被调用,因为它们共享相同的父级路由。如果我们直接将 beforeEnter 守卫放在details路由上,那么在这两个路由之间移动时就会被调用。

5. 完整的导航解析流程
  • 导航被触发。
  • 在失活的组件里调用 beforeRouteLeave 守卫。
  • 调用全局的 beforeEach 守卫。
  • 在重用的组件里调用 beforeRouteUpdate 守卫(2.2+)。
  • 在路由配置里调用 beforeEnter。
  • 解析异步路由组件。
  • 在被激活的组件里调用 beforeRouteEnter。
  • 调用全局的 beforeResolve 守卫(2.5+)。
  • 导航被确认。
  • 调用全局的 afterEach 钩子。
  • 触发 DOM 更新。
  • 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

九、RouterView 插槽

RotuerView 组件暴露了一个插槽,可以用来渲染路由组件:

<router-view v-slot="{ Component }"><keep-alive><component :is="Component" /></keep-alive>
</router-view>

十、滚动行为

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。
注意: 这个功能只在支持 history.pushState 的浏览器中可用。

const router = createRouter({history: createWebHashHistory(),routes: [...],scrollBehavior (to, from, savedPosition) {return {top:10,behavior: 'smooth',  //让滚动更平滑,不是直接跳到这个位置,而是慢慢滚动到这个位置}// return 期望滚动到哪个的位置}
})

也可以通过 el 传递一个 CSS 选择器或一个 DOM 元素。在这种情况下,top 和 left 将被视为该元素的相对偏移量

const router = createRouter({scrollBehavior(to, from, savedPosition) {// 始终在元素 #main 上方滚动 10pxreturn {// 也可以这么写// el: document.getElementById('main'),el: '#main',// 在元素上 10 像素top: 10,}},
})

十一、导航故障

当使用router-link组件时,Vue Router会自动调用router.push来触发一次导航。虽然大多数链接的预期行为是将用户导航到一个新页面,但也有少数情况下用户将留在同一页面上:

  • 用户已经位于他们正在尝试导航到的页面
  • 一个导航守卫通过调用return false中断了这次导航
  • 当前的导航守卫还没有完成时,一个新的导航守卫会出现了
  • 一个导航守卫通过返回一个新的位置,重定向到其他地方 (例如,return ‘/login’)
  • 一个导航守卫抛出了一个Error

注意:导航是异步的
如果导航被阻止,导致用户停留在同一个页面上,由router.push返回的Promise的解析值将是Navigation Failure。否则,它将是一个falsy值(通常是undefined)。这样我们就可以区分我们导航是否离开了当前位置:

const navigationResult = await router.push('/my-profile')if (navigationResult) {// 导航被阻止
} else {// 导航成功 (包括重新导航的情况)this.isMenuOpen = false
}

Navigation Failure 是带有一些额外属性的Error实例,这些属性为我们提供了足够的信息,让我们知道哪些导航被阻止了以及为什么被阻止了。要检查导航结果的性质,请使用isNavigationFailure函数:

import { NavigationFailureType, isNavigationFailure } from 'vue-router'// 试图离开未保存的编辑文本界面
const failure = await router.push('/articles/2')if (isNavigationFailure(failure, NavigationFailureType.aborted)) {// 给用户显示一个小通知showToast('You have unsaved changes, discard and leave anyway?')
}

NavigationFailureType有三种值

  • aborted:在导航守卫中返回false中断了本次导航。
  • cancelled: 在当前导航完成之前又有了一个新的导航。比如,在等待导航守卫的过程中又调用了router.push
  • duplicated:导航被阻止,因为我们已经在目标位置了。

十二、动态路由

router.addRoute({ name: 'admin', path: '/admin', component: Admin })
router.addRoute('admin', { path: 'settings', component: AdminSettings })

动态添加路由有两种方式,上面的第一种是直接添加在最顶级路由,第二种方式传入一个路由的name,可以把第二个参数的路由放在它的children属性中,用于添加嵌套路由,相当于

router.addRoute({name: 'admin',path: '/admin',component: Admin,children: [{ path: 'settings', component: AdminSettings }],
})

相关文章:

vue-router查漏补缺

一、动态路由匹配 1.带参数的动态路由匹配 import User from ./User.vue// 这些都会传递给 createRouter const routes [// 动态字段以冒号开始{ path: /users/:efg, component: User }, ]这种方式的路由会匹配到/users/abc或者/users/123,路径参数用冒号:表示&#xff0c;并…...

使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作

使用Flink CDC实现 Oracle数据库数据同步的oracle配置操作&#xff0c;包括开启日志归档和用户授权。 flink官方参考资料&#xff1a; https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/oracle-cdc/ 操作步骤&#xff1a; 1.启用…...

mqtt.js 客户端封装

mqtt.js 客户端封装 没封装前使用 const client mqtt.connect(ws://10.10.20.9:9001) onMounted(() > {const topicList []const channelCount 12for(let i 0; i < channelCount; i) {topicList.push(/test/sendImage${i 1})}client.on(connect, () > {console…...

www.aws.training网站的账户密码如何修改

www.aws.training网站的账户密码如何修改 参加aws考试后, 账号密码如何修改呢? 是不是找了好久都找不到. 右上角, 我的账户, 点击注销. 然后会跳到页面: 点击那个网址链接, 进入新的页面,点安全: 右上角: 更改密码. 按提示来就好....

使用Python实现高性能数据存储

在数据驱动的时代&#xff0c;处理和存储海量数据已成为关键需求。高性能数据存储不仅能够确保数据的快速读写&#xff0c;还能提升系统的整体性能。Python作为一种灵活且功能强大的编程语言&#xff0c;提供了多种高效的数据存储解决方案。本文将详细介绍如何使用Python实现高…...

[已解决]nvm安装node.js 报错 拒绝访问此应用无法在你电脑上运行

报错如下&#xff1a; 出错背景&#xff1a; 心血来潮把node删掉重新安装&#xff0c;想用nvm来进行管理node 出错原因&#xff1a; npm下载失败、下载不完整 不完整的npm展示&#xff1a; 出错根本原因&#xff1a; 可能因为镜像源或者网络波动&#xff0c;导致node下载…...

图文检索(36):Decomposing Semantic Shifts for Composed Image Retrieval

Decomposing Semantic Shifts for Composed Image Retrieval 摘要方法3.1 前期准备3.2 视觉语言表示3.3 降级过程3.4 升级过程3.5 训练和推理 结论 发布时间&#xff08;2024 AAAI&#xff09; 标题&#xff1a;分解语义转换以实现组合图像检索 摘要 语义转换网络 (SSN)&…...

批量计算(Batch Processing)

批量计算&#xff08;Batch Processing&#xff09;是一种数据处理方式&#xff0c;指的是将大量任务或数据分批次进行处理&#xff0c;而不是实时处理每一个任务。这种处理方式通常在任务之间没有依赖关系时使用&#xff0c;可以大大提高计算效率和资源利用率。批量计算广泛应…...

Linux yum-config-manager命令异常

错误信息 使用 yum-config-manager命令时错误信息如下 sudo yum-config-manager \ > --add-repo \ > https://download.docker.com/linux/centos/docker-ce.repo sudo: yum-config-manager: command not found 解决办法 第一步&#xff1a; sudo yum -y install yum-u…...

【C++】关联存储结构容器-set(集合)详解

目录 一、基本概念 二、内部实现 三、常用操作 3.1 构造函数 3.2 插入操作 3.3 删除操作 3.4 查找操作 3.5 访问元素 3.6 容量操作 3.7 交换操作 四、特性 五、应用场景 结语 一、基本概念 set是C标准模板库&#xff08;STL&#xff09;中的一种关联容器&#xf…...

如何利用SPSS软件进行多组间显著性检验以abcd显示

1.SPSS软件中进行多组间的显著性检验 要在SPSS软件中进行多组间的显著性检验&#xff0c;并以abcd显示结果&#xff0c;你可以按照以下步骤操作&#xff1a; 数据准备&#xff1a; 确保你的数据已经正确输入SPSS&#xff0c;其中每行代表一个观测值&#xff0c;包含至少两列&a…...

C++ 之计时函数总结

C 之计时函数总结 总结Windows下C开发时的计时实现 1. clock() #include <time.h>   //引入头文件void main() {clock_t start, end;start clock();fun(); //需计时的函数end clock(); float t_cfloat(end-start)/CLOCKS_PER_SEC;cout << "func cos…...

仿dota2渲染--shader常见贴图含义(直观展示)

Properties {[Header(Texture)]_MainTex ("RGB:颜色 A:透贴", 2D) "white"{}_NormTex ("RGB:法线贴图", 2D) "bump" {}_MaskTex ("R:高光强度 G:边缘光强度 B:高光染色 A:高光次幂…...

NoSQL大数据存储技术测试(5)MongoDB的原理和使用

单项选择题 第1题 关于 MongoDB 集群部署下面说法不正确的是&#xff08;&#xff09; 已经不使用主从复制的模式 在实际应用场景中&#xff0c; Mongodb 集群结合复制集和分片机制 MongoDB 支持自动分片&#xff0c; 不支持手动切分 &#xff08;我的答案&#xff09; 每…...

视图、转发与重定向、静态资源处理

目录 视图 默认视图 视图机制原理 自定义视图 请求转发与重定向 静态资源处理 视图 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性 可以通过 order 属性指定解析器的优先顺序&#xff0c;order 越小优先级越高 默认是最低优先级&#xff0c;Integer.MAX_…...

ThinkPHP 5.1 的模板布局功能

ThinkPHP 5.1 的模板布局功能&#xff0c;包括全局配置、模板标签以及动态方法布局三种方式。以下是对这三种方式的要点概括和补充&#xff0c;以便于更好地理解和使用&#xff1a; 方式一&#xff1a;全局配置方式 适用于全站使用相同布局的情况&#xff0c;配置简单且统一。…...

入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…...

Redis Cluster 分片机制

Redis 集群是 Redis 提供的一种分布式实现&#xff0c;用于水平扩展数据存储能力。通过 Redis 集群&#xff0c;可以将数据分片存储在多个 Redis 节点上&#xff0c;同时提供高可用性和故障转移功能。 分片&#xff08;Sharding&#xff09;&#xff1a; Redis 集群将数据划分…...

LightRAG测试BUG

错误一&#xff1a; LightRAG无法回答错误&#xff1a; INFO:lightrag:kw_prompt result:{{"high_level_keywords": ["xxx", "xxx"],"low_level_keywords": ["xxx", "xxx", "xxx"] }} JSON parsing e…...

关于手柄摇杆的连线

由于时间实在是太久远了&#xff0c;我也忘记具体的连线了&#xff0c;只能提供当时的连线图片。...

运算符优先级和,|| 的介绍

运算符优先级 关系运算的优先级高于逻辑运算&#xff0c;所以需要加上小括号来改变 更详细的运算符优先级可以去MATLAB官网看 &运算的优先级高于|优先级&#xff1a; &&&#xff0c;|| 的介绍 我们知道&#xff0c;&运算时&#xff0c;若第一个为 0 0 0&…...

Excel的文件导入遇到大文件时

Excel的文件导入向导如何把已导入数据排除 入起始行&#xff0c;选择从哪一行开始导入。 比如&#xff0c;前两行已经导入了&#xff0c;第二次导入的时候排除前两行&#xff0c;从第三行开始&#xff0c;就将导入起始行设置为3即可&#xff0c;且不勾选含标题行。 但遇到大文…...

SQL Having用法

拿个业务场景说这个案例&#xff0c;比如我们有个表里面可能有批改过的数据&#xff0c;批改过得数据不会随着新批改的数据覆盖&#xff0c;而是逐条插入表中&#xff0c;如果想找出包含最早批改的数据和最新批改数据的话&#xff0c;那么我们就需要用到了havinng 用法,假设最开…...

【mysql优化 | 新增分区】

在同步其他系统的数据&#xff0c;大概每天有16w多&#xff0c;目前已经600多万条数据了&#xff0c;导致查询的时候特别慢。 因为是报表&#xff0c;而且是每天统计&#xff0c;所以我们可以按照日期进行分区。 ALTER TABLE table PARTITION BY RANGE (TO_DAYS(rsdate)) (PA…...

vue 组件之间的传值方式

一、父组件向子组件传值 父组件可以使用 props 将数据传递给子组件。 <!-- 父组件 --> <template><ChildComponent :message"parentMessage" /> </template><script> import ChildComponent from ./ChildComponent.vue;export defau…...

VScode执行任务

背景 在vscode 中 如果执行命令需要传递进来参数&#xff0c;那么直接通过命令行终端的方式不太方便。通过task 任务的方式来进行启动执行&#xff0c;降低反复输入参数等繁琐工作。 首先可以查看vscode 官方文档 task 启动 crtl shift p .vscode/task.json 示例 执行cp…...

以太网链路详情

文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…...

将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上&#xff0c;然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…...

若依集成Uflo2工作流引擎

文章目录 1. 创建子模块并添加依赖1.1 新建子模块 ruoyi-uflo1.2 引入 Uflo2 相关依赖 2. 配置相关 config2.1 配置 ServletConfig2.2 配置 UfloConfig2.3 配置 TestEnvironmentProvider 3. 引入Uflo配置文件4. 启动并访问 Uflo2 是由 BSTEK 自主研发的一款基于 Java 的轻量级工…...

CV(4)--边缘提取和相机模型

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 边缘提取&#xff08;涉及语义分割&#xff09;&#xff1a; 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分&#xff0c;暗到亮为正 求边缘的幅度&#xff1a;sobel&#xff0c;Canny算子 图像分高频分量和低…...

使用html 和javascript 实现微信界面功能2

1.功能说明&#xff1a; 对上一篇的基础上进行了稍稍改造 主要修改点&#xff1a; 搜索功能: 在搜索框后面增加了搜索按钮。 搜索按钮调用performSearch函数来执行搜索操作。 表单形式的功能: 上传文件: 修改为表单形式&#xff0c;允许用户通过文件输入控件选择文件并上传。 …...

音视频入门基础:MPEG2-TS专题(12)—— FFmpeg源码中,把各个transport packet组合成一个Section的实现

一、引言 从《音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;9&#xff09;——FFmpeg源码中&#xff0c;解码TS Header的实现》可以知道&#xff1a;FFmpeg源码中使用handle_packet函数来处理一个transport packet&#xff08;TS包&#xff09;&#xff0c;该函数的前半…...

数据结构Day一

1.思维导图 2.顺序表的创建 seq.h #ifndef __SEQ_H__ #define __SEQ_H__#define max 30 typedef int DataType; typedef struct {DataType data[max];int len; }seqList,*seqListPtr;seqListPtr seq_create();#endifseq.c #include <stdio.h> #include <stdlib.h&g…...

cpptoml介绍

cpptoml 是一个用于 C 的开源库&#xff0c;旨在提供对 TOML&#xff08;Toms Obvious, Minimal Language&#xff09;格式的支持。它允许开发者轻松地在 C 项目中读取、解析和生成 TOML 格式的配置文件。cpptoml 是一个轻量级、易于使用的库&#xff0c;适用于那些希望将 TOML…...

迭代器(转

package Scala4 //迭代器 object hd { def main(args: Array[String]): Unit { var li1 List(1, 2, 3, 4, 5, 6) //依次输出List的元素 //1.循环 //li1.foreach(println) //2.迭代器 //2.1创建一个迭代器&#xff08;iterator&#xff09; // val it1li1.iterator.take(3)/…...

鸿蒙元服务上架

鸿蒙元服务上架 一、将代码打包成 .app 文件1. 基本需求2. 生成密钥和证书请求文件3. 申请发布证书4. 申请发布Profile5. 配置签名信息6. 更新公钥指纹7. 打包项目成 .app 文件 二、发布元服务1. 进入应用信息页面2. 上传软件包3. 配置隐私协议4. 配置版本信息5. 提交审核&…...

查询三网话费余额接口,移动话费余额接口、电信话费余额接口、联通话费余额的接口+html前端查询UI界面

PHP是直接请求的接口&#xff0c;HTML代码也是直接请求的接口。如果HTML想上线运行&#xff0c;还是需要做下安全的。 下边是PHP代码 <?php // 定义API接口地址和参数 $apiUrl "https://api.taolale.com/api/Inquiry_Phone_Charges/get"; //API文档地址&…...

C#开发-集合使用和技巧(十)Union用法-并集

在 C# 中&#xff0c;IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素&#xff0c;确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法&#xff1a; 基本语法 public static IEnumerable<TSource> Union<TSource>(this…...

PyTorch 切片运算 (Slice Operator)

PyTorch 切片运算 {Slice Operator} 1. [:, -1, :]2. [:, [-1], :]References 1. [:, -1, :] https://github.com/karpathy/llama2.c/blob/master/model.py import torchlogits torch.arange(1, 16) print("logits.shape:", logits.shape) print("logits:\n&…...

leaflet 双屏对比

本章主要讲的是leaflet的双屏对比&#xff0c;本文参考了插件&#xff1a;Leaflet.Sync&#xff0c;我这里对原有的文件进行了重写&#xff0c;去掉了一部分不需要的内容&#xff0c;增加了flyTo和panTo方法&#xff0c;新的方法&#xff0c;如果需要可以自行下载资源。 目录 …...

渗透测试学习笔记(二)kali相关

一.kali 基础工具 NetCat -网络工具中的瑞士军刀&#xff1a;允许用户通过 TCP 或 UDP 协议发送和接收数据。WireShark-开源抓包软件TCPdump-命令行抓包分析工具 二. 被动信息收集 2.1 被动信息收集指从公开渠道获取信息&#xff0c;主要是已经公开的信息。 要点&#xff1…...

Python中的正交配对测试库:allpairspy

Python中的正交配对测试库&#xff1a;allpairspy 简介Python 中的 All-Pairs Testing 库安装 allpairspy使用 allpairspy 库的代码示例运行结果总结 简介 All-Pairs Testing (正交配对测试) 是一种广泛应用于软件测试中的组合测试方法&#xff0c;其核心思想是通过生成所有可…...

循序渐进kubenetes Service(Cluster ip、Nodeport、Loadbalancer)

文章目录 部署一个web服务Kubernetes Port ForwardKubernetes ServicesClusterIP ServiceNodePort ServiceLoadBalancer Service 部署一个web服务 准备 Kubernetes 集群后&#xff0c;创建一个名为 web 的新 namespace&#xff0c;然后在该 namespace 中部署一个简单的 web 应…...

SpringBoot【八】mybatis-plus条件构造器使用手册!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学&#xff0c;想必大家对它不是非常陌生了吧&#xff0c;这期呢&#xff0c;我主要是围绕以下几点展开&#xff0c;重点给大家介绍 里…...

《HTML 的变革之路:从过去到未来》

一、HTML 的发展历程 图片: HTML 从诞生至今&#xff0c;经历了多个版本的迭代。 &#xff08;一&#xff09;早期版本 HTML 3.2 在 1997 年 1 月 14 日成为 W3C 推荐标准&#xff0c;提供了表格、文字绕排和复杂数学元素显示等新特性&#xff0c;但因实现复杂且缺乏浏览器…...

给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题

前言 最近在用自己的卡盒小程序的时候&#xff0c;发现卡片越来越多&#xff0c;有时候要找到某一张来看看笔记要找半天&#xff0c;于是自己做了一个搜索功能&#xff0c;先看效果&#xff1a; 怎么样&#xff0c;是不是还挺不错的&#xff0c;那么这篇文章就讲讲这样一个搜索…...

高阶数据结构--B树B+树实现原理B树模拟实现--Java

目录 一、B-树概念 二、B-树插入分析 1.用序列{53, 139, 75, 49, 145, 36, 101}构建B树的过程如下&#xff1a; 2.插入过程总结 三、B树插入实现 四、B树 1.B树概念 2.B树的特性 五、B树应用 1.索引 2.Mysql索引 3.InnoDB 一、B-树概念 1970 年&#xff0c; R.Bayer 和…...

CTF: 在本地虚拟机内部署CTF题目docker

step 1 安装基本依赖 sudo apt-get update sudo apt-get install -y \ca-certificates \curl \gnupg \lsb-releasestep 2 安装docker sudo apt-get remove docker docker.io containerd runc sudo apt-get update sudo apt-get install \apt-transport-https \ca-certificate…...

深度学习详解

深度学习&#xff08;Deep Learning&#xff0c;DL&#xff09;是机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;中的一个子领域&#xff0c;利用多层次&#xff08;深层&#xff09;神经网络来自动从数据中提取特征和规律&#xff0c;模仿人脑的神经系统来进…...

qt QCommandLineParser详解

1、概述 QCommandLineParser是Qt框架中提供的一个类&#xff0c;专门用于解析命令行参数。它简化了命令行参数的处理过程&#xff0c;使得开发者能够轻松定义、解析和验证命令行选项和参数。QCommandLineParser适用于需要从命令行获取输入的控制台应用程序&#xff0c;以及需要…...