feat(books): 书封接口——schema cover 字段+书架卡封面渲染

posts schema 加 cover?: image(image() 走 Astro 优化管线,仅阅读
轨消费);BooksPage 有封面渲染 96/192 两档 Image、无封面优雅回
退现有色脊卡设计(零破坏);目录 content/posts/assets/books/ 就位;
docs/写作指南.md 补用法节(路径/frontmatter 示例/尺寸建议)。

验证: pnpm astro build;E2E 34/34;现 5 本书全部回退色脊卡渲染
(封面貌 0,待用户加图)

Spec: none (书封接口预留,用户自行加图)

Co-authored-by: GLM-5.3
This commit is contained in:
wait4xandGLM-5.3 committed 2026-11-02 09:12:34 +08:00
1 parent 2e33a7cd2e
commit 9702c9faf4
3 files changed
+45 -1

No files matched your search

+21
View File
@@ -69,3 +69,24 @@ public/media/my-post/clip.mp4 ← 文件放这里
- push main → webhook 自动构建发布(约 10 秒)
- 新文章要英文版:跑 `python3 scripts/translate/translate_posts.py`(幂等,代码块不会被翻译破坏的风险见其 README 注释;锁定润色用 frontmatter `locked: true`)
## 书封图(/books 书架)
阅读轨文章可选加书封:
1. 图片放 `content/posts/assets/books/<slug>.jpg`(建议宽 480px、高宽比约 2:3)
2. 对应文章 frontmatter 加一行:`cover: ./assets/books/<slug>.jpg`
3. 构建自动优化出 96/192 两档;**没有 cover 的文章优雅回退现有色脊卡设计**,无需改任何代码
示例 frontmatter:
```yaml
---
title: "面纱"
pubDate: 2024-06-01
category: reading
bookAuthor: "毛姆"
mood: "#8a6f4a"
cover: ./assets/books/mian-sha.jpg
---
```
+21
View File
@@ -5,6 +5,7 @@ import { getCollection } from 'astro:content';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { t } from '../../i18n/ui';
import type { Locale } from '../../lib/locale';
import { Image } from 'astro:assets';
interface Props { locale?: Locale }
const { locale = 'zh' } = Astro.props;
@@ -38,7 +39,18 @@ const L = {
href={locale === 'en' ? `/en/archives/${b.id}/` : `/archives/${b.id}/`}
style={`--mood:${b.data.mood ?? 'var(--ink-4)'}`}
>
{b.data.cover ? (
<Image
src={b.data.cover}
alt={`${b.data.title} 封面`}
class="bk-cover"
widths={[96, 192]}
sizes="96px"
loading="lazy"
/>
) : (
<i class="spine" aria-hidden="true"></i>
)}
<div class="bk-body">
<strong class="bk-title">{b.data.title}</strong>
{b.data.bookAuthor && <span class="bk-author">{b.data.bookAuthor}</span>}
@@ -85,6 +97,15 @@ const L = {
transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.book:hover { border-color: var(--mood); transform: translateY(-2px); }
/* 书封(content/posts/assets/books/<slug>.jpg):无图时回退色脊卡设计 */
.bk-cover {
width: 96px;
height: 100%;
object-fit: cover;
align-self: stretch;
flex: none;
border-right: 1px solid var(--paper-line);
}
.spine {
flex: none;
width: 10px;
+3 -1
View File
@@ -66,7 +66,9 @@ export const collections = {
// slug 即文件名(glob loader 默认按文件名生成 id)
posts: defineCollection({
loader: glob({ pattern: '**/*.md', base: './content/posts' }),
schema: postsSchema,
// cover:书封图(仅阅读轨消费;放 content/posts/assets/books/<slug>.jpg,
// frontmatter 写相对路径 ./assets/books/<slug>.jpg,走 Astro 图片优化管线)
schema: ({ image }) => postsSchema.extend({ cover: image().optional() }),
}),
postsEn: defineCollection({
loader: glob({ pattern: '**/*.md', base: './content/posts-en' }),