【商城实战(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 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Netty笔记6:Netty组件
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
大模型学习笔记------Llama 3模型架构简介
大模型学习笔记------Llama 3模型架构 1、整体网络结构2、主要创新点3、其他关键改进点 LLaMA(Large Language Model Meta AI)系列模型是Meta发布并开源,分别在2023年2月、2023年7月和2024年4月发布了经历了LLaMA 1、LLaMA 2和LLaMA 3模型。本文只讲相对比较成熟、性…...
DeepSeek本地接口调用(Ollama)
前言 上篇博文,我们通过Ollama搭建了本地的DeepSeek模型,本文主要是方便开发人员,如何通过代码或工具,通过API接口调用本地deepSeek模型 前文:DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注:本文不仅…...
C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...
DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...
Kali CentOs 7代理
工具v2↓ kali_IP段v2端口例子<1> kali_IP段v2端口例子<2> CentOs 7 //编辑配置文件 vi /etc/profile//在该配置文件的最后添加代理配置 export http_proxyhttp://ip:port //代理服务器ip地址和端口号 export https_proxyhttp://ip:port //代理服务器ip地址和…...
LabVIEW虚拟频谱分析仪
在电子技术快速发展的今天,频谱分析已成为信号优化与故障诊断的核心手段。传统频谱分析仪虽功能强大,但价格高昂且体积笨重,难以满足现场调试或移动场景的需求。 基于LabVIEW开发的虚拟频谱分析仪通过软件替代硬件功能,显著降低成…...
商城源码的框架
商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架: WooCommerce:基于WordPress的电子商务插件,适用于小型到中型的在线商店。 Magento:一个功能强大和灵活的开源电子商务平台&am…...
关联封号率降70%!2025最新IP隔离方案实操手册
高效运营安全防护,跨境卖家必看的风险规避指南 跨境账号管理的核心挑战:关联封号风险激增 2024年,随着全球电商平台对账号合规的审查日益严苛,“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...
Qwen2-Audio系列学习笔记
模型介绍 GitHub - QwenLM/Qwen2-Audio: The official repo of Qwen2-Audio chat & pretrained large audio language model proposed by Alibaba Cloud. https://arxiv.org/pdf/2407.10759 https://zhuanlan.zhihu.com/p/712987238 We introduce the latest progress o…...
高频 SQL 50 题(基础版)_1341. 电影评分
高频 SQL 50 题(基础版)_1341. 电影评分 思路 思路 (select Users.name results from Users left join MovieRating on Users.user_id MovieRating.user_id group by(Users.name) order by count(MovieRating.movie_id) desc,Users.name asc limit 1) u…...
C#批量压缩并上载CSV数据文件到Box企业云盘
C# .NET 8实现Windows下批量压缩csv文件为zip文件,然后异步上传到box企业云服务网盘路径,实现异常处理和写入运行状态日志,参数来自ini配置文件。 C# .NET 8代码示例,包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录…...
pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码
PySide6的QtCharts类支持绘制各种型状的图表,如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等,下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果,实际使用时参照代码中示例数据的格式将实际数据替换即可…...
阿里万相,正式开源
大家好,我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门,而且还是免费向所有人敞开的那种。 你想想看,在这个科技飞速发展的时代,AI就像是拥有神奇魔法的魔法师,不断地给我们带来各种意想…...
Golang语法特性总结
1.认识Golang代码特性 package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否…...
AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例
文生图即以文字描述来生成图像,这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片,除了选择好的模型,在文生图中,提示词特别关键。 一、什么是提示词(Prompt) 提示词又称创意、关键词、咒语、ca…...
getline的使用(L1-059敲笨钟)
在 C 中,getline 函数主要有两种常用的形式,分别是 <iostream> 头文件中的 std::getline 用于从输入流读取一行字符串,以及 <cstdio> 头文件中的 std::getline(C11 引入)用于从文件流读取一行。下面分别介…...
Python数据可视化
1.Python 数据可视化全指南 🚀 数据可视化是数据分析和机器学习的关键环节,Python 提供了丰富的可视化库,如 Matplotlib、Seaborn、Plotly、Pandas 内置可视化等。以下是 Python 可视化的核心内容及最佳实践。 2. 基础可视化库 2.1 Matplot…...
探秘基带算法:从原理到5G时代的通信变革【五】CORDIC算法
文章目录 2.4 CORDIC算法2.4.1 CORDIC算法的基本原理2.4.2 方法论与分类体系旋转模式矢量模式线性模式 2.4.3 **CORDIC 算法中的误差来源****角度逼近误差的分析****缩放效应误差的分析****精度需求与迭代次数的关系****常见应用场景下的迭代次数建议****总结** 2.4.4优缺点分析…...
golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)
目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…...
大语言模型学习--本地部署DeepSeek
本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…...
力扣-动态规划-53 最大子数组和
思路 dp数组定义:以i为结尾的字符串的最大子数组和为dp[i]递推公式: dp[i] max(nums[i], dp[i-1] nums[i]);dp数组初始化:dp[0] nums[0];遍历顺序:顺序时间复杂度: 代码 class Solution { public:int maxS…...
论文阅读和代码实现EfficientDet(BiFPN)
BiFPN 采用双向特征融合,让 P3 和 P4 不仅能获取来自 Backbone 的信息,还可以有效吸收 P5 的高级语义特征,增强小目标的判别能力 通过 加权特征融合(Weighted Feature Fusion),BiFPN 让 P3 层能够 自动调整…...
[杂学笔记] 封装、继承、多态,堆和栈的区别,堆和栈的区别 ,托管与非托管 ,c++的垃圾回收机制 , 实现一个单例模式 注意事项
文章目录 1.封装、继承、多态2. 堆和栈的区别3.指针和引用的区别4. 托管与非托管5. c的垃圾回收机制6. 实现一个单例模式 注意事项 1.封装、继承、多态 封装就是将数据和内部的方法封装到一个类中,对外隐藏内部实现细节,但是留下了公共接口提供给外部使…...
c++ std::bind、std::bind_front使用笔记
c std::bind、std::bind_front使用笔记 std::bind 和 std::bind_front 的使用说明std::bind (C11 引入)std::bind_front (C20 引入) 应用场景应用注意事项应用注意事项的例子 std::bind 和 std::bind_front 的使用说明 std::bind (C11 引入) std::bind 用于创建一个新的可调用…...
神策数据严正声明
近日,我们发现有不法分子冒充神策网络科技(北京)有限公司(以下简称”神策数据”)的名义,发布虚假的招聘广告、面试邀请,企图误导求职者并进行不法行为。对此,我司发布严正声明&#…...
vue+elementui 实现上传文件/导入文件的功能
vueelementui 实现上传文件/导入文件的功能 1. 上传组件 <el-form-item label"上传文件:"><el-uploadaction"":file-list"fileList":show-file-list"false":http-request"handUpLoad"drag:limit"…...
FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)
文章目录 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)1. 符号提取 prompt2. 文件查询 prompt3. 总结 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解) 在开发过程…...
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势 在人工智能领域的探索之路上,李国杰院士凭借深厚的学术造诣和前瞻性的眼光,成为指引方向的重要灯塔。 李国杰院士任职于中国科学院计算技术研究所,担任研究员一职。他不仅是…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
认识时钟树
时钟源 高速外部震荡器HSE 低速外部震荡器LSE 高速内部震荡器HSI 低速内部震荡器LSI 易混淆点: RC(Resistor-Capacitor,电阻-电容振荡器)一般是内部时钟源 RTC(Real-Time Clock,实时时钟)…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
问了AI写的不错,记录一下,排查一些报错的时候比较好用 在 Linux 中,您可以通过命令行工具查看某个文件夹下的所有文件(限制到当前文件夹及其子文件夹两层深度),并搜索包含特定单词(如 XXXXX&am…...
Android 常见View的防抖
在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...
Unity打包到webgl鼠标图标大小不正确
我使用了自定义鼠标纹理,打包出来发现鼠标特别的大,位置也不对劲 研究了一下,不考虑浏览器界面缩放的话,可以直接改import settings的最大尺寸,改成合适的尺寸。 暂时先这样解决吧 最后贴一个设置鼠标图标的代码 pub…...
CentOS 7中安装Dify
Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...
爬蟲動態IP代理與數據採集穩定性
對於從事爬蟲開發的人來說,IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站,通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用,會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
解决Vscode项目同时运行两个项目终端无法自动叠加的问题
终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...
vuex中的state是响应式的吗?
在 Vue.js 中,Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时,依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的,该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...
k8s面试题总结(九)
1.K8s中pod删除失败,有哪些情况?如何解决? Pod删除失败的情况: (1) Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod 解决:先删除引用该pod的资源,再删除pod…...
【JQuery—前端快速入门】JQuery 操作元素
JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法: 这三个方法即可以获取元素的内容,又可以设置元素的内容. 有参数时,就进行元素的值设置,没有参数时,就进行元素内容的获取. 接下来,我们需…...
三维数据可视化与表面重建:Marching Cubes算法的原理与应用
1. 引言 随着现代医学影像技术的飞速发展,三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中,Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…...
网络变压器的主要电性参数与测试方法(2)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...
端到端自动驾驶——cnn网络搭建
论文参考:https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目,首先需要配置好我的仿真环境,下载软件udacity: https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...
# 【Unity】【游戏开发】赛车游戏中碰撞加速的实现方法
背景 在赛车类游戏开发中,常常需要实现赛车在碰撞某些道具或对象后加速的功能。例如,当赛车经过加速带或碰撞加速道具时,速度会瞬间增加,使游戏更具动态性和可玩性。本文将介绍一种通用的实现方式,并分析其逻辑。 分析 加速的核心逻辑如下: 判断碰撞条件:检测赛车是否…...