SpringBoot+MyBatis-Plus实战:从零构建物资管理系统,掌握并发库存控制
最近在整理过往项目时翻到了一个几年前做的“新冠物资管理系统”。当时的需求很急要在短时间内搭建一个能管理口罩、防护服、消毒液等防疫物资入库、出库、调拨和统计的系统。现在回头看这个项目虽然业务场景特殊但其技术选型和实现路径恰恰是很多Java后端开发者从学习到实战的典型缩影一个标准的SpringBoot MySQL单体应用涵盖了从环境搭建、业务建模到前后端交互的完整流程。很多人学SpringBoot跟着教程跑通一个“Hello World”或者增删改查CRUD后往往就卡住了。知道RestController、Service、Autowired也了解MyBatis或JPA但一旦要自己从零开始做一个有完整业务逻辑、需要处理并发和数据一致性的系统就不知道如何下手。这个物资管理项目就是一个很好的练手标本。它不涉及过于复杂的微服务或高并发但足以让你把SpringBoot、MySQL、Maven、Thymeleaf、MyBatis-Plus这些技术栈串起来理解一个Web应用是如何从代码变成可运行服务的。更重要的是通过复盘这个项目我想分享的不仅仅是“怎么做”更是“为什么这么做”以及“做的时候容易在哪里栽跟头”。比如为什么选择MyBatis-Plus而不是JPAThymeleaf模板在前后端不分离的架构里扮演什么角色简单的库存增减操作如何避免超卖这些问题的答案比单纯复制代码更有价值。1. 项目起点如何理解一个业务系统并转化为技术模型接到“物资管理”这个需求第一步不是打开IDE写SpringBootApplication而是先搞清楚我们要管理什么以及怎么管理。这听起来像废话但很多新手项目失败恰恰是因为跳过了业务建模直接陷入了技术细节。1.1 核心实体与关系梳理对于一个物资管理系统抛开“新冠”这个特定背景其核心无非是“物”、“库”、“人”、“流”四个维度。物即物资。需要定义它的基本属性如名称、规格型号、单位个、箱、瓶、当前库存数量、安全库存阈值等。库即仓库或存放点。可能是总库、分库、临时存放点。需要记录仓库信息。人即系统的使用者。通常分为管理员拥有所有权限、仓库管理员负责出入库操作、查询人员仅查看。流即物资的流动。这是系统的核心业务主要包括入库采购入库、捐赠入库、调拨入库。核心是增加特定仓库中特定物资的数量。出库领用出库、调拨出库、损耗报损。核心是减少数量且不能减到负数以下即不能超卖。调拨从一个仓库转移到另一个仓库。可以拆解为一次出库源仓库加一次入库目标仓库必须在同一个事务中完成保证数据一致性。基于这个分析我们的数据库表结构雏形就出来了material(物资表)id,name,spec,unit,total_stock,safe_stock...warehouse(仓库表)id,name,location,contact...user(用户表)id,username,password,role...stock(库存表)这是一个关键表。它记录了某个物资在某个仓库的具体数量。为什么需要它因为一个物资可能存放在多个仓库。表结构id,material_id,warehouse_id,quantity。这里material_id和warehouse_id组成联合唯一索引。flow_record(流水记录表)这是系统的“账本”所有物资变动都必须在此留痕。id,material_id,warehouse_id,flow_type(enum: 入库/出库/调拨),quantity,related_order_no(关联单号),operator_id,create_time。1.2 技术选型的逻辑为什么是这套组合拳搜索热词里出现了SpringBoot、MyBatis-Plus、Thymeleaf、MySQL这几乎是国内Java初学者项目的一套“标准答案”。但为什么是它们SpringBoot它解决了传统Spring项目繁琐的XML配置和依赖管理问题提供“约定大于配置”的快速启动能力。对于这样一个管理类系统它的内嵌Tomcat、自动配置、Starter依赖机制能让我们专注于业务开发而不是折腾服务器和配置。这是项目能快速上线的基石。MySQL关系型数据库的经典选择。物资、库存、流水这类结构化数据以及它们之间的事务性操作如调拨是关系型数据库的强项。虽然热词里也提到了PostgreSQL但对于大多数国内团队和初学者MySQL的生态、资料和工具链支持更友好。MyBatis-Plus这是一个基于MyBatis的增强工具。为什么不直接用JPAHibernate在这个项目中我们有很多复杂的联表查询比如查询某个物资在所有仓库的库存情况以及需要精细控制SQL性能的场景。MyBatis-Plus在保留MyBatis灵活SQL能力的同时提供了强大的单表CRUD封装类似JPA的Repository能极大减少简单操作的代码量是平衡开发效率和灵活性的好选择。Thymeleaf这是一个服务端模板引擎。在项目初期或内部系统中为了快速开发采用前后端不分离的模式是合理的。Thymeleaf语法自然HTML属性标签能与SpringBoot无缝集成直接在服务端渲染页面并返回给浏览器。这避免了初期分离开发所需的前端框架如Vue、React学习成本和联调开销。当然如果项目需要更现代化的交互或团队有前端资源可以升级为“SpringBoot Vue”前后端分离架构但那是另一个复杂度。一个关键提醒这套技术栈是入门和中小型项目的优选但不是银弹。如果系统规模扩大你需要考虑引入缓存Redis、消息队列ActiveMQ/RabbitMQ热词中出现了SpringBoot整合ActiveMQ、更复杂的数据库分库分表、以及微服务化Spring Cloud。但在第一天不要过度设计。用最简单的架构实现核心需求是更务实的做法。2. 从零到一搭建项目骨架与核心配置理解了业务和技术选型我们就可以动手了。这里我不会罗列每一步点击而是强调关键配置和容易出错的地方。2.1 项目初始化与依赖管理使用IDEA的Spring Initializr或通过 start.spring.io 网站生成项目骨架。关键依赖选择Spring Web提供Web MVC能力。Thymeleaf模板引擎。MyBatis Framework或直接选择MyBatis-Plus官方也提供了Starter。MySQL Driver数据库驱动。Lombok强烈推荐用于简化POJO类的getter/setter/constructor等代码。pom.xml文件是项目的基石。对于SpringBoot 2.7.18热词中提到的版本要特别注意父POM和依赖版本。一个常见的坑是依赖冲突。!-- 示例部分关键依赖 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version !-- 使用指定稳定版本 -- relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency !-- 使用MyBatis-Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version !-- 注意版本兼容性 -- /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies2.2 数据库与MyBatis-Plus配置在application.yml或application.properties中配置数据源和MyBatis-Plus。# application.yml 示例 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/covid_material_db?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai username: your_username password: your_password thymeleaf: cache: false # 开发时关闭缓存修改模板立即生效 prefix: classpath:/templates/ suffix: .html mode: HTML encoding: UTF-8 # MyBatis-Plus 配置 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印SQL调试用 map-underscore-to-camel-case: true # 自动转换下划线到驼峰命名 global-config: db-config: id-type: auto # 主键策略数据库自增 logic-delete-field: deleted # 全局逻辑删除字段如果启用 logic-delete-value: 1 logic-not-delete-value: 0 mapper-locations: classpath:mapper/*.xml # XML映射文件位置关键点MySQL连接参数serverTimezoneAsia/Shanghai非常重要避免时区问题导致的时间错误。useUnicode和characterEncoding保证中文不乱码。MyBatis-Plus全局配置map-underscore-to-camel-case让你在实体类中用javaBean风格warehouseName在数据库中用下划线风格warehouse_name无需手动映射。逻辑删除是数据软删除的优雅实现。SQL日志开发阶段开启log-impl方便调试SQL。生产环境务必关闭。2.3 实体类、Mapper与Service的分层结构这是经典的MVC或更精确地说是三层架构Controller - Service - Mapper结构。实体类Entity对应数据库表。使用Lombok的Data注解。Data TableName(material) // MyBatis-Plus注解指定表名 public class Material { TableId(type IdType.AUTO) // 主键自增 private Long id; private String name; private String spec; private String unit; private Integer totalStock; // 总库存可计算得出非直接存储 private Integer safeStock; // 省略 getter/setter }Mapper接口继承MyBatis-Plus的BaseMapper立刻获得单表CRUD方法。Repository // 可加明确是仓储层组件 public interface MaterialMapper extends BaseMapperMaterial { // 复杂查询可以在这里定义方法并在对应的XML中实现 ListMaterialStockVO selectStockDetail(Param(materialId) Long materialId); }Service层业务逻辑的核心。这里我们通常定义接口和实现类。public interface MaterialService extends IServiceMaterial { // 继承MyBatis-Plus的通用Service接口 // 定义业务方法如入库、出库 boolean stockIn(Long materialId, Long warehouseId, Integer quantity, String orderNo); } Service public class MaterialServiceImpl extends ServiceImplMaterialMapper, Material implements MaterialService { Override Transactional(rollbackFor Exception.class) // 关键声明式事务 public boolean stockIn(Long materialId, Long warehouseId, Integer quantity, String orderNo) { // 1. 更新库存表 stock // 2. 创建流水记录 flow_record // 3. 更新物资表的总库存可选可通过视图或查询计算 // 任何一步失败整个操作回滚 } }事务管理Transactional注解是保证业务原子性的关键。例如入库操作必须同时更新库存表和流水表要么都成功要么都失败。3. 核心业务实现库存管理的并发控制与数据一致性物资管理系统的核心难点不是CRUD而是如何安全、准确地管理库存。多个用户同时进行出库操作时如何防止同一批物资被重复领用超卖3.1 乐观锁与悲观锁的抉择这是一个经典的并发问题。有两种主流思路悲观锁认为冲突很可能发生所以在操作数据前先加锁如SELECT ... FOR UPDATE。在库存场景出库前先锁住这条库存记录检查并更新然后释放锁。这种方式简单直接但在高并发下可能造成大量线程等待影响性能。乐观锁认为冲突不常发生所以不加锁但在更新时检查数据是否被他人修改过。通常通过一个版本号version字段实现。对于这个物资管理系统并发压力通常不会像电商秒杀那样极端。我更推荐使用乐观锁因为它实现简单且能避免数据库锁的开销。实现方式 在stock表中增加一个version字段整数类型。UPDATE stock SET quantity quantity - #{deduct}, version version 1 WHERE id #{id} AND version #{oldVersion} AND quantity #{deduct};这条SQL的妙处在于它在一个原子操作中完成了“检查库存是否足够”、“扣减库存”和“更新版本号”。如果更新返回的影响行数为0说明要么库存不足要么版本号不对数据已被他人修改此时操作失败需要回滚事务并提示用户例如“库存已更新请刷新后重试”。在MyBatis-Plus中可以很方便地在实体类中使用Version注解启用乐观锁。Data TableName(stock) public class Stock { // ... 其他字段 Version private Integer version; }然后在Service层的更新操作中使用MyBatis-Plus的updateById方法它会自动处理版本号的检查和递增。3.2 业务逻辑的完整性以调拨为例调拨是出库和入库的组合必须在一个事务中完成。Override Transactional(rollbackFor Exception.class) public boolean transferStock(Long materialId, Long fromWarehouseId, Long toWarehouseId, Integer quantity, String orderNo) { // 1. 检查源仓库库存是否充足 (需要查询) Stock fromStock stockMapper.selectOne(new QueryWrapperStock() .eq(material_id, materialId) .eq(warehouse_id, fromWarehouseId)); if (fromStock null || fromStock.getQuantity() quantity) { throw new RuntimeException(源仓库库存不足); } // 2. 源仓库出库 (乐观锁更新) int updateOut stockMapper.deductStock(fromStock.getId(), quantity, fromStock.getVersion()); if (updateOut 0) { throw new RuntimeException(源仓库库存扣减失败可能已被其他操作修改); } // 3. 目标仓库入库 (乐观锁更新或新增记录) Stock toStock stockMapper.selectOne(...); // 查询目标库存记录 if (toStock null) { // 如果目标仓库没有该物资的库存记录则新增一条 toStock new Stock(); toStock.setMaterialId(materialId); toStock.setWarehouseId(toWarehouseId); toStock.setQuantity(quantity); stockMapper.insert(toStock); } else { // 如果已有记录则增加库存 int updateIn stockMapper.addStock(toStock.getId(), quantity, toStock.getVersion()); if (updateIn 0) { throw new RuntimeException(目标仓库库存增加失败可能已被其他操作修改); } } // 4. 记录流水出库流水和入库流水或一条调拨类型流水 FlowRecord outRecord new FlowRecord(...); // 出库流水 flowRecordMapper.insert(outRecord); FlowRecord inRecord new FlowRecord(...); // 入库流水 flowRecordMapper.insert(inRecord); return true; }关键点事务边界整个方法被Transactional包裹任何一步失败所有数据库操作回滚。先查后改先查询判断库存是否足够再执行更新。虽然乐观锁的UPDATE语句本身有quantity #{deduct}的判断但先查询可以提前给用户更友好的提示避免无效的更新尝试。流水记录这是审计追踪的关键任何库存变动都必须有据可查。流水表记录了操作的“四要素”谁operator、在何时create_time、对何物material、在何地warehouse、做了何事flow_type, quantity、依据是什么related_order_no。4. 前端交互与项目部署从开发环境到可运行系统4.1 Thymeleaf模板与Controller的配合Controller负责处理请求准备数据并跳转到Thymeleaf模板页面。Controller RequestMapping(/material) public class MaterialController { Autowired private MaterialService materialService; GetMapping(/list) public String listMaterial(RequestParam(value pageNum, defaultValue 1) Integer pageNum, RequestParam(value pageSize, defaultValue 10) Integer pageSize, Model model) { // 1. 分页查询 PageMaterial page new Page(pageNum, pageSize); PageMaterial materialPage materialService.page(page); // 2. 将数据放入Model供Thymeleaf渲染 model.addAttribute(pageInfo, materialPage); // 3. 返回模板名称对应 templates/material/list.html return material/list; } PostMapping(/in) public String stockIn(MaterialStockForm form, HttpSession session) { // 1. 获取当前登录用户ID (从Session) Long operatorId (Long) session.getAttribute(userId); // 2. 调用Service层入库方法 boolean success materialService.stockIn(form.getMaterialId(), form.getWarehouseId(), form.getQuantity(), form.getOrderNo(), operatorId); // 3. 重定向到列表页防止表单重复提交 return redirect:/material/list; } }在list.html中使用Thymeleaf语法渲染数据和分页table tr th:eachmaterial : ${pageInfo.records} td th:text${material.name}物资名称/td td th:text${material.spec}规格/td td th:text${material.totalStock}库存/td td a th:href{/material/edit/{id}(id${material.id})}编辑/a a th:href{/material/delete/{id}(id${material.id})} onclickreturn confirm(确定删除吗)删除/a /td /tr /table !-- 分页组件 -- div th:if${pageInfo.pages 1} span th:eachi : ${#numbers.sequence(1, pageInfo.pages)} a th:href{/material/list(pageNum${i})} th:text${i}/a /span /div4.2 项目打包与部署开发完成后需要将项目打包成可执行的JAR或WAR文件。SpringBoot项目通常打包为可执行JAR内嵌Tomcat。打包使用Maven命令mvn clean package。确保pom.xml中配置了SpringBoot的打包插件。build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build打包后会在target目录下生成一个covid-material-system-0.0.1-SNAPSHOT.jar文件。部署运行开发环境直接在IDEA中运行Application类的main方法。生产环境将JAR文件上传到服务器如Linux使用java -jar命令运行。nohup java -Xms512m -Xmx1024m -jar covid-material-system-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod app.log 21 -Xms和-Xmx设置JVM堆内存。--spring.profiles.activeprod指定使用application-prod.yml配置文件里面配置生产环境的数据库地址、日志级别等。nohup ... 和重定向输出到app.log是为了让程序在后台运行并将日志保存到文件。常见部署问题排查端口占用默认8080端口被占用。可以在application.yml中修改server.port或启动时指定--server.port8081。数据库连接失败检查生产环境数据库IP、端口、用户名、密码是否正确以及数据库是否允许远程连接。内存不足调整JVM参数-Xmx并监控服务器内存使用情况。文件上传路径问题如果系统有上传功能确保生产环境有对应的目录且应用有写入权限。4.3 项目的局限性与可能的演进方向这个“新冠物资管理系统”作为一个学习或中小型项目是合格的但它也存在单体架构的典型局限性能瓶颈所有模块耦合在一个应用内如果物资查询和流水记录查询压力都很大会相互影响。扩展性差无法针对库存计算、报表生成等重计算模块单独扩容。技术栈单一前端交互相对简单。如果业务量增长演进路径可能是前后端分离前端使用Vue/React后端SpringBoot提供纯RESTful API。这是第一步架构升级。引入缓存将热点物资信息、仓库信息缓存到Redis减轻数据库压力。模块拆分将用户权限、物资管理、库存流水、报表统计拆分为独立的微服务Spring Cloud Alibaba通过API网关聚合。引入消息队列将耗时的操作如生成复杂的统计报表异步化通过消息队列如RocketMQ通知后端处理处理完再通知前端。数据库优化流水记录表数据量巨大可以考虑按时间分表或者将历史流水迁移到数据仓库如ClickHouse供分析使用。回过头看这个项目最大的价值不在于它用了多少时髦的技术而在于它完整地走通了一个业务系统从需求分析、技术选型、数据库设计、业务编码到部署上线的全流程。它让你明白SpringBoot不只是几个注解MyBatis-Plus不只是生成CRUD事务不只是加个Transactional注解它们都是为了解决真实的业务问题而组合在一起的工具。理解了这个“为什么”再去学习那些更高级的面试题热词中的SpringBoot原理、Java八股文、设计模式才会更有方向感知道它们最终要服务于什么样的场景。

