2.3 KiB
2.3 KiB
PRD:博客文章列表排序修复
问题描述
Admin 页面和公开首页的文章列表,在同日期文章之间顺序不确定。
复现步骤:
- 同一天创建/发布多篇文章(如 2026-05-12 有 5 篇)
- 打开
blog.ephron.ren/admin或blog.ephron.ren/ - 同日期的文章顺序每次可能不同,最新创建的文章不一定排在最前面
根因:
blog/src/services/posts.py 的排序逻辑:
# 第 325 行
posts.sort(key=lambda p: (not p.pinned, -p.date.toordinal()))
只用了 date(datetime.date 类型,只有日期没有时间)。同日期的文章 toordinal() 值相同,排序退化为 Python 的 stable sort,顺序取决于 glob() 文件系统迭代顺序,非确定性。
影响范围:
- Admin 文章管理页(
/admin) - 公开首页(
/) - 博客列表页(
/posts) - 归档页(
/archive) - 标签筛选(
/tags/{tag}) - RSS feed(
/feed) - 搜索结果(
/search)
所有页面都调用 get_all_posts() 或 search_posts(),共用同一个排序逻辑。
期望行为
同日期的文章按创建/修改时间倒序排列,最新创建的排最前面。
修复方案
在排序 key 中增加 file_path.stat().st_mtime 作为三级排序键:
# posts.py 第 325 行
posts.sort(key=lambda p: (not p.pinned, -p.date.toordinal(), -p.file_path.stat().st_mtime))
# posts.py 第 643 行
results.sort(key=lambda p: (not p[0].pinned, -p[0].date.toordinal(), -p[0].file_path.stat().st_mtime))
排序优先级:
- 置顶文章优先(
not p.pinned) - 日期倒序(
-p.date.toordinal()) - 同日期时,按文件修改时间倒序(
-p.file_path.stat().st_mtime)
验证方式
- 同一天创建 3 篇文章 A、B、C(按此顺序创建)
- Admin 页面应显示 C、B、A(最新创建的在前)
- 公开首页同样顺序
- 修改文章 A 的内容后,A 应排到最前
注意事项
st_mtime在文件被编辑时会更新,这意味着"最后修改的文章"排最前,不完全是"创建时间"- 如果需要严格按创建时间排序,可以考虑在 frontmatter 中增加
created_at字段,但当前用st_mtime是最小改动方案 - Canvas 服务已用
updated_at(datetime 类型)排序,不存在此问题