小说阅读系统源码拆解:架构、表结构、部署与避坑指南

做源码拆解这些年,我很少遇到结构这么工整的免费项目,这套网络小说阅读系统的源码包让我翻了好一阵——平台编号54018,完整的用户端、管理端、数据库脚本和部署文档全都有,拿来做案例分析再合适不过。如果你正准备做毕业设计,或者想快速了解一个内容型网站从零到一是怎么设计的,这套系统值得花两个小时精读一遍。我会把它的设计思路、核心表结构、关键代码逻辑、部署过程以及我实测踩过的坑全部拆开讲清楚,保证你照着能跑起来、改得动。

1. 这套系统解决的问题:内容型项目的"存、取、读"三件大事

1.1 小说阅读系统不是"网页套数据库"那么简单

先说结论:网络小说阅读系统的本质是一个内容型系统,核心难点不在页面有多炫,而在三件事——内容怎么存、章节怎么取、阅读状态怎么记。

把一本小说拆开看,数据量虽然不算夸张,但结构非常特殊:一本书有几百章,每一章又有几千上万字。如果图省事把整本小说塞进一行记录,查询时数据库恨不得把内存读到爆;反过来如果给每本书建一张表,那数据表数量直接失控。54018这套源码采用了最常见的"一表一本书 + 一表一章"方案,chapter表独立存储并通过book_id关联 book表。听起来平淡无奇,却是整个系统能流畅跑起来的基础。没有这一层设计,后面谈什么阅读体验都是白搭。

1.2 双角色视角决定了两套完全不同的工程思路

这套系统的第二层复杂度来自"双角色"。普通读者关心的是打开快、翻页顺、下次还能续着读;运营管理员关心的是批量传书、改章节、管理用户效率高不高。54018源码把这两部分彻底拆开——前台是面向读者的阅读站点,后台是面向运营者的管理界面,两者共享数据库,但接口体系和数据操作逻辑完全分离。

很多人拿到源码后只盯着前台页面看,忽略了管理端。实际上后台才是这个项目最有含金量的地方:章节批量导入、小说上下架、分类调整、用户权限控制,这些操作直接体现了工程上的组织能力。想把这个项目吃透的人,我的建议是从后台入手,先把管理逻辑理清楚,再回头看前台的数据流,理解会顺很多。

2. 功能模块拆解:从注册登录到阅读器的完整链路

2.1 用户端:读者真正接触到的九个模块

用户端的核心是"让读者少操心,把注意力留给内容"。我梳理了这套系统前台的主要模块:

  1. 注册/登录:支持手机号或用户名注册,密码经过加密存储,登录后使用会话保持状态。
  2. 首页推荐:轮播图推热门书籍,下方按分类展示最新更新,制造"进来就有书看"的氛围。
  3. 分类浏览:按玄幻、都市、科幻、历史等类别筛选小说,分类和小说是典型的一对多关系。
  4. 关键词搜索:按书名或作者名模糊匹配,返回结果按点击量倒序排列。
  5. 小说详情页:展示封面、作者、简介、总字数、状态(连载/完结),同时显示目录列表。
  6. 阅读器:正文展示、目录侧滑、上一章/下一章切换、字号调节、阅读进度自动记忆。
  7. 书架:收藏自己感兴趣的小说,书架项会同步最后阅读章节。
  8. 阅读历史:记录每本书最后读到的章节,详情页会提示"继续阅读"。
  9. 评论评分:读者可以对小说打分和写短评,评论按时间倒序展示。

这些模块没有一个是多余的,它们串联起来正好覆盖了一个读者的完整体验路径:找书—看书—记进度—回头接着看。

2.2 管理端:运营效率是后台的第一诉求

