【商城实战(2)】商城架构设计:从底层逻辑到技术实现
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。
目录
- 一、整体架构规划
- 1.1 绘制商城整体架构图
- 1.2 各模块功能解析
- 1.3 模块间关系梳理
- 二、前端架构设计
- 2.1 技术栈选择
- 2.2 SPA 实现原理
- 2.3 前端架构优势
- 三、后端架构设计
- 3.1 微服务架构应用
- 3.2 服务间通信方式
- 3.3 后端架构的可扩展性与维护性
一、整体架构规划
1.1 绘制商城整体架构图
为了构建一个高效、稳定且可扩展的商城系统,我们精心设计了如下的整体架构图,它清晰地展示了商城系统各个关键部分及其相互关系。
如图所示,商城系统主要由前端、后端、数据库、缓存和消息队列等部分构成。前端负责与用户进行交互,提供直观、友好的界面;后端则专注于处理各种复杂的业务逻辑;数据库用于存储系统运行所需的各类数据;缓存能够显著提升系统的响应速度;消息队列实现了系统各模块之间的异步通信。
1.2 各模块功能解析
- 前端:作为用户与商城系统交互的入口,前端的主要职责是呈现丰富多样的页面,包括商品展示页面、购物车页面、订单详情页面等,使用户能够方便地浏览商品、添加商品到购物车、下单购买以及查看订单状态等。同时,前端还负责处理用户的各种输入操作,如搜索商品、选择商品规格、填写收货地址等,并将这些操作请求及时发送给后端进行处理。
- 后端:后端是商城系统的核心,承担着处理业务逻辑的重任。它接收前端传来的请求,根据不同的业务场景进行相应的处理。例如,在用户注册登录时,验证用户的账号密码;在商品管理方面,实现商品的添加、修改、删除、查询等操作;在订单处理过程中,完成订单的创建、支付、发货、退款等流程。此外,后端还需要与数据库、缓存、消息队列等其他组件进行交互,以确保业务的正常运行。
- 数据库:数据库用于持久化存储商城系统的各类数据,包括用户信息(如账号、密码、姓名、联系方式等)、商品信息(如商品名称、价格、库存、描述等)、订单信息(如订单编号、订单状态、商品明细、支付金额等)以及其他相关数据。它为商城系统提供了数据的持久化保存和可靠的查询服务,确保数据的完整性和一致性。
- 缓存:缓存的主要作用是存储经常被访问的数据,如热门商品信息、用户登录状态等。当用户请求这些数据时,系统可以直接从缓存中获取,而无需频繁地访问数据库,从而大大提高了系统的响应速度,减轻了数据库的压力。常见的缓存技术有 Redis 等,它具有高性能、高并发的特点,非常适合用于商城系统的缓存场景。
- 消息队列:消息队列在商城系统中扮演着重要的角色,它实现了系统各模块之间的异步通信和解耦。例如,在用户下单后,订单系统可以将订单信息发送到消息队列中,然后由其他相关系统(如库存系统、物流系统)从消息队列中获取订单信息并进行相应的处理。这样,即使某个系统出现故障或暂时不可用,也不会影响整个下单流程的正常进行,提高了系统的可用性和稳定性。同时,消息队列还可以用于实现流量削峰,在高并发场景下,将大量的请求暂存到消息队列中,然后按照系统的处理能力逐步进行处理,避免系统因瞬间高流量而崩溃。
1.3 模块间关系梳理
- 前端与后端通信:前端通过 HTTP/HTTPS 协议向后端发送请求,后端接收到请求后进行处理,并将处理结果以 JSON 等格式返回给前端。这种通信方式简洁高效,能够满足商城系统中各种业务场景的需求。例如,前端用户在商品详情页面点击 “加入购物车” 按钮,会向后端发送一个包含商品 ID、购买数量等信息的请求,后端接收到请求后,将商品信息添加到用户的购物车中,并返回添加成功的响应给前端。
- 后端与数据库交互:后端在处理业务逻辑过程中,需要频繁地与数据库进行交互,进行数据的读取和写入操作。例如,在用户注册时,后端会将用户输入的注册信息写入数据库的用户表中;在查询商品列表时,后端会从数据库的商品表中读取商品数据,并返回给前端展示。为了提高数据访问效率,后端通常会使用数据库连接池来管理数据库连接,减少连接创建和销毁的开销。
- 缓存与后端、数据库的关系:缓存位于后端和数据库之间,当后端需要获取数据时,首先会检查缓存中是否存在该数据。如果缓存中存在,则直接从缓存中获取,避免了对数据库的访问;如果缓存中不存在,则从数据库中读取数据,并将数据存储到缓存中,以便下次访问时能够直接从缓存中获取。这样,缓存有效地减轻了数据库的压力,提高了系统的响应速度。例如,当用户频繁访问热门商品列表时,后端可以从缓存中快速获取商品数据,而无需每次都查询数据库。
- 消息队列与其他模块的关系:消息队列作为系统各模块之间的异步通信桥梁,实现了模块之间的解耦。当某个模块产生一个事件(如订单创建、商品库存更新等)时,它可以将相关的消息发送到消息队列中。其他对该事件感兴趣的模块可以从消息队列中订阅并获取这些消息,然后进行相应的处理。例如,订单系统在创建订单后,将订单消息发送到消息队列,库存系统订阅该消息,接收到订单消息后,根据订单中的商品数量更新商品库存。这种异步通信方式使得各模块之间的耦合度降低,提高了系统的可维护性和扩展性。
二、前端架构设计
2.1 技术栈选择
在前端开发中,我们选用了一系列先进且高效的技术,构建出一个功能强大、用户体验出色的商城前端架构。
uniapp 是我们前端开发的核心框架,它基于 Vue.js,具备强大的跨平台能力。通过 uniapp,我们只需编写一套代码,就能同时发布到多个平台,如 iOS、Android、Web 以及各种小程序等。这大大提高了开发效率,减少了开发成本,使得我们能够快速响应市场需求,覆盖更广泛的用户群体。例如,在开发商城的移动端应用时,使用 uniapp 可以轻松实现 iOS 和 Android 平台的兼容,避免了为不同平台分别开发带来的繁琐工作。
Element Plus 是基于 Vue 3 构建的桌面端组件库 ,它为我们提供了丰富多样的组件,如按钮、表单、对话框、表格等。这些组件不仅设计精美,而且具有良好的交互性和易用性。借助 Element Plus,我们可以快速搭建出美观、专业的商城界面,提升用户的视觉体验和操作感受。比如,在商品详情页面,我们使用 Element Plus 的卡片组件展示商品信息,使用按钮组件实现添加购物车、立即购买等操作,使页面简洁明了,操作便捷。
axios 作为一个基于 Promise 的 HTTP 客户端,负责前端与后端之间的数据请求通信。它具有简洁的 API,支持多种 HTTP 请求方法,如 GET、POST、PUT、DELETE 等,并且可以方便地进行请求拦截和响应处理。在商城中,无论是获取商品列表、查询用户订单,还是提交用户注册信息、处理支付请求,axios 都能高效地完成数据传输任务,确保前端与后端之间的数据交互稳定、可靠。例如,当用户在商城中搜索商品时,前端通过 axios 向后端发送 GET 请求,携带搜索关键词,后端接收到请求后进行数据查询,并将结果返回给前端,axios 负责处理请求和响应的过程,保证数据的准确传输。
2.2 SPA 实现原理
单页应用(SPA)是商城前端架构的重要模式,它通过路由机制实现页面无刷新切换,为用户带来流畅的浏览体验。
在 SPA 中,前端路由扮演着关键角色,以 Vue Router 为例,它通过定义 URL 与组件之间的映射关系,使得应用程序能够根据 URL 的变化动态地加载不同的组件。当用户在商城中进行页面切换时,比如从首页跳转到商品详情页,URL 会发生变化,Vue Router 监听到 URL 的变化后,会根据预先定义好的路由规则,找到对应的商品详情组件,并将其渲染到页面中,而无需重新加载整个页面。这个过程中,页面的其他部分保持不变,只有需要更新的组件区域进行了动态更新,大大提高了页面切换的速度和效率。
同时,SPA 还通过动态加载组件与数据来提升性能和用户体验。在传统的多页应用中,页面加载时会一次性加载所有的资源和数据,而 SPA 采用按需加载的方式,只有当用户访问某个路由时,才会加载对应的组件和数据。例如,在商城中,用户未点击商品详情链接时,商品详情组件及其相关数据不会被加载,只有当用户点击链接后,才会动态加载该商品的详情信息,这样减少了初始加载时间,提高了应用的响应速度。并且,在数据更新方面,SPA 通过与后端进行异步数据交互,当数据发生变化时,只更新页面中受影响的部分,而不是整个页面,进一步提升了用户体验。
2.3 前端架构优势
- 开发效率提升:uniapp 基于 Vue.js 的开发模式,使得开发者可以利用 Vue.js 丰富的生态系统和开发经验,快速上手并进行开发。同时,一套代码多端运行的特性,极大地减少了开发工作量,提高了开发效率。例如,在开发商城的不同端应用时,无需为每个端单独编写代码,节省了大量的时间和人力成本。
- 多端适配便捷:uniapp 的跨平台能力,能够轻松实现商城在 Web、移动端(iOS 和 Android)以及小程序等多个平台上的运行,满足用户在不同设备上的访问需求。无论是使用电脑浏览商城,还是通过手机 APP 或小程序购物,用户都能获得一致的体验。
- 用户体验优化:SPA 的无刷新页面切换机制,让用户在商城中进行页面导航时感受到更加流畅和自然的体验,减少了页面加载等待时间,提高了用户的购物效率和满意度。同时,Element Plus 提供的美观组件和良好交互设计,也进一步提升了用户对商城的好感度。比如,在购物车页面,用户可以方便地进行商品数量调整、删除商品等操作,界面响应迅速,操作流畅。
- 维护成本降低:由于前端代码的统一性和组件化开发模式,使得代码的维护和更新更加容易。当需要修改某个功能或修复某个 Bug 时,只需在一处进行修改,就能在所有平台生效,降低了维护成本和出错的概率。例如,更新商城的某个界面样式,只需修改对应的组件代码,所有端的该界面样式都会同步更新 。
三、后端架构设计
3.1 微服务架构应用
在后端架构设计中,我们采用 Spring Boot 作为基础框架,搭建了高效灵活的微服务架构。Spring Boot 具有快速开发、自动配置等诸多优势,能够极大地提高开发效率,降低项目的搭建成本和维护难度。
将商城业务进行细致拆分,划分为多个独立的微服务模块,每个模块专注于特定的业务领域,实现高内聚、低耦合的设计目标。其中,用户微服务负责管理用户相关的业务逻辑,如用户注册、登录、信息修改、密码找回等功能。它通过与数据库中的用户表进行交互,实现用户数据的持久化存储和查询操作。例如,在用户注册时,用户微服务接收前端传来的用户注册信息,对信息进行合法性验证后,将用户数据插入到数据库的用户表中,并返回注册成功的响应给前端。
商品微服务承担着商品信息的管理工作,包括商品的添加、编辑、删除、查询、上架、下架以及库存管理等操作。它与数据库中的商品表和库存表紧密关联,确保商品数据的准确性和完整性。当商家在商城后台添加新商品时,商品微服务接收商品的详细信息,如商品名称、描述、价格、库存等,并将这些信息存储到数据库中。同时,在用户浏览商品列表或商品详情时,商品微服务从数据库中读取商品数据,返回给前端展示。
订单微服务主要处理订单相关的业务流程,涵盖订单的创建、修改、查询、支付、发货、退款等操作。它与用户微服务、商品微服务以及支付系统等进行交互,协调完成整个订单生命周期的管理。例如,当用户在商城中选择商品并提交订单时,订单微服务首先创建订单记录,关联用户信息和商品信息,然后调用支付系统进行支付处理。在支付成功后,订单微服务更新订单状态,并通知库存微服务扣减相应商品的库存。
每个微服务都可以独立进行开发、测试、部署和扩展,互不干扰。当某个微服务需要进行功能升级或修复 Bug 时,只需对该微服务进行相应的操作,而不会影响到其他微服务的正常运行。这种独立的开发和部署方式,使得团队能够更加高效地进行协作开发,提高开发速度和质量。同时,当业务量增长导致某个微服务的负载过高时,可以方便地对该微服务进行水平扩展,通过增加服务器实例来提高其处理能力,确保系统的性能和稳定性。
3.2 服务间通信方式
- RESTful API 通信:各个微服务之间通过 RESTful API 进行通信,这种基于 HTTP 协议的通信方式具有简单、直观、易于理解和实现的特点。RESTful API 使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE 等)来操作资源,每个微服务都对外暴露一组清晰的 API 接口,其他微服务可以通过发送 HTTP 请求来调用这些接口,获取数据或执行特定的业务操作。例如,商品微服务提供了获取商品列表的 API 接口,订单微服务在需要查询商品信息时,可以向商品微服务发送 GET 请求,携带必要的参数(如商品类别、页码、每页数量等),商品微服务接收到请求后,根据参数查询数据库,并将商品列表数据以 JSON 格式返回给订单微服务。
- 服务注册与发现:为了实现微服务之间的动态发现和通信,我们引入了服务注册中心 Eureka。每个微服务在启动时,会将自己的服务信息(包括服务名称、IP 地址、端口号、健康状态等)注册到 Eureka Server 上。Eureka Server 维护着一个服务注册表,记录了所有注册的微服务信息。当某个微服务需要调用其他微服务时,它首先从 Eureka Server 获取目标微服务的地址信息,然后根据这些信息进行通信。这样,即使微服务的地址发生变化(例如因为服务器迁移、扩容等原因),其他微服务也能够通过 Eureka Server 动态地获取到最新的地址,保证通信的正常进行。例如,用户微服务需要调用订单微服务的创建订单接口,它会先从 Eureka Server 查询订单微服务的地址,然后向该地址发送创建订单的 HTTP 请求。
- Feign 简化服务调用:Feign 是一个声明式的 Web 服务客户端,它基于 RESTful API,进一步简化了微服务之间的调用过程。通过 Feign,我们只需定义一个接口,并在接口上使用注解来声明需要调用的 API,Feign 会自动为我们实现接口的调用逻辑,包括构建 HTTP 请求、发送请求、处理响应等操作。这样,在代码中调用其他微服务的接口就像调用本地方法一样简单,提高了代码的可读性和维护性。例如,在用户微服务中,如果需要调用商品微服务获取商品详情,我们可以定义一个 Feign 接口,使用 @FeignClient 注解指定目标微服务的名称,然后在接口方法上使用 @RequestMapping 等注解定义 API 路径和请求方法。在使用时,只需注入该 Feign 接口,即可调用相应的方法获取商品详情,无需手动编写复杂的 HTTP 请求代码。
3.3 后端架构的可扩展性与维护性
- 灵活扩展:微服务架构的设计使得后端系统具有出色的可扩展性。当商城业务规模不断扩大,某个微服务的负载增加时,我们可以轻松地对该微服务进行水平扩展,通过增加服务器实例来提高其处理能力。例如,如果商品微服务在促销活动期间面临大量的商品查询请求,导致性能下降,我们可以在不影响其他微服务的情况下,快速启动多个商品微服务实例,并通过负载均衡器将请求分发到这些实例上,从而有效地应对高并发的业务场景。这种按需扩展的能力,使得系统能够根据业务需求灵活调整资源配置,避免了资源的浪费,同时保证了系统的高性能和稳定性。
- 独立维护:由于各个微服务之间相互独立,每个微服务都有自己独立的代码库、数据库和运行环境,因此在维护时可以针对单个微服务进行操作,降低了系统的维护复杂度。当某个微服务出现问题或需要进行功能升级时,开发人员可以专注于该微服务的代码和逻辑,而不会对其他微服务产生影响。例如,当订单微服务需要添加新的订单状态(如订单已取消)时,开发人员只需在订单微服务的代码中进行相应的修改和测试,然后重新部署该微服务即可,其他微服务(如用户微服务、商品微服务等)无需任何改动。这种独立维护的特性,使得系统的维护成本大大降低,同时提高了系统的可靠性和稳定性。
- 降低耦合度:微服务架构通过将商城业务拆分为多个独立的服务模块,每个模块只负责特定的业务功能,从而有效地降低了系统的耦合度。不同微服务之间通过定义明确的 API 进行通信,它们之间的依赖关系更加清晰和可控。这种低耦合的设计使得系统在进行功能扩展、修改和维护时更加灵活,减少了因模块之间的紧密耦合而带来的风险。例如,如果商城需要引入新的支付方式,只需要在支付微服务中进行相应的开发和配置,而不会影响到其他微服务的正常运行。同时,低耦合度也有利于团队的分工协作,不同的开发团队可以专注于不同的微服务模块,提高开发效率和质量。
相关文章:

