SpringBoot+Vue图书馆管理系统:从数据库设计到前后端实现

SpringBoot + Vue 做管理系统,放在 2025 年已经不算什么新鲜组合,但每次看到这种自带完整源码和数据库的图书馆管理系统,我还是愿意认真拆一拆。因为“管理系统”三个字看着简单,真要把借书、还书、逾期、统计这一整套流程切得干净利落,从数据库表设计到前后端联调,每一步都有讲究。

这套“阿博图书馆管理系统”,本质就是一个非常典型的 Java 全栈项目:后端 SpringBoot + MyBatis 操作 MySQL,前端 Vue 负责页面渲染与交互,前后端通过 RESTful API 进行数据对接。它要解决的痛点也很直白——把图书馆里原本靠纸质登记和 Excel 表格堆出来的流程,挪到一个可视化界面里,从录入图书、管理读者,到借阅归还、逾期处理,全程留痕、实时可查。

这套系统适合谁?第一类是正在做毕业设计或期末课设的学生,需要一个覆盖面全、能讲清楚实现逻辑的题目;第二类是刚入行的 Java 开发者,想通过一个完整项目理解前后端分离、接口设计、权限控制这些实际工作中的高频能力。如果你只是想要一套能跑起来交差的 Demo,它也能满足,但既然要做系统,我更建议把每一行核心代码都吃透再做二次开发。

1. 项目整体设计与技术选型

1.1 为什么是 SpringBoot + Vue 这套组合

拆开来看,SpringBoot 的价值在我的体验里首先是“少写配置”。它内置了 Tomcat,打成一个 Jar 包随处跑,把过去 Spring 那一堆 XML 配置收敛成了自动配置加注解,这让管理系统的开发成本一下子降了很多。和早期的 SSM 框架相比,SpringBoot 让团队可以把精力放在写业务代码上,而不是整天折腾环境。

MyBatis 则是那种适合“表关系复杂、SQL 需要精细控制”项目的持久层框架。图书馆管理系统里多表关联查询很多,比如查借阅记录要同时带出书名、读者名、分类名,这种需求用 MyBatis 的 SQL 联查非常直观,效率也好控制。相比之下,如果换用 JPA,简单 CRUD 确实省事,但在复杂查询和 SQL 调优层面,控制力会弱一些。

MySQL 不用多说,工程界最通用的数据库,毕业设计、外包项目、中小企业内部系统基本都是它。好处是资料多、生态成熟、出问题一搜就有答案,这对学习项目来说太重要了。而 Vue 这边,管理系统的通用交互无非就是表格、表单、弹窗、侧边栏菜单,Vue 配合 Element UI 基本是开箱即用,组件库成熟,中文文档丰富,对初学者极其友好。

1.2 技术选型取舍对照

技术组件在本项目中的作用如果换成其他方案会怎样
SpringBoot提供 RESTful 接口,管理业务对象和事务换成 SSM 需要手动整合大量配置,开发效率明显下降
MyBatis数据持久化,手写 SQL 完成多表操作换 JPA 开发初期快,但多表统计和复杂条件查询后期很难磨
MySQL存储图书、读者、借阅记录等全部业务数据换 PostgreSQL 完全可以,但周边工具和中文资料没有 MySQL 丰富
Vue渲染用户界面,管理页面交互状态换 React 也行,但开源管理系统模板和国内招聘生态更偏 Vue

这个选型组合说白了就是一条稳妥路线。它不追求某个技术点多么前沿,而是保证每个环节都有足够成熟的经验可以被借鉴,尤其适合学习、课设、答辩这类场景。

1.3 源码目录结构怎么组织

规范的目录结构能帮你节省大量定位问题的时间。后端我是这样划分的:

com.abo.library ├── config // 配置类:跨域、MyBatis、拦截器注册 ├── controller // 接口层:接收请求、返回统一结果 ├── service // 业务层:处理核心业务逻辑 ├── mapper // 数据访问层:接口 + XML 映射 ├── entity // 数据库实体类 ├── dto // 前端传入参数对象 ├── vo // 前端展示返回对象 ├── utils // 通用工具类 ├── interceptor // 登录与权限拦截器 └── LibraryApplication.java

