|
| 1 | +--- |
| 2 | +title: 书架功能配置指南 |
| 3 | +description: '如何配置和使用书架页面' |
| 4 | +publishDate: 2025-10-15 22:00:00 |
| 5 | +slug: shelf-config |
| 6 | +tags: ['建站', '功能说明'] |
| 7 | +--- |
| 8 | + |
| 9 | +import { MdxRepl, Aside } from '@/custom/components/user'; |
| 10 | +import { TabItem, Tabs } from 'astro-pure/user'; |
| 11 | +import ReadingCard from '@/components/reading/ReadingCard.astro'; |
| 12 | + |
| 13 | +"书架"页面是一个独立的看板, 用于展示您的阅读轨迹. 其所有内容都通过一个单独的 JSON 文件进行管理, 不依赖于任何文章的 frontmatter. |
| 14 | + |
| 15 | +## 1. 核心配置文件 |
| 16 | + |
| 17 | +您需要维护的唯一文件是位于项目根目录下 `public/` 文件夹中的 `bookshelf.json`。 |
| 18 | + |
| 19 | +## 2. 数据结构详解 |
| 20 | + |
| 21 | +该 JSON 文件是一个包含多个“阅读条目”对象的数组. 每个对象代表一张卡片, 其结构如下: |
| 22 | + |
| 23 | +<Aside type="note" title="字段说明"> |
| 24 | +| 字段 | 类型 | 是否必需 | 说明 | |
| 25 | +| :--- | :--- | :--- | :--- | |
| 26 | +| `title` | `string` | 必需 | 书籍, 论文或文章的标题. | |
| 27 | +| `type` | `string` | 必需 | `'book' \| 'paper' \| 'article'`, 决定了卡片上显示的图标. | |
| 28 | +| `status` | `string` | 必需 | `'to-read' \| 'reading' \| 'read'`, 决定了卡片出现在看板的哪一列. | |
| 29 | +| `description` | `string` | 可选 | 一句简短的描述, 会显示在标题下方. | |
| 30 | +| `rating` | `number` | 可选 | 评分, 1-5 的数字, 会以星星形式展示. | |
| 31 | +| `identifier` | `string` | 可选 | 唯一标识符. 对于书籍是 ISBN, 对于论文是 DOI. | |
| 32 | +| `sourceUrl` | `string` | 可选 | **仅用于 `article` 类型**, 指向原文的链接. | |
| 33 | +| `tags` | `string[]` | 可选 | 标签数组, 会在卡片底部显示为彩色徽章. | |
| 34 | +| `links` | `string[]` | 可选 | 关联的博客笔记. 只填写笔记的 `slug`. | |
| 35 | +</Aside> |
| 36 | + |
| 37 | +## 3. 工作流程 |
| 38 | + |
| 39 | +假设您读完一本书,并为它写了一篇读后感, 如何将它们添加到书架呢? |
| 40 | + |
| 41 | +1. **撰写笔记**: 像往常一样, 在 `src/content/blog/` 目录下创建您的 `.mdx` 笔记文件. 完成文章后, 记下您在 frontmatter 中为它设置的 `slug`. |
| 42 | + |
| 43 | +2. **打开配置文件**: 打开 `public/bookshelf.json` 文件. |
| 44 | + |
| 45 | +3. **添加新条目**: 在 JSON 数组中添加一个新的对象, 代表您读完的这本书. 填写 `title`, `type`, `status` 等信息. |
| 46 | + |
| 47 | +4. **关联笔记**: 在该对象的 `links` 数组中, 添加您刚刚记下的笔记 `slug` 字符串. |
| 48 | + |
| 49 | +5. **保存**: 保存文件. 网站下次构建时, 书架页面就会自动更新. |
| 50 | + |
| 51 | +## 4. 卡片效果预览 |
| 52 | + |
| 53 | +下面是不同类型卡片的渲染效果和对应的 JSON 数据结构。 |
| 54 | + |
| 55 | +### 书籍 (Book) 示例 |
| 56 | + |
| 57 | +<MdxRepl> |
| 58 | + <ReadingCard |
| 59 | + item={{ |
| 60 | + title: "人类简史", |
| 61 | + type: "book", |
| 62 | + status: "read", |
| 63 | + description: "从石器时代到人工智能, 一部宏大的人类历史.", |
| 64 | + rating: 5, |
| 65 | + identifier: "978-7-5086-6074-3", |
| 66 | + tags: ["历史", "人类学"], |
| 67 | + links: ["sapiens-note-1"] |
| 68 | + }} |
| 69 | + postsMap={new Map()} |
| 70 | + index={1} |
| 71 | + /> |
| 72 | + <Fragment slot="desc"> |
| 73 | + ````json |
| 74 | + { |
| 75 | + "title": "人类简史", |
| 76 | + "type": "book", |
| 77 | + "status": "read", |
| 78 | + "description": "从石器时代到人工智能, 一部宏大的人类历史.", |
| 79 | + "rating": 5, |
| 80 | + "identifier": "978-7-5086-6074-3", |
| 81 | + "tags": ["历史", "人类学"], |
| 82 | + "links": ["sapiens-note-1"] |
| 83 | + } |
| 84 | + ```` |
| 85 | + </Fragment> |
| 86 | +</MdxRepl> |
| 87 | + |
| 88 | +### 论文 (Paper) 示例 |
| 89 | + |
| 90 | +<MdxRepl> |
| 91 | + <ReadingCard |
| 92 | + item={{ |
| 93 | + title: "Attention Is All You Need", |
| 94 | + type: "paper", |
| 95 | + status: "read", |
| 96 | + description: "Transformer 架构的开山之作, 奠定了现代大语言模型的基础.", |
| 97 | + rating: 5, |
| 98 | + identifier: "10.48550/arXiv.1706.03762", |
| 99 | + tags: ["NLP", "Transformer"], |
| 100 | + links: ["transformer-explained"] |
| 101 | + }} |
| 102 | + postsMap={new Map([['transformer-explained', {title: 'Transformer 架构解析'}]])} |
| 103 | + index={2} |
| 104 | + /> |
| 105 | + <Fragment slot="desc"> |
| 106 | + ````json |
| 107 | + { |
| 108 | + "title": "Attention Is All You Need", |
| 109 | + "type": "paper", |
| 110 | + "status": "read", |
| 111 | + "description": "Transformer 架构的开山之作, 奠定了现代大语言模型的基础.", |
| 112 | + "rating": 5, |
| 113 | + "identifier": "10.48550/arXiv.1706.03762", |
| 114 | + "tags": ["NLP", "Transformer"], |
| 115 | + "links": ["transformer-explained"] |
| 116 | + } |
| 117 | + ```` |
| 118 | + </Fragment> |
| 119 | +</MdxRepl> |
| 120 | + |
| 121 | +### 文章 (Article) 示例 |
| 122 | + |
| 123 | +<MdxRepl> |
| 124 | + <ReadingCard |
| 125 | + item={{ |
| 126 | + title: "Working with TCP Sockets", |
| 127 | + type: "article", |
| 128 | + status: "reading", |
| 129 | + description: "一篇关于 TCP Socket 编程的优秀文章.", |
| 130 | + sourceUrl: "https://www.google.com", |
| 131 | + tags: ["Network", "Socket"] |
| 132 | + }} |
| 133 | + postsMap={new Map()} |
| 134 | + index={3} |
| 135 | + /> |
| 136 | + <Fragment slot="desc"> |
| 137 | + ````json |
| 138 | + { |
| 139 | + "title": "Working with TCP Sockets", |
| 140 | + "type": "article", |
| 141 | + "status": "reading", |
| 142 | + "description": "一篇关于 TCP Socket 编程的优秀文章.", |
| 143 | + "sourceUrl": "https://www.google.com", |
| 144 | + "tags": ["Network", "Socket"] |
| 145 | + } |
| 146 | + ```` |
| 147 | + </Fragment> |
| 148 | +</MdxRepl> |
0 commit comments