用户实测:「有的文章同时选择了置顶和隐藏,还会显示并置顶」。
根因:后台「隐藏」开关(hiddenTag)是个假开关——它只写 `hiddenTag: true` 这个
没人读的字段,而全站过滤只认 `tags` 里的 `hidden`。于是隐藏从未生效;
叠加置顶后,这篇还在列表最前面。
- 新增 src/lib/post-visibility.ts:可见性契约单一事实源——`!draft && !hidden &&
!tags.includes('hidden')`(两条通道都认,历史写法兼容)
- postsSchema 增真字段 `hidden`;七处消费点(首页双轨/归档 zh/en/书架/RSS zh/en/
文章页导航)统一走 isVisiblePost
- 后台假开关 hiddenTag 换成真开关 hidden,hint 写清语义:不进列表/RSS/sitemap,
页面本身仍生成(链接可分享);与置顶同时打开时以隐藏为准
- sitemap 过滤隐藏文章(astro.config 配置期扫 frontmatter,两种写法都认;
内容目录不可读时宁可不排除也不炸构建)
贡献数据去重(5j T2,回答用户「连续贡献是否实时」):
- 连续贡献不再构建期抓取 streak.svg 快照(不实时、暗色需滤镜、与热力图同源重复),
改为热力图同一份 GraphQL 日历本地计算(src/lib/heatmap.ts streakStats):
当前连续(以最后有贡献日为终点)/ 最长 / 总贡献,界面上标注「数据更新于 X」
- 贡献蛇块与自托管 snake/streak SVG 删除,fetch 脚本 ASSETS 清空,
build.sh 守卫改为退役说明;开源页数据板整块并入热力图区
验证: 构建 51 页 exit 0;content-lint 52 页 0/0/0;E2E 56/56;
临时两篇「置顶+隐藏」(新字段/旧 tags 各一)实测——首页/归档/书架/
双语首页/RSS 双语/sitemap 全部零命中,页面本身仍生成;
清理后归档首条恢复 writing-template(普通置顶不受影响);
开源页 snake/streak 资产零残留、连续统计条与更新时间标注就位
Spec: 2026-11-03_blog-5j-content-refine (T2 + 隐藏 bug 修复)
Co-authored-by: GLM-5.3
35 lines
1.0 KiB
Plaintext
35 lines
1.0 KiB
Plaintext
---
|
||
// 导航「文章」落点:全量归档列表(年份/轨道分节逻辑与首页共用 PostList)
|
||
import { getCollection } from 'astro:content';
|
||
import { isVisiblePost } from '../../lib/post-visibility';
|
||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||
import PostList from '../../components/PostList.astro';
|
||
import { sortPosts } from '../../lib/post-order';
|
||
|
||
// 置顶优先 → 时间倒序(sortPosts 契约见 src/lib/post-order.ts)
|
||
const posts = sortPosts(
|
||
await getCollection('posts', ({ data }) => isVisiblePost(data)),
|
||
);
|
||
---
|
||
|
||
<BaseLayout title="文章 · wait4x">
|
||
<h1 class="page-title">文章</h1>
|
||
<p class="page-note">按年份折叠 · 月分分组 · 共 {posts.length} 篇</p>
|
||
<PostList {posts} fold />
|
||
</BaseLayout>
|
||
|
||
<style>
|
||
.page-title {
|
||
font-size: var(--text-h1);
|
||
line-height: var(--leading-heading);
|
||
color: var(--ink-1);
|
||
margin-top: var(--space-5);
|
||
text-wrap: balance;
|
||
}
|
||
.page-note {
|
||
font-size: 13px;
|
||
color: var(--ink-4);
|
||
margin-block: var(--space-1) var(--space-4);
|
||
}
|
||
</style>
|