【商城实战(2)】商城架构设计:从底层逻辑到技术实现
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
数据序列化协议 Protobuf 3 介绍(Go 语言)
Protobuf 3 入门 1. 什么是序列化? 1.1 概念 序列化(Serialization 或 Marshalling) 是指将数据结构或对象的状态转换成可存储或传输的格式。反向操作称为反序列化(Deserialization 或 Unmarshalling),它…...

从芯片到光网络:解密平面光波导技术(PLC)核心优势
关键词:PLC、OFDR、光链路检测 平面光波导技术(Planar Lightwave Circuit, PLC)是一种基于平面波导结构的光学器件制造技术。它通过在平面基底上制作光波导,实现光信号的传输、分路、耦合、调制等功能。PLC技术的核心在于利用光波…...

5分钟快速搭建一个 SpringBoot3 + MyBatis-Plus 工程项目
环境 idea 2023.3.5 jdk 17 mysql 8 创建SpringBoot工程 创建SpringBoot工程,这里有两种方式可选,一种是使用idea提供的Spring Initializr自动创建,一种是通过Maven Archetype手动创建 自动创建SpringBoot工程 使用Spring Initializr创建…...
如何判断https使用了哪个版本的TLS?
互联网各领域资料分享专区(不定期更新): Sheet 正文 一、使用浏览器开发者工具(适合普通用户) 1. Google Chrome 打开目标网站(如 https://example.com)。点击地址栏左侧的 锁形图标。选择 「连接是安全的」 → 「证书信息」。在证书详情中,查看 「技术详细信息」 或 「…...

如何在 NocoBase 中实现 CRM 的线索转化
1. 引言 本教程将一步一步地引导您如何在 NocoBase 中实现 CRM 的商机转化(Opportunity Conversion)功能。我们将介绍如何创建所需的 collections(数据表)、配置数据管理页面、设计转化流程以及设置关联管理,从而帮助…...
StarRocks-fe工程在Cursor中不能识别为Java项目
SR简介 StarRocks 是一款高性能分析型数据库,支持实时、多维度、高并发的数据分析。本指南旨在解决在使用 VSCode 或 Cursor 开发 StarRocks 后端项目时遇到的模块识别问题。 问题描述 使用 Cursor 或 VSCode 打开 StarRocks 的后端工程 fe 时,spark-…...
影刀RPA开发拓展--SQL常用语句全攻略
前言 SQL(结构化查询语言)是数据库管理和操作的核心工具,无论是初学者还是经验丰富的数据库管理员,掌握常用的 SQL 语句对于高效管理和查询数据都至关重要。本文将系统性地介绍最常用的 SQL 语句,并为每个语句提供详细…...

05类加载机制篇(D6_方法调用和方法执行)
目录 一、字节码指令集 二、基本数据类型 1. 加载和存储指令 2. const系列 3. push系列 4. ldc系列 5. load系列 load系列A load系列B 6. store系列 store系列A store系列B 7. pop系列 8. 栈顶元素数学操作及移位操作系列 9. 运算指令 10. 类型转换指令 11. 宽…...
视音频数据处理入门:颜色空间(二)---ffmpeg
目录 概述 流程 相关流程 初始化方法 初始化代码 转换方法 转换代码 释放方法 整体代码介绍 代码路径 概述 本篇简单说一下基于FFmpeg的libswscale的颜色空间转换;Libswscale里面实现了各种图像像素格式的转换,例如:YUV与RGB之间的…...

从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略
前言 最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。 作为一名AI基础…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(5)
1.问题描述: 提供两套标准方案,可根据体验需求选择: 1.地图Picker(地点详情) 用户体验:①展示地图 ②标记地点 ③用户选择已安装地图应用 接入文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guide…...
Leetcode 3469. Find Minimum Cost to Remove Array Elements
Leetcode 3469. Find Minimum Cost to Remove Array Elements 1. 解题思路2. 代码实现 题目链接:3469. Find Minimum Cost to Remove Array Elements 1. 解题思路 这一题我没啥特别好的思路,就只能动态规划了,倒是也能过,不过总…...

Excel的行高、列宽单位不统一?还是LaTeX靠谱
想要生成田字格、米字格、带拼音标准,方便小学生书法和练字。Word,Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时,如果没有专用模板、奇奇怪怪的插件,使用起来会碰到各种问题。比如,Word里面用…...

(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)
物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意:ESP-01sWIFI模块,去搜了一下这个小东西很有玩点,远程控制LED啥的,然后我就想…...

告别GitHub连不上!一分钟快速访问方案
一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…...
迷你世界脚本对象库接口:ObjectLib
对象库接口:ObjectLib 迷你世界 更新时间: 2023-04-26 20:21:09 具体函数名及描述如下: 序号 函数名 函数描述 1 getAreaData(...) 获取区域数据 2 getPositionData(...) 获取位置数据 3 getLivingData(...) 获取生物数据 4 getItemDat…...

数据库事务、乐观锁及悲观锁
参考:node支付宝支付及同步、异步通知、主动查询支付宝订单状态 以下容结合上述链接查看 1. 什么是数据库事务? 1.1. 连续执行数据库操作 在支付成功后,我们在自定义的paidSuccess里,依次更新了订单状态和用户信息。也就说这里…...
蓝桥王国--dij模板
#include <bits/stdc.h> // 万能头 using namespace std; typedef pair<long long ,int> PII; int n,m; long long d[300011]; struct edge///邻接表 {int v;long long w; }; int vis[300011]; vector<edge> mp[300011];///邻接表 void dij(int s)///dij单源…...

Java基础关键_017_集合(一)
目 录 一、概述 二、Collection 关系结构 1.概览 2.说明 三、Collection 接口 1.通用方法 (1)add(E e) (2)size() (3)addAll(Collection c) (4)contains(Object o) &#…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...