一开始这个站只有一个模块:知识库。它按「教程 → 章节」组织,一次上线就是一整套 20~30 章。首页那块「最新文章」直接取知识库最近更新的章节,于是读者看到的是这样的列表:
速查表:提示词、Skills、MCP、工作流清单
systemd 服务化与开机自启
Flutter Web 构建与部署
MongoDB 与半结构化数据
每一条都是「第 20 章」「第 30 章」这种没有上下文就没有意义的片段。问题不在排序,而在于两种内容被塞进了同一个容器。
一、它们本来就不是一类东西
| 知识库 | 博客 | |
|---|---|---|
| 组织方式 | 教程 → 章节,有目录与顺序 | 单篇,按时间倒序 |
| 阅读方式 | 从头顺读,或按需检索 | 随便点开一篇 |
| 更新节奏 | 少而重(一次一整套) | 轻而频繁 |
| 价值 | 成体系、可查阅 | 时效性、记录感 |
把两者混在一起,读者困惑(这条为什么不是完整的文章?),搜索引擎也困惑(页面之间缺少清晰的层级关系)。
二、拆分方案
- 知识库:保持原样——分组 → 教程 → 章节,左侧目录,章节内可写笔记、划词备注;
- 博客:新模块——单篇文章,Markdown 正文(后台可直接上传图片)、分类、标签、归档、RSS、浏览量;
- 首页:两块并列,各自取最近更新,谁也不假装是对方;
- 导航:首页 → 博客 → 知识库 → 关于 → 常见问题。
三、数据模型上的差异
知识库的表是两张:kb_category(教程)+ kb_article(章节,靠 category + sort 维持顺序)。
博客只需要一张 blog_post,外加一张可选的 blog_category:文章自带标题、摘要、封面、标签、发布时间,不依赖任何排序字段。
发布时间与更新时间分开,是博客这条时间流的骨架:置顶优先、其余按发布时间倒序,发布时间为空就是草稿。
四、后台发布体验
写文章时最烦的两件事是「找图片」和「排版」。所以后台的编辑器做了这几件事:
- 正文用 Markdown,右侧可一键预览;
- 「插入图片」把本地图片传到文件服务,按 Markdown 语法插到光标位置,也支持直接往编辑框里拖拽图片;
- 封面单独上传,前台列表以封面缩略图展示;
- 摘要有默认值(自动取正文前 120 字),slug 可以留空自动生成;
- 状态只有两个:草稿、发布。发布时自动补发布时间。
五、小结
模块拆分的判断标准不是“像不像”,而是内容的组织方式是否相同。组织方式不同,就应该是两个模块——哪怕它们看起来都是“文章”。
这次拆分之后,首页的两块各司其职:博客告诉你「最近在写什么」,知识库告诉你「这里有哪些成体系的东西」。