管理端的设计逻辑与前台的"体验优先"完全不同,它更看重批处理和状态控制能力。54018源码后台主要包括:

  • 小说管理:新增小说、编辑简介、设置封面、上架下架。列表支持按状态、分类、书名筛选。
  • 章节管理:在某一本小说下批量新增章节,也支持TXT文档导入后自动切章,这个后文会细讲。
  • 分类管理:维护分类树,操作会同步影响前台分类导航。
  • 用户管理:查看注册用户列表、封禁/解封用户、重置密码。
  • 公告管理:发布站点公告,前台公告栏直接拉取最新一条。
  • 数据概览:统计注册用户数、小说总数、总点击量,作为简单的运营看板。

站在工程角度看,后台是"一个列表 + 增删改查"的标准化实现,但一旦加上状态流转(比如下架后前台不可见、导入章节失败回滚),复杂度就上来了。这套系统在状态处理上做得比较规矩,值得对照源码看。

2.3 容易被忽略的三个隐性功能

有几个功能不在主菜单里,但直接决定了系统好不好用,审核源码时我特意做了标注。

浏览量统计:每次打开小说详情页都会执行点击量加一,它是排行榜和"热门推荐"的数据来源。实现上只是一个简单的update语句,但它是整个系统的运营基石。

阅读进度自动记忆:读者在读某一章时,前端会定时上报章节ID和滚动位置,后端写入阅读历史表。下次打开详情页,系统能直接显示"续读第X章",这个体验很多小白项目完全没想到去做,属于典型的"看着简单、没做过就漏掉"的功能。

章节排序:看似不起眼,坑却很深。如果章节序号设计成字符串varchar,第10章就会跑到第2章前面,因为字符串排序按字典序走。因此必须用int类型存chapter_no并用它排序。这套源码做得是对的,但我在不少同类项目里见过反例。

3. 数据库设计:五张核心表的建表逻辑与字段取舍

3.1 表结构总览

整个系统的数据模型非常集中,核心就是五张表,入门级项目不搞复杂的视图和存储过程,全部是标准的关系表设计:

表名作用关键字段
user用户表id、username、password、salt、nickname、status、role
book小说表id、title、author、category_id、intro、cover、status、word_count、click_count
chapter章节表id、book_id、chapter_no、title、content、word_count
category分类表id、name、sort
read_history阅读历史表id、user_id、book_id、chapter_id、read_offset、update_time
bookshelf书架表id、user_id、book_id、last_chapter_id、update_time

另外还有评论表和公告表,它们结构简单,就不逐一展开了。整套库大概在九到十张表左右,属于一个"麻雀虽小五脏俱全"的内容型系统标准模式。

3.2 为什么章节一定要拆分成独立表

看一眼这两条核心表的建表语句,你就明白设计意图了:

CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL COMMENT '书名', `author` varchar(64) DEFAULT NULL, `category_id` int(11) DEFAULT NULL, `intro` text COMMENT '简介', `cover` varchar(255) DEFAULT NULL COMMENT '封面路径', `status` tinyint(1) DEFAULT '1' COMMENT '1上架 0下架', `word_count` int(11) DEFAULT '0' COMMENT '总字数', `click_count` int(11) DEFAULT '0' COMMENT '点击量', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `chapter` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `book_id` int(11) NOT NULL, `chapter_no` int(11) NOT NULL COMMENT '章节序号', `title` varchar(128) NOT NULL COMMENT '章节标题', `content` longtext COMMENT '正文内容', `word_count` int(11) DEFAULT '0', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_book_no` (`book_id`, `chapter_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

拆表的理由非常现实:chapter.content用的是longtext,一章节正文动辄几KB甚至几十KB。如果把内容存到book表里,详情页查询就会被无关内容拖慢,每次都要带出一大包数据。拆成独立表之后,小说列表和详情的查询完全不经过大字段,只有读者真正进入阅读器去章节表取内容,这种按需加载的方式对性能友好得多。

此外chapter表建了(book_id, chapter_no)联合索引,目录查询和章节跳转都走这个索引,这也解释了为什么上一章下一章的切换可以做到毫秒级返回。

3.3 阅读历史与书架:用联合唯一索引避免数据越攒越多

阅读历史表最关键的设计是这条唯一约束:

CREATE TABLE `read_history` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `book_id` int(11) NOT NULL, `chapter_id` bigint(20) NOT NULL, `read_offset` int(11) DEFAULT '0' COMMENT '章节内滚动位置', `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_book` (`user_id`, `book_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

因为加了uk_user_book,一个用户对同一本书只会保留一条历史记录,重复读同一本书时走的是更新逻辑而不是无脑插入。如果没有这个约束,一个读者读一百章就会攒一百条历史,系统运行半年后整张表膨胀到几百万行,随便一个查询都很慢。书架的last_chapter_id字段也是同样的思路:书架里的每本书只记录一个"最近在读章节",点击续读直接跳转。

这里有个设计细节值得注意——read_offset存的是章节内的滚动位置,等于记录"读到这一章的第几屏"。很多同类项目只会记章节ID,读者每次重新进入章节还要从头滚动,体验打了折扣。54018这套源码把位置也存了,虽然只是一个小字段,但使用感受差别很明显。

4. 核心实现逻辑走读:密码、阅读进度、排行榜背后的代码

4.1 登录密码不是你想的MD5就完事

很多初学者写登录功能,存密码就是简单MD5一下,这其实等于裸奔——网上随便一个彩虹表都能反查出来。54018源码的做法是食盐加哈希:注册时生成一段随机字符串作为盐,和密码拼接后做多次哈希再入库,盐值本身也单独存一列。

// 注册逻辑简化示例 String salt = randomSalt(8); String hashed = md5WithSalt(rawPassword, salt); userMapper.insert(username, hashed, salt);

登录验证时取出该用户的盐,重新计算哈希再比对,数据库里永远不会出现明文。这套做法虽然不算最前沿(对安全性要求更高的场景可以直接上BCrypt),但作为教学案例,它把"不能存明文"这个意识完整地演示出来了,比很多糊弄的项目正经得多。

4.2 阅读进度保存:先查再插还是upsert,这里给了标准答案

进度保存的接口逻辑是阅读器功能的关键:每次读者翻页或退出章节,前端会把chapter_id和read_offset发到后端。后端要做的是——有记录就更新,没记录就插入。

@PostMapping("/api/history") public Result saveHistory(@RequestBody ReadHistoryVO vo) { ReadHistory history = new ReadHistory(); history.setUserId(vo.getUserId()); history.setBookId(vo.getBookId()); history.setChapterId(vo.getChapterId()); history.setReadOffset(vo.getReadOffset()); history.setUpdateTime(new Date()); if (historyMapper.exists(vo.getUserId(), vo.getBookId())) { historyMapper.updateByUserAndBook(history); } else { historyMapper.insert(history); } return Result.ok(); }

配合表上的uk_user_book唯一索引,这套逻辑是安全的。另一种更优雅的写法是直接使用数据库的INSERT ... ON DUPLICATE KEY UPDATE,一步到位,还省掉了一次查询,你可以作为改进点试试。前端拿到记录后的处理也值得看一眼,核心就是"有历史跳历史,没历史从第一章开始":

getReadHistory({ bookId }).then(res => { if (res.data && res.data.chapterId) { jumpToChapter(res.data.chapterId, res.data.readOffset); } else { jumpToChapter(firstChapterId, 0); } });

这一段逻辑把"续读"体验从'能记住第几章'直接提升到了'记住你在哪一行',真实项目的细节感就在这里体现。

4.3 排行榜和浏览量:不要用count(*)现算

热门榜、点击榜在展示层看起来很基础,但是注意——点击量不能通过count(*)去统计别的表,那样数据量一大就会把数据库拖垮。54018源码的做法是直接在book表冗余一个click_count字段:

UPDATE book SET click_count = click_count + 1 WHERE id = #{bookId}

用一个字段在详情页被打开时实时累加,查询排行榜时直接按这个字段倒序排。为了进一步减少写入压力,工业级系统通常会引入Redis计数、再异步刷回数据库,对这个项目来说直接update已经够用。如果你后续想优化性能,可以把这一步改成Redis自增,每天定时回写,这也是一道很好的简历亮点。

4.4 TXT导入的自动切章逻辑

后台导入TXT整本书算是一个高频需求,手写几千章显然不现实。源码里用正则识别章节标题,在导入时自动把文本按章节切分:

String pattern = "^\\s*第[一二三四五六七八九十百千万0-9零壹贰叁肆伍陆柒捌玖]{1,8}[章卷回节]\\s+.*$";

逐行扫描文本,命中标题规则的行就开一个新章节,其余内容追加到当前章节正文。实际操作下来,大部分规范排版的TXT都能正确切分,偶尔遇到特殊字符再做人工调整。如果你接手这类项目,注意处理文件编码和BOM头,否则第一行会出现看不见的乱码字符,这个坑我后面会细说。

5. 源码获取与本地部署:从零把这个项目跑起来

5.1 免费源码怎么拿

这套系统在源码分享平台是免费开放的,检索编号54018就能拿到下载链接,不需要付费。下载后一般是完整压缩包,里面包含后端代码、前端页面、数据库脚本以及说明文档。顺便提醒一句:如果你是从别处转存得到的,先检查压缩包解压后的文件目录是否完整——常见的是缺少数据库sql文件,这会导致项目无论如何也启动不起来。

拿到源码的第一件事,不是双击运行,而是先读README或者部署文档,确认技术栈。我测试的这套默认是Spring Boot + MyBatis + MySQL + 前台模板页面,属于非常典型的教学组合,环境要求不高,一台普通电脑完全跑得动。

5.2 环境准备清单

实测可运行的环境组合如下:

软件版本要求说明
JDK1.8以上项目基于Java 8语法开发
Maven3.6以上依赖管理和打包
MySQL5.7或8.0数据库,注意8.0驱动变化
浏览器Chrome/Edge均可前端不需要额外构建

如果你本机还没装Maven,开发工具自带Bundled Maven也行,不追求命令行的可以直接在工具里操作。

5.3 初始化数据库与修改配置

第一步是建库导数据。进入MySQL执行:

mysql -u root -p create database novel_reading default character set utf8mb4; exit;

然后导入源码包里自带的sql脚本:

mysql -u root -p novel_reading < novel_reading.sql

接下来打开后端配置文件application.yml,重点确认数据源配置:

spring: datasource: url: jdbc:mysql://localhost:3306/novel_reading?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 你的数据库密码 server: port: 8080

这里最容易被忽略的是serverTimezone=Asia/Shanghai。如果缺失,MySQL 8.0连接时会报时区错误,项目直接起不来。另外连接串里的characterEncoding=utf8也要保留,不然后面中文全部乱码。

提示:如果MySQL是8.0以上,注意pom.xml里的驱动坐标要对应com.mysql.cj.jdbc.Driver。老项目默认带的旧驱动在8.0下会报ClassNotFoundException,这个点至少让一半新手卡在启动阶段。

5.4 启动顺序与访问验证

配置无误后,两种启动方式任选。推荐先在开发工具里直接运行主类,方便看日志:

mvn clean package -DskipTests java -jar target/novel-reading-system.jar

启动日志输出"Started"字样后,浏览器访问前台地址http://localhost:8080,后台管理地址http://localhost:8080/admin,使用源码说明里的默认管理员账号登录。能打开首页、能看到数据库里的测试书籍数据,就说明整套链路基本打通了。

6. 实测踩坑记录:编码、性能、安全这些坎必须跨过去

6.1 中文乱码:源头是连接串和建表字符集

我测试这套源码时第一次导入数据库后就发现书名全乱码,排查后发现是sql脚本执行时MySQL客户端默认字符集不是utf8mb4,导进去的字符就废了。处理方法是连接串显式指定characterEncoding=utf8,建表语句统一用DEFAULT CHARSET=utf8mb4,双管齐下基本根治。

顺带补充,utf8和utf8mb4的区别很多人不清楚:utf8在MySQL里最多存三字节,像部分生僻字和Emoji表情都是四字节,必须用utf8mb4才能存住。小说内容里出现这些字符的频率很高,所以所有表和连接串都得按utf8mb4来。

6.2 章节加载慢与分页性能问题

阅读器打开目录时,如果直接全量返回几百章的列表,接口耗时会明显变长。54018源码在目录接口上做了分页处理,使用分页插件:

public PageInfo<Chapter> pageChapters(int bookId, int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<Chapter> list = chapterMapper.selectByBookId(bookId); return new PageInfo<>(list); }

前端滚动到底部时加载下一页,避免一次性渲染大量DOM节点。如果你拿到的是没有分页的老版本,强烈建议自己加上——这既是性能优化,也是面试时很能打的谈资。

6.3 安全细节:SQL注入和XSS都要防

MyBatis里写SQL,用#{}和${}是截然不同的结果,#{}是预编译占位符,安全;${}会直接拼字符串,存在SQL注入风险。这套源码总体规范,但在排序字段等场景使用了${}拼接,如果字段值来自前端且未做白名单校验,就有被注入的可能。我改造时加了一道参数校验,只允许传入预设的字段名排序,算是个巩固手段。

另一处是评论功能。读者提交的评论如果不做转义就直接渲染到页面上,恶意脚本可以借机执行,这就是XSS攻击。处理思路也很简单:后端入库时过滤标签符号,前端显示用纯文本方式渲染。在一个内容型系统里,用户输入的安全处理永远值得多花一小时。

6.4 时间充裕的话,这套系统可以这样继续改造

如果这是你的毕设项目,拿到手后还建议做几件事让它更有亮点:用Redis缓存热门章节内容,减少频繁查库;引入Elasticsearch做全文搜索,替换掉现在的Like模糊查询;给章节导入功能接一个异步任务,大文件导入时不再阻塞操作界面;把阅读进度同步做到多端设备,需要提前设计好统一的数据同步协议。这些都做一遍,这个项目的分量会完全不同。

最后还是要提醒一句,白嫖源码没问题,但答辩或交付前一定要自己把代码读透、能讲清楚核心的表结构和登录流程。再好的源码,如果只会跑起来不会改,到了真正要解释设计思路的场合还是会露馅。把它当成一份高质量的学习资料,在它的基础上做出属于你自己的改进,这才是免费源码最大的价值。

相关新闻

链表回文判断:快慢指针+后半段反转的O(1)空间解法

链表回文判断:快慢指针+后半段反转的O(1)空间解法

链表的回文结构&#xff0c;是算法刷题绕不开的一道经典题&#xff0c;题号 OR36 在不少在线题库的数据结构专项里都能看到。它要解决的问题一句话就能说清&#xff1a;给定一个单链表&#xff0c;判断从头到尾读和从尾到头读&#xff0c;节点值序列是否完全一致。听起来简单&a…

2026/10/20 4:57:54 阅读更多 →
iOS 17隐私协议适配全指南:从权限弹窗到隐私清单

iOS 17隐私协议适配全指南:从权限弹窗到隐私清单

iOS17 隐私协议适配详解距离 iOS 17 正式推送已经过去几个月了&#xff0c;我陆续处理了几个项目的隐私协议适配工作&#xff0c;也看了不少群里开发者的吐槽。说实话&#xff0c;很多团队对“隐私协议适配”这件事的理解还停留在“在 Info.plist 里加几段权限描述文案”的阶段…

2026/10/20 4:57:54 阅读更多 →
NC|泥炭地微生物群落次级代谢基因簇高度多样但原位表达有限

NC|泥炭地微生物群落次级代谢基因簇高度多样但原位表达有限

摘要 生物合成基因簇&#xff08;biosynthetic gene cluster&#xff0c;BGC&#xff09;的原位生态学意义仍不清楚。作者采用宏基因组与宏转录组联用策略&#xff0c;沿泥炭地氧化还原梯度表征BGC多样性与活性。基于7个宏基因组共回收9,694个BGC&#xff0c;分类涵盖多类微生物…

2026/10/20 4:56:54 阅读更多 →

最新新闻

OpenCV 4.8.0源码编译实战:VS2019动态与VS2022静态双链路配置

OpenCV 4.8.0源码编译实战:VS2019动态与VS2022静态双链路配置

简介&#xff1a;面向需要在 Visual Studio 2019 与 2022 中搭建 OpenCV 4.8.0 X64 开发环境的 C 开发者&#xff0c;这份资源同时提供动态与静态两种编译方案&#xff1a;VS2019 动态编译生成 DLL&#xff0c;适合追求可执行文件轻量化的场景&#xff1b;VS2022 静态编译将库代…

2026/10/20 5:40:14 阅读更多 →
前端PDF页数统计与缩略图渲染实战指南

前端PDF页数统计与缩略图渲染实战指南

1. 项目概述&#xff1a;为什么需要在前端直接处理PDF页数统计与缩略图渲染最近在帮某高校实验室做一套教学资料预览系统&#xff0c;核心需求很明确&#xff1a;老师上传一批PDF讲义后&#xff0c;系统得立刻告诉ta“这批文件一共多少页”&#xff0c;同时在界面上生成每份PDF…

2026/10/20 5:40:14 阅读更多 →
ASP+SQL Server旅游管理系统设计与实现全攻略

ASP+SQL Server旅游管理系统设计与实现全攻略

简介&#xff1a;涵盖源代码、论文、开题报告与答辩PPT的ASPSQL旅游管理系统毕业设计资料包&#xff0c;面向计算机相关专业学生及需要快速搭建旅游管理系统的开发者。系统由ASP动态页面与SQL Server数据库共同构成&#xff0c;覆盖用户注册登录、旅游线路展示、在线预订、订单…

2026/10/20 5:40:14 阅读更多 →
Word打字卡顿延迟几秒?从设置到文档修复的完整排查指南

Word打字卡顿延迟几秒?从设置到文档修复的完整排查指南

你是不是也遇到过这种场景&#xff1a;正在Word里赶一份材料&#xff0c;刚敲完一行字&#xff0c;界面直接卡住&#xff0c;光标变成了小手电筒的样子&#xff0c;等了两三秒才反应过来。更气人的是&#xff0c;按退格键删错别字&#xff0c;屏幕上那些字纹丝不动&#xff0c;…

2026/10/20 5:40:14 阅读更多 →
统一API管理实战:把视频项目的AI调用成本收进一扇门

统一API管理实战:把视频项目的AI调用成本收进一扇门

上个月底对账的时候&#xff0c;我真被视频项目的AI调用成本吓了一跳——预算超了快三成&#xff0c;更难受的是账完全对不上。这家说按token计费&#xff0c;那家按字符算&#xff0c;还有个视频生成的接口按秒扣费&#xff0c;财务拿到的几张账单连口径都不一样。后来团队借助…

2026/10/20 5:40:14 阅读更多 →
Keras大文件训练内存溢出解决方案:三层数据流架构

Keras大文件训练内存溢出解决方案:三层数据流架构

1. 为什么“大文件无法一次性读入内存”是Keras用户绕不开的坎&#xff1f;Keras作为高层深度学习API&#xff0c;最大的优势是简洁、直观、上手快——写个model.fit(X_train, y_train)就能跑通一个模型。但这个看似简单的接口背后&#xff0c;藏着一个被新手反复踩坑、被老手默…

2026/10/20 5:39:13 阅读更多 →

日新闻

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/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →