前端框架Vue的路由机制
大家好,我是G探险者。
最近在调试前端代码的时候,遇到一个问题。首先我们有一个门户页面,该页面里面有很多的豆腐块,每个豆腐块会配置一个系统的跳转连接。
我的系统就是其中一个豆腐块,我第一次登录进来之后,点击我的系统豆腐块可以正常跳转,页面加载都正常,但是切出之后,再次点击我的豆腐块,报了404,页面莫名其妙就找不到了。
为了弄清这个原因,最后研究发现有几个关键的技术点:前端路由,路由模式的两种模式(history模式和hash模式),单页面应用(SPA).
下面我将从这几个概念介绍。
一、单页面(SPA)与多页面(MPA)
什么是单页面应用(SPA)?
单页面应用(Single Page Application,简称 SPA)是一种通过 JavaScript 和客户端路由来实现的 web 应用程序,它的特点是:
- 一次性加载:SPA 应用在首次加载时加载整个应用的 HTML、CSS 和 JavaScript 文件。之后的所有页面更新都是通过 JavaScript 动态加载数据并在当前页面中更新视图,而不会重新加载整个页面。
- 页面切换无刷新:用户在浏览不同页面时,SPA 不会向服务器请求新的 HTML 页面,而是通过 JavaScript 动态更新视图,模拟页面跳转的效果。页面切换时,URL 通常也会发生变化,但不会引起浏览器的全页面刷新。
- 客户端渲染:所有的视图渲染工作主要在客户端完成,后端通常只负责提供数据接口(如 API)而不参与页面渲染。
SPA 的工作原理:
- 当用户首次访问时,浏览器从服务器加载一个 HTML 文件,加载相关的 JavaScript 文件和资源。
- 后续用户与应用交互时,通过 JavaScript 操控页面内容,通常使用客户端路由(如
vue-router
、react-router
)来管理不同的视图状态。 - URL 会根据不同的路由更新,但页面内容不会刷新,只有相关的数据和视图组件会被更新。
SPA 的优缺点:
- 优点:
- 流畅的用户体验:因为没有页面刷新,用户的交互体验更加平滑、响应迅速。
- 前后端分离:后端主要提供数据接口,前端可以独立于后端开发。
- 减少网络请求:页面资源一次加载后,后续操作仅需请求 API 接口而不是完整页面。
- 缺点:
- SEO 问题:传统的 SPA 使用 JavaScript 动态渲染页面内容,搜索引擎的爬虫可能无法正确索引这些动态内容。为了解决这个问题,通常需要使用服务器端渲染(SSR)或预渲染技术。
- 首次加载较慢:SPA 通常需要在初始加载时加载大量的 JavaScript 代码,可能会导致首次加载较慢。
- 浏览器性能压力:因为所有的渲染都在客户端进行,大量的 JavaScript 代码和复杂的应用逻辑可能会导致浏览器性能下降。
什么是多页面应用(MPA)?
多页面应用(Multi-Page Application,简称 MPA)是传统的 web 应用形式,指的是一个应用包含多个独立的页面,每个页面由服务器根据请求动态渲染,并且每次用户跳转到新页面时,浏览器都会发起新的 HTTP 请求,重新加载整个页面。
MPA 的工作原理:
- 每次用户请求一个新的页面时,浏览器都会向服务器发起请求,服务器返回一个完整的 HTML 页面,并加载该页面的 CSS 和 JavaScript 资源。
- 页面间的跳转会导致整个页面的重新加载,服务器负责渲染新的页面内容并返回。
- MPA 的每个页面通常是相互独立的,互不干扰。
MPA 的优缺点:
-
优点:
- SEO 友好:每个页面都是一个独立的 HTML 页面,可以被搜索引擎正常索引,因此 SEO 表现更好。
- 简单实现:没有太多复杂的前端 JavaScript 逻辑,适合于简单的网站或传统的多页面网站。
- 更好的初始加载速度:由于每个页面都是独立加载的,首屏加载速度通常较快。
-
缺点:
- 较差的用户体验:每次页面跳转都会重新加载整个页面,体验上不如 SPA 流畅。
- 页面之间的数据共享困难:每个页面都是独立的,页面之间的状态和数据不容易共享。
- 需要更多的网络请求:每次跳转都会向服务器请求完整的页面和资源,增加了服务器负担和网络流量。
SPA 和 MPA 的区别
特性 | 单页面应用(SPA) | 多页面应用(MPA) |
---|---|---|
页面切换 | 页面不刷新,内容局部更新,流畅的用户体验 | 每次跳转都刷新整个页面 |
请求次数 | 初次加载时请求资源,后续通过 API 获取数据 | 每次跳转都向服务器请求完整的页面资源 |
URL 变化 | 使用前端路由控制,URL 改变但不刷新页面 | 每次跳转都会改变 URL 并刷新页面 |
开发方式 | 前后端分离,前端多使用 JavaScript 控制视图 | 后端渲染页面,前端通常更依赖服务器渲染内容 |
SEO | SEO 难度较大,通常需要服务器端渲染(SSR)或预渲染 | 由于每个页面是独立的,SEO 更加友好 |
性能 | 初次加载较慢,但后续操作快速 | 每个页面都重新加载,可能导致性能问题 |
适用场景 | 适用于需要流畅交互、丰富功能的现代 Web 应用 | 适用于传统的网站、内容较少、页面之间差异大的场景 |
适用场景分析
-
SPA 适用场景:
- 动态内容丰富的 Web 应用:如社交媒体平台、在线编辑器、管理后台、即时聊天应用等。
- 需要良好用户体验的应用:例如需要实现流畅的动画效果、快速切换视图等的应用。
- 前后端分离的项目:适合团队分工明确,前端和后端开发可以独立进行的项目。
-
MPA 适用场景:
- 内容较少且结构简单的网站:如公司官网、博客、新闻网站等。
- SEO 需求较高的项目:例如电商平台、搜索引擎优化要求较高的博客或内容网站。
- 需要快速初始加载速度的网站:MPA 通常首屏加载速度较快,适用于静态内容较多的网站。
二、前端路由
什么是前端路由?
前端路由是指,在用户的浏览器端(客户端)处理路由跳转,而无需向服务器请求新的页面。在传统的多页面应用(MPA)中,每次用户点击链接或刷新页面时,浏览器会向服务器发送请求,服务器返回完整的页面。然而,在前端路由的 SPA 应用中,页面加载一次后,应用的所有路由跳转都只是在浏览器端通过 JavaScript 控制视图的切换,而不会重新加载整个页面。
Vue Router 的基本工作原理
Vue Router 基本上是根据 URL 的变化来决定显示哪个视图(组件)。其核心原理是:
- 通过监听浏览器的 URL(或地址栏)的变化,Vue Router 决定展示哪个组件。
- 根据定义的路由规则,URL 的不同部分(路径、查询参数、哈希等)会映射到不同的组件。
- Vue Router 在 URL 改变时,更新浏览器的历史记录(这通过
History API
或hashchange
事件来实现)。
具体来说,Vue Router 通过以下机制工作:
- 路由规则(Routes):定义 URL 路径与视图组件的映射关系。
- 路由模式(Mode):定义 URL 是如何呈现的,常见的有
hash
模式和history
模式。 - 路由守卫(Navigation Guards):在路由切换时,提供钩子函数来做路由拦截、权限验证等操作。
Vue Router 核心概念
路由定义与路由表
Vue Router 的核心是路由表,它通过路径匹配将 URL 映射到组件。通常,路由表定义在一个 routes
数组中,每个路由对象包含以下内容:
- path:路由的路径。
- component:该路径对应的组件。
- name:可选的路由名字,可以用于通过名称进行导航。
- children:嵌套路由,定义父子路由关系。
- meta:用于存放额外信息,如权限等。
视图组件与 <router-view>
路由表定义的组件会通过 <router-view>
显示在页面中。<router-view>
是一个占位符,它会根据路由的变化渲染对应的组件。
<!-- App.vue -->
<template><div><h1>Vue Router 示例</h1><router-view></router-view> <!-- 根据路由渲染对应的组件 --></div>
</template>
当你在浏览器中切换不同的 URL 路径时,<router-view>
会自动渲染出与当前路径匹配的组件。
动态路由与路由参数
Vue Router 还支持动态路由,它允许你在 URL 中定义动态部分。例如,路径 /user/:id
中的 :id
就是一个动态参数,可以在组件中获取到这个参数的值。
const routes = [{path: '/user/:id',component: User,props: true // 使动态路径参数通过 props 传递给组件}
];
通过 this.$route.params.id
访问动态参数 id
。
路由嵌套(Nested Routes)
你可以通过 children
属性定义嵌套路由,这样可以实现多层视图的嵌套展示。例如,父组件内嵌套多个子组件。
const routes = [{path: '/dashboard',component: Dashboard,children: [{path: 'profile',component: Profile},{path: 'settings',component: Settings}]}
];
在父组件的模板中,使用 <router-view>
来嵌套显示子路由的视图:
<!-- Dashboard.vue -->
<template><div><h2>Dashboard</h2><router-view></router-view> <!-- 子路由会渲染在这里 --></div>
</template>
路由守卫(Navigation Guards)
路由守卫是 Vue Router 提供的一种机制,可以在路由跳转时执行特定的逻辑,比如权限验证、数据预加载等。常见的路由守卫有:
- 全局守卫:可以在任何路由切换前、后或解析时触发。
beforeEach
: 在路由跳转前执行。afterEach
: 在路由跳转后执行。
router.beforeEach((to, from, next) => {// 执行权限检查等if (to.meta.requiresAuth && !isAuthenticated) {next('/login'); // 跳转到登录页} else {next(); // 继续路由跳转}
});
- 路由独享守卫:每个路由配置项中可以定义
beforeEnter
来指定独享的守卫。 - 组件内守卫:在组件内部定义
beforeRouteEnter
、beforeRouteUpdate
和beforeRouteLeave
来管理路由状态。
程序化导航(Programmatic Navigation)
除了 <router-link>
组件,Vue Router 还提供了编程式导航的方式来跳转路由。你可以通过调用 this.$router.push()
或 this.$router.replace()
方法来导航。
this.$router.push('/home'); // 导航到 /home
this.$router.push({ name: 'user', params: { id: 123 } }); // 根据路由名称和参数跳转
路由模式(Hash 与 History)
Vue Router 支持两种主要的路由模式:hash
模式和 history
模式。
Hash 模式
工作原理
- 在
hash
模式 中,路由会通过 URL 中的 hash(#
)符号 来进行区分。例如,http://example.com/#/home
。 #
后面的部分不会被浏览器提交给服务器,所有的页面变化都发生在浏览器端,而不会导致页面刷新。- 当用户访问
http://example.com/#/home
时,#
后面的部分会被用作路由的标识,浏览器不会向服务器发送请求。
优点
- 无需服务器配置:在
hash
模式下,浏览器不会向服务器发送带有#
的 URL 部分。因此,不需要特别的服务器配置就能支持路由。 - 兼容性好:
hash
模式的历史记录由浏览器内建支持,且几乎所有现代浏览器(包括早期版本的浏览器)都能兼容hash
模式。 - 易于实现:
hash
模式实现简单,开发时不需要考虑与服务器的配合,适合快速开发和部署。
缺点
- URL 不够美观:URL 中有
#
符号,可能影响用户的体验,并且不如history
模式的 URL 更符合常规的 URL 格式。例如,http://example.com/#/home
。 - SEO 较差:由于哈希部分(
#
后面的部分)不被浏览器作为正常 URL 发送给服务器,搜索引擎的爬虫可能无法抓取和索引这些页面,影响 SEO。
适用场景
- 静态网站:如果你在开发的是一个静态网站或不依赖于复杂服务器配置的应用,
hash
模式是一个简单且快速的选择。 - 没有后端服务器支持的应用:如果你没有对服务器进行配置(比如静态托管在某些第三方平台上,无法配置服务器的 URL 重写规则),
hash
模式是最适合的选择。 - 早期浏览器兼容:如果你的应用需要支持较旧的浏览器,
hash
模式因为其广泛的兼容性,通常是首选。
History 模式
工作原理
history
模式 基于 HTML5 的 History API,通过调用pushState
和replaceState
来改变浏览器的 URL,而无需刷新页面。例如,http://example.com/home
。- 这种模式下,URL 不包含
#
符号,看起来与传统的多页面应用相似。
优点
- 美观的 URL:
history
模式生成的 URL 更加清晰和符合常规,例如http://example.com/home
,不包含#
符号,更加符合 SEO 和用户习惯。 - 更好的 SEO:因为 URL 中不包含哈希符号,搜索引擎可以正常地抓取页面内容,优化 SEO 表现。
- 更接近传统网站:
history
模式下的 URL 和多页面应用的行为类似,因此适合需要多页面结构的应用,且能够提供无刷新页面切换的体验。
缺点
- 需要服务器配置:
history
模式依赖于 HTML5 的 History API,浏览器的 URL 会发生变化,因此需要服务器端配置支持路由。例如,如果用户直接访问http://example.com/home
,而服务器没有配置该路径的处理规则,可能会返回 404 错误。 - 浏览器兼容性:虽然大多数现代浏览器都支持
history
API,但某些老旧浏览器可能不兼容,尤其是 Internet Explorer 9 及以下版本。
适用场景
- 服务器支持:当你可以控制服务器的配置,能够对所有 URL 路径进行重定向处理时,
history
模式是一个理想的选择。例如,在服务器上配置 URL 重写规则,使得所有路径都指向应用的index.html
文件。 - SEO 要求较高的应用:如果你的应用需要考虑 SEO,且你希望 URL 结构尽量简洁、干净,
history
模式是首选,因为它不会在 URL 中添加#
符号。 - 现代浏览器和单页面应用:适用于现代浏览器,尤其是需要构建复杂、功能丰富的 SPA 应用时,
history
模式提供更好的体验。
如何选择:Hash 模式 vs History 模式
选择标准 | Hash 模式 | History 模式 |
---|---|---|
SEO 需求 | SEO 支持较差,因为 URL 中有 # 。 | SEO 更好,因为 URL 看起来是常规的路径。 |
浏览器兼容性 | 兼容性广,支持所有浏览器。 | 现代浏览器支持较好,较老版本浏览器支持差。 |
服务器支持 | 不需要服务器配置。 | 需要服务器配置,支持 URL 重写。 |
URL 美观度 | URL 包含 # ,不太美观。 | URL 简洁、符合标准,像传统的多页面应用。 |
适用场景 | 静态网站、没有后端支持的应用、早期浏览器支持 | 需要 SEO 和美观 URL 的应用、需要服务器支持 |
为什么History 模式需要服务器配置?
在 History 模式 中,前端应用使用 HTML5 History API(pushState
和 replaceState
)来控制 URL 的变化。当用户访问某个路径时,例如 http://example.com/home
,浏览器不会向服务器请求 home
页面,而是由前端路由框架(如 Vue Router)来渲染视图。但当用户直接刷新页面或通过直接访问 URL 时,浏览器会向服务器请求 http://example.com/home
这个路径。
问题:服务器并不知道该如何处理这个请求。因为这个路径 /home
并不是服务器上存在的文件或页面,而是由前端路由生成的。
- 如果你没有进行服务器配置,服务器会返回一个 404 错误,说明它找不到
/home
这个资源。 - 如果你配置了服务器,使得所有路径都指向你的前端应用的入口页面(例如
index.html
),前端路由框架会接管路由控制,正确渲染页面。
举例说明:
假设你有一个 Vue.js 项目,使用了 Vue Router 并且设置了 History 模式。你的应用有两个页面:
/home
(主页)/about
(关于页)
如果你访问 http://example.com/home
,前端路由框架会根据 URL 渲染 home
页面,但 如果没有服务器配置,直接刷新页面时,浏览器会向服务器请求 http://example.com/home
,而此时服务器并没有 /home
这个路径的实际文件,所以它会返回 404 错误。
服务器配置的作用:
为了避免这个问题,通常会进行如下配置:
- 服务器需要将所有的路由请求(如
/home
、/about
)都指向应用的index.html
文件,然后由前端的路由框架(如 Vue Router)来接管具体的路由渲染。
举例:Apache 服务器配置
在 Apache 服务器中,可以通过设置 .htaccess
文件来实现 URL 重写,将所有的请求都指向 index.html
:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]
- 解释:
RewriteEngine On
:开启重写功能。RewriteCond %{REQUEST_FILENAME} !-f
:如果请求的文件不存在。RewriteCond %{REQUEST_FILENAME} !-d
:如果请求的目录不存在。RewriteRule ^ index.html [L]
:将所有请求重写到index.html
,并由前端路由来处理。
通过这种配置,当用户直接访问 http://example.com/home
或者刷新这个页面时,Apache 会返回 index.html
页面,然后 Vue Router 会根据 URL 自动渲染对应的视图。
举例:Nginx 服务器配置
在 Nginx 中,你可以使用以下配置:
server {listen 80;server_name example.com;root /path/to/your/project/dist;location / {try_files $uri $uri/ /index.html;}
}
- 解释:
root /path/to/your/project/dist;
:设置静态文件目录。location / { try_files $uri $uri/ /index.html; }
:如果用户请求的路径(如/home
)对应的文件不存在,Nginx 会返回index.html
,然后交由前端的 Vue Router 进行处理。
相关文章:
前端框架Vue的路由机制
大家好,我是G探险者。 最近在调试前端代码的时候,遇到一个问题。首先我们有一个门户页面,该页面里面有很多的豆腐块,每个豆腐块会配置一个系统的跳转连接。 我的系统就是其中一个豆腐块,我第一次登录进来之后…...
flutter 快速实现侧边栏
首先我们写一个侧边栏工具类,示例如下: import package:flutter/material.dart;class Sidebar extends StatelessWidget {overrideWidget build(BuildContext context) {return Drawer(child: ListView(padding: EdgeInsets.zero,children: <Widget&…...
华为数通最新题库 H12-821 HCIP稳定过人中
以下是成绩单和考试人员 HCIP H12-831 HCIP H12-725 安全中级...
算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II
93. 复原 IP 地址--分割 题目 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…...
JS,递归,处理树形数据组件,模糊查询树形结构数据字段
JS递归如何模糊查询树形结构数据,根据数据中的某一个字段值,模糊匹配 直接拿去使用就行 function filterTreeLabel(arr, label) {let result []arr.forEach((item) > {// if (String(item.POBJECT_NAME).toLowerCase().indexOf(label)!-1) {if (String(item.P…...
前端大数字精度丢失?Choerodon UI 大数字解决方案:精确性与灵活性的结合!
01 引言 在企业项目开发中,数据的精确性是关键。Choerodon UI 的大数字解决方案,通过其高精度计算、数据一致性维护、灵活的数据交互、国际化支持、兼容性保障、定制化格式化等优势,为开发人员提供了一个强大的武器库,以确保在处…...
matlab凸包检测
% 创建一个3D点集 points [1 2 3; 4 5 6; 7 8 9; 10 11 12; 13 14 15]; % 使用convhull函数计算凸包 hull convhull(points); % 输出凸包点的索引 disp(Convex Hull Indices:); disp(hull); % 绘制点集和凸包 figure; scatter3(points(:,1), points(:,2), points(:,3),…...
单节点calico性能优化
在单节点上部署calicov3273后,发现资源占用 修改calico以下配置是资源消耗降低 1、因为是单节点,没有跨节点pod网段组网需要,禁用overlay方式网络(ipip,vxlan),使用route方式网络 配置calico-node的环境变量 CALICO_IPV4POOL_I…...
【芯片设计- RTL 数字逻辑设计入门 番外篇 7.1 -- 基于ATE的IC测试原理】
文章目录 ATE 测试概述Opens/Shorts测试Leakage测试AC测试转自:漫谈大千世界 漫谈大千世界 2024年10月23日 23:17 湖北 ATE 测试概述 ATE(Automatic Test Equipment)是用于检测集成电路(IC)功能完整性的自动测试设备。它在半导体产业中扮演着至关重要的角色,主要用于检…...
oracle 导入数据提示跳过表
imp system/orclorcl fileD:\oracle_back.dmp fully showy logD:\oracle_log.log 今天用上面的命令往 oracle 中导入数据出现一个奇怪的问题 就是所有导入的表都提示 正在跳过表XXX 最后提示成功终止导入, 没有出现警告。 最后select一个表也没导入进来 怪哉怪哉!…...
鸿蒙开发(15)案例 排行榜
排行榜 准备图片 定义案例需要的数据模型 创建Models文件, //定义app需要的数据模型export class FruitData{name:string;vote:string;id:string;constructor(id:string,name:string,vote:string,) {this.id idthis.name namethis.vote vote}}排行榜头部 创…...
【Java Web】Axios实现前后端数据异步交互
目录 一、Promise概述 二、Promise基本用法 三、async和await关键字 四、Axios介绍 4.1 Axios基本用法 4.2 Axios简化用法之get和post方法 五、Axios拦截器 六、跨域问题处理 一、Promise概述 axios是代替原生的ajax实现前后端数据交互的一套新解决方案,而…...
SLAAC如何工作?
SLAAC如何工作? IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园 https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?sectionj00shttps://www.zhihu.com/question/6691553243/answer/57023796400 主机在启动或接口UP后,发…...
微信小程序UI自动化测试实践 !
微信小程序UI自动化测试实践 引言: 随着微信小程序的快速发展,越来越多的企业和开发者开始开发小程序来满足用户的需求。而在开发小程序的过程中,UI自动化测试是一个必不可少的环节,可以帮助开发者减少人工测试的工作量ÿ…...
代码随想录-笔记-其七
我们来到了贪心算法的章节。 贪心算法和其他部分不太一样的是,他更多的是突出一种思路:通过求局部最优解来求全局最优解。因为只是一个大的思想逻辑,针对不同题型总是有不同的解决方案,所以贪心算法也不想其他算法那样有一个很经…...
react身份证回显
1. 处理身份证号的函数 function getAgeSexAndBirthdate(idCard: string): { sex: 男 | 女 | null; birthdate: Date | null } {if (idCard.length ! 18) {console.error(身份证号码必须是18位。);return { sex: null, birthdate: null };}// 提取出生年月日const year parse…...
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
大家好,今天,我们将讨论 Hibernate 和 JPA 架构。 在开始我们的文章之前,我想回答一个重要的问题:为什么我们需要使用 Hibernate、Eclipse Link、EF core 等 ORM 工具? 事实上,这是一个非常好的问题。我们…...
leetcode----mysql
1179. 重新格式化部门表 - 力扣(LeetCode) 表 Department: ------------------------ | Column Name | Type | ------------------------ | id | int | | revenue | int | | month | varchar | ----…...
盛元广通畜牧与水产品检验技术研究所LIMS系统
一、系统概述 盛元广通畜牧与水产品检验技术研究所LIMS系统集成了检测流程管理、样品管理、仪器设备管理、质量控制、数据记录与分析、合规性管理等功能于一体,能够帮助实验室实现全流程的数字化管理。在水产、畜牧产品的质检实验室中,LIMS系统通过引入…...
EXCEL文件解析
[Excel文件名].xlsx (解压后) │ ├── _rels │ └── .rels (定义关系文件) ├── docProps │ ├── app.xml (应用程序属性) │ └── core.xml (核心文档属性) ├── xl │ ├── _rels │ │ └── workbook.xml.rels (工作簿关系文件) │ ├── …...
【C++】- 掌握STL List类:带你探索双向链表的魅力
文章目录 前言:一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…...
开源 AI 智能名片 S2B2C 商城小程序中运营与产品的关系剖析
摘要:本文聚焦于开源 AI 智能名片 S2B2C 商城小程序,深入探讨其中运营与产品之间的关系。通过分析运营与产品的多种关系认知,阐述在该特定小程序情境下运营与产品相互依存、相互作用的机制,包括运营对产品的需求以及产品对运营的依…...
flask_socketio 以继承 Namespace方式实现一个网页聊天应用
点击进入上一篇,可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装: pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…...
DePIN潜力项目Spheron解读:激活闲置硬件,赋能Web3与AI
DePIN赛道作为今年加密资本关注的热点之一,不仅吸引了大量资金涌入,还凭借其灵活的资源调配、高效的运作方式和可靠的安全性能,逐渐渗透到多个领域和项目中。例如,Helium的无线网络协议、IoTeX的去中心化物联网、IO NET的去中心化…...
《Vue进阶教程》第十六课:深入完善响应式系统之单例模式
往期内容: 《Vue进阶教程》第五课:ref()函数详解(重点) 《Vue进阶教程》第六课:computed()函数详解(上) 《Vue进阶教程》第七课:computed()函数详解(下) 《Vue进阶教程》第八课:watch()函数的基本使用 《Vue进阶教…...
C++ —— const修饰指针
C —— const修饰指针 常量指针(实际开发中用的很多)指针常量(了解即可)常指针常量(了解即可) 常量指针(实际开发中用的很多) 语法:const 数据类型 *变量名; 不能通过解…...
【学习笔记】数据结构(八)
动态存储管理 文章目录 动态存储管理8.1 概述8.2 可利用空间表及分配方法8.3 边界标识法8.3.1 可利用空间表的结构8.3.2 分配算法8.3.3 回收算法 8.4 伙伴系统8.4.1 可利用空间表的结构8.4.2 分配算法8.4.3 回收算法 8.5 无用单元收集 - 垃圾回收机制8.6 存储紧缩 - 内存碎片化…...
maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException
Maven生产环境中遇到java.lang.IndexOutOfBoundsException的问题,尝试了重启电脑、重启IDEA等常规方法无效,最终通过直接重建工程解决了问题。 Rebuild Project 再启动OK...
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
近日,经与腾讯云联合测试,建投数据自主研发的人力资源信息管理系统V3.0、招聘管理系统V3.0、绩效管理系统V2.0、培训管理系统V3.0通过腾讯云数据库TDSQL的技术认证,符合腾讯企业标准的要求,产品兼容性良好,性能卓越。 …...
后端-添加购物车和查看购物车
...
【HarmonyOS NEXT】Web 组件的基础用法以及 H5 侧与原生侧的双向数据通讯
关键词:鸿蒙、ArkTs、Web组件、通讯、数据 官方文档Web组件用法介绍:文档中心 Web 组件加载沙箱中页面可参考我的另一篇文章:【HarmonyOS NEXT】 如何将rawfile中文件复制到沙箱中_鸿蒙rawfile 复制到沙箱-CSDN博客 目录 如何在鸿蒙应用中加…...
7-2 排序
输入一批未排序的数据,数量不超过30个,请使用选择法或者冒泡法对其排序,并按照规定的要求输出。 输入格式: 先输入待排序的整形数的个数;然后输入所有的待排序的数据。 输出格式: 在一行中按照由大到小的顺序输出排序好的数据…...
Java通过反射破坏单例模式
有个第三方工具类,不支持多例模式。但是又不能直接改第三方工具类的代码,因此可以通过反射破坏第三方工具类的单例。 第三方工具类反编译如下 可以看到构造函数进行了私有化,不允许外部new,只能通过newInstance进行实例化。并且…...
FFmpeg第一话:FFmpeg 简介与环境搭建
FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 解码详解 第一话:FFmpeg 简介与环境搭建 FFmpeg 探索之旅一、前言二、FFmpeg 是什么?三、简单介绍其历史背景四、为什么用 C学习 FFmpeg?(一)高性能优势&#…...
C++并发编程: std::atomic对指针进行操作
std::atomic 对指针进行运算的用途 std::atomic 提供了一种在多线程环境中安全地操作指针的方法。这对于实现线程安全的指针管理、动态内存分配、链表操作等场景非常有用。通过使用std::atomic对指针进行运算,可以确保指针操作的原子性和多线程安全性。 常见用途 …...
工业大数据分析算法实战-day08
文章目录 day08模型评价聚类算法基于距离的聚类基于层次的聚类基于密度的聚类基于分布的聚类聚类结果的评价 day08 今天是第8天,昨日阐述了概率图模型和集成学习的分类,主要讲解了有向图和无向图,生成式模型和判断式模型,以及集成…...
在 C# 中实现的目录基础操作
前言 在开发应用程序过程中,对操作系统上的文件夹存储文件和子文件夹操作是常见的需求。.NET中的Directory类提供了处理文件目录的功能。本文介绍如何读取文件夹的属性、获取文件夹的大小及文件个数、创建文件夹、遍历文件夹中的所有文件、移动文件夹和删除文件夹等…...
Python 标识符是啥?
Python 的标识符就是我们写代码时用来给变量、函数、类等取名字的东西。 你写的 my_variable 是个标识符, 定义的 add_numbers 函数名也是个标识符, 甚至你写的 Cat 类名,也是标识符。 一句话总结:标识符就是代码里给“东西”起…...
WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现
一、前言 罗马不是一天建成的。 每个全栈工程师都是从HELLO WORLD 起步的。 之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。 今天我们用更简单的来实现: Python。 我们将用Python来实现一个学生管理应用࿰…...
将 Matplotlib 图形转换为 PIL 图像并返回
将 Matplotlib 图形转换为 PIL 图像并返回 前言完整代码Matplotlib 中 fig 和 ax 的关系示例: 问题分析常见错误及解决方案总结 前言 Matplotlib 是 Python 里最流行的图表展示库,PIL (Python Imaging Library)则是一个强大的图像处理库。在开发过程中&…...
F5中获取客户端ip地址(client ip)
当F5设备对其原始设置上的所有IP地址使用NAT时,连接到poo成员(nodes、backend servers)的出站连接将是NAT IP地址。 pool 成员(nodes、backend servers)将无法看到真实的客户端 ip地址,因为看到的是F5上的…...
点焊机器人维修-ABB-KUKA-FANUC-YASKAWA
在正式启用点焊机器人之前,一项至关重要的预备步骤便是进行焊枪的全面设置操作。以FANUC机器人为例,其焊枪的设置流程涵盖了多个关键环节,如焊枪运动方向的精确规划、焊枪规格的选择以及零点标定的细致执行等。这些设置均须严格依据实际所采用…...
springboot448教学辅助系统(论文+源码)_kaic
摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#x…...
网络地址转换(NAT)和端口映射
1. 网络地址转换(NAT) 1.1 NAT的应用场景 (1)应用场景:允许将私有IP地址映射到公网地址,以减缓IP地址空间的消耗 ①需要连接Internet,但主机没有公网IP地址 ②更换了一个新的ISP,需要重新组织网络时&…...
iClent3D for Cesium 实现无人机巡检飞行效果
作者:gaogy 1、背景 随着地理信息技术的发展,三维地球技术逐渐成为了许多领域中的核心工具,尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据,提供更高效的决策支持。…...
低比特语言模型 是一种利用较少比特数进行语言建模的技术
Vanilla LLM: 基础的全精度语言模型,通常在较高比特数下运作 Vanilla LLM,或称为“基础的全精度语言模型”,是指使用标准的浮点数(通常是16位或32位)进行训练和推理的语言模型。这些模型依赖于经典的神经网络结构&…...
ES6中的map和set
Set ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set本身是一个构造函数,用来生成 Set 数据结构。 以下代码 const s new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x > s.add(x));for (let i of s…...
【WRF安装】WRF编译错误总结1:HDF5库包安装
目录 1 HDF5库包安装有误:HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1:提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…...
MyBatis常见面试题总结
#{} 和 ${} 的区别是什么? 注:这道题是面试官面试我同事的。 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于原样文本替换,可以替换任意内容,比如${driver}…...