news 2026/9/17 5:20:59

基于SpringBoot+Vue+MySQL的图书馆管理系统设计与部署全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于SpringBoot+Vue+MySQL的图书馆管理系统设计与部署全解析

前阵子整理代码仓库,翻到一套去年帮朋友搭建的图书馆管理系统源码,技术栈是 SpringBoot 后端加 Vue 前端加 MySQL 数据库,整体结构清晰,业务闭环完整,而且可以直接在本地跑起来。正好最近不少读者问我有没有适合做毕业设计或者练手项目参考的全栈源码,我就把这套系统重新梳理了一遍,把从需求分析到部署运行的整个思路都写出来。这个项目最大的特点是它没有停留在增删改查的层面,而是针对疫情期间图书馆的实际运营场景做了一些很具体的功能设计,比如入馆预约、流量管控、图书归还后的消毒登记状态等,这些细节让一个普通的图书管理系统变得更有业务价值,也更有面试和答辩的谈资。

适合看这篇内容的人主要是三类:一是正在找全栈项目练手、想搞懂 SpringBoot + Vue + MySQL 怎么串起来的新手;二是需要做毕业设计或课程设计的学生;三是想快速搭一套带预约与库存管理能力的内部系统的开发者。我会从业务设计讲到底层实现,再到部署踩坑,尽量把项目里的设计取舍和真实问题说透。

1. 疫情场景下图书馆管理系统的需求拆解

1.1 疫情给图书馆业务带来的变化

很多人一听到图书馆管理系统,第一反应就是图书的增删改查、借书还书、超期罚款。这套基础流程在疫情前后确实没有本质变化,但疫情真正改变了图书馆的运营约束条件:入馆人数需要控制、借阅行为需要尽量无接触、归还的图书需要经过消杀流程再重新上架、到馆读者的健康状态需要留档。这些需求在传统图书管理系统里是没有的,而我在设计这套系统时,恰恰把这些“新常态”作为了核心业务亮点。

举个具体的例子,传统的借书流程是读者到馆、选书、柜台办理。而在疫情背景下,很多图书馆采用了预约借阅模式:读者在线上预约某本书,图书馆工作人员把书找到并经过杀菌消毒流程后放到指定位置,读者到馆后凭预约码直接取书,全程减少面对面接触。这套系统里的预约功能就是围绕这个流程设计的。另外,入馆人数限制也需要一个量化工具,系统里加入了“时间段预约 + 入馆人数上限”的机制,管理员可以配置每个时段的容量,读者预约时实时校验是否还有名额,这本质上是一个小型的库存管理问题。

1.2 系统的角色划分与核心功能清单

我把这套系统的用户角色划分为三类:系统管理员图书管理员读者。角色不同,看到的功能入口和操作权限完全不同。

  • 系统管理员:负责维护用户账号、配置系统参数、查看统计分析报表、管理角色权限。
  • 图书管理员:负责图书信息的录入与维护、处理借书还书流程、登记图书消毒状态、审核预约请求。
  • 读者:可以检索图书、查看图书详情与库存、在线预约、查询个人借阅记录、提交入馆预约。

在这个基础上,系统的核心功能模块我归纳为六大块:读者认证模块图书管理模块借阅管理模块预约管理模块入馆管控模块统计报表模块。如果只是机械地写代码,这些模块就是几张表加几个接口,但如果从业务角度想清楚每个模块要解决什么问题,代码写起来才有方向。

1.3 为什么要做“可直接运行”的源码交付

标题里特别强调了“可直接运行”,这一点我觉得对学习者来说非常重要。很多开源项目代码质量不错,但拿下来根本跑不起来,要么缺少数据库初始化脚本,要么依赖版本混乱,要么前端后端联调地址写死。所以我在这套系统里刻意做了几件事:数据库脚本完整、前后端启动说明清晰、默认账号直接可用、所有配置项都有注释。拿到源码后,只要电脑上装了 JDK、MySQL、Node.js 这三个基础环境,按照步骤走基本十分钟内能把系统跑起来。这样做的意义在于,让使用者把精力放在理解和改造代码上,而不是浪费在环境配置上。

2. 技术选型:SpringBoot + Vue + MySQL 背后的设计逻辑