前端目录也用标准 Vue 工程结构:

src/ ├── api // axios 接口封装,按模块拆文件 ├── views // 页面组件,如图书列表、借阅管理、系统设置 ├── components // 通用组件,如分页、上传、弹窗 ├── router // 路由配置,含动态路由和权限控制 ├── store // 全局状态,存放 token、用户信息 ├── utils // 工具类,含请求封装、格式化 └── App.vue

这种分层的好处是业务开发时照着 “Controller → Service → Mapper” 一层层往下写就行,出了问题也好定位——接口报错先看 controller,业务逻辑不对看 service,SQL 不对看 mapper XML,不扯皮。

2. 核心功能模块与数据库表设计

2.1 六大功能模块拆解

图书管理模块是整个系统的主心骨,包括图书分类、图书信息维护、库存数量管理、检索查询。前端表现就是一个图书列表页,配合新增和编辑弹窗,分类单独一个管理页。

读者管理模块管的是谁在借书。包括读者档案维护、借阅证状态控制、个人历史借阅记录查询。如果系统里分管理员和读者两种角色,普通读者登录前台后只能看自己的信息和借阅情况。

借阅管理模块是核心中的核心,借书、还书、续借、逾期处理都在这条链路上。一本书能否借出,需要经过库存校验、图书状态校验、读者借阅上限校验三重关卡。逾期处理还要根据应还时间自动计算罚金,这部分数据逻辑最容易出问题。

公告管理模块负责管理员发布系统公告,读者登录后能看到公告列表和详情。系统管理模块承担账户管理、角色管理、菜单权限配置。统计报表模块在多数版本里属于加分项,可以做成按时间段统计借阅量、热门图书排行、逾期记录汇总等可视化页面。

2.2 数据库表怎么设计才不用返工

数据库名我习惯叫 library,字符集用 utf8mb4。这里给出最核心的几张表结构,你可以直接参考建模。

图书表 t_book:

