《Vue 路由导航:打造流畅的单页应用一》
一、Vue Router 简介
Vue Router 是什么?
Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页面应用并实现页面间导航。它基于 Vue 的组件系统构建,通过配置路由将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时,URL 会随之更新,但页面不需要从服务器重新加载。
Vue Router 的作用和优势
- 路由管理:定义 URL 路径与组件映射,实现页面切换。
const routes = [
{ path: '/', component: HomeView },
{ path: '/about', component: AboutView }
];
const router = createRouter({
history: createMemoryHistory(),
routes
});
-
- Vue Router 的 routes 选项定义了一组路由,把 URL 路径映射到组件。例如:
-
- 这些路由组件通常被称为视图,本质上它们只是普通的 Vue 组件,在应用的模板中可以使用 <router-view> 来声明路由的占位符,Vue Router 会根据当前的 URL 路径在 <router-view> 中渲染对应的组件。
- 嵌套路由:构建复杂页面结构。
const router = new VueRouter({
routes: [
{
path: '/bar',
component: Bar,
children: [
{
// 组件 routerChild 会被渲染在 bar 组件的 router-view 中
path: '/bar/child', //或者直接写成 child 相当于 '/bar/child'
component: routerChild
}
]
}
]
});
-
- 嵌套路由在实际开发中应用较多,一般是一个路由页里边包含一个或多个路由页。实际场景一般是上边固定不变,下边导航切换。
-
- 配置示例:
- 路由参数:动态传递数据给组件。
const routes = [
{ path: '/user/:id', component: User }
];
// 在组件中使用
this.$router.push({ path: '/user/123' });
console.log(this.$route.params.id); // 输出:123
const routes = [
{ path: '/search', component: Search }
];
// 在组件中使用
this.$router.push({ path: '/search', query: { q: 'Vue Router' } });
console.log(this.$route.query.q); // 输出:'Vue Router'
-
- 动态参数使用 : 符号定义,可以在组件中通过 $route.params 访问。例如:
-
- 查询参数通过 ? 符号定义,可以在组件中通过 $route.query 访问。例如:
- 导航守卫:进行身份验证等操作。
router.beforeEach((to, from, next) => {
// 预检查逻辑
next(); // 继续导航
});
-
- 路由守卫提供了在导航发生之前执行预检查的能力。主要包括全局守卫、路由守卫和导航守卫。例如:
- 代码分割:提高应用性能。
const Home = () => import(/* webpackChunkName: "home" */ '../views/Home.vue');
const About = () => import(/* webpackChunkName: "about" */ '../views/About.vue');
const Contact = () => import(/* webpackChunkName: "contact" */ '../views/Contact.vue');
export default new Router({
mode: 'history',
routes: [
{ path: '/', name: 'Home', component: Home },
{ path: '/about', name: 'About', component: About },
{ path: '/contact', name: 'Contact', component: Contact }
]
});
-
- 在单页面应用中,路由的配置直接影响到页面的加载和渲染。传统的单文件打包方式会导致所有路由相关的代码都打包在一起,增加了初始加载的体积。而代码分割技术可以使得每个路由相关的代码独立打包,实现按需加载,从而优化了应用的性能。
-
- 实现路由级别的代码分割,可以通过以下步骤:
-
-
- 使用 <router-view> 组件:在应用的模板中使用 <router-view> 来声明路由的占位符。
-
-
-
- 定义路由和组件:为每个路由定义对应的组件。
-
-
-
- 利用动态导入:使用动态导入(import())来按需加载路由组件。
-
-
- 示例:
二、安装和配置
安装 Vue Router
可以使用 npm 或 yarn 安装 Vue Router。例如,在命令行中输入npm install vue-router或yarn add vue-router即可完成安装。
在 Vue 项目中配置 Vue Router
- 导入并安装插件。
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
-
- 在 Vue 项目中,首先需要导入 Vue Router 并将其安装为插件。在项目的入口文件(通常是main.js)中,可以使用以下代码导入并安装插件:
- 创建路由规则。
const routes = [
{ path: '/', component: HomeView },
{ path: '/about', component: AboutView }
];
const router = new VueRouter({
routes: [
{
path: '/bar',
component: Bar,
children: [
{
// 组件 routerChild 会被渲染在 bar 组件的 router-view 中
path: '/bar/child', //或者直接写成 child 相当于 '/bar/child'
component: routerChild
}
]
}
]
});
-
- 创建路由规则需要定义一组路由,把 URL 路径映射到组件。例如:
-
- 也可以配置嵌套路由,比如:
- 在根 Vue 实例中配置 router。
import Vue from 'vue';
import App from './App.vue';
import router from './router';
const app = new Vue({
router,
render: h => h(App),
}).$mount('#app');
-
- 在main.js文件中,创建 Vue 实例时,将路由实例挂载到 Vue 实例上:
三、基本路由
创建基本路由
在 Vue Router 中,创建基本路由主要是定义 URL 路径与组件的映射。通过配置路由规则,可以将不同的 URL 路径与特定的 Vue 组件关联起来,实现页面的切换和导航。例如:
const routes = [
{ path: '/home', component: HomeComponent },
{ path: '/about', component: AboutComponent }
];
const router = new VueRouter({
routes
});
在上面的代码中,我们定义了两个路由规则,分别将/home路径和/about路径映射到HomeComponent和AboutComponent组件。
路由链接和路由视图
使用<router-link>创建导航链接,<router-link>组件会生成一个<a>标签,并自动绑定路由信息,方便用户在页面上进行导航。例如:
<router-link to="/home">Home</router-link>
<router-link to="/about">About</router-link>
使用<router-view>显示对应组件。<router-view>是一个占位符,Vue Router 会根据当前的 URL 路径在<router-view>中渲染对应的组件。例如:
<div>
<router-view></router-view>
</div>
动态路由参数
在路由路径中定义参数,可以实现动态传递数据。动态参数使用:符号定义,在组件中可以通过$route.params访问。例如:
const routes = [
{ path: '/user/:id', component: UserComponent }
];
// 在组件中使用
this.$router.push({ path: '/user/123' });
console.log(this.$route.params.id); // 输出:123
这样,当用户访问/user/123时,123将作为参数传递给UserComponent组件,可以在组件中通过$route.params.id获取这个参数值,实现动态的数据传递和页面渲染。
四、嵌套路由
创建嵌套路由
在 Vue Router 中,创建嵌套路由主要是在组件内部定义子路由。具体步骤如下:
- 首先,在路由配置文件中定义父路由和子路由。例如:
const router = new VueRouter({
routes: [
{
path: '/parent',
component: ParentComponent,
children: [
{
path: 'child',
component: ChildComponent
}
]
}
]
});
- 在父组件(ParentComponent)中,需要使用<router-view>来渲染子路由的内容。例如:
<template>
<div>
<!-- 父组件内容 -->
<router-view></router-view>
<!-- 子组件将在这里渲染 -->
</div>
</template>
嵌套路由的使用场景和好处
- 构建复杂页面结构:在实际开发中,应用的有些界面是由多层级组件组合而来的。例如,一个电商平台可能有商品浏览、用户中心、购物车等不同功能区域,这些功能区域可以通过嵌套路由来组织。又如,在一个内容管理系统中,文章编辑、分类管理、用户权限等多级菜单结构也可以使用嵌套路由来实现。
- 提高代码复用性:父级路由可以定义一个通用的布局或模板,子路由则提供具体的页面内容。这样可以避免重复编写代码,提高开发效率。例如,在一个企业级应用中,可能有多个页面都需要使用相同的头部和底部导航栏,这时可以将头部和底部导航栏放在父组件中,然后在子路由中只编写具体的页面内容。此外,通过动态路由匹配,可以实现对特定资源的访问,如/user/:id。在这种情况下,不同的用户 ID 都可以使用相同的父组件和子组件结构,只需要根据不同的 ID 加载不同的数据即可。
五、路由导航守卫
全局前置守卫
全局前置守卫是在路由导航发生前执行的一种守卫机制,可以在路由切换前执行自定义逻辑。通过调用 router.beforeEach 方法注册全局前置守卫。
全局前置守卫接收三个参数:to(即将进入的目标路由对象)、from(当前导航正要离开的路由对象)、next(一个必须调用的函数,用来处理导航操作)。
例如:
const router = new VueRouter({... });
router.beforeEach((to, from, next) => {
// 在这里实现验证用户是否有权限访问该路由的逻辑
const isAuthenticated = // 鉴权逻辑,比如检查用户是否已登录、是否有相应权限等
if (isAuthenticated) {
next(); // 如果验证通过,继续导航
} else {
next('/login'); // 如果验证失败,跳转到登录页面
}
});
在上述示例中,我们使用 router.beforeEach 方法注册了一个全局前置守卫。在守卫函数中,我们可以编写验证用户是否有权限访问该路由的逻辑,如果验证通过,则调用 next() 方法继续导航,否则调用 next('/login') 方法跳转到登录页面或其他页面。
路由独享的守卫
路由独享的守卫是特定路由的守卫,只作用于某个特定的路由,而不像全局守卫那样作用于所有的路由。
可以在路由配置中通过beforeEnter属性来定义路由独享守卫。例如:
const routes = [
{
path: '/admin',
component: Admin,
beforeEnter: (to, from, next) => {
console.log('Entering Admin route');
if (isAuthenticated()) {
next();
} else {
next('/login');
}
}
}
];
在这个示例中,beforeEnter守卫只在用户导航到/admin路由时触发。守卫逻辑检查用户是否已认证,如果是,则允许继续导航,否则重定向到登录页面。
组件内的守卫
组件内的守卫是在组件进入、更新或离开时执行逻辑的守卫机制。Vue.js 提供了以下三个组件内守卫钩子:
- beforeRouteEnter:在路由进入之前调用。不能直接访问组件实例,因为在守卫执行时组件实例还没有被创建。可以在next回调中访问组件实例。例如:
export default {
name: 'UserProfile',
beforeRouteEnter(to, from, next) {
console.log('Entering UserProfile route');
next(vm => {
// 组件实例已经创建,可以访问
vm.fetchUserData();
});
},
methods: {
fetchUserData() {
// 逻辑代码
}
}
};
- beforeRouteUpdate:在当前路由改变,但仍然渲染同一组件时调用。例如:
export default {
name: 'UserProfile',
beforeRouteUpdate(to, from, next) {
console.log('Route updated');
this.fetchUserData(to.params.id);
next();
},
methods: {
fetchUserData(id) {
// 逻辑代码
}
}
};
- beforeRouteLeave:导航离开当前组件的路由时调用,常用于确认用户是否保存了更改或阻止导航。例如:
export default {
name: 'UserProfile',
beforeRouteLeave(to, from, next) {
const answer = window.confirm('Do you really want to leave? You have unsaved changes!');
if (answer) {
next();
} else {
next(false);
}
}
};
六、路由传参
查询参数
查询参数是在 URL 中通过 ? 符号传递的数据。在 Vue Router 中,可以使用 this.$route.query 来接收查询参数。例如:
const routes = [
{ path: '/search', component: Search }
];
// 在组件中使用
this.$router.push({ path: '/search', query: { q: 'Vue Router' } });
console.log(this.$route.query.q); // 输出:'Vue Router'
在声明式导航传参中,可以使用 to=\"/path?参数名=值\" 的语法格式在 <router-link> 上传递查询参数,在接收参数的组件内,通过 $route.query.参数名 来接收传递过来的值。例如:
<router-link to="/find?name=杨帆&age=21">发现音乐</router-link>
在接收参数的 find 组件代码中:
<template>
<div>
find 组件 这是声明式导航通过查询字符串方式传递过来的参数
<br>
{{$route.query.name}}{{ $route.query.age }}
<br>
</div>
</template>
<script>
export default {};
</script>
<style scoped>
</style>
在编程式导航传参中,可以使用 path + query 的组合方式传递查询参数。例如:
<a @click.prevent="goFriend('/part', 'part')">朋友</a>
goFriend(path, name){
this.$router.push({path: path,query:{name:'杨帆',age:'21'}})
}
在 part 组件中通过 $route.query.name 接收参数:
<template>
<div>
part 组件 这是编程式导航通过 path + query 方式传递过来的参数
<br>
{{ $route.query.name }}{{ $route.query.age }}
<br>
</div>
</template>
<script>
export default {};
</script>
<style>
</style>
路由参数
路由参数是在路由路径中定义的动态参数,使用 : 符号定义。在 Vue Router 中,可以在组件中通过 $route.params 访问路由参数。例如:
const routes = [
{ path: '/user/:id', component: User }
];
// 在组件中使用
this.$router.push({ path: '/user/123' });
console.log(this.$route.params.id); // 输出:123
在声明式导航传参中,可以使用动态路由参数的方式传递参数,语法格式为 to=\"/path/值\",但需要提前配置路由对象。例如:
<router-link to="/my/杨帆/21">我的音乐</router-link>
配置路由对象:
const routes = [
{
// 匹配的路径
path:'/',
// 重定向到 find 组件
redirect:'/find'
},
{
path:'/find',
name:'find',
component: find
},
{
path:'/my/:name/:age',
name:'my',
component: my
}
];
在接收参数的 my 组件中,使用 $route.params.参数名 接收参数:
<template>
<div>
my 组件 这是声明式导航通过动态路径参数方式传递过来的参数
<br>
{{ $route.params.name }}{{ $route.params.age }}
<br>
</div>
</template>
<script>
export default {};
</script>
<style>
</style>
在编程式导航传参中,可以使用 name + params 的组合方式传递路由参数。例如:
<a @click.prevent="goShop('/shop', 'shop')">商城</a>
goShop(path, name){
this.$router.push({name: name,params:{name:'杨帆',age:'21'}})
}
在 shop 组件中通过 $route.params.name 接收参数:
<template>
<div>
shop 组件 这是编程式导航通过 path + query 方式传递过来的参数
<br>
{{ $route.params.name }}{{ $route.params.age }}
<br>
</div>
</template>
<script>
export default {};
</script>
<style>
</style>
命名路由
命名路由是给路由规则起个名字,可以简化路由的跳转,特别是在路由层级比较多时。在 Vue Router 中,可以通过 name 属性给路由规则命名。例如:
{
path:'/demo',
component:Demo,
children:[
{
path:'test',
component:Test,
children:[
{
name:'hello',
path:'welcome',
component:Hello
}
]
}
]
}
简化跳转:
<!--简化前,需要写完整的路径 -->
<router-link to="/demo/test/welcome">跳转</router-link>
<!--简化后,直接通过名字跳转 -->
<router-link :to="{name:'hello'}">跳转</router-link>
<!--简化写法配合传递参数 -->
<router-link:to="{name:'hello',query:{id:666,title:'你好'}}">跳转</router-link>
在使用命名路由时,router 标签中的 to 只能写成对象形式才能使用。例如:
const routes = [
{
name:'guanyu',
path:'/about',
component:About,
children:[
{
// 二级路由路径不能加/
path:'message',
component:Message,
children:[
{
name:'xiangqing',
path:'detail',
component:Detail
}
]
}
]
},
{
path:'/home',
component:Home,
children:[
{
// 二级路由路径不能加/
path:'news',
component:News
}
]
}
];
使用配置:
<router-link:to="{
//path:'/about/message/detail',
name:'xiangqing',
query:{id:m.id,title:m.title}
}">{{m.title}}</router-link>
<router-link active-class="active":to="{name:'guanyu'}">About</router-link>
七、路由懒加载
懒加载的概念和原理
在 Vue.js 中,懒加载允许根据需要动态加载组件或资源,从而减少初始页面加载时间并提高性能。具体实现方法包括使用<keep-alive>和<component is>组件,以及动态导入等方式。懒加载的核心是将页面的组件或资源按需加载,只有在用户需要访问特定页面或组件时才进行加载,而不是在应用启动时一次性加载所有内容。
使用懒加载提高应用性能
路由懒加载可以显著减少初始加载时间。在传统的单页应用中,所有的组件通常会在应用启动时一起打包加载,这可能导致初始加载时间过长,影响用户体验。而通过路由懒加载,每个路由对应的组件会被分割成独立的代码块,只有在用户访问该路由时才会加载对应的组件,从而大大减少了初始加载的时间。例如,在一个包含多个页面的 Vue 应用中,如果没有使用懒加载,那么所有页面的组件代码都会在应用启动时加载,可能会导致加载时间过长。而使用懒加载后,只有当用户访问特定页面时,该页面的组件才会被加载,这样可以极大地提高应用的性能和用户体验。此外,懒加载还可以减小初始包体积,避免在页面加载时加载不需要的组件,从而节省带宽,进一步提高用户体验。
相关文章:
《Vue 路由导航:打造流畅的单页应用一》
一、Vue Router 简介 Vue Router 是什么? Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页面应用并实现页面间导航。它基于 Vue 的组件系统构建,通过配置路由将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面…...
【xshell连接失败】
xshell用pem连接失败 Warning: Identity file ”open_api_test.ssh not accessible: No such file or directory. Warning: Identity file open_api_test2.pem not accessible: No such file or directory. Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 搞了半…...
说说Elasticsearch拼写纠错是如何实现的?
大家好,我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的?】面试题。希望对大家有帮助; 说说Elasticsearch拼写纠错是如何实现的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...
实例讲解MATLAB绘图坐标轴标签旋转
在进行绘图时需要在图片上添加上做标轴的标签,但是当数据量比较多时,例如一天24小时的数据,这时把每个小时显示在左边轴的标签上,文字内容放不下,因此需要将坐标轴标签旋转一定的角度,这样可以更好在图形上…...
Win10+Ubuntu20.04双系统重装Ubuntu22.04单系统
从去年 8 月美化 Ubuntu 系统后一直存在内核错误问题,但因为大部分功能还能正常使用,只是在 apt 时报错,所以一直逃避不想重装,直到最近 12 月新的开始,恰好设置的界面打不开得重装 gnome ,所以下定决心重装…...
eBPF:现代Linux的强大内核扩展技术
eBPF:现代Linux的强大内核扩展技术 eBPF(Extended Berkeley Packet Filter)是一项变革性的技术,它为Linux内核提供了一个灵活的、可编程的方式来处理数据包过滤、网络监控、安全性和系统性能分析等多种任务。 1. eBPF简介 1.1 …...
深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注
文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…...
人工智能工作流程概述:从数据到智能决策
目录 一、引言 二、人工智能工作流程概述 (一)数据收集 (二)数据预处理 (三)模型选择与设计 (四)模型训练 (五)模型评估 (六)模…...
Jenkins升级到最新版本后无法启动
1. 场景还原 最近在web界面将jenkins升级到最新版本后,后台无法启动jenkins服务,服务状态如下: 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…...
.net core MVC入门(三)——Product页面添加
文章目录 项目地址一、Product数据库准备 项目地址 教程作者:教程地址: 代码仓库地址: 所用到的框架和插件: dbt airflow一、Product数据库准备 添加Product的EF上下文 public DbSet<Category> Categories { get; set; …...
【Java基础】笔记
List和ArrayList区别 public class Arrays_BugDemo {public static void main(String[] args){/** List 是一个固定大小的列表,虽然可以进行查询操作,但不支持添加、删除或修改元素。* 如果需要一个可以动态修改的列表,可以使用 ArrayList 进…...
Docker 进阶指南:常用命令、最佳实践与资源管理
Docker 进阶指南:常用命令、最佳实践与资源管理 Docker 作为一种轻量级的容器化技术,已经成为现代软件开发和部署不可或缺的工具。本文将为您深入介绍 Docker 的常用命令、最佳实践以及如何有效管理容器资源,帮助您更好地在 Ubuntu 22.04 或…...
C++编写静态库
1、新建项目创建静态库staticLib1. demoStaticLib.h #pragma once class ArrayTool { public:int Max(const int* lpHead, const int nLength);int Sum(const int* lpHead, const int nLength); }; demoStaticLib.cpp #include "pch.h" #include "demoStati…...
oracle数据库日常操作
1、执行SQL语句后不显示PL/SQL procedure successfully completed set feedback off; 2、显示实例名称 echo "set sqlprompt \"_user_connect_identifier> \"" >> $ORACLE_HOME/sqlplus/admin/glogin.sql 3、客户端尝试连接到服务器时发生超时 …...
行驶证 OCR 识别API接口的影响因素
一、影响因素 (一)证件质量与图像质量 行驶证的质量对OCR 识别 API 界面的效果有重要影响。清晰的文件可以使识别系统准确地捕获文本信息,而模糊的文本可能会导致识别错误。而且不同地区、不同年份的行驶证在字体、排版、格式等方面可能存在差异,甚至可…...
什么是TCP/IP和UDP
TCP/IP和UDP都是网络协议,用于不同计算机或设备之间的通信。它们的作用是定义数据如何在网络上传输,但它们在传输方式、可靠性和效率上有显著的区别。 1. TCP/IP TCP/IP(传输控制协议/互联网协议,Transmission Control Protocol…...
1074 Reversing Linked List (25)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K3, then you must output 3→2→1→6→5→4; if K4, you must output 4→3→2→1→5→6. Input Specif…...
layui table 纵向滚动条导致单元格表头表体错位问题
我用的时layui2.6.8版本 历史项目维护,bug给我让我做了,本来利用前端手段强解决,后来发现很多table 找了解决办法 打开layui-v2.6.8/lay/modules/table.js 如果打开后时压缩的代码 直接搜索 e.find(".layui-table-patch") …...
算法基础 - 求解非线性方程(牛顿法)
文章目录 1. 前言2. 牛顿迭代算法2.1. 基本思想2.2. 如何求解 x12.3. 如何求解 x22.4. 收敛性2.5. 编码实现2.5.1. 递归实现2.5.2. 非递归实现 1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。本文秉承有始有终的态度,继续介绍“非线性方程”的求解算法。…...
[C#]C#实现数字到人民币大写金额的转换
在软件开发中,将数字转换成人民币大写形式的需求通常出现在需要生成财务报表、发票、收据、账单等正式文档的场景中。这些文档往往需要遵循一定的格式和规范,以确保信息的准确性和可读性,特别是在处理与金钱相关的数据时。 比如: …...
Base64.cv:高效安全的在线Base64转换工具详解
在日常开发中,Base64编解码是一个非常常见的需求。本文将介绍一款优秀的在线Base64转换工具:Base64.cv。 工具特点 1. 性能优势 采用浏览器原生API,转换速度快本地运算,无服务器延迟支持大容量文本处理 2. 安全性 纯客户端处…...
前端面试热门题(二)[html\css\js\node\vue)
Vue 性能优化的方法 Vue 性能优化的方法多种多样,以下是一些常用的策略: 使用v-show替换v-if:v-show是通过CSS控制元素的显示与隐藏,而v-if是通过操作DOM来控制元素的显示与隐藏,频繁操作DOM会导致性能下降。因此&am…...
施耐德电气:多维解构AI挑战,引领产业创新变革
CSDN 看到,大模型正在掀起一场智能化革命,带来计算、开发、交互三大范式全面升级和转换,其中 AI 计算范式正在从图灵、冯诺伊曼计算范式转为神经网络计算范式。AI 技术仍在快速发展,AI 算力基础设施的数据中心如果仍走“堆资源、堆…...
Unity的GPU Instancing技术
首先新建一个场景,添加一个相机,并创建一个Render Texture给相机。 然后在相机上挂载以下脚本TestBatches ,同时脚本的Inspector面板的Mesh中选择Cube,另外创建一个新的材质拖动给mat: public class TestBatches : M…...
JVM指令集概览:基础与应用
写在文章开头 在现代软件开发中,Java 语言凭借其“一次编写,到处运行”的理念成为了企业级应用的首选之一。这一理念的背后支撑技术正是 Java 虚拟机(JVM)。JVM 是一个抽象的计算机,它实现了 Java 编程语言的各种特性,并且能够执行编译后的字节码文件。了解 JVM 的工作原…...
使用 Redis Stream 结合 Redission DelayedQueue 实现延迟消息队列(已上线生产)
一、Redis Stream 介绍 Redis Stream 是 Redis 5.0 版本新增加的数据结构,作为一种轻量级的消息队列,Redis Stream 作为一种轻量级的消息队列,适合资源有限或对性能要求较高的场景。 Redis Stream 主要用于消息队列(MQÿ…...
时频转换 | Matlab基于递归图Reccurence Plots一维数据转二维图像方法
目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab基于递归图Reccurence Plots一维数据转二维图像方法 程序设计 clear clc close allfs 6400 ; % 数据采样频率 N 5120; % 信号的点数% 生成时间向量 t (0:N-1) / fs; % 生成正弦信号 x sin(2 * pi * 15…...
《手写Spring渐进式源码实践》实践笔记 (第二十一章 将ORM框架整合到Spring容器中)
文章目录 第二十一章 ORM框架整合Spring背景目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例测试结果: 总结 第二十一章 ORM框架整合Spring 背景 MyBatis-Spring 能够实现 MyBatis 与 Spring 框架的无缝集成。它使得 MyBatis 能够参与 Spring…...
数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)
数据库管理267期 2024-11-286 数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai:Oracle Da…...
NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比
NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…...
第六届国际科技创新学术交流会暨管理科学信息化与经济创新发展(MSIEID 2024)
重要信息 大会官网:msieid2024.iaecst.org (点击了解大会,参会等内容) 大会时间:2024年12月6-8日 大会地点:中国-广州 大会简介 随着全球化和信息化的不断深入,管理科学、信息化和经济发展…...
【计算机视觉算法与应用】模板匹配、图像配准
目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...
HHO-CNN-BiGRU-Attention哈里斯鹰优化算法卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比
HHO-CNN-BiGRU-Attention哈里斯鹰优化算法卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比 目录 HHO-CNN-BiGRU-Attention哈里斯鹰优化算法卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计…...
数据并行、模型并行与张量并行:深度学习中的并行计算策略(中英双语)
中文版 数据并行、模型并行与张量并行:深度学习中的并行计算策略 随着深度学习模型的不断增大,单个计算节点(例如单个 GPU)的计算和内存能力逐渐成为了限制训练效率和模型规模的瓶颈。为了应对这些挑战,深度学习社区…...
大数据-239 离线数仓 - 广告业务 测试 FlumeAgent 加载ODS、DWD层
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
Python中的数据结构深入解析:从列表到字典的优化技巧
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! Python是一门以易用性和可读性著称的高级编程语言,其内置的数据结构为开发者提供了强大的工具,但了解其底层实现及性能优化策略却常被忽略。本文深入探讨Python中的核心数据结构,包括列表(list)、元组…...
【JS】JS判断数据类型
typeof // typeof 后面括号有没有都可以 console.log(typeof(a)) // string console.log(typeof(123)) // number console.log(typeof(undefined)) // undefined console.log(typeof(true)) // boolean console.log(typeof(Symbol(123))) // symbolconsole.log(typeof(null)) /…...
基于jmeter+perfmon的稳定性测试记录
软件测试资料领取:[内部资源] 想拿年薪40W的软件测试人员,这份资料必须领取~ 软件测试面试刷题工具领取:软件测试面试刷题【800道面试题答案免费刷】 1. 引子 最近承接了项目中一些性能测试的任务,因此决定记录一下,…...
【0351】Postgres内核 Open WAL segment(包含 WAL 位置 ‘RecPtr’)(2 - 4)
上一篇: 文章目录 1. 打开 WAL Segment2. Standby mode 由一个 状态机(state machine)实现2.1 何处获取 WAL 文件?2.1.1 XLogSource2.1.2 从所选源(XLogSource )读取 XLOG2.1.2.1 walreceiver 运行状态 ?2.1.3 readFile(XLOG 文件句柄)1. 打开 WAL Segment 在经过前…...
Mysql基础
什么是关系型数据库? 顾名思义,关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)。 …...
Altium Designer学习笔记 24 PCB初始布局2
基于Altium Designer 23学习版,四层板智能小车PCB 更多AD学习笔记:Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…...
【从0学英语】形容词性/名词性物主代词是什么?
在英语中,物主代词是非常重要的语法概念之一,特别是对于初学者来说。理解形容词性物主代词和名词性物主代词的不同,能够帮助我们在日常对话中准确地表达拥有关系。在这篇文章中,我们将深入探讨这两个概念,并通过详细的…...
hhdb数据库介绍(10-29)
管理 数据备份 从存储节点或灾备机房数据备份 选择灾备机房类型、从库(双主备库)存储节点类型进行备份,页面根据选择类型,对应给出提示信息。发起备份时,检测从存储节点状态是否符合备份条件。 主从数据一致性检测…...
springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)
目录 一、删除文章分类功能。 (1)接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 (2)实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...
实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理
目录 一、ThreadLocal基本知识回顾分析 (一)ThreadLocal原理 (二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null? (三)ThreadLocal中的内存泄漏问题及JDK处理方法 &…...
Spark 内存管理机制
Spark 内存管理 堆内内存和堆外内存 作为一个 JVM 进程,Executor 的内存管理建立在 JVM(最小为六十四分之一,最大为四分之一)的内存管理之上,此外spark还引入了堆外内存(不在JVM中的内存),在spark中是指不…...
【Maven】继承和聚合
5. Maven的继承和聚合 5.1 什么是继承 Maven 的依赖传递机制可以一定程度上简化 POM 的配置,但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本,且这些模块之间不存在依赖关系,这就导致同一个依赖…...
NViST运行笔记
文章标题: NViST: In the Wild New View Synthesis from a Single Image with Transformers 1. 环境配置 创建环境 conda create -n nvist python3.9 进入环境 conda activate nvist 安装torch torchvision torchaudio pip install torch2.1.2 torchvision0…...
性能测试工具Grafana、InfluxDB和Collectd的搭建
一、性能监控组成简介 1、监控能力分工:这个系统组合能够覆盖从数据采集、存储到可视化的整个监控流程。Collectd可以收集各种系统和应用的性能指标,InfluxDB提供高效的时序数据存储,而 Grafana 则将这些数据以直观的方式呈现出来。2,实时性能监控:对于需要实时了解系统状…...
JS中的类与对象
面向对象是使用最广泛的一种编程范式,最具代表性的面向对象语言就是Java和C,在它们的理念中,面向对象的三大特性:封装,继承,多态。类,对象,公有/私有方法/属性,各种继承就…...