2.1 后端为什么选择 SpringBoot

技术上我完全可以使用 Node.js 的 Express、Python 的 Django 或者 Go 的 Gin,但最终选择 SpringBoot,核心原因是这套系统的目标用户大多是 Java 技术栈的学习者,而 SpringBoot 确实是目前 Java 服务端开发最主流、生态最完整的框架之一。它用自动配置极大地简化了传统 Spring 项目的配置流程,让开发者可以专注于业务代码。而且图书馆管理系统在国内通常部署在高校或公共机构,Java 技术栈在运维习惯、部署环境兼容性上有天然的优势。

在 SpringBoot 版本选择上,我用了SpringBoot 2.7.x,而不是最新的 3.x。这里有一个很重要的考量:SpringBoot 3.x 要求 JDK 17 及以上,而很多学习者的本机环境还是 JDK 8,如果选了 3.x 会导致环境门槛变高。SpringBoot 2.7 虽然不算最新,但它仍然是目前生产环境中使用率非常高的版本,稳定、资料多、踩坑记录好找,尤其适合这种教学性质的源码项目。持久层我用的是 MyBatis-Plus,它对单表 CRUD 做了极大的简化,同时保留了自定义 SQL 的能力,在开发效率和灵活性之间取了平衡。

2.2 前端为什么选择 Vue 而不是其他框架

前端选择 Vue 的理由更加务实。Vue 在国内开发者群体中有庞大的用户基础,中文文档完善,学习曲线平缓,而且 Vue 生态圈里有 Element UI 这样的成熟中后台组件库,特别适合快速开发管理系统这类以表格、表单、弹窗为主要交互形态的应用。

具体到版本选择,我在这套系统中选用的是Vue 2 + Element UI,而不是 Vue 3 + Element Plus。这样说可能会让一些追求新技术的读者困惑。我的考量是:这套源码的定位是“稳定可运行 + 易改造”,Vue 2 的生态经过多年沉淀,各类问题和教程都极度丰富,对于第一次接触前后端分离项目的初学者来说,遇到问题能更容易搜到答案。Element UI 的表单校验、表格组件、分页组件开箱即用,几行代码就能完成一个标准的管理界面。当然,如果你本身是 Vue 3 的熟练使用者,把项目升级到 Vue 3 也不难,这属于后面可以扩展的方向。

前端工程化方面,我使用了 Vue CLI 来创建项目,它内置了 Webpack 打包配置,并且提供了 npm run serve 这样的本地开发命令。在开发环境,前端通过与后端的代理配置实现接口联调,也就是把 /api 前缀的请求转发给后端的 8081 端口,这样在开发阶段可以完美绕过跨域问题。

2.3 数据库选型与核心表结构设计

MySQL 是这个项目里最没有争议的选择。它开源免费、部署简单、性能稳定,而且在国内网络上有海量的使用教程和问题解决方案。版本推荐MySQL 5.7 或 8.0,两者都可以。但要注意,如果使用 MySQL 8.0,JDBC 驱动类和连接 URL 的配置与 5.7 略有不同,这个问题我在后面的部署章节会详细说。

数据库设计是整个系统的地基。我按照业务场景设计了七张核心表:user(用户表)、book(图书表)、borrow_record(借阅记录表)、reservation(预约记录表)、visit_appointment(入馆预约表)、category(图书分类表)、system_config(系统参数表)。下面我重点解释几张业务核心表的设计思路。

book表是整个图书管理的核心。除了书名、作者、ISBN、出版社、分类、馆藏位置这些基础信息外,我额外设计了total_stock(总库存)、available_stock(可借库存)和status(图书状态)三个字段。可借库存字段非常关键,因为每次借书和还书操作都需要同步更新它,查询图书列表时直接基于这个字段就能判断是否可借,不需要实时关联借阅记录表做统计,效率更高也更直观。

reservation表承载了预约借书功能。关键字段包括user_idbook_idstatusexpire_timestatus有“待取书”、“已完成”、“已取消”、“已过期”四个状态。当读者预约一本书后,管理员可以在后台确认图书已准备好,读者需要在规定时间内到馆取书,否则预约自动过期并释放库存。这个机制本质上是把线上预约和线下取书衔接起来的业务流程控制。