相关新闻

计算机毕业设计之学校新生入学管理系统设计与实现

计算机毕业设计之学校新生入学管理系统设计与实现

学校新生入学是学校针对学生必不可少的一个部分。在学校发展的整个过程中,新生入学担负着最重要的角色。为满足如今日益复杂的管理需求,各学校新生入学程序也在不断改进。本课题所设计的学校新生入学管理系统,使用SSM框架,JSP技术…

2026/10/12 18:57:07 阅读更多 →
红黑树:平衡二叉搜索树的工业级实现与优化

红黑树:平衡二叉搜索树的工业级实现与优化

1. 红黑树:平衡二叉搜索树的工业级实现第一次接触红黑树是在大学数据结构课上,当时教授用"魔法般的自平衡规则"来形容它。直到后来参与数据库引擎开发,亲眼见证每秒处理数十万次插入操作时红黑树依然保持稳定性能,才真正…

2026/10/14 12:54:35 阅读更多 →
深度解析SGLang:如何构建高性能大语言模型服务框架的实战指南

深度解析SGLang:如何构建高性能大语言模型服务框架的实战指南

深度解析SGLang:如何构建高性能大语言模型服务框架的实战指南 【免费下载链接】sglang SGLang is a high-performance serving framework for large language models and multimodal models. 项目地址: https://gitcode.com/GitHub_Trending/sg/sglang SGLan…

