From 264148f0a6b6e5b84150139d463f0581a701cf37 Mon Sep 17 00:00:00 2001 From: wait4xx Date: Mon, 2 Nov 2026 12:42:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(cms):=20=E5=86=85=E5=AE=B9=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=97=AD=E7=8E=AF=E2=80=94=E2=80=94=E7=AB=99=E7=82=B9?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=E4=B8=89=E4=BB=B6=E5=A5=97+=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E8=A7=86=E9=A2=91=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - A 站点文案单例:content/site/{home,about,opensource}.yaml + src/lib/site-content.ts 访问层(字段级回落默认,默认值=原文案逐字 一致,零回归);接线主页 tagline(en 首页新增该块)、关于页 intro、 开源页叙述三段 + PINNED 参数化(projects.ts: loadProjects(pinned) /orderPinned,PINNED_DEFAULT 仅缺省兜底) - loader 语义修正(返工如实入档):Astro 7 的 file() 把 YAML 顶层对象 按 Object.entries 拆成多条目(id=key、data=value),单例字段必炸 schema;改 glob 精确到单文件 = 真单例语义,data 即文件根对象, Sveltia 可编辑根字段零嵌套(比包 main: 层的方案后台体验更好) - B 文章媒体:posts +video/+poster;Sveltia file 字段 (media_folder=public/media、public_folder=/media、hint ≤50MB); 正文后渲染 video controls preload=metadata playsinline,无则不渲染; 图片链路核对本已一致(./assets 走 Astro 管线);链接 markdown 原生 - docs/写作指南.md 补「后台上传」节(三类媒体 + 三单例操作 + 体积纪律) Sveltia 集合:posts / moments / photos / site_pages(三单例) 车道:op-gitea(实测 tagline 改 yaml 产物联动、置空回落默认、pinned 改名排序变、视频临时件渲染全对、构建绿 + lint 45 页 0/0/0);收编 复验:构建 44 页 + E2E 37/37 + 三 yaml 扁平键就位 验证: pnpm astro build 44 页 exit 0;E2E 37/37 PASS;content-lint 0/0/0;播放器/单例/置顶 playwright 实测全过 Spec: none (内容管理闭环,车道级交付) Co-authored-by: GLM-5.3 --- content/site/about.yaml | 5 ++ content/site/home.yaml | 5 ++ content/site/opensource.yaml | 13 +++++ docs/写作指南.md | 60 ++++++++++++++++++++++ public/admin/config.yml | 62 ++++++++++++++++++++++ src/components/geek/ProjectWall.astro | 6 ++- src/components/pages/AboutPage.astro | 12 +++++ src/content.config.ts | 31 +++++++++++ src/lib/projects.ts | 18 ++++--- src/lib/site-content.ts | 74 +++++++++++++++++++++++++++ src/pages/archives/[...slug].astro | 29 +++++++++++ src/pages/en/archives/[...slug].astro | 21 ++++++++ src/pages/en/index.astro | 10 ++++ src/pages/en/opensource.astro | 7 ++- src/pages/index.astro | 5 +- 15 files changed, 346 insertions(+), 12 deletions(-) create mode 100644 content/site/about.yaml create mode 100644 content/site/home.yaml create mode 100644 content/site/opensource.yaml create mode 100644 src/lib/site-content.ts diff --git a/content/site/about.yaml b/content/site/about.yaml new file mode 100644 index 0000000..cd4363f --- /dev/null +++ b/content/site/about.yaml @@ -0,0 +1,5 @@ +# 关于页可变段落(后台「页面文案 → 关于页」可改) +# intro = 身份陈述段;留空则回落默认文案,构建不炸 +intro: + zh: 写作者 · 读者 · 快门按压者,拥抱开源。这里是我三条轨道的公开工作台:读过的书留下评注,写过的代码进项目墙,按下的快门收入图库。 + en: Writer · Reader · Shutter-presser, embracing open source. This is the public workbench of my three tracks — books that left notes, code that reaches the project wall, and shutters I pressed. diff --git a/content/site/home.yaml b/content/site/home.yaml new file mode 100644 index 0000000..8906933 --- /dev/null +++ b/content/site/home.yaml @@ -0,0 +1,5 @@ +# 主页身份语(后台「页面文案 → 主页设置」可改) +# zh/en 双字段,页面按 locale 取;留空则回落到 src/lib/site-content.ts 的默认文案 +tagline: + zh: 写作者 · 读者 · 快门按压者,拥抱开源。 + en: Writer · Reader · Shutter-presser — embracing open source. diff --git a/content/site/opensource.yaml b/content/site/opensource.yaml new file mode 100644 index 0000000..f10b3a1 --- /dev/null +++ b/content/site/opensource.yaml @@ -0,0 +1,13 @@ +# 开源页叙述(后台「页面文案 → 开源页」可改) +# blurb = 链接前文案,repo_* 拼成仓链接,blurb_after = 链接后文案;任一留空回落默认 +blurb: + zh: 本站本身即开源: + en: 'This site is itself open source: ' +repo_url: https://git.wait4x.online/wait4x/blog +repo_label: git.wait4x.online/wait4x/blog +blurb_after: + zh: —— Astro SSG、双写作流、构建发布全链皆在仓中。以下是我在自托管 gitea 与 GitHub 上的全部公开仓库,以及最近一年的贡献活动。 + en: — the Astro SSG, dual-writing workflow, and the full build & deploy pipeline live in the repo. Below are all my public repositories on self-hosted gitea and GitHub, plus contributions from the past year. +# 置顶项目(跨源手选,顺序即展示顺序;name = 仓库短名)。原 projects.ts 硬编码名单迁于此 +pinned: + - blog diff --git a/docs/写作指南.md b/docs/写作指南.md index ec366ec..8a1ec28 100644 --- a/docs/写作指南.md +++ b/docs/写作指南.md @@ -65,6 +65,24 @@ public/media/my-post/clip.mp4 ← 文件放这里 见 `content/posts/media-sample.md`(draft 文章,仅构建验证用,不上线)。 +## 链接卡片(OG 预览卡) + +**一行只放一个链接、且它独立成段**时,构建期会抓取该页的 OG 信息渲染成卡片(标题 / 描述 / 站点图标 / 可选缩略图): + +```markdown +https://astro.build/ + +[也可以是 markdown 链接形态](https://astro.build/) +``` + +规则与边界: + +- **内联链接不变**:夹在句子里的链接保持普通样式(`这是一句带 [链接](https://example.com) 的话` → 不会变卡),所以不会把整篇变成卡片墙 +- **抓取失败一律回落普通链接**:404、无 OG、超时(4s)、站点拒爬都不影响构建 +- **每篇最多 10 张卡**,超出的回落普通链接(防止文章变卡片流) +- **缓存**:结果存 `content/.link-cache.json`(入仓,保证构建确定性);条目 30 天后自动重抓。想强制刷新某条——删掉该 URL 的条目即可 +- 缩略图取 `og:image`,无图不占位;图标取站点而非第三方 favicon 服务 + ## 发布提醒 - push main → webhook 自动构建发布(约 10 秒) @@ -90,3 +108,45 @@ mood: "#8a6f4a" cover: ./assets/books/mian-sha.jpg --- ``` + +## 后台上传(Sveltia 后台,推荐路径) + +后台地址 `/admin/`(gitea 账号登录)。三类媒体都有后台入口,不必手写路径: + +### 图片 + +文章编辑器里插入图片 → 自动上传到 `content/posts/assets/` 并写入 `./assets/...` +相对路径(走 Astro 图片管线,自动优化)。**不要手改成 `/assets/...` 绝对路径**。 + +### 视频(frontmatter 字段,正文后自动渲染) + +1. 文章编辑页「附视频」字段上传(自动落 `public/media/`,路径写 `/media/.mp4`) +2. 正文读完后自动出现 `