visit_appointment表则承载了入馆预约功能。字段包含user_idappointment_date(预约日期)、time_slot(时间段)、statushealth_info(健康自查信息)。入馆人数上限则通过同一天同一时间段内预约记录的数量与系统参数表中的max_visitors对比来控制。这个设计将“限流”从纯人工管理变成了系统自动管控,是疫情场景下最有价值的功能点之一。

3. 核心模块代码实现的路子与细节

3.1 后端项目的分层结构与接口设计

后端项目的包结构我严格按照分层架构来组织:controller层负责接收 HTTP 请求和参数校验,service层负责业务逻辑处理,mapper层通过 MyBatis-Plus 操作数据库。这种分层方式看起来很常规,但它的价值在于让每个类的职责非常单一,后期维护和扩展都方便。

以借书流程为例,在BorrowController中定义了一个POST /api/borrow接口,接收userIdbookId两个参数。控制器拿到参数后调用BorrowService.borrowBook(userId, bookId)。在Service层中,整个借书业务按照以下逻辑执行:先校验读者是否存在且状态正常;再校验图书是否存在且可借库存大于零;若校验通过,生成一条借阅记录并把图书的available_stock减一;最后更新图书状态。我把更新库存的操作放在借阅记录创建之后,并用@Transactional注解保证这两个数据库操作要么同时成功,要么同时失败,避免出现“记录了借阅但库存没减”的数据不一致问题。

这里插一个非常值得注意的细节:库存减一操作,我一开始写的是先查出当前可借库存,在 Java 代码中减一后再更新。这种方式在并发量大的时候会产生“超卖”问题。后来我改成了直接在 SQL 语句中执行UPDATE book SET available_stock = available_stock - 1 WHERE id = ? AND available_stock > 0,通过数据库层面的条件更新来保证并发安全。虽然图书馆的并发量不会像电商那么高,但这种写法代表了一个合格后端开发者的基本素养。

3.2 前端路由与页面的组织方式

前端项目基于 Vue CLI 创建,目录结构遵循 Vue 2 项目的标准规范:src/views目录存放页面组件,src/router目录配置路由表,src/api目录封装接口请求,src/utils存放 axios 实例和 token 工具函数。路由表是理解整个前端页面逻辑的关键。

我使用了 Vue Router 并使用路由守卫来做登录权限控制。简单来说,路由表里定义了/login/bookList/borrow/reservation/visit/admin等页面。在全局前置守卫中,每次路由跳转前检查本地是否存在 token,如果没有则强制跳转到登录页。对于管理员页面,还额外判断了当前用户的角色信息,普通读者访问管理页面会被拦截并提示无权访问。

页面的交互逻辑并不复杂,以图书列表页为例:页面加载时向GET /api/book/list发送请求,后端返回分页数据,前端用 Element UI 的el-table组件渲染列表,用el-pagination组件渲染分页。搜索功能则通过输入条件重新请求接口实现。这些操作看起来平淡无奇,但却是每一个管理系统开发者都必须熟练掌握的基础功。

3.3 预约限流模块的实现细节

预约模块是这个项目的精髓所在。入馆预约的核心逻辑是:读者选择某一天的某个时间段,系统查询该时间段已有的预约人数,如果小于系统配置的上限,就创建一条预约记录;否则提示“该时段已约满”。

具体实现时,我设计了一个visit_appointment表,以appointment_datetime_slot两个字段作为判断条件。查询语句的核心逻辑是:

SELECT COUNT(*) FROM visit_appointment WHERE appointment_date = #{date} AND time_slot = #{timeSlot} AND status = 'CONFIRMED'

system_config表中存储了max_visitors_per_slot这个配置项,管理员可以灵活调整每个时间段的最大预约人数。如果把某个时段的最大人数设置为 0,就相当于关闭了这个时段的预约,这就为疫情的动态管理留了极大弹性。同时,读者入馆后管理员可以执行“确认到馆”操作,把预约状态从CONFIRMED改为VISITED,这样及时释放名额,方便其他读者预约。