2026/10/13 15:23:31 阅读更多 →

最新新闻

Andersen Consulting携手TalentSmartEQ,推动领导力发展与业务转型

Andersen Consulting携手TalentSmartEQ,推动领导力发展与业务转型

Andersen Consulting与TalentSmartEQ签署合作协议,拓展其人力资本服务能力。TalentSmartEQ总部位于圣迭戈,专注于情商(EQ)与领导力发展,致力于打造实用、生动且便于学以致用的学习体验。 二十多年来,Talen…

2026/10/14 19:39:50 阅读更多 →
重组蛋白纯化标签:高效获取高质量蛋白的关键技术

重组蛋白纯化标签:高效获取高质量蛋白的关键技术

在现代生命科学研究与生物制药开发中,重组蛋白表达 已成为核心技术之一。无论是基础科研、蛋白结构研究,还是应用于蛋白药物研发,高质量的重组蛋白是实验成功的基础。而在整个过程中,重组蛋白纯化 及其配套的“纯化标签技术”扮演…

2026/10/14 19:39:50 阅读更多 →
第一个程序:五行代码是怎么跑起来的(零基础入门 · 第 3 篇)

第一个程序:五行代码是怎么跑起来的(零基础入门 · 第 3 篇)

摘要:C# 程序到底从哪一行开始跑?把 Program.cs 里的 using、namespace、class、Main、Console.WriteLine 逐行拆开:为什么必须写 static、string[] args 到底装的是什么、大括号和分号各管哪一段、编译器在你看不见的地方补了哪些代码。三个…

2026/10/14 19:39:50 阅读更多 →
西邮liiux兴趣小组2025一面题题解

西邮liiux兴趣小组2025一面题题解

西邮linux兴趣小组2025一面题题解 总结 本次一面题考点包含: C语言 printf 返回值C语言值传递、指针传递sizeof 、 strlen 、数组退化数组指针二级指针指针加减运算按位与运算三元运算符数组越界、未定义行为union 联合体柔性数组(零长数组)函…

2026/10/14 19:39:50 阅读更多 →
P1090 NOIP 2004 提高组 合并果子 题解

P1090 NOIP 2004 提高组 合并果子 题解

P1090 NOIP 2004 提高组 合并果子 题解 题目传送门: <{[()]}> 这题很容易想到一个贪心&#xff1a;每次取重量最小的两堆果子&#xff0c;再取合并后重量最小的两堆果子&#xff0c;直到只有一堆果子为止。 接下来是证明 证明贪心 假设现在只有 3 堆果子&#xff0c…

2026/10/14 19:39:50 阅读更多 →
Java多数据源事务配置:4种落地方案与本地消息表实战

Java多数据源事务配置:4种落地方案与本地消息表实战

1. 项目概述&#xff1a;为什么“Java多数据源事务配置”是每个中高级后端绕不开的硬骨头“Java多数据源的事务配置”——这八个字背后&#xff0c;藏着无数人在分布式系统演进过程中踩过的深坑、改过的凌晨三点的配置、回滚失败后焦灼盯屏的十几分钟&#xff0c;以及生产环境里…

2026/10/14 19:38:49 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →