【前端学习笔记】Pinia
1.介绍
Pinia 是 Vue 3 中的官方状态管理库,作为 Vuex 的继任者,它为 Vue 3 提供了一个更现代、更灵活、更易用的状态管理解决方案。Pinia 主要用于管理应用中的全局状态,并提供了一个清晰、简洁的 API 来处理复杂的状态逻辑、数据流和副作用。
Pinia 与 Vuex 相比,具有更简洁的 API、更好的 TypeScript 支持、更强的模块化和灵活性。下面是对 Pinia 的详细解读,包括其核心概念、如何使用以及它的一些优势。
- 更简洁的 API:Pinia 的 API 更加简洁直观,避免了 Vuex 中的一些冗长代码(如 mutations、getters)。
- TypeScript 原生支持:Pinia 提供了更好的 TypeScript 类型推导和支持,使得开发过程中可以享受更好的类型检查和自动完成功能。
- 模块化设计:Pinia 支持模块化,每个 store 都可以独立于其他 store 使用,便于拆分和维护。
- 兼容 Vue 3 和 Composition API:Pinia 与 Vue 3 的 Composition API 紧密集成,提供了一个现代化的、以函数式为核心的状态管理方式。
2.使用
Pinia 是 Vue 3 中的官方状态管理库,作为 Vuex 的继任者,它为 Vue 3 提供了一个更现代、更灵活、更易用的状态管理解决方案。Pinia 主要用于管理应用中的全局状态,并提供了一个清晰、简洁的 API 来处理复杂的状态逻辑、数据流和副作用。
Pinia 与 Vuex 相比,具有更简洁的 API、更好的 TypeScript 支持、更强的模块化和灵活性。下面是对 Pinia 的详细解读,包括其核心概念、如何使用以及它的一些优势。
1. 为什么使用 Pinia?
在 Vue 3 中,Pinia 是为了替代 Vuex 作为更现代、更轻量级的状态管理解决方案。其设计哲学是简洁、灵活、易用,适用于 Vue 3 的 Composition API。相较于 Vuex,Pinia 具有以下优势:
- 更简洁的 API:Pinia 的 API 更加简洁直观,避免了 Vuex 中的一些冗长代码(如
mutations
)。 - TypeScript 原生支持:Pinia 提供了更好的 TypeScript 类型推导和支持,使得开发过程中可以享受更好的类型检查和自动完成功能。
- 模块化设计:Pinia 支持模块化,每个 store 都可以独立于其他 store 使用,便于拆分和维护。
- 兼容 Vue 3 和 Composition API:Pinia 与 Vue 3 的 Composition API 紧密集成,提供了一个现代化的、以函数式为核心的状态管理方式。
2. Pinia 核心概念
Pinia 主要有三个核心概念:
-
Store:
- Pinia 的核心是 store,它是管理状态的容器,类似于 Vuex 中的 store。每个 store 都是一个包含状态、getter 和 actions 的对象。
- Store 用来存储应用中的 全局状态,可以在应用中的任意组件之间共享这些状态。
-
State:
- Pinia 的 store 包含 state,也就是我们管理的应用状态。它通常是一个普通的 JavaScript 对象或者数组,包含了你要在应用中共享的数据。
-
Actions:
- Pinia 使用 actions 来更新 state 或执行副作用操作。与 Vuex 不同,Pinia 中的 actions 可以直接修改 state,而不需要通过 mutations。
3. 如何使用 Pinia?
首先,在你的 Vue 3 项目中创建一个 Pinia 实例,然后将其传递给 Vue 实例。一般来说,这个步骤会在 main.ts
或 main.js
中完成。
// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const app = createApp(App)// 创建并注册 Pinia 实例
const pinia = createPinia()app.use(pinia)
app.mount('#app')
在 Pinia 中,每个 store 是通过 defineStore
函数定义的,它接收两个参数:
- store 的名称。
- 一个函数,返回 store 的state、getter 和 actions。
// stores/counter.js
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => {return {count: 0}},actions: {increment() {this.count++},decrement() {this.count--}},getters: {doubleCount: (state) => state.count * 2}
})
在上面的代码中,useCounterStore
是一个 store,它包含:
state
:存储数据的地方。actions
:用来修改state
的方法。getters
:计算派生状态的函数,类似于 Vuex 中的 getter。
3.4 使用 Store
在组件中,你可以使用 useCounterStore
来访问和修改 store 中的状态。
<template><div><p>Count: {{ counter.count }}</p><p>Double Count: {{ counter.doubleCount }}</p><button @click="counter.increment">Increment</button><button @click="counter.decrement">Decrement</button></div>
</template><script setup>
import { useCounterStore } from './stores/counter'// 使用 Pinia store
const counter = useCounterStore()
</script>
通过 useCounterStore()
,你可以访问 store 中的状态、actions 和 getters。在模板中,直接访问 counter.count
或 counter.doubleCount
就能显示当前的状态。
Store 的模块化
Pinia 支持将 store 划分为多个模块,每个模块可以包含不同的 state、actions 和 getters,类似于 Vuex 的模块化设计。你可以根据功能模块来组织 store。
例如,你可以在 stores
目录下创建多个文件,分别定义不同的 store。
// stores/user.js
import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({name: 'John Doe',age: 30}),actions: {updateName(newName) {this.name = newName}}
})
在 App.vue
中,你可以像使用其他 store 一样使用不同的 store。
import { useUserStore } from './stores/user'const user = useUserStore()
console.log(user.name) // 'John Doe'
user.updateName('Jane Doe')
4. Pinia 与 Vuex 的对比
特性 | Pinia | Vuex |
---|---|---|
支持 Vue 3 | 原生支持,专为 Vue 3 设计 | 也支持 Vue 3,但需要额外的配置和适配 |
API 简洁 | 使用 defineStore 定义 store,简洁明了 | 需要 state 、mutations 、actions 、getters |
TypeScript 支持 | 原生支持 TypeScript,类型推导更好 | 支持,但不如 Pinia 高效和简单 |
模块化 | 本身支持模块化,每个 store 可以独立 | 需要使用 modules 配置来实现模块化 |
响应式系统 | 使用 Vue 3 的响应式系统,性能更高 | 使用 Vue 2 的响应式系统,性能稍逊 |
插件生态 | 由于是 Vue 官方推荐,插件逐步增多 | 插件生态成熟,支持很多功能 |
存储方式 | store 通过 defineStore 生成,自动响应 | store 是通过 Vuex 实例创建,配置较多 |
5. Pinia 的优势
- 简洁性:Pinia 的 API 简洁明了,没有 Vuex 中的繁琐配置,直接通过
defineStore
创建 store,减少了冗余代码。 - 类型安全:Pinia 提供了更好的 TypeScript 支持,自动类型推导,使得开发体验更加流畅,尤其在大型项目中,Pinia 的类型检查非常重要。
- Composition API 集成:Pinia 和 Vue 3 的 Composition API 完美集成,使用
setup()
时非常方便地管理状态。 - 模块化:Pinia 支持 store 的模块化,可以根据功能进行拆分,易于维护。
- 性能:Pinia 使用 Vue 3 的响应式系统,性能更优。
Vuex 的 mutations
与 Pinia 的设计差异
在 Vuex 中,mutations
是修改状态(state)的唯一方式。它被设计成 同步 的函数,负责直接修改 Vuex store 中的 state。这种做法有两个主要原因:
- 明确的状态修改轨迹:所有的状态变更都需要通过 mutations,这样就能更清晰地跟踪状态变更,帮助开发者理解状态是如何变化的。
- 调试和开发工具的支持:Vuex 提供了完善的开发工具支持,
mutations
的存在使得工具能够记录每次状态变更,帮助进行历史追踪和时间旅行调试(Time Travel Debugging)。
而 Pinia 的设计没有 mutations
,它允许直接在 actions 中修改状态,简化了代码结构并提升了灵活性。以下是两者的比较及其优缺点。
为什么 Vuex 需要 mutations
?
-
清晰的状态变更追踪:
- 在 Vuex 中,所有对状态的修改都必须通过
mutations
,因此你可以很容易地追踪到哪个mutation
引起了状态的变化。 - 这有助于调试和跟踪问题,尤其是当应用规模庞大时。
- 在 Vuex 中,所有对状态的修改都必须通过
-
同步操作:
mutations
是同步执行的,这意味着它们是可以预测的(没有异步操作干扰)。这一点对于状态管理和调试来说是非常重要的。
-
开发者工具支持:
- Vuex 提供了强大的 Vue Devtools 支持,能够记录每次
mutation
触发的状态变更,并支持时间旅行调试,这使得开发和调试更加容易。
- Vuex 提供了强大的 Vue Devtools 支持,能够记录每次
Pinia 为什么不需要 mutations
?
-
简化 API 设计:
- Pinia 摒弃了
mutations
,采用了更简洁的 API,允许在 actions 中直接修改状态。 - 这使得代码更直观,减少了冗余的层级,尤其对于中小型项目来说,能大幅度简化代码。
- Pinia 摒弃了
-
灵活的状态修改:
- 在 Pinia 中,
actions
不仅可以处理异步逻辑,还能直接修改状态。你不需要再区分异步操作和同步操作,因为它们都可以在同一个地方处理。 - 这种设计简化了状态管理,不需要显式地创建额外的
mutations
来处理同步操作。
- 在 Pinia 中,
-
更符合 Vue 3 Composition API:
- Pinia 作为 Vue 3 的状态管理库,与 Composition API 设计模式紧密结合。Pinia 的 API 与 Vue 3 的设计理念一致,它直接支持响应式数据管理,并让你能够更方便地通过
store
的state
和actions
来操作数据。 - Pinia 的 API 更符合 Vue 3 的函数式编程范式,使用起来更简洁和灵活。
- Vuex 的
mutations
提供了清晰的状态变更跟踪,适用于大型应用中对状态变化需要详细审计的情况。Vuex 的设计使得状态变更更加可预测和易于调试,特别是在复杂应用中,这一点非常重要。 - Pinia 的简化设计摒弃了
mutations
,让代码更加简洁和灵活。对于小型和中型应用来说,Pinia 提供了一个更轻量级的解决方案,避免了冗余代码。 - Vuex:由于
mutations
的存在,Vuex 在设计上有一定的学习曲线,特别是当项目的状态变得复杂时,可能会导致多余的代码和样板代码(如重复的mutations
和actions
)。但是,它的优势在于提供了明确的状态修改规范,适用于大型项目或需要严格控制状态的应用。 - Pinia:通过移除
mutations
,Pinia 的 API 更加简洁,减少了开发者需要编写的代码量,适用于更简单的状态管理场景。它使得开发者能够更轻松地使用 Vue 3 Composition API,特别是对于较小或中等规模的项目。 - Vuex:在 Vuex 中,所有异步操作都必须在
actions
中进行,而mutations
只能进行同步操作。这意味着你需要清楚区分异步和同步的操作,这可能增加一些复杂度。 - Pinia:在 Pinia 中,
actions
可以同时处理同步和异步操作,不需要区分mutations
和actions
。这为开发者提供了更大的灵活性和便利性。 - Vuex:Vuex 的设计本身会引入一些额外的性能开销,特别是在大规模项目中,
mutations
和getters
的结构可能会导致性能下降,尤其是当 store 中的状态变得复杂时。 - Pinia:Pinia 基于 Vue 3 的响应式系统,设计上更轻量,性能更优。它利用 Vue 3 Composition API 的响应式机制,性能开销较低。
- Vuex:Vuex 也支持 TypeScript,但需要额外的配置,并且在大型项目中,使用 Vuex 可能会遇到一些类型推导不够智能或冗长的情况。
- Pinia:Pinia 提供了更好的 TypeScript 支持,类型推导更加智能,适合现代 TypeScript 项目的开发需求。
- Pinia 作为 Vue 3 的状态管理库,与 Composition API 设计模式紧密结合。Pinia 的 API 与 Vue 3 的设计理念一致,它直接支持响应式数据管理,并让你能够更方便地通过
- Vuex 的
mutations
适用于大型项目,它提供了更加严格和明确的状态管理方式,能清晰地跟踪和调试状态的变更,尤其在复杂应用中,提供了更加规范和安全的管理。 - Pinia 的设计更加简洁,摒弃了
mutations
,适合较小和中等规模的项目。它提供了更高的灵活性和易用性,尤其是在与 Vue 3 Composition API 配合使用时,简化了代码的书写。
如果你正在开发一个复杂的、需要严格控制状态管理的大型项目,Vuex 可能会更适合。如果你的项目相对较小,或者是使用 Vue 3 的 Composition API,Pinia 将是一个更轻量、更现代的选择。
持久化存储
正常情况下,不刷新浏览器时,store 中的状态和路由会保持不变:
- 路由变化:在 前端路由(例如 Vue Router 或 React Router)中,路由的变化是由前端 JavaScript 控制的,不会引起页面的重新加载。所以,路由状态和应用的其他状态(如 store 中的数据)会在应用的生命周期内保持不变,直到你主动更改它们。
- store 状态:在不刷新浏览器的情况下,Pinia 或 Vuex 中的状态会保持不变,组件之间可以共享这个状态,直到你显式地改变它。例如,用户的输入、请求返回的数据、选择的模板等状态都会保留。
刷新浏览器时,store 中的状态会丢失: - 浏览器刷新:当你刷新浏览器时,浏览器会重新加载整个页面,这意味着 JavaScript 的运行环境也会被重新初始化。此时,所有的前端状态(如 store 中的数据)都会被重置,因为它们是保存在 内存 中的,而浏览器刷新时内存会被清空。
- 路由变化:路由也会重置,因为路由是基于当前页面状态的。刷新页面相当于重新加载整个应用,浏览器会将 URL 设置为默认的路由(通常是首页),并根据这个 URL 初始化路由状态。
为了避免刷新浏览器后丢失状态,可以使用 持久化存储(如 localStorage 或 sessionStorage),将重要的状态保存到浏览器的存储中。这样,在刷新页面后,应用可以从持久化存储中恢复之前的状态。pinia-plugin-persistedstate
- 可以配置
persist: true
来启用持久化:
import { defineStore } from 'pinia';export const useStore = defineStore('store', {state: () => ({count: 0}),persist: true // 启用持久化//或者persist: {storage: sessionStorage // 默认是 localStorage}
});
- 在 main.js 或 main.ts 中启用插件:
import { createPinia } from 'pinia'
import persistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(persistedstate) // 启用持久化插件app.use(pinia)
相关文章:
【前端学习笔记】Pinia
1.介绍 Pinia 是 Vue 3 中的官方状态管理库,作为 Vuex 的继任者,它为 Vue 3 提供了一个更现代、更灵活、更易用的状态管理解决方案。Pinia 主要用于管理应用中的全局状态,并提供了一个清晰、简洁的 API 来处理复杂的状态逻辑、数据流和副作用…...
Windows 11【1001问】Windows 11系统硬件配置要求
Windows 11 的设计目标是让用户更贴近自己喜欢的内容,在其发布之际,计算机在连接、创作以及游戏体验方面扮演了更加核心的角色。在设定 Windows 11 的最低系统要求时,我们依据三个关键原则来指导决策,以确保用户能够获得卓越的使用…...
ROS ur10机械臂添加140夹爪全流程记录
ROS ur10机械臂添加140夹爪 系统版本:Ubuntu20.04 Ros版本:noetic Moveit版本:moveit-noetic 参考博客: ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例…...
火绒终端安全管理系统V2.0网络防御功能介绍
火绒终端安全管理系统V2.0 【火绒企业版V2.0】网络防御功能包含网络入侵拦截、横向渗透防护、对外攻击检测、僵尸网络防护、Web服务保护、暴破攻击防护、远程登录防护、恶意网址拦截。火绒企业版V2.0的网络防御功能,多层次、多方位,守护用户终端安全。 …...
halcon三维点云数据处理(二十五)moments_object_model_3d
目录 一、moments_object_model_3d例程二、moments_object_model_3d函数三、效果图一、moments_object_model_3d例程 这个例子说明了如何使用moments_object_model_3d运算符来将3D数据与x、y、z坐标轴对齐。在实际应用中,通过3D传感器获取的物体模型可能具有一个与物体主轴不…...
网络安全漏洞管理要求 网络安全产品漏洞
一、漏洞类型 缓冲区溢出、跨站脚本、DOS攻击、扫描、SQL 注入、木马后门、病毒蠕虫、web攻击、僵尸网络、跨站请求伪造、文件包含、文件读取、目录遍历攻击、敏感信息泄露、暴力破解、代码执行漏洞、命令执行、弱口令、上传漏洞利用、webshell利用、配置不当/错误、逻辑/涉及错…...
XML(eXtensible Markup Language)
eXtensible Markup Language(可扩展标记语言)是一种用来存储和传输数据的文本格式。 具体定义 XML 可扩展标记语言,是用于标记电子文件使其具有结构性的标记语言,可以 用来标记数据、定义数据类型,是一种允许用户对自…...
SpringBoot两种方式接入DeepSeek
方式一:基于HttpClient 步骤 1:准备工作 获取 DeepSeek API 密钥:访问 DeepSeek 的开发者平台,注册并获取 API 密钥。 步骤 2:引入依赖 <dependency><groupId>org.springframework.boot</groupId&g…...
el-date-picker 组件限制禁止选择当前时间之前的时间
页面代码 <el-date-pickerv-model"xxx.startTime"type"datetime"placeholder"请选择开始时间"value-format"YYYY-MM-DD HH:mm:ss"clearable:disabledDate"disabledDateFn":disabled-hours"disabledHours":dis…...
嵌入式科普(33)深度解析C语言中的const和volatile关键字
1. 关键字基础概念 const:定义"只读变量",被修饰的变量不可被程序修改 volatile:提醒编译器该变量可能被意外修改,禁止编译器优化 九、e2studio VS STM32CubeIDE之const修饰BSP函数的形参 嵌入式科普(23)指向寄存器的…...
DIP的实际举例
SOLID原则。 依赖倒置原则(DIP)的核心是高层模块不应该依赖于低层模块,二者都应该依赖于抽象(接口或抽象类) 例如,随着业务的发展,订单总金额的计算规则可能需要根据不同的客户类型或促销活动…...
【GESP】C++二级真题 luogu-b3955, [GESP202403 二级] 小杨的日字矩阵
GESP二级真题,多层循环、分支语句练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3955/ 【GESP】C二级真题 luogu-b3955, [GESP202403 二级] 小杨的日字矩阵 | OneCoderGESP二级真题,多层循环、分支…...
python类型转换深浅拷贝
1.类型转换 1.1 int(x):转化为一个整数,只能转换由纯数字组成的字符串 float->int 浮点型强转整形会去掉小数点后面的数,只保留整数部分 a 1.2 print(type(a)) #<class float> b int(a) print(type(b)) #<class int>print(int…...
Kafka面试题汇总
基础篇 1、什么是 Apache Kafka?它的主要用途是什么? 2、Kafka 中的几个核心概念是什么?请简要说明每个概念的作用。 3、Kafka 的 Producer 和 Consumer 是如何工作的?它们之间的数据传递机制是什么? 进阶篇 1、K…...
window安装MySQL5.7
1、下载MySQL5.7.24 浏览器打开: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-winx64.zip 2、解压缩 下载下来的是一个压缩包,解压到你想放到的目录下面,我放的是“C:\MySQL” 3、配置MySQL环境变量 计算机右键 - 属性 …...
什么是手机9008模式?如何进入9008
之前给大家分享了一些有关手机刷机的知识,今天给大家讲一讲如果刷机过程中不慎变砖应该如何应对(当然了,希望大家都不会遇到)😂😄 在给手机 Root 或刷机时,线刷 9008 指的是利用 高通 9008 模式…...
【jira】用到几张表
jira用到的几张表 测试计划,测试周期,测试用例,问题记录 1. 测试计划 # 记录表,查计划详情 SELECT ID,issuenum,SUMMARY FROM jiraissue where issuenum 22871# 测试计划下,测试周期,查测试周期id&…...
文件包含-session2
[题目信息]: 题目名称题目难度文件包含-session22 [题目考点]: 由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意…...
在 MySQL 的 InnoDB 存储引擎中,脏页(Dirty Page)的刷盘(Flush)时机
1. 后台线程周期性刷盘 触发机制: InnoDB 的 Page Cleaner 线程 会周期性地将脏页刷入磁盘,防止内存中脏页堆积。 触发条件: 脏页比例阈值:当 Buffer Pool 中脏页占比超过 innodb_max_dirty_pages_pct(默认 90%&#…...
Vscode编辑器获取更新远程最新分支
解决:打开当前项目的终端,输入 git remote update origin --prune # 查看远程分支 git branch -r --prune --prune 参数告诉 Git 清理那些远程仓库中已经删除但本地仍然存在的跟踪分支。 命令作用 更新远程仓库引用: git remote update …...
`AdminAdminDTO` 和 `userSession` 对象中的字段对应起来的表格
以下是将更正后的表格放在最前面的回答,表格包含序号列,合并了后端 AdminAdminDTO 和前端 userSession 的所有字段,并标注对方没有的字段。token 字段值用省略号(...)表示: 序号字段名AdminAdminDTO (后端…...
存储引擎、索引(MySQL笔记第四期)
p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 存储引擎概念InnoDB存储引擎MyISAM存储引擎Memory存储引擎存储引擎的选择 索引三种索引索引分类语法(创建/查看/删除)性能分析工具SQL执行频率慢查询日志profile详情explain执行计…...
全面汇总windows进程通信(二)
在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: 信号量(Semaphore)和互斥量(…...
【大模型】蓝耘智算云平台快速部署DeepSeek R1/R3大模型详解
目录 一、前言 二、蓝耘智算平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 应用场景 2.4 对DeepSeek 的支持 2.4.1 DeepSeek 简介 2.4.2 DeepSeek 优势 三、蓝耘智算平台部署DeepSeek-R1操作过程 3.1 注册账号 3.1.1 余额检查 3.2 部署DeepSeek-R1 3.2.1 获取…...
心理咨询小程序的未来发展
还在眼巴巴看着心理咨询行业的巨大蛋糕却无从下口?今天就来聊聊心理咨询小程序的无限潜力 据统计,全球超 10 亿人受精神心理问题困扰,国内心理健康问题也日益突出,心理咨询需求猛增。可传统心理咨询预约难,费用高&…...
硬件工程师入门教程
1.欧姆定律 测电压并联使用万用表测电流串联使用万用表,红入黑出 2.电阻的阻值识别 直插电阻 贴片电阻 3.电阻的功率 4.电阻的限流作用 限流电阻阻值的计算 单位换算关系 5.电阻的分流功能 6.电阻的分压功能 7.电容 电容简单来说是两块不连通的导体加上中间的绝…...
大模型本地部署硬件资源学习(包含模型微调所需资源)
大模型本地部署硬件配置学习 前言1.大模型应用需求分析扩展框架2.华为昇腾算力3.显卡信息汇总对比表4.大模型微调显卡资源指南(Qwen系列与DeepSeek蒸馏模型)一、Qwen系列模型微调显存需求二、DeepSeek-R1蒸馏模型微调显存需求三、显存优化策略与硬件选型…...
【DeepSeek系列】05 DeepSeek核心算法改进点总结
文章目录 一、DeepSeek概要二、4个重要改进点2.1 多头潜在注意力2.2 混合专家模型MoE2.3 多Token预测3.4 GRPO强化学习策略 三、2个重要思考3.1 大规模强化学习3.2 蒸馏方法:小模型也可以很强大 一、DeepSeek概要 2024年~2025年初,DeepSeek …...
Java基础常见的面试题(易错!!)
面试题一:为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”(又称 “钻石问题”),即一个子类从多个父类继承到同名方法或属性时,编译器无法确定该调用哪个父类的成员。同时,多继承…...
山东大学软件学院nosql实验四
实验题目: 使用Java做简单数据插入 实验内容 用API方式,做数据插入。 使用Java语言实现数据插入界面,为实验一建立的学生、教师、课程表插入数据,可以在前端界面中录入数据之后保存,也可以导入Excel中的数据。 实…...
Linux | man 手册使用详解
注:本文为 “Linux man 手册” 相关文章合辑。 略作重排。 man 手册常用命令 1. 查看和搜索手册页 查看特定软件包的手册页,并使用 grep 命令过滤出包含特定关键字的行: man <package> | grep <keyword>在整个系统的手册页中…...
初阶数据结构(C语言实现)——1数据结构前言
1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 2.什么是算法? 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一…...
Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式
Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序: 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…...
基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现
大家好,今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我,文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…...
工具方法 - 合规性矩阵
Compliance matrix (合规性矩阵)是产品需求管理中的一个重要工具,它是用来识别、跟踪、监控和组织所有客户和利益相关方需求是否被满足的工具。具体来说,Compliance matrix需要用一行一行的证据来证明被设计的产品针对每个需求的实…...
2.2 STM32F103C8T6最小系统板的四种有关固件的开发方式
2.2.1 四种有关固件的开发方式 四种有关于固件的开发方式从时间线由远及近分别是:寄存器开发、标准外设驱动库开发、硬件抽象层库开发、底层库开发。 四种开发方式各有优缺点,可以参考ST官方的测试与说明。 1.寄存器开发 寄存器编程对于从51等等芯片过渡…...
go 环境准备
配置路径: GOROOT:D:\GoGOPATH:go的工作目录 D:\workspacego 验证版本:go version 配置第三方仓库: GO111MODULE:开启mod模式GOPROXY:go语言三方库地址GOSUMDB:go语言软件包的M…...
VMware安装Centos 9虚拟机+设置共享文件夹+远程登录
一、安装背景 工作需要安装一台CentOS-Stream-9的机器环境,所以一开始的安装准备工作有: vmware版本:VMware Workstation 16 镜像版本:CentOS-Stream-9-latest-x86_64-dvd1.iso (kernel-5.14.0) …...
高中数学基础-平面向量
文章目录 1、平面向量2、复数 高中数学-平面向量、复数 1、平面向量 向量:具有大小和方向的量称为向量;物理学中向量也称矢量,只有大小没有方向的量称为标量;向量的大小称为模,大小为1的是单位向量,长度为0…...
v4l2子系统学习(三)编写虚拟摄像头驱动
文章目录 1、声明2、前言3、虚拟摄像头驱动编写3.1、编写硬件相关代码3.2、程序示例 1、声明 本文是在学习韦东山《驱动大全》V4L2子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商品详情 其对应的…...
堆排序(详解)c++
堆排序 (可以⽤ ppt 演⽰流程) 堆排序(Heap Sort)是指利⽤堆这种数据结构所设计的⼀种排序算法。本质上是优化了选择排序算法,选择排序的思想是在堆排序元素中拿出最大值或最小值,然后把这个位置的值放在它该放的位置上就可以了&a…...
API测试工具:Swagger vs Postman 2025最新全面对比
随着微服务架构的普及和云原生应用的激增,高效的 API 开发、测试和文档管理工具变得越来越重要。在众多 API 工具中,Swagger 和 Postman 各自以不同的方式解决着 API 开发生命周期中的关键问题,本文将从多个维度深入对比这两款工具࿰…...
算法-图-数据结构(邻接矩阵)-BFS广度优先遍历
邻接矩阵广度优先遍历(BFS)是一种用于遍历或搜索图的算法,以下是具体介绍: 1. 基本概念 图是一种非线性的数据结构,由顶点和边组成,可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数…...
List的模拟实现(2)
前言 上一节我们讲解了list的基本功能,那么本节我们就结合底层代码来分析list是怎么实现的,那么废话不多说,我们正式进入今天的学习:) List的底层结构 我们先来看一下list的底层基本结构: 这里比较奇怪的…...
【C++设计模式】观察者模式(1/2):从基础到优化实现
1. 引言 在 C 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重…...
可狱可囚的爬虫系列课程 13:Requests使用代理IP
一、什么是代理 IP 代理 IP(Proxy IP)是一个充当“中间人”的服务器IP地址,用于代替用户设备(如电脑、手机等)直接与目标网站或服务通信。用户通过代理IP访问互联网时,目标网站看到的是代理服务器的IP地址&…...
冒险岛079 V8 整合版源码搭建教程+IDEA启动
今天教大家来部署下一款超级怀旧游戏冒险岛,冒险岛源码是开源的,但是开源的代码会有各种,本人进行了加工整合,并且用idea进行了启动测试,经过修改后没有任何问题。 启动截图 后端控制台 前端游戏界面 声明 冒险岛源码…...
Web刷题之PolarDN(中等)
1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当&…...
[250224] Yaak 2.0:Git集成、WebSocket支持、OAuth认证等 | Zstandard v1.5.7 发布
目录 Yaak 2.0 发布:Git 集成、WebSocket 支持、OAuth 认证等众多功能!Zstandard v1.5.7 发布:性能提升,稳定性增强 Yaak 2.0 发布:Git 集成、WebSocket 支持、OAuth 认证等众多功能! Yaak,一款…...
插入排序:一种简单而直观的排序算法
大家好!今天我们来聊聊一个简单却非常经典的排序算法——插入排序(Insertion Sort)。在所有的排序算法中,插入排序是最直观的一个。 一、插入排序的基本思想 插入排序的核心思想是:将一个待排序的元素,插…...