图书预约的逻辑与入馆预约略有不同。因为图书预约不仅是一个名额判断,还涉及库存和线下取书的衔接。当读者发起借阅预约时,系统检查当前图书的available_stock,如果大于零,就为读者创建一条待取书的预约记录,并暂时锁定库存。管理员在后台确认“图书已准备好”后,状态变为待取书,读者需在规定时限内到馆取书。如果超时未取,系统定时任务或管理员手工操作会将预约状态改为“已过期”,并释放库存。这一整套流程把线上预约、库存锁定、线下取书完美地串了起来。

4. 从源码到本地可运行的部署实操记录

4.1 环境准备与版本对应关系

这部分是很多拿到源码的人最容易卡住的地方。我把整个环境要求列成一个清晰的对照表:

软件推荐版本备注
JDK1.8项目使用 Java 8 语法,JDK 8 到 JDK 11 均可
Maven3.6+IDEA 自带,也可以用命令行
MySQL5.7 / 8.05.7 配置最简单,8.0 需注意驱动差异
Node.js14.x / 16.x不要用太高版本,否则 npm install 容易报错
npm6.x / 8.x对应 Node 版本

对于没有安装任何一个环境的纯新手,我的建议是先去把 JDK、MySQL、Node.js 装好,再回来继续看。很多人不是代码有问题,而是环境有问题,例如 JDK 路径没配导致 Maven 编译失败,或者 MySQL 初始化时 root 密码记不住导致后面连接不上。我强烈建议数据库连接信息这类配置都写在application.yml里,并且不要提交真实密码到代码仓库,本地开发用统一密码即可。

4.2 数据库初始化与关键配置解释

数据库初始化是让系统跑起来的第一步。项目根目录下有一个db_library.sql文件,包含了建库、建表、插入初始数据的全部 SQL 语句。本地执行方式非常直接:打开 MySQL 命令行工具,执行source db_library.sql的完整路径,即可完成数据库的创建和初始化。

我设计的初始化数据里包含一个管理员账号(admin/123456)和几个读者账号(user01/user01 等),以及几十本测试图书数据,覆盖了文学、科技、历史等多个分类。这样使用者登录进去就能看到内容,不需要手工录入数据。

初始化完成后,需要修改后端配置文件。在application.yml中,最关键的是数据库连接信息:

spring: datasource: url: jdbc:mysql://localhost:3306/db_library?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver

这里有个版本差异要特别说明:MySQL 8.0 的驱动类是com.mysql.cj.jdbc.Driver,连接 URL 必须要有serverTimezone参数,否则会报时区相关的错误;而 MySQL 5.7 使用旧版的驱动类com.mysql.jdbc.Driver也能连接,但不推荐。所以我的建议是统一使用 MySQL 8.0 的驱动配置方式,两个版本的数据库都能兼容。

4.3 后端启动步骤与验证方式

后端项目位于backend目录下。使用 IDEA 打开该目录后,IDEA 会自动检测到 Maven 项目并开始下载依赖。第一次下载依赖可能比较慢,国内网络建议在 Maven 的settings.xml中配置阿里云镜像源,这个操作能节省大量时间。

依赖下载完成后,在src/main/java下找到主启动类LibraryApplication.java,右键运行即可。看到类似下面的日志就表示后端启动成功:

Tomcat started on port(s): 8081 (http) with context path ''

这里要提醒大家:我把后端端口配置为 8081 而不是 8080。原因是前端 Vue 开发服务器默认占用 8080 端口,如果后端也用 8080 会导致本地联调时端口冲突。前端通过代理请求/api,代理目标指向http://localhost:8081,这样就完全避开了跨域和端口冲突两个经典问题。

验证后端是否正常工作,可以在浏览器中直接访问http://localhost:8081/api/book/list,如果返回 JSON 格式的图书列表数据,说明后端和数据库的连接已经打通。

4.4 前端启动步骤与常见启动报错处理

前端项目位于frontend目录下。启动流程分为三大步:安装依赖、启动开发服务器、访问页面。

cd frontend npm install npm run serve

npm install这一步对新手来说是一个比较明显的门槛。它需要从 npm 官方仓库下载大量依赖包,在国内常常因为网络问题导致超时或安装失败。解决方法是把 npm 源切换到国内镜像源,一行命令就可以完成:

npm config set registry https://registry.npmmirror.com

切换源之后重新执行npm install,速度会肉眼可见地提升。如果执行npm install期间报错,常见原因是 Node 版本太高导致某些旧依赖包不兼容,我建议用 Node.js 的版本管理工具切换到 16.x 再试。

依赖安装完成后,执行npm run serve,看到App running at: http://localhost:8080就表示前端启动成功。浏览器访问这个地址,默认会跳转到登录页,用管理员账号登录即可看到完整功能。整个流程走下来,基本验证了标题中的“可直接运行”不是一句空话。

4.5 我在打包部署时的三个经验细节

除了开发环境运行,很多人还会尝试把项目打成生产包部署到服务器上。这里分享三个我在实际部署中总结出来的经验。

第一个经验是关于前端打包后的静态资源路径。默认情况下,Vue 项目打包后的资源路径是根路径/,如果部署在服务器的子路径下,会出现白屏或资源加载失败的问题。解决办法是在vue.config.js中设置publicPath: './',让资源路径变成相对路径,这样部署在任意路径下都能正常访问。

第二个经验是关于前端打包后的接口地址。前端代码里 axios 请求的 baseURL 是/api,在开发时靠代理转发到后端 8081。打包后没有 Node 代理了,就需要在 Nginx 配置反向代理,把/api开头的请求转发到后端服务:

location /api/ { proxy_pass http://localhost:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }

第三个经验是数据库连接被拒问题。后端部署到服务器后,数据库地址不能再写localhost,要改成服务器的内网 IP 或实际数据库地址。同时 MySQL 默认只允许本机连接,需要为远程访问创建允许特定 IP 连接的用户,或者调整绑定地址。如果没有这一步配置,大概率会报Communications link failure这个错误。

5. 最常被问到的坑与排查思路

5.1 数据库连接类问题排查

在实战中,数据库连不上是出现频率最高的问题。典型的错误提示是Access denied for user 'root'@'localhost'或者Communications link failure。前者的原因通常是密码错误,需要检查application.yml中的密码是否与数据库实际设置的密码一致。后者的原因则复杂一些,常见的有数据库服务没启动、端口被防火墙拦截、连接 URL 中的 IP 或者端口写错、MySQL 8.0 的时区问题未配置。

如果你用的是 MySQL 8.0,刚好遇到Unable to load authentication plugin 'caching_sha2_password'这个错误,不用慌,这是因为 MySQL 8.0 默认的认证插件与旧版驱动不兼容。解决办法有两个:一是把驱动升级到mysql-connector-java8.0.33 版本;二是在 MySQL 命令行中执行下面的 SQL 把用户加密方式改回mysql_native_password

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

这个错误在 5.7 版本中不会出现,这也是为什么我建议新手优先选择 5.7 的原因。

5.2 前端接口报错的排查思路

联调阶段最典型的报错是Proxy error: Could not proxy request /api/...。这个错误说明前端代理配置有问题,需要检查vue.config.js中的devServer.proxy配置,确认代理目标地址http://localhost:8081的端口是否与后端实际启动端口一致。

另一个常见问题是接口返回 404。这时先别急着改后端代码,首先用 Postman 或浏览器直接访问具体的接口地址,如果直接访问能通,而前端访问不通,问题通常出在代理配置上;如果直接访问也返回 404,则要去后端检查Controller中的请求映射路径,看看@RequestMapping路径是否存在拼写错误或者层级缺失。

第三个高频问题是登录后刷新页面就退出。这个是因为登录状态存储在 Vuex 中,刷新后内存中的数据丢失,token 没有持久化到localStorage。我的解决方法是把 token 存到localStorage,每次刷新后在 Vuex 初始化时从localStorage重新读取。这个方案非常简单,却能解决一个让无数新手头疼的问题。

5.3 业务逻辑层面的隐蔽缺陷

最后分享一个我在测试中发现的业务逻辑 bug,这是一个很值得后端开发者警惕的典型案例。在生成借阅记录和扣减库存的流程中,一开始我没有保证操作的原子性,导致出现“借阅记录生成了,但库存没有减少”的情况。后来加了@Transactional并配合数据库条件更新,才彻底解决了问题。

另一个隐蔽的坑是图书删除功能的处理。如果直接删除图书记录,但该图书还有未归还的借阅记录,就会导致数据关联断裂。在访问历史记录时会查出空的书名。解决方法是把删除改为逻辑删除,用deleted字段标记,而不是真正从数据库中删掉。这种逻辑删除的思路,在现实项目管理中非常常用,值得每一个学习者重视。

6. 这个项目后续还可以怎么扩展

6.1 引入 Redis 做缓存和限流

当前系统对数据库的查询没有做缓存,每次请求图书列表都会直接查库。如果数据量变大,数据库压力会明显增加。一个低成本的优化方案就是引入 Redis 缓存热门图书列表,设置几分钟的过期时间。同时,Redis 也可以用来做入馆预约的计数器,利用它的原子性操作实现更精确的限流控制,避免超高并发下数据库压力过大。

6.2 用 WebSocket 实现预约状态的实时推送

目前预约状态的变更,比如管理员确认图书准备好、预约超时被释放,都需要读者刷新页面才能看到。如果引入 WebSocket,可以让后端主动推送状态变更给前端,读者不需要刷新页面就能实时收到通知。这种体验提升在预约取书、入馆审核这类场景中非常直观。

6.3 图书宣传视频与 m3u8 播放支持

作为一个实用型的图书管理系统,还可以把图书数字化内容整合进来。比如为热门图书配置宣传视频或内容导读,前端用基于 video.js 的播放器接上 m3u8 格式的视频流,就能实现在线预览功能。Vue 生态中有对应的 HLS 播放方案,如果要做数字化阅读空间,这会是一个很加分的扩展点。

6.4 用 Docker 编排一键部署

如果你不想在服务器上手动装 JDK、MySQL、Node 环境,可以写一份 Dockerfile 和 Docker Compose 配置,把后端、前端、数据库分别构建成镜像,一条命令启动所有服务。这样无论是本地切换环境还是部署到云服务器,都会变成一个非常轻量的事情。尤其是前后端分离的项目,Docker Compose 编排三个容器是非常优雅的解决方案。

最后再分享一个我个人的感受。做这个项目的过程其实不只是写代码,更多的时候是在想“这个功能到底是给谁用、解决什么问题”。图书馆管理系统表面上是一个传统的信息管理系统,但一旦放到疫情这个具体的场景里,预约、限流、无接触借还这些功能就变得非常实际。这也是我为什么在文章里花大量篇幅讲业务设计和需求拆解,而不是只贴代码的原因。技术框架只是工具,真正有价值的是把业务场景用代码落地的能力。如果你正在研究这套源码,我希望你多花时间想想每一个设计背后的原因,然后动手去改一版你自己的功能出来,那才是把这个源码真正吃透了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 5:20:52

Trae+Keil命令行:STM32开发也能享受AI高效编程

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

作者头像 李华
网站建设 2026/9/17 5:20:24

Image 2.5双参考图实操:从四格漫画到系列化AI生图的一致性控制

1. 从“碰运气”到“能复现”:双参考图到底解决了什么问题做AI生图的老手应该都有这种感觉:单张图怎么都好说,一旦要画一个“系列”,麻烦立刻就来了。以前用AI画连环画或者四格漫画,最痛苦的不是构图、不是光影&#x…

作者头像 李华
网站建设 2026/9/17 5:18:58

新经济公司如何套用林奇GARP策略?质量成长框架的调整

20世纪90年代,彼得林奇在《彼得林奇的成功投资》里写下一句话:投资的关键不是判断市场,而是判断公司。他把自己的策略总结为GARP,Growth at a Reasonable Price,合理价格下的成长。这套逻辑当年在沃尔玛、克莱斯勒、甜…

作者头像 李华
网站建设 2026/9/17 5:18:56

eVTOL PCBA可靠性验证:温度循环与振动测试的关键关卡

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

作者头像 李华
网站建设 2026/9/17 5:17:03

Java Connection refused 排查:TCP握手与端口监听实战

java.net.ConnectException 这个报错,几乎每个写过 Java 的人都撞上过。报错信息往往就一行java.net.ConnectException: Connection refused: connect,简洁得像什么都没说,但它背后可能是服务没起来、端口写错了、绑定地址不对、容器网络不通…

作者头像 李华