CREATE TABLE `t_book` ( `id` int NOT NULL AUTO_INCREMENT, `isbn` varchar(20) DEFAULT NULL COMMENT 'ISBN号', `book_name` varchar(100) NOT NULL COMMENT '书名', `author` varchar(50) DEFAULT NULL COMMENT '作者', `publish_house` varchar(100) DEFAULT NULL COMMENT '出版社', `type_id` int DEFAULT NULL COMMENT '分类id', `total_num` int DEFAULT 0 COMMENT '馆藏总数', `stock_num` int DEFAULT 0 COMMENT '当前可借库存', `create_time` datetime DEFAULT NULL COMMENT '入库时间', PRIMARY KEY (`id`), KEY `idx_type_id` (`type_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图书信息表';

借阅记录表 t_borrow_record:

CREATE TABLE `t_borrow_record` ( `id` int NOT NULL AUTO_INCREMENT, `borrow_id` varchar(40) DEFAULT NULL COMMENT '借阅单号', `book_id` int NOT NULL COMMENT '图书id', `reader_id` int NOT NULL COMMENT '读者id', `borrow_time` datetime DEFAULT NULL COMMENT '借出时间', `due_time` datetime DEFAULT NULL COMMENT '应还时间', `return_time` datetime DEFAULT NULL COMMENT '实际归还时间', `status` tinyint DEFAULT 0 COMMENT '0借阅中 1已归还 2续借 3逾期待处理', PRIMARY KEY (`id`), KEY `idx_book_id` (`book_id`), KEY `idx_reader_id` (`reader_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='借阅记录表';

除了这两张表,还需要 t_reader(读者表)、t_user(用户表)、t_book_type(图书分类表)、t_announcement(公告表),以及权限相关 t_role、t_menu、t_user_role、t_role_menu 等关联表。

这里有一个经验要强调:借书操作涉及四步——查图书库存、查读者当前借阅数量、插入借阅记录、扣减库存。这四个步骤必须放在同一个事务里,否则就会出现“库存扣了记录没写”或者“记录写了库存没扣”的尴尬局面。

2.3 权限模型和菜单动态渲染

这套系统里的权限模型用典型的 RBAC 设计:用户绑定角色,角色绑定菜单,菜单决定接口和页面是否可以访问。后端拦截器解析 JWT 得到用户身份,再判断这个身份有没有目标接口的权限;前端根据登录用户的角色动态渲染菜单,管理员看到借阅管理和系统管理,普通读者只能看到图书检索和个人中心。

我特别想提醒一点:权限判断不要在 Controller 里写“if(user.getRole()==1)”这种硬编码。项目小的时候看着省事,后期加一个角色就要改一遍所有接口,维护成本会爆炸。正确做法是做一个自定义注解或者配置化鉴权,新增角色时只需要在数据库里配置菜单和权限,改改配置就行。

3. 实操过程与核心业务实现

3.1 从环境准备到项目启动

动手之前先把环境准备好。我建议的版本搭配是 JDK 1.8 或 11,Maven 3.6 以上,MySQL 5.7 或 8.0,前端如果项目是 Vue2 就用 Node 14+,Vue3 就用 Node 18+。IDE 我习惯后端用 IntelliJ IDEA,前端用 VSCode,两个都开也没问题。

启动步骤没什么复杂的,但有三个细节值得多看一眼:

第一,建库的时候字符集一定选对。我见过太多人建库时用了默认 latin1,结果页面显示一身问号,排查了半天头都大了。正确姿势是建库指定 utf8mb4,连接 URL 里也带上 characterEncoding=utf8。

第二,配置文件里的数据源信息要确认。MySQL 8 的驱动类名是 com.mysql.cj.jdbc.Driver,如果连接报错,大概率还要在 URL 上加 serverTimezone=Asia/Shanghai。

第三,前端启动之前先改好接口代理。vue.config.js 里配置 devServer 的 proxy,把 /api 开头的请求转发到后端端口,这样本地开发就不会被跨域问题反复折腾。

3.2 后端借阅接口实现与事务处理

借书接口是整个项目里最值得反复琢磨的业务。先看 Controller 层:

@PostMapping("/borrow") public Result<Void> borrowBook(@RequestBody @Validated BorrowReqDTO dto) { bookService.borrowBook(dto); return Result.success(); }

Controller 只做参数接收和结果封装,真正的逻辑都在 Service 层。借书核心流程如下:

@Transactional(rollbackFor = Exception.class) public void borrowBook(BorrowReqDTO dto) { // 1. 校验图书是否存在且上架 Book book = bookMapper.selectById(dto.getBookId()); if (book == null || book.getStatus() != 1) { throw new ServiceException("图书不存在或已下架"); } // 2. 校验库存:这里用库存字段直接判断 if (book.getStockNum() <= 0) { throw new ServiceException("该书已借完"); } // 3. 校验读者最大借阅数 int borrowingCount = borrowMapper.countBorrowingByReaderId(dto.getReaderId()); if (borrowingCount >= systemConfig.getMaxBorrowNum()) { throw new ServiceException("该读者已达到最大借阅数量"); } // 4. 生成借阅单号并插入借阅记录 String borrowId = "B" + System.currentTimeMillis(); BorrowRecord record = new BorrowRecord(); record.setBorrowId(borrowId); record.setBookId(dto.getBookId()); record.setReaderId(dto.getReaderId()); record.setBorrowTime(new Date()); record.setDueTime(DateUtil.addDays(new Date(), systemConfig.getBorrowDays())); record.setStatus(BorrowStatus.BORROWING); borrowMapper.insert(record); // 5. 原子扣减库存 int rows = bookMapper.deductStock(dto.getBookId(), 1); if (rows == 0) { throw new ServiceException("库存扣减失败,请重试"); } }

这里最核心的一点是“库存扣减”。不要先查出来再算一遍再更新,那样并发情况下会把库存扣成负数。正确方式是数据库原子更新:

UPDATE t_book SET stock_num = stock_num - 1 WHERE id = #{bookId} AND stock_num > 0

这样更新后返回的记录行数如果不为 0,说明扣减成功,同时天然防超借。

还书流程则反着来:根据借阅单号查借阅记录,判断状态是否是借阅中;计算是否逾期,如果逾期就根据超期天数产生罚金记录;更新借阅记录状态和归还时间;把库存加回去。这里面最容易忽略的就是“逾期”和“正常归还”两分支要把状态写对,否则后续统计报表会错。

图书搜索功能也值得写一下,因为图书馆系统的检索频率非常高。一个典型的多表模糊查询示例如下:

SELECT b.*, bt.type_name FROM t_book b LEFT JOIN t_book_type bt ON b.type_id = bt.id WHERE b.book_name LIKE CONCAT('%', #{keyword}, '%') OR b.author LIKE CONCAT('%', #{keyword}, '%') OR b.isbn = #{keyword} ORDER BY b.id DESC LIMIT #{offset}, #{pageSize}

注意这里用了 LEFT JOIN,目的是让分类信息一并返回,前端表格就不用二次请求了。

3.3 前端页面与接口联调要点

Vue 侧的第一步是封装 axios 实例。把 baseURL 统一设成 /api,加上请求拦截器自动附带 token,响应拦截器统一处理 401 跳回登录页。别把 token 处理逻辑在每一个页面里都写一遍,那是真的难维护。

图书列表页是典型的管理后台页面,结构就是搜索区加按钮区加表格加分页。新增编辑用 dialog 弹窗套 el-form 表单。这个模式的代码不需要背,复用到后面会发现借阅管理、读者管理、公告管理全是同一个套路。

前后端联调时最容易踩的坑有两个。一个是后端返回的 null 字段,前端表格里明明有值却显示空,多半是字段名大小写或者下划线驼峰映射问题。另一个是日期格式,默认序列化出来的时间可能带着 T,前端显示非常不友好,后端需要统一配置全局日期格式化模版,比如转成 “yyyy-MM-dd HH:mm:ss”。

4. 常见问题与排查经验

4.1 五个高频问题逐一拆解

中文乱码是第一大坑。现象是页面显示问号,或者数据库字段里的中文变成乱码。解决从三处下手:数据库连接 URL 加 characterEncoding=utf8,数据库建库用 utf8mb4,前端页面 meta 标签指定 charset 为 UTF-8。乱码问题经常是这三处有遗漏,挨个排查就能定位。

MySQL 8 时区报错是第二个高频翻车点。新装的 MySQL 8 在连接时经常提示 server timezone 相关问题,解决办法很简单,在 jdbcUrl 加 serverTimezone=Asia/Shanghai。如果不加,系统拿到的默认时区可能和本地不一致,甚至编译期连接测试直接失败。

第三个是跨域拦截问题。前端跑在 8080,后端跑在 9090,浏览器会拦截跨域请求。开发期最省事的方案是后端配置全局 CORS,前端 devServer 里用 proxy 做转发。上线阶段则交给 Nginx 反向代理,把 /api 路径代理到后端服务。

第四个是 MyBatis 驼峰映射失效。数据库字段是 book_name,实体属性是 bookName,如果不开启驼峰映射,查询出来的 bookName 就是 null。在 application.yml 里加上 mybatis.configuration.map-underscore-to-camel-case: true 就能解决。如果项目里用了 resultMap,则要显式把 column 和 property 对应上。

第五个是 Vue 前端刷新 404。如果用了 history 路由模式,部署到服务器后,直接刷新某个子页面会出现 404,因为 Nginx 没有找到对应的真实路径。解决办法要么改用 hash 模式,要么在 Nginx 配置里加 try_files 指令,把所有路径都回退到 index.html。

4.2 报错排查的顺序与技巧

遇到报错不要慌,我自己的排查顺序是:先看浏览器开发者工具里的 Network 请求状态码和返回信息,再开后端控制台看 SpringBoot 打印的异常栈,最后顺着调用链路定位是在哪一层出的问题。

拿到异常后,优先看报错信息里有没有包含具体 SQL。如果是 MyBatis 的 SQL 语法错误,直接把日志里的 SQL 复制到 Navicat 执行一遍,基本上能很快发现是语法问题还是字段名不匹配。如果异常抛在事务里,注意看有没有 rollback 相关的提示,那说明业务中间某个步骤抛了异常,触发了整体回滚。

4.3 性能优化与上线部署建议

项目跑通之后,如果想让它的性能和数据量承载力上一个台阶,有三个优化点非常重要。

第一是索引。借阅记录表里 book_id、reader_id、borrow_time 建议建联合索引,因为查询最频繁的场景就是“查某读者当前借了哪几本书”和“查某本书的借阅历史”。图书表的 isbn 建唯一索引,分类表按 type_id 建索引,查询速度会立竿见影地提升。

第二是分页。列表页面千万别一次性把全表数据查出来,用 PageHelper 插件或者手写 LIMIT 分页都行。前端也要配合分页组件,一页不要超过 20 条,保持响应速度。

第三是统计报表的数据处理。借阅量统计、热门图书排行这类聚合查询,在数据量小的时候随便算,数据量大以后应避免高峰期实时跑。合理做法是每天凌晨用一个定时任务,把统计结果提前聚合到一张独立的统计表,页面直接读统计表,速度快得多。

部署上线方面,后端打成 Jar 包直接运行,前端构建后的 dist 目录由 Nginx 托管。Nginx 里配一个 location / 指向前端文件,location /api/ 反向代理到后端端口,完美解决跨域和后端资源访问问题。

5. 最后聊点实操体会

这个项目最有价值的点,我认为不是“能跑通”,而是“你能把整条数据流讲清楚”。答辩或者面试的时候,面试官问你:一本书被借走之后,库存减一是哪一段代码?如果中途某一步失败了怎么办?能清清楚楚地指出来,这个项目才算真正吸收了。

我踩过几次坑之后,最大的心得是:开发管理系统时,数据库表设计要花掉至少 30% 的精力。借阅记录表把 bett due_time 这种时间字段设计好,后面统计逾期、生成报表都会省很多事。如果后续想继续扩展,可以加 Redis 缓存热门图书、加 Docker 容器化部署、加操作日志模块,这些升级方向都比再做一版“表单增删改查”有价值。

如果你手头正在做这套系统,下一步不妨先把你机器的数据库备份做好,然后找几条真实的借还数据跑一遍流程,观察每个表的变化。把这条链路看明白了,这个项目你就算是真正吃透了。

相关新闻

PCA+SVR组合预测:高维特征压缩与回归建模实战指南

PCA+SVR组合预测:高维特征压缩与回归建模实战指南

最近在做某设备的性能预测项目&#xff0c;手里攒了十几个传感器特征&#xff0c;从温度、压力、振动到电流&#xff0c;看起来信息很全&#xff0c;模型却一直不给力。直接扔给SVR&#xff08;支持向量回归机&#xff09;&#xff0c;训练时间还能接受&#xff0c;但预测结果不…

2026/10/20 20:41:20 阅读更多 →
curl GET与POST请求实战:JSON参数、编码与调试技巧

curl GET与POST请求实战:JSON参数、编码与调试技巧

1. 为什么值得花时间把curl的GET和POST彻底搞明白日常开发里&#xff0c;调试接口这件事几乎每天都在发生。浏览器里点来点去只能覆盖最简单的场景&#xff0c;一旦遇到需要自定义请求头、携带JSON体、模拟特定认证方式的情况&#xff0c;图形化工具就开始捉襟见肘。而curl这个…

2026/10/20 20:41:20 阅读更多 →
逻辑回归核心原理与工程调参实战:从Sigmoid到正则化

逻辑回归核心原理与工程调参实战:从Sigmoid到正则化

直接开写。逻辑回归这个名字&#xff0c;在我刚接触机器学习那会儿就老觉得别扭。明明是做分类的&#xff0c;结果名字里带着“回归”两个字&#xff0c;第一次听课的时候我甚至以为它跟线性回归是同一个东西。后来真正在项目里用了几次&#xff0c;才理解这个名字背后其实特别…

2026/10/20 20:41:20 阅读更多 →

最新新闻

手写鼠标点击粒子特效:从原理到性能优化的完整实战

手写鼠标点击粒子特效:从原理到性能优化的完整实战

前阵子给某活动页面做氛围优化&#xff0c;需求方反复强调要有“互动感”。白底、黑字、产品图&#xff0c;排版再干净&#xff0c;鼠标移上去没有任何反馈&#xff0c;也确实容易让人产生“这是个静态PPT”的错觉。于是我想到了“鼠标粒子特效”——准确说&#xff0c;是一段H…

2026/10/20 21:16:52 阅读更多 →
Java实现IP归属地查询:离线库方案与Spring Boot封装实践

Java实现IP归属地查询:离线库方案与Spring Boot封装实践

在做日志分析和用户画像时&#xff0c;后端服务拿到一个公网IP&#xff0c;最朴素的需求就是想知道这个IP到底来自哪个省、哪个市&#xff0c;甚至哪个运营商。这个需求听起来不难&#xff0c;网上搜“Java IP归属地查询”会跳出一堆在线API&#xff0c;复制一段代码就能跑通&a…

2026/10/20 21:16:52 阅读更多 →
基于SpringBoot和微信小程序的考研学习系统开发实战

基于SpringBoot和微信小程序的考研学习系统开发实战

先说结论&#xff1a;这套“基于微信小程序的考研学习系统”&#xff0c;选题方向是对的&#xff0c;技术栈也不冷门。后端SpringBoot、前端微信原生小程序&#xff0c;功能覆盖学习计划、每日打卡、题库刷题、错题本、学习统计和后台管理。作为计算机毕业设计&#xff0c;它兼…

2026/10/20 21:16:52 阅读更多 →
context-mode上下文模式设计:从状态机建模到工程落地的完整实践

context-mode上下文模式设计:从状态机建模到工程落地的完整实践

1. 从“上下文模式”这个命名说起&#xff1a;它到底在解决什么问题第一次看到“context-mode”这个词&#xff0c;很多人会下意识地把它当成某个框架里的配置项&#xff0c;或者某个编辑器插件的开关。但如果你真的在工程一线待过几年&#xff0c;就会发现这个词背后藏着一个非…

2026/10/20 21:16:52 阅读更多 →
STM32F103裸机驱动两相四线步进电机:时序精度与IO翻转控制实战

STM32F103裸机驱动两相四线步进电机:时序精度与IO翻转控制实战

简介&#xff1a;本资源是一套基于STM32F103微控制器的两相四线步进电机驱动程序&#xff0c;面向嵌入式初学者、电机控制实践者及自动化设备开发工程师&#xff0c;解决步进电机精准启停、方向切换与细分控制等核心问题&#xff0c;适用于3D打印机、CNC小车、精密位移平台等需…

2026/10/20 21:16:52 阅读更多 →
Java+Selenium自动化测试入门:核心机制与工程实践全解析

Java+Selenium自动化测试入门:核心机制与工程实践全解析

1. 项目概述&#xff1a;JavaSelenium到底在解决什么问题说实话&#xff0c;Selenium这个框架我已经用了快十年&#xff0c;从最早的Selenium IDE到现在的WebDriver 4.x&#xff0c;踩过的坑能装满一个仓库。这些年有很多新手问我同一个问题&#xff1a;"JavaSelenium到底…

2026/10/20 21:15:44 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →