添加友链页面
修改枚举
在src\content\spec
目录下新建文件friends.md
NOTE这个文件是新友链页面的内容文件,类似于其他页面内容(例如关于页面)来源的 about.md 文件。 添加这个文件的目的是为 “友链” 页面提供对应的内容数据,也便于通过统一方式调用内容。
在src\types\config.ts
文件定位至 LinkPreset
枚举中添加以下内容
export enum LinkPreset { Home = 0, Archive = 1, About = 2, Friends = 3,}
NOTE定义一个新的导航链接 “Friends”。在项目结构中,LinkPreset 枚举可能用于统一管理网页导航条或特定页面布局,对应页面的标识。
国际化i18n翻译
在src\i18n\i18nKey.ts
文件末尾添加以下内容
author = 'author',publishedAt = 'publishedAt',license = 'license',friends = 'friends',
NOTEi18nKey.ts 文件负责国际化功能,这里添加了 friends 键值,表示新页面 “友链” 的国际化字符串键。 后续会根据项目支持的语言为 friends 提供不同语言的翻译。
按照自己的语言,在 src\i18n\languages
目录中编辑相应语言文件,以 zh_CN.ts
为例,在末尾位置添加内容
[Key.author]: '作者',[Key.publishedAt]: '发布于',[Key.license]: '许可协议',[Key.friends]: '友链',
NOTE编辑语言文件,为新增的 friends 翻译字符串提供对应语言的翻译(这里是中文:友链)。 如果项目支持其他语言,这个步骤需要在每个语言文件中添加 friends 的翻译,保证页面多语言显示功能。
在 src\constants\link-presets.ts
文件末尾添加内容
[LinkPreset.Archive]: { name: i18n(I18nKey.archive), url: '/archive/',},[LinkPreset.Friends]: { name: i18n(I18nKey.friends), url: '/friends/',},
NOTE在 LinkPreset 到页面路径的映射中,加入新的友链页面配置。 name 设置链接名称,这里使用国际化 i18n(I18nKey.friends) 来确保多语言支持。 url 指定这个页面的路径 /friends/。
创建和配置页面的Astro文件
在src\pages
目录下复制原本的about.astro
文件,重命名为 friends.astro
,修改该文件下的函数以及方法。
const aboutPost = await getEntry("spec", "about");
if (!aboutPost) { throw new Error("About page content not found");}
const { Content } = await render(aboutPost);---<MainGridLayout title={i18n(I18nKey.about)} description={i18n(I18nKey.about)}> <div class="flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32"> <div class="card-base z-10 px-9 py-6 relative w-full "> <Markdown class="mt-2"> <Content /> </Markdown> </div> </div></MainGridLayout>
const friendsPost = await getEntry('spec', 'friends')
if (!friendsPost) { throw new Error("Friend page content not found");}
const { Content } = await render(friendsPost);---<MainGridLayout title={i18n(I18nKey.friends)} description={i18n(I18nKey.friends)}> <div class="flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32"> <div class="card-base z-10 px-9 py-6 relative w-full "> <Markdown class="mt-2"> <Content /> </Markdown> </div> </div></MainGridLayout>
NOTE创建
friends.astro
作为友链页面的模板文件,复制使用了类似about.astro
的结构代码。 修改了内容获取函数,使其加载的是friends.md
数据,而非 about.md 数据。 修改了标题 title 和描述 description,指向 friends 的国际化字符串。
在导航栏中添加友链页面
在 src\config.ts
文件找到navBarConfig
枚举添加内容,注意要在 LinkPreset.About
末尾添加
export const navBarConfig: NavBarConfig = { links: [ LinkPreset.Home, LinkPreset.Archive, LinkPreset.About, LinkPreset.friends, { name: "GitHub", url: "https://github.com/saicaca/fuwari", external: true, }, ],};
NOTEnavBarConfig 用于配置页面的导航栏。 在导航栏中添加新的 “友链” 入口,使用户能够通过导航直接访问这个页面。
创建卡片效果友链
在之前创建的 friends.astro
文件中编辑
---
import MainGridLayout from "../layouts/MainGridLayout.astro";
import { getEntry } from "astro:content";import { render } from "astro:content";import Markdown from "@components/misc/Markdown.astro";import I18nKey from "../i18n/i18nKey";import { i18n } from "../i18n/translation";
const friendsPost = await getEntry("spec", "friends");
if (!friendsPost) { throw new Error("Friend page content not found");}
const { Content } = await render(friendsPost);
const items = [ { title: "Astro", imgurl: "https://avatars.githubusercontent.com/u/44914786?s=48&v=4", desc: "The web framework for content-driven websites. ⭐️ Star to support our work!", siteurl: "https://github.com/withastro/astro", tags: ["框架"], },];---<MainGridLayout title={i18n(I18nKey.friends)} description={i18n(I18nKey.friends)}> <div class="flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32"> <div class="card-base z-10 px-9 py-6 relative w-full "> <div class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-8 my-4"> {items.map((item) => ( <div class="flex flex-nowrap items-stretch h-28 gap-4 rounded-[var(--radius-large)]"> <div class="w-28 h-28 flex-shrink-0 rounded-lg overflow-hidden bg-zinc-200 dark:bg-zinc-900"> <img src={item.imgurl} alt="站点头像" class="w-full h-full object-cover"> </div> <div class="grow w-full"> <div class="font-bold transition text-lg text-neutral-900 dark:text-neutral-100 mb-1">{item.title}</div> <div class="text-50 text-sm font-medium">{item.desc}</div> <div class:list={["items-center", {"flex": true, "hidden md:flex" : false}]}> <div class="flex flex-row flex-nowrap items-center"> {(item.tags && item.tags.length > 0) && item.tags.map((tag,i) => ( <div class:list={[{"hidden": i==0}, "mx-1.5 text-[var(--meta-divider)] text-sm" ]}> / </div> <span class="transition text-50 text-sm font-medium"> {tag} </span>))} {!(item.tags && item.tags.length > 0) && <div class="transition text-50 text-sm font-medium">{i18n(I18nKey.noTags)}</div>} </div> </div> </div> <a href={item.siteurl} target="_blank" rel="noopener noreferrer"class="flex btn-regular w-[3.25rem] rounded-lg bg-[var(--enter-btn-bg)] hover:bg-[var(--enter-btn-bg-hover)] active:bg-[var(--enter-btn-bg-active)] active:scale-95"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="transition text-[var(--primary)] text-4xl mx-auto iconify iconify--material-symbols" width="1em" height="1em" viewBox="0 0 24 24"> <path fill="currentColor" d="M12.6 12L8.7 8.1q-.275-.275-.275-.7t.275-.7t.7-.275t.7.275l4.6 4.6q.15.15.213.325t.062.375t-.062.375t-.213.325l-4.6 4.6q-.275.275-.7.275t-.7-.275t-.275-.7t.275-.7z"></path> </svg> </a> </div> ))} </div> <Markdown class="mt-2"> <Content /> </Markdown> </div> </div></MainGridLayout>
NOTE在
friends.astro
文件中,添加卡片效果的友链信息,包括站点名称、头像、描述、链接、标签等信息。
const items
部分就是添加的友链部分,继续添加即可。
格式可以为:
{ title: '', imgurl: '', desc: '', siteurl: '', tags: ['',''], },