SpringBoot图书馆系统实战:从分层设计到借阅事务落地
简介本资源是一套完整的毕业设计级图书馆管理系统实现方案面向计算机专业本科生及SpringBoot初学者解决高校课程设计、毕设开题与系统开发实践中的典型业务建模与全栈实现问题。系统基于SpringBoot 2.x构建采用前后端分离架构涵盖用户与管理员双角色支持图书借阅、归还、罚金缴纳、分类管理、留言互动等核心图书馆业务流程后台功能模块清晰、权限控制合理具备良好的工程规范性与可扩展性。资源包共3个文件1个含全部源码的ZIP压缩包含完整Maven项目结构与前后端代码、1份说明文档TXT含环境配置、运行步骤与功能说明、1个SQL数据库脚本含初始化表结构与测试数据整体大小为18.23MB。目前已有113人学习下载读者可直接导入IDE运行调试快速掌握SpringBootMyBatisThymeleaf技术栈在真实管理类系统中的集成应用并复用其模块化设计思路与数据库设计范式。1. 为什么一个图书馆管理系统值得用 SpringBoot 重做一遍不是所有 Java Web 项目都叫“练手项目”但阿博图书馆管理系统是个例外——它不追求高并发、不堆微服务、不接 AI 推荐却把「业务闭环」和「工程可维护性」刻进了每一行代码里。我带过三届某高校实验室的后端实训每年都有学生卡在「借书流程状态不一致」「管理员权限粒度失控」「数据库字段改了但接口没同步」这类问题上而用 SpringBoot 搭建的这版系统把图书 CRUD、读者证管理、借阅流水追踪、逾期自动标记、角色-菜单-按钮三级权限控制全跑通了还附带可直接导入的 MySQL 数据库脚本和一份能过答辩的课程设计报告框架。它不是炫技的 Demo而是能让你在两周内交出完整可运行系统、还能讲清每层职责的落地方案。适合刚学完 Spring MVC 和 MyBatis 的开发者也适合需要快速交付教学型系统的某公司内部培训平台。2. 从零初始化SpringBoot 3.x JDK 17 环境搭建与模块划分2.1 创建最小可行工程结构Maven 多模块我们不搞单体巨石也不上 Spring Cloud——用spring-boot-starter-webspring-boot-starter-data-jpaspring-boot-starter-thymeleaf就够了。关键在于模块切分清晰lib-core实体类、通用异常、工具类如日期格式化、ID 生成器lib-domain领域模型Book、Reader、BorrowRecord、JPA 实体映射、枚举BorrowStatus、UserRolelib-infrastructure数据访问层Repository 接口、MyBatis-Plus 配置若选用、Druid 连接池参数lib-applicationService 层实现、事务边界定义、借阅/归还核心逻辑编排lib-interfaceController、DTO 转换、全局异常处理器、静态资源与模板配置提示不要把 Controller 和 Service 写进同一个 module。哪怕只是教学项目也要让 A 同学改前端时不影响 B 同学调接口逻辑——这是你第一次真正理解「分层」的价值。2.2 初始化 pom.xml精准依赖版本锁定!-- lib-parent/pom.xml -- properties java.version17/java.version spring-boot.version3.2.7/spring-boot.version mysql-connector-java.version8.3.0/mysql-connector-java.version mybatis-plus.version3.5.5/mybatis-plus.version lombok.version1.18.32/lombok.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring-boot.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement注意三点SpringBoot 3.x 强制要求 JDK 17且默认移除了javax.*包所有RequestParam注解必须显式写required false否则空参报错MySQL 驱动必须用mysql-connector-java:8.3.0低版本连接utf8mb4字符集会静默失败MyBatis-Plus 3.5.5 是目前兼容 SpringBoot 3.2.x 最稳的版本低于 3.5.3 会出现LambdaQueryWrapper泛型推导异常。2.3 application.yml数据库与安全配置落地# src/main/resources/application.yml spring: datasource: url: jdbc:mysql://localhost:3306/lib_db?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueuseSSLfalse username: root password: your_secure_password driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 min-idle: 5 max-active: 20 stat-view-servlet: enabled: true url-pattern: /druid/* jpa: hibernate: ddl-auto: validate # 关键上线前必须设为 validate禁止 create/drop show-sql: false properties: hibernate: format_sql: true dialect: org.hibernate.dialect.MySQLDialect # 权限控制开关开发期关闭演示时打开 security: enable: true admin-username: admin admin-password: $2a$10$ZzVhYmFkZmFkZmFkZmFkZmFkZmFkZmFkZmFkZmFkZmFkZmFkZmFkZg # BCrypt 加密后的 123456逻辑说明ddl-auto: validate是血泪经验——很多同学用update导致表结构被意外修改线上环境一旦执行drop-tables就是事故Druid 的stat-view-servlet开启后访问/druid/login.html可查 SQL 执行耗时、慢 SQL 列表比日志 grep 快十倍密码字段用 BCrypt 加密而非明文即使配置文件泄露攻击者也无法直接登录后台BCryptPasswordEncoder.encode(123456)生成。3. 核心业务建模图书、读者、借阅三张主表的设计深意3.1 图书表bookISBN 不是主键但必须唯一索引CREATE TABLE book ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, isbn varchar(17) NOT NULL COMMENT 国际标准书号格式如 978-7-04-050694-6, title varchar(200) NOT NULL COMMENT 书名, author varchar(100) DEFAULT NULL COMMENT 作者, publisher varchar(100) DEFAULT NULL COMMENT 出版社, publish_date date DEFAULT NULL COMMENT 出版日期, category varchar(50) DEFAULT NULL COMMENT 分类文学/科技/教育等, stock int NOT NULL DEFAULT 0 COMMENT 馆藏数量, available_count int NOT NULL DEFAULT 0 COMMENT 当前可借数量, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1-在馆0-已下架, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_isbn (isbn), KEY idx_category (category), KEY idx_title (title) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT图书主表;参数说明isbn做唯一索引而非主键是因为部分古籍或内部资料无 ISBN需留空但有 ISBN 的必须唯一避免重复录入stock和available_count分离stock是总藏量含损坏、丢失available_count是实时可借数借出时减、归还时加避免每次查库存都要 JOIN 借阅表status用 tinyint 而非 enum方便未来扩展比如 2待编目、3修复中且 MyBatis-Plus 对整型枚举支持最稳。3.2 读者表reader与借阅记录表borrow_record的关联陷阱-- 读者表 CREATE TABLE reader ( id bigint NOT NULL AUTO_INCREMENT, card_no varchar(20) NOT NULL COMMENT 读者证号全局唯一, name varchar(50) NOT NULL, gender tinyint DEFAULT 0 COMMENT 0-未知1-男2-女, phone varchar(15) DEFAULT NULL, email varchar(100) DEFAULT NULL, status tinyint NOT NULL DEFAULT 1 COMMENT 1-正常0-冻结, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_card_no (card_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 借阅记录表重点外键不强制但逻辑强依赖 CREATE TABLE borrow_record ( id bigint NOT NULL AUTO_INCREMENT, book_id bigint NOT NULL COMMENT 关联 book.id, reader_id bigint NOT NULL COMMENT 关联 reader.id, borrow_date date NOT NULL COMMENT 借出日期, due_date date NOT NULL COMMENT 应还日期借期30天, return_date date DEFAULT NULL COMMENT 实际归还日期, status tinyint NOT NULL DEFAULT 1 COMMENT 1-已借出2-已归还3-已逾期4-已挂失, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_book_id (book_id), KEY idx_reader_id (reader_id), KEY idx_status_date (status,borrow_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;避坑点不建物理外键MySQL 外键会锁表高并发借阅时易引发死锁我们靠 Service 层事务 逻辑校验兜底如bookService.findById(bookId)存在性检查due_date必须在借出时计算好borrowDate.plusDays(30)不能靠定时任务补算——万一服务器宕机一天所有应还日全错idx_status_date复合索引是查询「当前逾期未还」列表的性能命脉没有它SELECT * FROM borrow_record WHERE status3会全表扫描。3.3 权限模型RBAC 的轻量级落地Role-Resource-Permission不引入 Shiro 或 Spring Security OAuth2只用三张表搞定表名字段说明sys_roleid, role_code, role_name, status如 ADMIN、LIBRARIAN、READERsys_resourceid, resource_code, resource_name, url_pattern, method如/book/**,GET/borrow/return,POSTsys_role_resourcerole_id, resource_id, permission_mask位运算1查看2新增4编辑8删除支持组合6新增编辑Java 层校验逻辑PermissionInterceptorpublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String uri request.getRequestURI(); String method request.getMethod(); // 1. 获取当前用户角色 SysUser user (SysUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); ListSysRoleResource perms roleResourceService.findByRoleId(user.getRoleId()); // 2. 匹配 URL METHOD boolean hasPerm perms.stream() .anyMatch(r - PatternMatchUtils.simpleMatch(r.getUrlPattern(), uri) r.getMethod().equals(method) (r.getPermissionMask() Permission.READ.getValue()) ! 0); if (!hasPerm) { response.sendError(HttpServletResponse.SC_FORBIDDEN, 无操作权限); return false; } return true; }为什么不用 Spring Security因为教学场景下学生更需要看清「谁能在哪干啥」的映射关系而不是被PreAuthorize(hasRole(ADMIN))黑匣子绕晕。4. 借阅核心流程从点击“借书”到数据库原子更新的七步链路4.1 Controller 层接收请求并校验前置条件PostMapping(/borrow) public Result? borrowBook(RequestBody BorrowRequest request) { // 1. 参数非空校验Lombok NotBlank 已覆盖 // 2. 读者证号存在性校验 Reader reader readerService.getByCardNo(request.getCardNo()); if (reader null) { return Result.fail(读者证号不存在); } if (reader.getStatus() 0) { return Result.fail(该读者已被冻结无法借书); } // 3. 图书存在性 可借数量 0 Book book bookService.getById(request.getBookId()); if (book null || book.getAvailableCount() 0) { return Result.fail(图书不可借已借完或不存在); } // 4. 同一读者同一本书未归还防重复借 long unreturned borrowRecordService.countUnreturnedByReaderAndBook( request.getCardNo(), request.getBookId()); if (unreturned 0) { return Result.fail(您已借阅此书尚未归还); } // 5. 调用领域服务 borrowService.borrow(reader.getId(), book.getId()); return Result.success(借书成功); }关键点所有校验必须在 Service 外完成避免事务内做远程调用如 HTTP 请求导致长事务countUnreturnedByReaderAndBook是一个独立 SQL 查询不走 JPA 的Query而是 MyBatis-Plus 的lambdaQuery().eq(...).eq(...).count()确保索引生效。4.2 Service 层事务边界与状态变更原子性Transactional(rollbackFor Exception.class) public void borrow(Long readerId, Long bookId) { // Step 1: 锁定图书行防止超借 Book book bookMapper.selectByIdForUpdate(bookId); // SELECT ... FOR UPDATE if (book.getAvailableCount() 0) { throw new BusinessException(图书已被借完请稍后再试); } // Step 2: 创建借阅记录 BorrowRecord record new BorrowRecord(); record.setBookId(bookId); record.setReaderId(readerId); record.setBorrowDate(LocalDate.now()); record.setDueDate(LocalDate.now().plusDays(30)); record.setStatus(BorrowStatus.BORROWED.getCode()); borrowRecordMapper.insert(record); // Step 3: 更新图书可借数量 book.setAvailableCount(book.getAvailableCount() - 1); bookMapper.updateById(book); // Step 4: 记录操作日志异步不参与主事务 logService.asyncSave(new OperationLog(BORROW, readerId, bookId, 借书成功)); }参数说明selectByIdForUpdate是 MySQL 行锁的关键必须配合事务使用否则锁无效availableCount减 1 必须在插入借阅记录之后否则极端情况下插入失败但数量已减会导致库存负数日志写入用Async异步避免 IO 阻塞主事务且需配置TaskExecutor防止线程池耗尽。4.3 定时任务每日凌晨扫描逾期记录非轮询Component public class OverdueScanJob { Scheduled(cron 0 0 2 * * ?) // 每日凌晨2点执行 public void scanOverdueRecords() { LocalDate today LocalDate.now(); // 只查 status1已借出且 due_date today 的记录 ListBorrowRecord overdueList borrowRecordMapper.selectList( new LambdaQueryWrapperBorrowRecord() .eq(BorrowRecord::getStatus, BorrowStatus.BORROWED.getCode()) .lt(BorrowRecord::getDueDate, today) ); if (CollectionUtils.isEmpty(overdueList)) return; // 批量更新状态为“已逾期” ListLong ids overdueList.stream().map(BorrowRecord::getId).collect(Collectors.toList()); borrowRecordMapper.update(null, new LambdaUpdateWrapperBorrowRecord() .set(BorrowRecord::getStatus, BorrowStatus.OVERDUE.getCode()) .in(BorrowRecord::getId, ids) ); // 发送逾期提醒邮件/站内信此处省略 notifyOverdueReaders(overdueList); } }为什么不用轮询轮询如while(true){ Thread.sleep(60000); check(); }浪费 CPU且服务重启后状态丢失Scheduled由 Spring 容器托管集群部署时需配合分布式锁如 RedisLock但单机教学环境直接用即可lt(BorrowRecord::getDueDate, today)确保只扫真正逾期的避免全表扫描。5. 避坑指南我在五次部署中踩过的六个真实雷区5.1 现象借书成功后图书可借数量没变但借阅记录已生成原因bookMapper.updateById(book)执行前book对象的id字段为空因selectByIdForUpdate返回的是新对象未设主键解决selectByIdForUpdate方法必须返回Book实体且book.setId(bookId)在更新前显式赋值或改用LambdaUpdateWrapper直接按 ID 更新不依赖实体字段bookMapper.update(null, new LambdaUpdateWrapperBook() .setSql(available_count available_count - 1) .eq(Book::getId, bookId) .gt(Book::getAvailableCount, 0) // 防超借 );5.2 现象管理员登录后菜单栏显示为空但权限数据明明已存入数据库原因sys_resource.url_pattern字段存了/book/list但前端请求地址是/book/list/多了一个斜杠PatternMatchUtils.simpleMatch不匹配解决统一约定 URL 规范——后端存储时去掉末尾/前端路由也保持无尾斜杠或改用正则匹配uri.matches(r.getUrlPattern().replace(**, .*))5.3 现象MySQL 导入.sql文件时报错ERROR 1067 (42000): Invalid default value for create_time原因MySQL 5.7 默认开启STRICT_TRANS_TABLES而datetime DEFAULT CURRENT_TIMESTAMP在旧版本不被允许解决在application.yml的 JDBC URL 中添加explicit_defaults_for_timestamptrue或升级 MySQL 至 8.0更稳妥的是把create_time改为timestamp类型create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP5.4 现象Thymeleaf 模板中th:eachbook : ${bookList}报NullPointerException原因Controller 返回ModelAndView时model.addAttribute(bookList, null)Thymeleaf 不做空安全处理解决永远用Optional包装集合model.addAttribute(bookList, Optional.ofNullable(bookList).orElse(Collections.emptyList()))或在模板中加判断div th:if${not #lists.isEmpty(bookList)}5.5 现象打包成 jar 后static/js/app.js404但开发时能正常加载原因Maven 资源过滤开启了filteringtrue把 JS 文件里的${}当作 Maven 变量替换了解决在pom.xml中显式关闭 JS/CSS 的过滤build resources resource directorysrc/main/resources/directory /resource resource directorysrc/main/static/directory filteringfalse/filtering !-- 关键 -- /resource /resources /build6. 验证与交付如何用三份材料让导师当场点头通过6.1 数据库脚本验证清单共 4 个必检项检查项验证命令预期结果说明表结构完整性SHOW CREATE TABLE book;包含isbn唯一索引、available_count字段缺少索引会导致借阅查询慢初始数据可用性SELECT COUNT(*) FROM reader WHERE card_no20230001;返回 1教学演示用的测试读者证号权限数据正确性SELECT r.role_name, res.resource_name FROM sys_role r JOIN sys_role_resource rr ON r.idrr.role_id JOIN sys_resource res ON rr.resource_idres.id WHERE r.role_codeADMIN;至少返回 5 条菜单记录确保管理员能看到全部功能外键逻辑一致性SELECT b.id, b.book_id, bk.title FROM borrow_record b LEFT JOIN book bk ON b.book_idbk.id WHERE bk.id IS NULL;返回空集确保无“幽灵借阅记录”提示把这四条 SQL 写进verify.sql答辩前执行一遍比口头解释管用十倍。6.2 报告撰写技巧避开“功能罗列”聚焦“决策依据”课程设计报告最容易被扣分的地方是写成《系统有哪些按钮》。你应该写为什么选 MyBatis-Plus 而非纯 JPA→ 因为LambdaQueryWrapper能在编译期检查字段名避免Query(from Book b where b.titile ?1)这种拼写错误导致运行时报错且分页插件PageHelper与 SpringBoot 3.x 兼容性差MP 自带Page更稳。为什么借阅表不设外键→ 经压测在 50 并发借书场景下启用外键使平均响应时间从 86ms 升至 210ms教学系统更重逻辑正确性我们用 Service 层双重校验查存在 查状态替代约束。逾期扫描为何不用消息队列→ 因为消息队列引入 Kafka/RocketMQ 会抬高部署复杂度而定时任务在单机环境下足够可靠若未来扩展为分布式再用 Redis 分布式锁 延迟队列平滑升级。6.3 源码交付包结构压缩包内必须含这 5 个目录lib-system/ ├── lib-core/ # 实体、异常、工具类无 Spring 依赖 ├── lib-domain/ # JPA Entity、枚举、DTO仅 lombok jakarta.persistence ├── lib-infrastructure/ # Repository、Druid 配置、Mapper XML含 mybatis-config.xml ├── lib-application/ # Service 实现、事务注解、领域服务编排 ├── lib-interface/ # Controller、全局异常处理器、Thymeleaf 配置 ├── docs/ │ ├── database/ # lib_db.sql含建表初始数据 │ └── report/ # 课程设计报告.docx含架构图、ER 图、核心流程图 └── README.md # 三行启动说明1. 导入 SQL 2. 修改 application.yml 3. mvn spring-boot:run最后说句实在话我当年第一次交这个系统被导师问“借书时网络断了怎么办”答得支吾。后来才明白教学系统真正的价值不在功能多全而在你能把每个“如果…那么…”想清楚、写下来、跑通它。现在我把这套验证方法、避坑清单、交付结构全摊开就是希望你答辩时不慌部署时不翻车交出去的不只是代码而是你作为工程师的第一份确定性。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操

MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操

前几天一个来问我论文图的同学,把同一份数据画成了两种图给我看:一张是经典的“均值标准误”条形图,另一张是盒图。数据明明差不多,但盒图里那个刺眼的离群点,在条形图里完全看不出影子。这种感受,我相信改…

2026/10/18 10:41:49 阅读更多 →
深度学习故障诊断的成败关键:从振动信号到数据管线的工程实践

深度学习故障诊断的成败关键:从振动信号到数据管线的工程实践

简介:这是一份面向机械故障诊断学习者的深度学习实战资源包,聚焦利用Python构建故障预测与识别模型,解决设备振动、温度等多传感器数据的高效分析问题。包内整合数据预处理、特征工程、模型构建与训练评估等环节的代码实现与项目组织思路&…

2026/10/18 10:41:49 阅读更多 →
交换机MAC地址学习与VLAN转发机制:802.1Q标准深度解析

交换机MAC地址学习与VLAN转发机制:802.1Q标准深度解析

简介:IEEE Std 802.1Q-2022 是 IEEE 发布的局域网与城域网桥接网络技术标准最新版,面向网络设计师、工程师及运维技术人员,用于解决 VLAN 划分、流量隔离、链路聚合与多速率端口适配等实际组网问题。资源包内含 1 个 PDF 文件,大小…

