第27周JavaSpringboot电商进阶开发 2.常用功能进阶
电商常用功能进阶 - 课程笔记整理
Excel解析与处理
一、课程内容概述
本小节开始进入电商常用功能进阶部分,主要讲解以下内容:
- Excel的解析和处理
- 商品图片的处理
- Valid注解对列表的验证
- 订单数变化趋势图
- Spring Boot高级功能
二、Excel解析与处理的背景
在Java中解析Excel表格是非常常见的需求,尤其在电商场景中。例如,运营人员可能需要批量导入商品或用户信息,使用Excel可以提高效率,因为Excel在数据处理、求和、平均值计算等方面能力强大。
三、主流技术栈介绍
目前有两个主流的Excel处理工具:
- Apache POI
- 官网:Apache POI
- 特点:
- 用于处理Microsoft文档的Java API,包括Excel、Word、PPT等。
- 从4.0版本开始,需要Java 8或更高版本。
- 支持处理Excel(.xls和.xlsx)、Word(.doc和.docx)、PPT(.ppt和.pptx)等格式。
- Maven依赖可直接引入,无需手动下载。
- 阿里EasyExcel
- 官网:阿里EasyExcel
- 特点:
- 阿里巴巴出品,基于语雀展示。
- 主要解决内存溢出问题,适合处理超大Excel文件。
- 内部利用了POI,但对POI 07版解析进行了重写,避免内存问题。
四、Excel相关概念
Apache POI中的重要概念
- Workbook:整个Excel表格文件,可以包含多个Sheet。
- Sheet:工作表,每个Sheet是一个有行有列的内容区域。
- Row:行,代表Excel中的一行数据。
- Cell:单元格,代表Excel中的一个单元格数据。
五、技术选型建议
- Apache POI:适用于大多数场景,功能全面,社区支持广泛。不仅可用于Excel,还可用于Word、PPT等文档处理。
- EasyExcel:适用于需要处理超大Excel文件的场景,避免内存溢出问题。
六、课程实践
代码编写
1. 添加商品批量导入功能
在ProductAdminController
中添加一个方法,用于处理商品批量导入:
@PostMapping("/admin/upload/product")
public void uploadProduct(@RequestParam("file") MultipartFile file) {// 获取文件名String fileName = file.getOriginalFilename();// 获取文件后缀String suffix = fileName.substring(fileName.lastIndexOf("."));// 生成唯一文件名String uuid = UUID.randomUUID().toString();String newFileName = uuid + suffix;// 创建文件File destFile = new File(Constant.FILE_PATH + newFileName);// 创建文件夹(如果不存在)File fileDirectory = new File(Constant.FILE_PATH);if (!fileDirectory.exists()) {boolean created = fileDirectory.mkdirs();if (!created) {throw new ImMoreException("文件夹创建失败");}}try {file.transferTo(destFile);// 通过Excel导入商品addProductByExcel(destFile);} catch (IOException e) {throw new ImMoreException("文件上传失败");}
}
2. 读取Excel文件并解析商品信息
创建一个方法addProductByExcel
,用于读取Excel文件并解析商品信息:
private void addProductByExcel(File excelFile) {try (FileInputStream inputStream = new FileInputStream(excelFile)) {XSSFWorkbook workbook = new XSSFWorkbook(inputStream);Sheet firstSheet = workbook.getSheetAt(0);Iterator<Row> rowIterator = firstSheet.iterator();List<Product> products = new ArrayList<>();while (rowIterator.hasNext()) {Row nextRow = rowIterator.next();Iterator<Cell> cellIterator = nextRow.cellIterator();Product product = new Product();while (cellIterator.hasNext()) {Cell nextCell = cellIterator.next();int columnIndex = nextCell.getColumnIndex();Object cellValue = getCellValue(nextCell);switch (columnIndex) {case 0:product.setName((String) cellValue);break;case 1:product.setImage((String) cellValue);break;case 2:product.setDetail((String) cellValue);break;case 3:product.setCategoryId(((Double) cellValue).intValue());break;case 4:product.setPrice((Double) cellValue);break;case 5:product.setStock(((Double) cellValue).intValue());break;case 6:product.setStatus((String) cellValue);break;}}products.add(product);}// 将商品信息存入数据库saveProductsToDatabase(products);} catch (IOException e) {throw new ImMoreException("Excel文件读取失败");}
}
3. 工具方法getCellValue
创建一个工具类ExcelUtils
,用于处理Excel单元格的值:
public class ExcelUtils {public static Object getCellValue(Cell cell) {switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case BOOLEAN:return cell.getBooleanCellValue();case NUMERIC:return cell.getNumericCellValue();default:return null;}}
}
4. 将商品信息存入数据库
private void saveProductsToDatabase(List<Product> products) {for (Product product : products) {Product existingProduct = productMapper.selectByName(product.getName());if (existingProduct != null) {throw new ImMoreException("商品名不允许重复");}int count = productMapper.insertSelective(product);if (count == 0) {throw new ImMoreException("新增失败");}}
}
七、测试与验证
- 启动项目:确保项目正常启动。
- 准备Excel文件:按照模板格式准备商品数据。
- 使用Postman测试:
- 创建一个POST请求,URL为
/admin/upload/product
。 - 在请求体中选择
form-data
,添加一个文件字段file
,选择准备好的Excel文件。 - 发送请求,检查响应是否成功。
- 创建一个POST请求,URL为
- 验证数据库:检查数据库中是否成功插入了商品数据。
八、总结
本小节通过实际案例演示了如何使用Apache POI进行Excel文件的解析和处理,包括文件上传、Excel读取、数据解析和数据库操作。希望小伙伴们能够掌握这些技能,灵活应用于实际项目中。
图片处理
一、图片处理的背景
在电商项目中,用户或运营人员上传的图片往往尺寸较大,不适用于移动端浏览,不仅耗费流量,还会增加加载时间。此外,图片容易被其他商家盗用,因此需要进行处理,包括缩放和添加水印。
二、工具介绍
我们将使用 Thumbnails 工具,它支持读取图像并进行缩放、旋转、透明化、打水印等操作,支持多种图片格式(如 JPG、PNG、GIF、BMP)。其官网提供了丰富的示例,便于学习和使用。
三、功能实现
1. 引入依赖
在 pom.xml
中添加以下依赖:
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version>
</dependency>
2. 图片处理工具类
创建 ImageUtils
工具类,实现图片的裁剪、缩放、旋转和打水印功能:
import javax.imageio.ImageIO;
import java.io.File;
import java.util.UUID;public class ImageUtils {public static void main(String[] args) {String path = "你的图片路径"; // 替换为你的图片路径String fileName = "草莓.jpg";// 裁剪图片new File(path + File.separator + "crop.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).sourceRegion(Positions.BOTTOM_RIGHT, 200, 200).size(200, 200).toFile(path + File.separator + "crop.jpg");// 缩放图片new File(path + File.separator + "scale_1.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).scale(0.7).toFile(path + File.separator + "scale_1.jpg");new File(path + File.separator + "scale_2.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).scale(1.5).toFile(path + File.separator + "scale_2.jpg");new File(path + File.separator + "size_1.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).size(500, 500).keepAspectRatio(false).toFile(path + File.separator + "size_1.jpg");new File(path + File.separator + "size_2.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).size(500, 500).keepAspectRatio(true).toFile(path + File.separator + "size_2.jpg");// 旋转图片new File(path + File.separator + "rotate_90.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).rotate(90).toFile(path + File.separator + "rotate_90.jpg");new File(path + File.separator + "rotate_180.jpg").getParentFile().mkdirs();Thumbnails.of(new File(path + File.separator + fileName)).rotate(180).toFile(path + File.separator + "rotate_180.jpg");// 打水印new File(path + File.separator + "watermark.jpg").getParentFile().mkdirs();try {Thumbnails.of(new File(path + File.separator + fileName)).watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(path + File.separator + "watermark.png")), 0.5f).toFile(path + File.separator + "watermark.jpg");} catch (Exception e) {e.printStackTrace();}}
}
3. 图片上传接口的改造
在 ProductAdminController
中改造图片上传接口,实现图片的自动处理:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
@RequestMapping("/admin")
public class ProductAdminController {@PostMapping("/upload/image")public String uploadImage(@RequestParam("file") MultipartFile file) {// 获取文件名String fileName = file.getOriginalFilename();// 获取文件后缀String suffix = fileName.substring(fileName.lastIndexOf("."));// 生成唯一文件名String newFileName = UUID.randomUUID().toString() + suffix;// 创建文件File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);// 创建文件夹(如果不存在)File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);if (!fileDirectory.exists()) {boolean created = fileDirectory.mkdirs();if (!created) {throw new ImMoreException("文件夹创建失败");}}try {file.transferTo(destFile);// 处理图片:缩放并打水印Thumbnails.of(destFile).size(400, 400).watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(Constant.FILE_UPLOAD_DIR + Constant.WATERMARK_JPG)), Constant.IMAGE_OPACITY).toFile(Constant.FILE_UPLOAD_DIR + "processed_" + newFileName);return "图片上传并处理成功";} catch (IOException e) {throw new ImMoreException("图片处理失败");}}
}
四、测试与验证
- 启动项目:确保项目正常启动。
- 准备图片:选择一张图片作为测试文件。
- 使用Postman测试:
- 创建一个POST请求,URL为
/admin/upload/image
。 - 在请求体中选择
form-data
,添加一个文件字段file
,选择准备好的图片。 - 发送请求,检查响应是否成功。
- 创建一个POST请求,URL为
- 验证处理结果:检查处理后的图片是否符合预期,包括尺寸、水印和透明度等。
五、总结
本小节学习了使用 Thumbnails 工具进行图片处理的方法,包括裁剪、缩放、旋转和打水印。通过改造图片上传接口,实现了自动处理上传图片的功能,提高了图片的实用性和美观度。
列表参数校验的实现方法
一、问题背景
在实际开发中,前端传入的参数可能是一个列表,需要对列表中的每个元素进行校验。例如,校验列表中的每个 ID 是否大于零。常见的校验注解如 @Min
或 @Max
在列表场景下无法直接使用,因此需要寻找解决方案。
二、解决方案
方法一:手动校验
- 实现步骤:
- 使用
for
循环遍历列表。 - 对每个元素的属性进行手动校验,如
if (updateRequest.getPrice() < 1)
。 - 如果校验失败,抛出自定义异常。
- 使用
- 优点:简单直接,易于理解。
- 缺点:代码冗长,不优雅,难以统一管理。
方法二:自定义列表类
- 实现步骤:
- 创建一个自定义列表类
ValidList
,实现List
接口。 - 在自定义列表类中,对每个元素添加校验逻辑。
- 将普通列表替换为自定义列表。
- 创建一个自定义列表类
- 优点:代码优雅,复用性强。
- 缺点:需要额外实现一个类,稍微增加复杂度。
方法三:使用 @Validated
注解
- 实现步骤:
- 在控制器类上添加
@Validated
注解。 - 在方法参数前添加
@Valid
注解,对列表中的每个元素进行校验。 - 处理校验异常,提供友好的错误信息。
- 在控制器类上添加
- 优点:代码简洁,充分利用 Spring 的校验机制。
- 缺点:需要处理特定的校验异常。
三、代码示例
手动校验
@PostMapping("/admin/product/batchUpdate")
public APIResponse batchUpdateProduct(@RequestBody List<UpdateProductRequest> updateRequests) {for (UpdateProductRequest updateRequest : updateRequests) {if (updateRequest.getPrice() < 1) {throw new ImMoreException("价格过低");}if (updateRequest.getStock() > 10000) {throw new ImMoreException("库存过多");}// 其他校验逻辑}// 更新逻辑return APIResponse.success();
}
自定义列表类
public class ValidList<E> implements List<E> {private List<E> list;public ValidList(List<E> list) {this.list = list;}@Overridepublic int size() {return list.size();}// 其他 List 方法的实现public static void main(String[] args) {List<UpdateProductRequest> updateRequests = new ArrayList<>();ValidList<UpdateProductRequest> validList = new ValidList<>(updateRequests);// 校验逻辑}
}
使用 @Validated
注解
@Validated
@RestController
@RequestMapping("/admin/product")
public class ProductAdminController {@PostMapping("/batchUpdate3")public APIResponse batchUpdateProduct3(@Valid @RequestBody List<UpdateProductRequest> updateRequests) {// 更新逻辑return APIResponse.success();}
}
四、总结
本小节介绍了三种对列表参数进行校验的方法:手动校验、自定义列表类和使用 @Validated
注解。每种方法都有其优缺点,选择时需根据项目实际情况和技术选型进行权衡。手动校验适合简单场景,自定义列表类和 @Validated
注解则更适合复杂和批量校验场景。
电商功能优化与高级特性
一、功能优化
订单状态提示升级
在 order service impl
中,优化订单状态流转相关的异常提示:
- 取消订单:新增枚举
CANCEL_ORDER_STATUS
,提示 “订单状态有误,付款后暂不支持取消订单”。 - 付款操作:新增枚举
PAY_RUN_OTHER_STATUS
,提示 “仅能在未付款时付款”。 - 发货操作:新增枚举
DELIVER_RUN_ORDER_STATUS
,提示 “仅能在付款后发货”。 - 完单操作:新增枚举
FINISH_RUN_ORDER_STATUS
,提示 “仅能在发货后完单”。
商品图片上传优化
在 product admin controller
中,优化图片上传功能:
- 问题分析:原实现方式在服务器部署时可能因转发导致获取的 IP 不准确。
- 解决方案:将 IP 和端口号配置为固定值,避免动态获取。
- 代码调整:
- 引入配置文件中的
file.upload.uri
,替换动态获取 IP 的代码。 - 拼接图片访问地址时,使用配置的 URI 作为前缀。
- 引入配置文件中的
二、新功能开发
订单数变化趋势图
- 接口开发:
- 在
order admin controller
中新增GET
接口adminOrderStatistics
,用于获取每日订单量统计。 - 接口参数为
start_date
和end_date
,指定统计的时间范围。
- 在
- 服务实现:
- 在
order service
中新增statistics
方法,接收起始时间和结束时间作为参数。 - 调用
order mapper
中的查询方法,获取统计数据。
- 在
- 数据查询与转换:
- 创建
order statistics query
类,封装查询条件。 - 在
order mapper
中编写 SQL 语句,使用date_format
函数按天聚合订单数据,计算每天的订单数量。 - 处理时区问题,确保统计结果的准确性。
- 创建
三、Spring Boot 高级功能
指定配置
- 命令行参数:通过命令行指定配置参数,如
server.port
和spring.profiles.active
,覆盖默认配置。 - 多环境配置:介绍常见的四种环境(本地开发、测试、预发、生产),根据实际需求调整配置。
热加载与调试技巧(详情)
- 热加载配置:
- 在 IDEA 中配置调试选项,启用热加载功能。
- 自动编译和更新类资源,提高开发效率。
- 调试技巧:
- 使用断点调试,灵活控制程序执行流程。
- 强制返回值和抛出异常,快速验证逻辑。
- 重新加载修改后的类,实时查看代码改动效果。
相关文章:
第27周JavaSpringboot电商进阶开发 2.常用功能进阶
电商常用功能进阶 - 课程笔记整理 Excel解析与处理 一、课程内容概述 本小节开始进入电商常用功能进阶部分,主要讲解以下内容: Excel的解析和处理商品图片的处理Valid注解对列表的验证订单数变化趋势图Spring Boot高级功能 二、Excel解析与处理的背…...
网络安全基础知识:从零开始了解网络安全
### 网络安全基础知识:从零开始了解网络安全 欢迎来到《零基础入门到独立参加网络安全比赛》系列教程的第一篇!在这篇文章中,我们将从最基础的概念开始,深入探讨网络安全的定义、重要性、常见的网络攻击类型,以及网络…...
【A2DP】蓝牙A2DP协议剖析:从架构到规范
目录 一、A2DP 协议架构 1.1 A2DP 协议栈结构组成 1.2 协议栈各部分的关系与作用 二、设备配置与角色定义(Configurations and roles ) 2.1 角色定义 2.2 配置示例与角色体现 三、用户需求与场景 3.1 用户需求与场景 3.2 协议限制 3.3 协议要求…...
python力扣15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&am…...
Linux之系统文件目录理解
1.boot/ 存储启动系统的相关文件的 2.swap/ 虚拟内存 3.dev/ 用于存放设备文件(device files)。这些文件是操作系统与硬件设备之间的接口,允许用户和程序通过文件操作的方式访问硬件资源 字符设备(Character Devices…...
uvm_transaction, uvm_seq_item, uvm_object, uvm_component的关系
uvm_object ├── uvm_component (验证环境中的静态组件) └── uvm_transaction└── uvm_sequence_item (用于sequence-driver交互的事务) 2. 核心类的作用与区别 (1) uvm_object 定位:所有UVM类的基类。 功能: 提供基础的对象操作&…...
Reflect.get和target[key]有何不同?
主要区别在this指向不同,下面输出张三还是李四?: const person{name:张三,get FullName(){return this.name;},};let personProxynew Proxy(person,{get(target,key){return Reflect.get(target,key)//或者return target[key]}});const p1{__proto__:pe…...
K8s 1.27.1 实战系列(十)PV PVC
一、核心概念与关系 1、PV(Persistent Volume) PV 是集群中的持久化存储资源,由管理员预先创建并配置,独立于 Pod 生命周期。它抽象了底层存储(如 NFS、云存储等),定义存储容量、访问模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等属性。例如,一…...
JQuery
1.jquery介绍 jQuery是目前使用最广泛的javascript函数库。据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库。微软公司甚至把jQuery作为他们的官方库。 jQuery的版本分为1.x系列和2.x、3.x系列,1.x系列兼容低版…...
「AI 加持的高效架构」高并发场景下的服务器成本优化
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
html css 笔记
01_浏览器相关知识 五大主流浏览器: Chrome Safari IE Firefox Opera (拥有自己的内核) 四大内核: webkit Trident Gecko blink. 02_网页相关知识 构成 网址 网站 网页 网页标准: 结构 表现 行为 分别对应 HTML CSS JavaScript 03_HTML简介 H…...
通义万相 2.1:AIGC 领域的 “王炸” 组合如何颠覆创作生态?
引言 在数字化和人工智能的飞速发展中,AIGC(AI生成内容)技术已经成为推动创作、设计和内容生成领域创新的核心力量。而当通义万相2.1与蓝耘智算平台强强联手,这一“王炸”组合不仅提升了AIGC的效率,还为创作生态带来了…...
Math.NET Numerics 库怎么装
你提到的缺少的库是 Math.NET Numerics。 关于 Math.NET Numerics Math.NET Numerics 是一个用于 .NET 平台的开源数学库,提供了以下功能: 线性代数(矩阵运算、求解线性方程组等)。数值计算(积分、微分、优化等&…...
NPM安装与配置全流程详解(2025最新版)
写目录 一、环境准备与Node.js安装1. 下载Node.js(含NPM)2. 验证安装 二、NPM核心配置优化1. 全局模块与缓存路径设置2. 镜像加速3. 代理配置(企业网络适用) 三、NPM基础操作指南1. 项目初始化2. 包管理命令3. 依赖锁定与版本管理…...
python-52-基于Langchain和Faiss实现向量存储和检索的技术原理
文章目录 1 文本加载与预处理1.1 计算文本的MD5哈希值1.2 加载文本并计算哈希2 初始化向量存储2.1 基于Ollama的嵌入模型2.2 获取code和id的对应关系2.3 清空索引向量2.4 基于HuggingFaceEmbeddings的嵌入模型2.4.1 将模型下载到本地2.4.2 使用方式3 添加新文本3.1 处理新文本并…...
游戏引擎学习第140天
回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式,声音在技术上是一个非常特别的存在,但在游戏中进行声音混音的需求其实相对简单明了,所以今天的任务应该不会太具挑战性。 今天我们会编写一个…...
Jetpack Navigation 实战:Fragment 和 Activity 的交互与导航
在 Android 开发中,使用 Jetpack Navigation 组件可以方便地管理 Fragment 和 Activity 之间的导航。以下是如何使用 Jetpack Navigation 实现 Fragment 之间、Activity 之间以及 Activity 与 Fragment 之间跳转的实战示例。 1. 添加依赖 首先,在 build.…...
Linux中的基本指令(上)
目录 ls指令 判断linux中文件 pwd指令 认识路径 编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…...
多用户网页在线聊天室(测试报告)
文章目录 多用户网页在线聊天室一,项目概括1.1 项目名称1.2 测试时间1.3 项目背景1.3 编写目的 二,测试计划2.1 测试环境与配置2.2 测试用例2.3实际执行用例2.3.1登录2.3.2聊天消息列表展示2.3.3聊天消息详情页展示2.3.4联系人页展示2.3.5信息的编辑与发…...
字节青训营后端方向的个人总结(2025年3月4日)
字节青训营的结营总结(25寒假) ——致青训营队友的一封信 明天就是大项目结项的日子了,不知道大家在这方面学习、精进了多少,也许有的朋友收获颇多并且已经完成了项目,我个人对此表示由衷的恭喜和祝贺。 当初自告奋…...
VX iOS分析随记
断SVC的时候看调用栈,发现里面一个特别大的ollvm函数。vx版本8054 * thread #36, queue com.apple.root.default-qos, stop reason breakpoint 4.1 frame #0: 0x0000000111ad6124 WeChat___lldb_unnamed_symbol1315083 20 WeChat___lldb_unnamed_symbol13150…...
docker 小记
一、卸载 查看当前版本 docker -v2. 如果有,先停止docker systemctl stop docker如果是yum安装,卸载方式为 #已防版本冲突,直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…...
AI代码编程辅助工具
现在AI火的一塌糊涂,作为技术应该更应该关注当前AI对编程行业的影响。 分享下当前网络上最火的网络编程辅助工具。 以下是个人搜集到的可以对编程起辅助作用的工具: 2025年最佳AI编程辅助工具 1. GitHub Copilot 这个工具也许你已经在使用了࿰…...
使用 kubectl cp 命令可以在 Kubernetes Pod 和本地主机之间拷贝文件或文件夹
使用 kubectl cp 命令可以在 Kubernetes Pod 和本地主机之间拷贝文件或文件夹 kubectl cp <namespace>/<pod-name>:<pod-path> <local-path> # 从 Pod 拷贝到本地 kubectl cp <local-path> <namespace>/<pod-name>:<pod-path&g…...
【eNSP实战】交换机配置端口隔离
交换机端口隔离可以实现在同一个VLAN内对端口进行逻辑隔离,端口隔离分为L2层隔离和L3层隔离,这里只进行L2层隔离演示。 拓扑图 路由器AR1配置GE 0/0/1配置IP,其余PC主机各自配置IP和网关。 现将PC1到PC4四个主机全部进行L2层隔离,…...
动态规划-第2篇
前言:在上一篇文章中,我们了解了动态规划的基本概念和解决问题的基本思路。通过分解问题、存储子问题的解,动态规划为我们提供了高效的解决方案。然而,动态规划并不是一成不变的,它有很多不同的技巧和变种,…...
数据库查问题常用OS命令汇总
1、内存使用情况查看 top //查看活跃进程占用情况 free -mh //查看操作系统当前可用内存 2、cpu使用情况 lscpu //查看os cpu情况 sar -u -f sar文件名 -s hh:mm:ss -e hh:mm:ss //查看对应日期的历史cpu情况 top //查看当前活跃进程使用cpu情况 3、io情况 iostat …...
基于springboot住院管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展,推动了很多行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、畅通、高效的线上管理系统。当前的住院管理存在管理效率低下&…...
《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》
导语 "你是否想过用Python开发一款可玩性高的双人合作游戏?本文将分享如何从零开始实现一款类《吸血鬼幸存者》的生存射击游戏!包含完整源码解析、角色系统设计、敌人AI逻辑等核心技术点,文末提供完整代码包下载!" 哈…...
【ES6】在ES6中自定义数组
在ES6中是允许自定义类扩展基础类型的,因为这些基础类型是有构造函数的,在JS中类就是函数。 // 自定义数组 class myArray extends Array {constructor() {super();} }let arr new myArray();arr.push(1);console.log(arr);重写Array的原生方法 ES6的…...
软件开发项目有哪些风险
软件开发项目风险主要包括 需求不明确、技术实现难度大、进度延误、成本超支、质量问题。其中,需求不明确可能导致功能设计反复修改;技术实现难度大会使开发过程中不断遇到未知挑战;进度延误常常因资源配置不足或变更频繁而发生;成…...
47.HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现 文章目录 HarmonyOS NEXT 登录模块开发教程࿰…...
RAGFlow版本升级-Win10系统Docker
下载源码压缩包 https://github.com/infiniflow/ragflow.git 删除旧版本代码文件夹,把下载的代码解压到原先目录 更新一下env文件:ragflow/docker/.env 把值改为最新版本即可 RAGFLOW_IMAGEinfiniflow/ragflow:v0.17.1 更新一下docker docker compose -…...
dns劫持是什么?常见的劫持类型有哪些?如何预防?
DNS劫持的定义 DNS劫持(Domain Name System Hijacking)是一种网络攻击手段,攻击者通过篡改域名解析的过程,将用户对某个域名的访问请求重定向到错误或恶意的IP地址。这种攻击可能导致用户访问到钓鱼网站、恶意广告页面࿰…...
Python精进系列: isinstance 函数
Python isinstance函数:类型检查的得力助手 目录 Python isinstance函数:类型检查的得力助手引言一、isinstance函数基础语法结构简单示例 二、isinstance函数的应用场景函数参数类型检查数据处理与类型转换面向对象编程中的类型判断 三、isinstance函数…...
【基础知识】回头看Maven基础
版本日期修订人描述V1.02025/3/7nick huang创建文档 背景 项目过程中,对于Maven的pom.xml文件,很多时候,我通过各种参考、仿写,最终做出想要的效果。 但实际心里有些迷糊,不清楚具体哪个基础的配置所实现的效果。 今…...
练习题:81
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 运行思路 结束语 Python题目 题目 使用字典推导式创建一个字典,键为 1 到 10 的整数,值为键的平方。 题目分析 需求理解 本题要求使用 Python 的字典…...
三角函数:从宇宙法则到AI革命的数学密钥
——跨越三千年的数学语言与现代科技全景透视 一、数学本质:宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化,其数学表达可抽象为: { x cos θ ℜ ( e i θ ) y sin θ ℑ ( e i θ ) \begin…...
【论文笔记】Best Practices and Lessons Learned on Synthetic Data for Language Models
论文信息 论文标题:Best Practices and Lessons Learned on Synthetic Data for Language Models 作者信息: Ruibo Liu, Jerry Wei, Fangyu Liu, Chenglei Si, Yanzhe Zhang, Jinmeng Rao, Steven Zheng, Daiyi Peng, Diyi Yang, Denny Zhou1 and Andre…...
Java高频面试之集合-10
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详解红黑树?HashMap为什么不用二叉树/平衡树呢? 一、红黑树(Red-Black Treeÿ…...
Keil 5 环境下STM32F4 HAL库版本MDK工程创建详细步骤(适合小白,附工程源码)
一、前期准备 1.安装好keil Keil(MDK) 5 软件安装教程-CSDN博客https://blog.csdn.net/qq_42748213/article/details/90485750 2.安装好STM32F4的芯片包 Keil5中STM32F4xx芯片包下载安装_stm32f4芯片包-CSDN博客https://blog.csdn.net/weixin_45783141/article/details/131…...
【微服务】Nacos 配置动态刷新(简易版)(附配置)
文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境:Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明:官方版本说明 <!--读取boo…...
LabVIEW cRIO中CSV文件的读取
在LabVIEW cRIO中读取CSV文件,需通过文件传输、路径配置、数据解析等步骤实现。本文详细说明如何通过代码读取本地存储的CSV文件,并探讨直接通过对话框选择文件的可行性及替代方案。 一、CSV文件传输至cRIO本地存储 1. 使用NI MAX文件管理 步骤…...
双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!
2025-03-10 语言更新 模式匹配支持守卫(Pattern Guard) 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式,并且模式守卫为真的情况下才会执行。如果模式守卫为假,则会…...
从青铜到王者:六大排序算法实战解析
前言 在编程的世界里,排序算法如同一颗璀璨的明珠,闪耀着智慧的光芒。它不仅是计算机科学的基础知识点,更是每一位程序员必备的技能。今天,就让我们一同走进排序算法的世界,深入探究冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序这六大经典算法的精髓所在,…...
011-base64
base64 编码 以下是C实现的Base64字符串加密算法及其原理说明,综合了多个技术文档的核心要点: 一、Base64编码原理 Base64是一种将二进制数据转换为ASCII字符的编码方式,核心原理基于 3字节转4字符 的转换规则: 分组规则&…...
汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响
引言 失去发动机的掩蔽效应后,新能源电车的NVH问题,成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别,根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源?今天分享的这个案例,内…...
springcloud gateway通过数据库获取路由信息
在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置,可以实现灵活的路由管理。以下是详细实现步骤: 1. 数据库表设计 创建路由配置表 gateway_route: CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…...
QtDataVisualization使用
Qt Data Visualization 是一个开源的第三方库,它为Qt框架提供了高级的数据可视化功能。这个库允许开发者创建复杂的3D和2D图表,包括但不限于散点图、曲面图、条形图等。它基于Qt 3D模块,因此可以充分利用Qt 3D引擎的强大功能来呈现三维数据。…...
【Go每日一练】实现简单的控制台计算器
👻创作者:丶重明 👻创作时间:2025年3月7日 👻擅长领域:运维 目录 1.😶🌫️题目:简单的控制台计算器2.😶🌫️代码输出3.😶&#…...