博客排序改为最新优先

直接修复博客里“有些地方还是旧内容排前面”的问题,把目录树与知识库索引统一改为最近更新优先。


一、背景

1.1 问题现象

用户指出博客里虽然首页“最近更新”看起来正常,但站点整体浏览体验仍有“不是最新在前”的问题。

实际排查后确认:

  • 首页 RecentNotes 本来就是按最新时间倒序;
  • 标签页与文件夹页列表本来也偏向按时间倒序;
  • 仍然明显不符合“最新在前”直觉的地方,主要有两处:
    1. 左侧目录树 Explorer 默认按字母排序;
    2. 知识库索引.md 内部组内排序主要按路径名,而不是按真正更新时间。

1.2 目标

  • 把知识库索引改成按 updated/created/date 倒序
  • 把左侧目录树改成按最新时间倒序
  • 保留文件夹优先显示
  • 本地构建验证无误后再发布

1.3 约束条件

  • 不能只凭感觉改,需要先确认 Quartz 相关数据结构是否真的带日期;
  • 不能破坏 RSS / sitemap / 内容索引原有生成逻辑;
  • 修改后必须真实构建验证,而不是只改源码不验证;
  • /data 空间紧张,执行前需检查磁盘。

二、方案设计

2.1 技术方案

问题点原行为修复方式结论
知识库索引按路径名排序解析 frontmatter 的 updated / created / date,按时间倒序✅ 采用
左侧 Explorer文件夹/文件按字母序Explorer.tsx 中按 node.data.date 倒序,时间相同再按名称兜底✅ 采用
前端可用日期contentIndex 生成时删除了 date保留 date 字段供 Explorer 排序使用✅ 采用

2.2 实现思路

知识库 md frontmatter
  -> generate_kb_index.py 解析 updated/created/date
  -> 生成 INDEX / 知识库索引(最新优先)
 
Quartz 内容索引
  -> contentIndex 保留 date
  -> Explorer 读取 node.data.date
  -> 目录树按最新优先排序

2.3 关键决策

  • 文件夹仍然放在文件前面,避免目录树层级感被破坏;
  • 同时间或缺少时间字段时,仍用标题字母序作为兜底;
  • 不改首页 RecentNotes,因为它本来就是正确的,避免无谓风险。

三、执行过程

3.1 步骤记录

步骤1:确认真正的异常点

检查后确认:

  • RecentNotes 已按最新倒序;
  • 标签页/文件夹页列表已基本正常;
  • Explorer知识库索引.md 才是主要问题。

结果:✅ 锁定改动范围,避免误改。

步骤2:修改知识库索引生成脚本

编辑 /data/nanobot-workspace/scripts/generate_kb_index.py

  • 新增 frontmatter 解析函数;
  • 新增 parse_sort_datetime()
  • daily / projects / learning 三类条目都改为按 sort_dt 倒序;
  • 若 frontmatter 时间缺失,则回退到文件 mtime

结果:✅ 索引排序依据从“路径名”改为“真实时间”。

步骤3:修改 Quartz 内容索引

编辑 /data/ysdmh-new/quartz/plugins/emitters/contentIndex.tsx

  • 保留 date 字段,不再在简化索引阶段删除。

结果:✅ 前端 Explorer 可以拿到页面日期。

步骤4:修改 Explorer 排序逻辑

编辑 /data/ysdmh-new/quartz/components/Explorer.tsx

  • 保持“文件夹优先”;
  • 同类型节点按 node.data.date 倒序;
  • 日期相同或缺失时,再按 displayName 字母序兜底。

结果:✅ 左侧目录树改为最近更新优先。

步骤5:生成索引并构建验证

执行:

python3 /data/nanobot-workspace/scripts/generate_kb_index.py
rsync -a --delete --exclude 'index.md' --exclude 'index.md.bak' /data/knowledge-base/ /data/ysdmh-new/content/
npx quartz build

结果:

  • 索引生成成功;
  • Quartz 构建成功;
  • 抽样检查确认 知识库批量补双链并发布 已排在 AI新闻汇总 前面。

四、遇到的问题

问题1:Explorer 原本拿不到可用于客户端排序的日期

现象:虽然后端 ContentIndex 里有 date,但简化输出时被删掉了,导致前端排序只能靠名称。

原因分析:之前为了压缩内容索引,保留了 description 删除逻辑,同时也把 date 一起删掉了。

解决方案:只删除 description,保留 date 给前端用。

验证结果:✅ public/static/contentIndex.json 中已可见 date 字段。

问题2:知识库索引“日期分组正确”不等于“组内顺序正确”

现象:虽然已经按 2026-04-22 / 2026-04-12 / 2026-04-09 分组,但组内仍可能是旧文章排在前面。

原因分析:组内排序原来主要按路径字符串倒序,不等于真正的更新时间顺序。

解决方案:解析 frontmatter 时间并建立统一 sort_dt 字段。

验证结果:✅ 09:31 的《知识库批量补双链并发布》已排在 09:06 的《AI新闻汇总》前面。


五、结果与验证

5.1 最终结果

  • 知识库索引.md 组内条目已按最新更新时间优先;
  • 左侧 Explorer 已由字母序改为最新优先;
  • 首页 RecentNotes 保持原有正确行为;
  • 本地 Quartz 构建通过。

5.2 验证方式

  • 读取生成后的 /data/knowledge-base/知识库索引.md 检查顺序;
  • 检查 /data/ysdmh-new/public/static/contentIndex.json 是否包含 date
  • 检查构建产物中 Explorer 的 sortFn 已变为按时间排序;
  • 执行 npx quartz build 确认站点能正常生成。

5.3 影响范围

本次改动主要影响:

  • 知识库索引页面的显示顺序;
  • 左侧目录树的排序逻辑;
  • 静态内容索引中保留 date 字段。

不影响:

  • 文章正文内容;
  • 首页导航结构;
  • 自动同步与定时早报流程。

六、反思与改进

6.1 做得好的

  • 先定位“到底是哪几个位置不对”,没有把本来正常的模块也一起乱改;
  • 改完后真实生成索引并构建验证,避免只停留在源码层;
  • 同时修正了“索引排序”和“目录树排序”,体验更一致。

6.2 需要改进的

  • 以后新增列表/目录类功能时,应统一先明确排序依据是“标题、路径、创建时间还是更新时间”;
  • generate_kb_index.py 目前 frontmatter 解析还是轻量实现,后续如果元数据更复杂,可考虑更稳健的 YAML 解析。

6.3 后续建议

  • 若用户还希望首页文章列表、标签页、文件夹页完全统一成“最近更新优先”,可以继续做全站排序口径梳理;
  • 若知识库继续增多,可给索引增加“最近 7 天更新”快捷区块。

七、参考资料


相关文件

  • /data/nanobot-workspace/scripts/generate_kb_index.py
  • /data/ysdmh-new/quartz/components/Explorer.tsx
  • /data/ysdmh-new/quartz/plugins/emitters/contentIndex.tsx
  • /data/knowledge-base/知识库索引.md