Spring Boot集成EasyExcel
1. 初始化Spring Boot项目
首先,使用Spring Initializr(https://start.spring.io/)生成一个基本的Spring Boot项目。选择以下依赖项:
- Spring Web
- Lombok (用于减少样板代码)
- SLF4J (用于日志记录)
2. 添加依赖
在你的pom.xml
文件中添加EasyExcel的Maven依赖。确保版本号是最新的,你可以访问Maven仓库来获取最新版。
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>最新的版本号</version>
</dependency>
3. 创建实体类
假设我们需要处理一个用户信息表,包含姓名和年龄两个字段。以下是实体类的设计,并使用Lombok简化代码:
package com.example.demo.model;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;// 使用@Data注解自动生成getter、setter等方法
@Data
public class UserData {// 指定Excel列标题为“姓名”@ExcelProperty("姓名")private String name; // 用户姓名// 指定Excel列标题为“年龄”@ExcelProperty("年龄")private Integer age; // 用户年龄
}
4. 创建监听器类
创建一个监听器类来处理每一行的数据,并在服务类中调用它。我们使用@Slf4j
注解简化日志记录:
package com.example.demo.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.model.UserData;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;@Slf4j // 使用@Slf4j注解简化日志记录
public class UserDataListener extends AnalysisEventListener<UserData> {private final List<UserData> dataList = new ArrayList<>(); // 存储读取的数据/*** 当解析一行数据时调用* @param userData 解析得到的用户数据* @param analysisContext 上下文对象*/@Overridepublic void invoke(UserData userData, AnalysisContext analysisContext) {dataList.add(userData); // 将每一行的数据添加到列表中log.info("读取到一条数据: {} {}", userData.getName(), userData.getAge()); // 日志记录}/*** 所有数据解析完成后调用* @param analysisContext 上下文对象*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {log.info("所有数据解析完成"); // 数据解析完成后记录日志}/*** 获取读取的数据列表* @return 读取的数据列表*/public List<UserData> getDataList() {return dataList; // 返回读取的数据列表}
}
5. 实现服务类
编写一个服务类来实现数据的读写操作,并增加异常处理和日志记录。我们将在此处添加分页功能,以确保当单个页面数据达到一定量时重新生成新的页面进行写入:
package com.example.demo.service;import com.alibaba.excel.EasyExcel;
import com.example.demo.listener.UserDataListener;
import com.example.demo.model.UserData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;@Slf4j // 使用@Slf4j注解简化日志记录
@Service
public class ExcelService {private static final int PAGE_SIZE = 100; // 每页最大数据条数/*** 写入Excel文件* @param filePath 文件路径* @param data 要写入的数据列表*/public void writeExcel(String filePath, List<UserData> data) {try {log.info("开始写入Excel文件: {}", filePath); // 记录日志int totalRows = data.size();int totalPages = (int) Math.ceil((double) totalRows / PAGE_SIZE);for (int page = 0; page < totalPages; page++) {int fromIndex = page * PAGE_SIZE;int toIndex = Math.min(fromIndex + PAGE_SIZE, totalRows);List<UserData> currentPageData = data.subList(fromIndex, toIndex);String sheetName = "用户信息" + (page + 1); // 设置工作表名称// 开始写入Excel文件EasyExcel.write(filePath, UserData.class).sheet(sheetName) // 设置工作表名称.doWrite(currentPageData); // 执行写入操作log.info("写入第 {} 页数据完成", page + 1); // 写入完成后记录日志}log.info("写入Excel文件完成"); // 写入完成后记录日志} catch (Exception e) {log.error("写入Excel失败", e); // 记录错误日志}}/*** 读取所有工作表的Excel文件* @param inputStream 输入流* @return 读取的数据列表*/public List<UserData> readAllSheets(InputStream inputStream) {List<UserData> allData = new ArrayList<>();try {log.info("开始读取所有工作表的Excel文件"); // 记录日志// 获取Excel文件中的所有Sheet信息List<String> sheetNames = EasyExcel.read(inputStream).excelExecutor().sheetList().get();for (String sheetName : sheetNames) {log.info("开始读取工作表: {}", sheetName);UserDataListener listener = new UserDataListener();// 执行读取操作EasyExcel.read(inputStream, UserData.class, listener).sheet(sheetName) // 指定工作表名称.doRead(); // 执行读取操作// 处理listener.getDataList()allData.addAll(listener.getDataList());log.info("读取工作表 {} 完成", sheetName);}log.info("读取所有工作表的Excel文件完成"); // 读取完成后记录日志} catch (Exception e) {log.error("读取所有工作表的Excel失败", e); // 记录错误日志}return allData;}/*** 读取特定工作表的Excel文件* @param filePath 文件路径* @param sheetIndex 工作表索引(从0开始)*/public void readSpecificSheet(String filePath, int sheetIndex) {try {log.info("开始读取特定工作表的Excel文件: {}, Sheet Index: {}", filePath, sheetIndex); // 记录日志UserDataListener listener = new UserDataListener();// 执行读取操作EasyExcel.read(filePath, UserData.class, listener).sheet(sheetIndex) // 指定工作表索引.doRead(); // 执行读取操作// 处理listener.getDataList()for (UserData userData : listener.getDataList()) {log.info("{} {}", userData.getName(), userData.getAge()); // 记录每条数据的日志}log.info("读取特定工作表的Excel文件完成"); // 读取完成后记录日志} catch (Exception e) {log.error("读取特定工作表的Excel失败", e); // 记录错误日志}}/*** 使用模板填充数据并生成新的Excel文件* @param templateFilePath 模板文件路径* @param outputFilePath 输出文件路径* @param data 要填充的数据列表*/public void fillTemplate(String templateFilePath, String outputFilePath, List<UserData> data) {try {log.info("开始使用模板填充数据: {}, 输出文件路径: {}", templateFilePath, outputFilePath); // 记录日志// 使用模板填充数据EasyExcel.write(outputFilePath).withTemplate(templateFilePath).sheet().doFill(data);log.info("模板填充数据完成"); // 填充完成后记录日志} catch (Exception e) {log.error("模板填充数据失败", e); // 记录错误日志}}/*** 下载文件并在失败时返回JSON* @param response HttpServletResponse 对象* @throws IOException 如果写入文件失败*/public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {try {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");List<UserData> data = new ArrayList<>();for (int i = 1; i <= 100; i++) { // 假设我们有100条数据data.add(new UserData().setName("张三" + i).setAge(20 + i % 50));}EasyExcel.write(response.getOutputStream(), UserData.class).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(data);} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = Map.of("status", "failure", "message", "下载文件失败: " + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}
}
}
6. 创建控制器类
为了方便测试,我们可以创建一个简单的控制器类来调用服务类中的方法:
package com.example.demo.controller;import com.example.demo.service.ExcelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@Slf4j // 使用@Slf4j注解简化日志记录
@RestController
@RequestMapping("/excel")
public class ExcelController {@Autowiredprivate ExcelService excelService; // 自动注入ExcelService/*** 文件上传* @param file 上传的文件* @return 成功消息* @throws IOException 如果读取文件失败*/@PostMapping("upload")@ResponseBodypublic String upload(@RequestParam("file") MultipartFile file) throws IOException {InputStream inputStream = file.getInputStream();List<UserData> data = excelService.readAllSheets(inputStream);log.info("成功读取到 {} 条数据", data.size());return "success";}/*** 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel)** @param response HttpServletResponse 对象* @throws IOException 如果写入文件失败*/@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {excelService.downloadFailedUsingJson(response);}/*** 写入Excel文件* @param filePath 文件路径* @return 成功消息*/@GetMapping("/write")public String writeExcel(@RequestParam String filePath) {log.info("准备写入Excel文件: {}", filePath); // 记录日志List<UserData> data = new ArrayList<>();for (int i = 1; i <= 500; i++) { // 假设我们有500条数据data.add(new UserData().setName("张三" + i).setAge(20 + i % 50));}excelService.writeExcel(filePath, data); // 调用写入方法log.info("写入Excel文件完成"); // 返回成功消息return "写入Excel成功"; // 返回成功消息}/*** 读取所有工作表的Excel文件* @param filePath 文件路径* @return 成功消息*/@GetMapping("/read/allSheets")public String readAllSheets(@RequestParam String filePath) {log.info("准备读取所有工作表的Excel文件: {}", filePath); // 记录日志excelService.readAllSheets(filePath); // 调用读取方法log.info("读取所有工作表的Excel文件完成"); // 返回成功消息return "读取所有工作表的Excel成功"; // 返回成功消息}/*** 读取特定工作表的Excel文件* @param filePath 文件路径* @param sheetIndex 工作表索引(从0开始)* @return 成功消息*/@GetMapping("/read/specificSheet")public String readSpecificSheet(@RequestParam String filePath, @RequestParam int sheetIndex) {log.info("准备读取特定工作表的Excel文件: {}, Sheet Index: {}", filePath, sheetIndex); // 记录日志excelService.readSpecificSheet(filePath, sheetIndex); // 调用读取方法log.info("读取特定工作表的Excel文件完成"); // 返回成功消息return "读取特定工作表的Excel成功"; // 返回成功消息}/*** 使用模板填充数据并生成新的Excel文件* @param templateFilePath 模板文件路径* @param outputFilePath 输出文件路径* @return 成功消息*/@GetMapping("/fill/template")public String fillTemplate(@RequestParam String templateFilePath, @RequestParam String outputFilePath) {log.info("准备使用模板填充数据: {}, 输出文件路径: {}", templateFilePath, outputFilePath); // 记录日志List<UserData> data = new ArrayList<>();for (int i = 1; i <= 500; i++) { // 假设我们有500条数据data.add(new UserData().setName("张三" + i).setAge(20 + i % 50));}excelService.fillTemplate(templateFilePath, outputFilePath, data); // 调用模板填充方法log.info("模板填充数据完成"); // 返回成功消息return "模板填充数据成功"; // 返回成功消息}
}
7. 异常处理与日志记录
在实际应用中,建议增加更多的异常处理逻辑和日志记录,以便更好地调试和维护。我们已经在服务类中添加了基本的日志记录和异常处理机制。
全局异常处理
你可以在项目中添加全局异常处理器来捕获和处理未处理的异常:
package com.example.demo.exception;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import lombok.extern.slf4j.Slf4j;@Slf4j // 使用@Slf4j注解简化日志记录
@ControllerAdvice
public class GlobalExceptionHandler {/*** 处理所有异常* @param e 异常对象* @return 错误响应*/@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {log.error("发生错误: ", e); // 记录错误日志return new ResponseEntity<>("发生错误: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); // 返回错误消息}
}
8. 启动应用程序
确保你的主应用程序类正确配置:
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import lombok.extern.slf4j.Slf4j;@SpringBootApplication
@Slf4j // 使用@Slf4j注解简化日志记录
public class DemoApplication {/*** 主函数,启动Spring Boot应用* @param args 命令行参数*/public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args); // 启动Spring Boot应用log.info("Spring Boot应用已启动"); // 记录启动日志}
}
9. 测试
启动应用程序后,你可以通过浏览器或Postman等工具访问以下URL来测试Excel的读写功能:
- 写入Excel:
http://localhost:8080/excel/write?filePath=/path/to/your/output.xlsx
- 读取Excel:
http://localhost:8080/excel/read?filePath=/path/to/your/input.xlsx
总结
以上是完整的Spring Boot集成EasyExcel的详细步骤和代码示例,包括详细的注释以及实现了当单个页面数据达到一定量时重新生成新的页面进行写入的功能。
相关文章:
Spring Boot集成EasyExcel
1. 初始化Spring Boot项目 首先,使用Spring Initializr(https://start.spring.io/)生成一个基本的Spring Boot项目。选择以下依赖项: Spring WebLombok (用于减少样板代码)SLF4J (用于日志记录) 2. 添加依赖 在你的pom.xml文件…...
2024年12月CCF-GESP编程能力等级认证C++编程六级真题解析
CCF-GESP C++六级真题难度与考察范围深度解析 考试定位与整体难度 CCF-GESP C++六级认证属于高阶编程能力考核,难度显著高于五级,接近信息学竞赛提高组水平,重点考察复杂算法设计、面向对象编程(OOP)深度应用及高级数据结构实现能力。试题要求考生具备将数学建模与算法优化…...
网络VLAN技术详解:原理、类型与实战配置
网络VLAN技术详解:原理、类型与实战配置 1. 什么是VLAN? VLAN(Virtual Local Area Network,虚拟局域网) 是一种通过逻辑划分而非物理连接隔离网络设备的技术。它允许管理员将同一物理网络中的设备划分为多个独立的广播…...
深入探讨RAID 5的性能与容错能力:实验与分析(磁盘阵列)
前言—— 本实验旨在探讨 RAID 5 的性能和容错能力。通过创建 RAID 5 阵列并进行一系列读写性能测试及故障模拟,我们将观察 RAID 5 在数据冗余和故障恢复方面的表现,以验证其在实际应用中的可靠性和效率。 首先说明:最少三块硬盘, 使用 4 块…...
如何让ai问答机器人通人性?
领域专用的问答机器人,数据是灵魂。通用模型的问题在于,它们虽然知识广博,但对特定领域的深度理解不足。解决这个问题的第一步,就是构建一个高质量的领域知识库。 数据要精准且全面 想让机器人真正“懂”一个领域,数…...
最新版Chrome浏览器加载ActiveX控件技术--allWebPlugin中间件一键部署浏览器扩展
allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…...
重生之我在学Vue--第11天 Vue 3 高级特性
重生之我在学Vue–第11天 Vue 3 高级特性 文章目录 重生之我在学Vue--第11天 Vue 3 高级特性前言一、Teleport:打破组件层级的瞬移术1. 什么是Teleport?2. 核心用法3. 实战技巧 二、Suspense:异步组件的优雅过渡1. 为什么需要Suspense&#x…...
汽车无钥匙启动系统不使用传统机械钥匙启动汽车
汽车无钥匙启动系统 定义 汽车无钥匙启动系统(Keyless Start System),启动车辆时不用掏拧钥匙,只需把钥匙放在包内或口袋里,按下车内按键或拧动导板即可使发动机点火。它无需插入钥匙,通过点按按键或旋转…...
平安养老险深圳分公司积极开展2025年“3·15”金融消费者权益保护教育宣传活动
为深刻把握金融工作的政治性、人民性,帮助社会公众增强维护自身合法权益的意识和能力,平安养老险深圳分公司在2025年3月7日至3月15日期间,以“保障金融权益,助力美好生活”为口号,聚焦“维护权益”主题,全面…...
python 实现 A* 算法
A*算法是一种广泛使用的路径搜索算法,结合了启发式搜索和Dijkstra算法的优点。它通过评估每个节点的代价函数 ( f(n) g(n) h(n) ) 来选择最优路径,其中: ( g(n) ) 是从起点到当前节点的实际代价。( h(n) ) 是从当前节点到目标节点的启发式…...
MyBatis 如何创建 SqlSession 对象的?
MyBatis 创建 SqlSession 对象的过程主要由 SqlSessionFactory 接口及其实现类来完成。以下是详细步骤: 1. SqlSessionFactory 接口: SqlSessionFactory 是 MyBatis 的核心接口之一,它负责创建 SqlSession 对象。 你可以将 SqlSessionFactory 视为 Sql…...
微服务》》四个问题
客户端如何访问 API 网关 如 Core中 Ocelot技术 服务如何治理 服务注册与发现 如 Core中 的 consul技术 服务挂了怎么办 可以利用 重试机制、限流、熔断、降级等 服务之间通信问题 》》同步 1. Http 对外 跨防火墙 【 序列化、反序列化 2 ( 因为http是应用层…...
CockroachDB MCP -cursor适用
CockroachDB MCP 服务器 GitHub仓库置顶 这是一个用于 Cursor 的 CockroachDB MCP 服务器,基于 Model Context Protocol (MCP) 规范实现,可以让你在 Cursor 中直接与 CockroachDB 数据库交互。 功能 连接到 CockroachDB 数据库获取数据库中的所有表获…...
GOC学习
for(int i1;i<5;i){//这里的所有语句都会被执行 5 次 } int main(){pen.a(200,16,1,0).a(200,-16,1,0);pen.rt(16).fd(200).bk(200);pen.lt(32).fd(200).bk(200);///pen.rt(-32).fd(200).bk(200);for(int i1;i<5;i){pen.a(200,16,1,0).a(200,-16,1,0);pen.rt(16).fd(200)…...
【机器学习】基于t-SNE的MNIST数据集可视化探索
一、前言 在机器学习和数据科学领域,高维数据的可视化是一个极具挑战但又至关重要的问题。高维数据难以直观地理解和分析,而有效的可视化方法能够帮助我们发现数据中的潜在结构、模式和关系。本文以经典的MNIST手写数字数据集为例,探讨如何利…...
Vscode工具开发Vue+ts项目时vue文件ts语法报错-红波浪线等
Vscode工具开发Vuets项目时vue文件ts语法报错-红波浪线等 解决方案 问题如题描述,主要原因是开发工具使用的代码检查与项目的中的ts不一致导导致,解决办法,修改 vscode 中, 快捷键:command shift p, 输入ÿ…...
Python在数据处理中的应用:从入门到精通
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
vue3实现跨页面缓存
避免频繁向后端发送请求,vue3中,可以用缓存机制,为了实现跨页面缓存,可以把缓存放到localsotrage里面 关键代码: const globalCache JSON.parse(localStorage.getItem(globalCache)) || {}; 然后加一个forceRefresh关键字, const fetchData async (forceRefresh false) …...
YOLO优化之多信息融合MIF
设计背景 在目标检测领域,随着深度学习技术的不断进步,研究者们一直在寻求提高模型性能和效率的方法。其中, 多模态数据融合 作为一种有效的策略,近年来受到了广泛关注。多模态融合旨在将来自不同传感器或模态的数据进行整合,以提供更全面、丰富的信息供模型学习和推断。…...
人工智能与人的智能,改变一生的思维模型【8】逆向思维
逆向偏差思维模型:顶尖高手如何「反常识」破局 (斯坦福决策科学中心认证的逆向思考框架) 一、直击本质:什么是逆向偏差思维? 定义: 逆向偏差思维是一种主动对抗本能认知倾向的决策模式,通过系…...
Python 科学计算与机器学习入门:NumPy + Scikit-Learn 实战指南
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类
文章目录 深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类1. 什么是 QSystemTrayIcon?2. 自定义系统托盘图标类:SysTraylcon3. 代码解析1. **类的定义**2. **构造函数:SysTraylcon::SysTraylcon(QWidget *parent)**3. **ini…...
DeepSeek-R1 面试 -—— GRPO
DeepSeek训练中应用的GRPO算法,它源自于强化学习领域的PPO算法。GRPO与PPO算法之间存在哪些差异?这两种算法各自的优劣何在?为何DeepSeek选择采用GRPO算法而非PPO算法?本文将对这些问题提供解答。 一、PPO算法 PPO(Pr…...
AI作曲DiffRhythm原理及本地部署
1.原理简介 最近AI在音乐生成方面的进展引起了极大的关注,但现有的方法面临着严重的限制。一些当前的生成模型只能合成人声或伴奏轨道。虽然一些模型可以生成组合的人声和伴奏,但它们通常依赖于精心设计的多阶段级联架构和复杂的数据管道,阻…...
农业电商|基于SprinBoot+vue的农业电商服务系统(源码+数据库+文档)
农业电商服务系统 目录 基于SprinBootvue的农业电商服务系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2后台模块实现 5.2.1管理员模块实现 5.2.2商家模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码…...
深度学习有哪些算法?
深度学习包含多种算法和模型,广泛应用于图像处理、自然语言处理、语音识别等领域。以下是主要分类及代表性算法: 一、基础神经网络 多层感知机(MLP) 最简单的深度学习模型,由多个全连接层组成,用于分类和回…...
鸿蒙开发-一多开发之媒体查询功能
在HarmonyOS中,使用ArkTS语法实现响应式布局的媒体查询是一个强大的功能,它允许开发者根据不同的设备特征(如屏幕尺寸、屏幕方向等)动态地调整UI布局和样式。以下是一个使用媒体查询实现响应式布局的实例: 1. 导入必要…...
历年华中科技大学计算机考研复试上机真题
历年华中科技大学计算机考研复试上机真题 2022华中科技大学计算机考研复试上机真题 2021华中科技大学计算机考研复试上机真题 2019华中科技大学计算机考研复试上机真题 在线评测:https://pgcode.cn 八进制 题目描述 输入一个整数,将其转换成八进制数…...
卷积神经网络(CNN)的主要架构
卷积神经网络(CNN, Convolutional Neural Networks)是深度学习中最重要的模型之一,广泛应用于计算机视觉、目标检测、语义分割等任务。自 LeNet 诞生以来,CNN 结构经历了多个重要发展阶段,出现了许多经典架构ÿ…...
IDEA:项目结构不见了,项目文件消失解决
IDEA:看不见目录结构了。 1、确认项目是否仍存在:检查项目文件夹是否仍然存在于磁盘上。如果项目文件夹被删除或移动了,您需要将其还原或重新导入到IDEA中。 2、重新导入项目:如果项目文件存在,在 IDEA 中找到项目文…...
基于ssm的宠物医院信息管理系统(全套)
一、系统架构 前端:html | layui | vue | element-ui 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat | idea | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页…...
How to install a package in offline scenario in Ubuntu 24.04
概述 做过信创项目的兄弟们在工作上每天可能面对很多需要解决的问题,不过,有一类问题可能是大家经常遇的,比方说,有时候我们不得不硬着头皮在离线生产环境中安装某些软件包,相信很多兄弟被这种细碎的小事搞得焦头烂额…...
将pdf或者word转换成base64格式
废话不多说直接上代码: function fileToBase64(file) {return new Promise((resolve, reject) > {const reader new FileReader();reader.readAsDataURL(file);reader.onload function (event) {const base64Data event.target.result.split(,)[1];resolve(b…...
使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库
定义 检索增强生成(RAG)的基本定义 检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息,并将其作为提示&…...
乐观锁VS分布式锁实现抢单服务
司机开始接单,乘客填写出发地——目的地,开始下单 service-order模块 Operation(summary"司机抢单") GetMapping("/robNewOrder/{driverId}/{orderId}") public Result<Boolean> robNewOrder(PathVariable Long driverId,P…...
通过特征值和特征向量实现的图像压缩和特征提取
前文,我们在学习人工智能的线性代数基础的时候,就了解到,矩阵在人工智能中被广泛使用,接下来我们就从大家非常常见的图像开始,深度理解矩阵在人工智能中的应用。有关线性代数基础的文章可以看的我CSDN:人工智能中的线性…...
ranger集成starrock报错
org.apache.ranger.plugin.client.HadoopException: initConnection: Unable to connect to StarRocks instance, please provide valid value of field : {jdbc.driverClassName}.. com.mysql.cj.jdbc.Driver. 可能的原因 JDBC 驱动缺失:运行环境中没有安装 MySQL …...
第J2周:ResNet50V2算法实现01(Tensorflow硬编码版)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 使用tensorflow实现ResNetV50V2的网络结构。本次根据第一层的细节手动硬编码,没有任何的优化,只为了更好的理解细节。 目录结构&…...
论文分享 | HE-Nav: 一种适用于复杂环境中空地机器人的高性能高效导航系统
阿木实验室始终致力于通过开源项目和智能无人机产品,为全球无人机开发者提供强有力的技术支持,并推出了开源项目校园赞助活动,助力高校学子在学术研究与技术创新中取得更大突破。近日,香港大学王俊铭同学,基于阿木实验…...
【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式
【mysql】centOS7安装mysql详细操作步骤! linux系统安装mysql版本 需要 root 权限,使用 root 用户进行命令操作。使用tar文件包,安装,gz包也可以但是还需要配置用户,tar包虽然大,但是全啊! 1. …...
java学习笔记1
程序编译步骤 java程序执行步骤 相关代码及解释: /* 对第一个java程序进行总结 1. java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编译我们的java源文件。格式&am…...
强大的数据库DevOps工具:NineData 社区版
本文作者司马辽太杰, gzh:程序猿读历史 在业务快速变化与数据安全日益重要的今天,生产数据库变更管理、版本控制、数据使用是数据库领域的核心挑战之一。传统的解决方式往往采用邮件或即时通讯工具发起审批流程,再通过堡垒机直连数…...
「Unity3D」UGUI运行时设置元素的锚点Anchor,维持元素Rect的显示不变,即待在原处
在编辑器中,通过设置Raw edit mode,可以切换两种,元素锚点的改变模式: 一种是锚点单独改变,即:不开启原始模式,保持原样,改变anchoredPosition与sizeDelta。一种是锚点联动显示&…...
深入解析大语言模型的 Function Call 实现—— 以 Qwen2.5为例
引言 在现代大语言模型(LLM)中,Function Call(函数调用)能力极大地提升了模型的实用性,使其能够调用外部 API、执行复杂计算或获取实时数据。例如,在 OpenAI API 和 Qwen2.5-7B-Instruct 这样的…...
鸿蒙路由 HMrouter 配置及使用一
1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true (我这项目创…...
驾驭 DeepSeek 科技之翼,翱翔现代学习新天际
在当今这个信息爆炸的时代,学习的方式和途径正在经历着前所未有的变革。人工智能技术的飞速发展,为我们的学习带来了全新的机遇和挑战。DeepSeek 作为一款强大的大语言模型,凭借其卓越的性能和丰富的功能,为现代学习注入了新的活力…...
[Windows] 轻量级景好鼠标录制器 v2.1 单文件版,支持轨迹+鼠标键盘录制复刻
[Windows] 轻量级景好鼠标录制器 链接:https://pan.xunlei.com/s/VOLHz0rPyqdhV4bgyTYuW6W7A1?pwd98uj# 软件特性: 高效播放控制:动作间隔优化至100 ms,进度条可视化,支持随机循环/多次播放。 深度自定义࿱…...
C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理
背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件,使用上与客户端版的优势是: 1.安装更新部署方便,只需服务器部署了软件,其它客户端的用户无需安装&am…...
【Linux内核系列】:文件系统
🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz ★★★ 本文前置知识: 文件系统初识 那么在我们此前关于文件的学习中,我们学习的都是进程与打开的文件之间的关系,以及打开的文件如何进行管理…...
工程化与框架系列(35)--前端微服务架构实践
前端微服务架构实践 🏗️ 引言 随着前端应用规模的不断扩大,微服务架构在前端领域的应用越来越广泛。本文将深入探讨前端微服务架构的实现方案、最佳实践和相关工具。 微服务架构概述 前端微服务架构主要包括以下方面: 应用拆分…...