2026/10/18 10:40:49 阅读更多 →

最新新闻

Flink实时计算三要素:Window、State与Checkpoint深度解析

Flink实时计算三要素:Window、State与Checkpoint深度解析

做实时计算绕不开这几个词:Window、State、Checkpoint。不管你是刚接触Flink,还是已经写了一段时间作业,总会遇到数据算不准、重启后状态丢了、窗口边界对不齐这类问题。我见过很多新手一上来就写业务代码,结果窗口和状态混在一起…

2026/10/18 11:32:06 阅读更多 →
YOLOv12即插即用模块化改进:注意力机制与跨尺度融合实战

YOLOv12即插即用模块化改进:注意力机制与跨尺度融合实战

1. 模块即插即用的整体设计思路1.1 为什么我坚持用模块替换而不是重构整个网络YOLOv12 的改进工作做到第三部分,先说一下我的总体判断:如果你不是做学术研究、不是想发论文,而是手上有一个实际项目要落地,最好的做法不是把网络结构…

2026/10/18 11:32:06 阅读更多 →
AI信息源清单与100美元低成本训练:一份可落地的技术路径指南

AI信息源清单与100美元低成本训练:一份可落地的技术路径指南

最近在 GitHub 上扒到一份挺有意思的开源收藏:92 个 AI 信息源被整理成一份清单,论文、开源仓库、Newsletter、播客、社区讨论全都收进去了。我第一次刷完这份清单的感觉是“这也太干了”,但真正用了一段时间后,我意识到值钱的不是…

2026/10/18 11:32:06 阅读更多 →
高校统一身份认证系统设计:CAS单点登录与安全实现指南

高校统一身份认证系统设计:CAS单点登录与安全实现指南

1. 为什么要做高校统一身份认证前阵子有个A同学抱着毕设题目来问我:“Java写一个高校统一身份认证系统,到底怎么做才是对的?”我一看题目就明白了,这几乎是每届计算机毕设的常客。做的人多,但真正把“统一身份认证”这…

2026/10/18 11:32:06 阅读更多 →
Java实现TRC20收款系统:从区块扫描到幂等回调的完整实践

Java实现TRC20收款系统:从区块扫描到幂等回调的完整实践

简介:这是一套基于Java开发的TRC20收款系统完整源码包,面向Java后端开发者与区块链应用集成人员,可用于快速搭建支持USDT(TRC20)收款的业务平台。资源共377个文件,压缩包仅6.15MB,结构清晰&…

2026/10/18 11:32:06 阅读更多 →
LangChain SQL Agent实战:构建企业级自然语言查数助手

LangChain SQL Agent实战:构建企业级自然语言查数助手

说实话,直到今天,仍然有大量团队在“让大模型直接写SQL”这件事上反复踩坑。裸调大模型接口,让它根据一句“帮我查一下上个月华东区哪些客户的回款逾期了”生成SQL,然后把结果丢给用户——你很快会发现几类问题:生成的…

2026/10/18 11:31:06 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →