Firefly 博客导航功能完整指南

分钟
Firefly 博客导航功能完整指南
AI 概括

点击按钮,AI 将为你生成这篇文章的摘要

本文档整合了 Firefly 博客导航功能的所有教程,涵盖导航栏配置、页面功能实现和组件功能三大模块。


一、导航栏基础配置

1.1 目录结构总览

src/
├── content/
│ ├── content.config.ts # 内容集合定义(spec 集合)
│ ├── spec/ # 特殊页面的 Markdown 内容
│ │ ├── about.md # 关于我
│ │ ├── friends.mdx # 友链
│ │ ├── talks.md # 说说
│ │ ├── books.md # 书架
│ │ ├── movies-games.md # 影视与游戏
│ │ ├── music.md # 音乐
│ │ ├── changelog.md # 更新日志
│ │ ├── routines.md # 规划
│ │ ├── places.md # 足迹
│ │ └── projects.md # 网站导航
│ └── posts/ # 博客文章
├── types/
│ └── config.ts # LinkPreset 枚举 + 类型定义
├── constants/
│ └── link-presets.ts # LinkPreset → NavBarLink 映射表
├── config/
│ ├── siteConfig.ts # 站点配置(含页面开关)
│ └── navBarConfig.ts # ⭐ 导航栏链接配置(核心文件)
├── pages/ # 页面路由
│ ├── about.astro
│ ├── friends.astro
│ ├── talks.astro
│ ├── books.astro
│ ├── movies-games.astro
│ ├── music.astro
│ ├── changelog.astro
│ ├── projects.astro
│ └── life/
│ ├── routines.astro
│ └── places.astro
└── components/layout/
└── Navbar.astro # 导航栏组件(通常无需修改)

1.2 当前导航栏结构

主页 (/) ← LinkPreset.Home
分类 (/categories/) ← LinkPreset.Categories
归档 (/archive/) ← LinkPreset.Archive
网站导航 (/projects/) ← 自定义 NavBarLink
动态 (下拉菜单 icon:local-cafe)
├── 说说 (/talks/) ← LinkPreset.Talk(受开关控制)
├── 相册 (/gallery/) ← LinkPreset.Gallery(受开关控制)
└── 留言板 (/guestbook/) ← LinkPreset.Guestbook(受开关控制)
记录 (下拉菜单 icon:camera-outdoor)
├── 书架 (/books/) ← 自定义 NavBarLink
├── 影视与游戏 (/movies-games/) ← 自定义 NavBarLink
├── 音乐 (/music/) ← 自定义 NavBarLink
├── 更新日志 (/changelog/) ← 自定义 NavBarLink
├── 规划 (/life/routines/) ← 自定义 NavBarLink
└── 足迹 (/life/places/) ← 自定义 NavBarLink
关于 (下拉菜单 icon:info)
├── 关于我 (/about/) ← LinkPreset.About
├── 友链 (/friends/) ← LinkPreset.Friends(受开关控制)
└── 赞助 (/sponsor/) ← LinkPreset.Sponsor(受开关控制)

1.3 方式一:使用内置预设(LinkPreset)

适用于主题已提供的常用页面,只需 3 步。

可用预设列表

预设枚举显示名称URL所需开关
LinkPreset.Home主页/-
LinkPreset.Archive归档/archive/-
LinkPreset.About关于我/about/-
LinkPreset.Categories分类/categories/-
LinkPreset.Friends友链/friends/pages.friends
LinkPreset.Sponsor赞助/sponsor/pages.sponsor
LinkPreset.Guestbook留言/guestbook/pages.guestbook
LinkPreset.Bangumi番组计划/bangumi/pages.bangumi
LinkPreset.Gallery相册/gallery/pages.gallery
LinkPreset.Talk说说/talks/pages.talks

操作步骤

Step 1 — 在 src/config/navBarConfig.ts 中添加预设:

// 作为顶级菜单
links.push(LinkPreset.Gallery);
// 作为下拉子菜单(放在 children 数组中)
links.push({
name: "动态",
url: "/my/",
icon: "material-symbols:local-cafe",
children: [
...(siteConfig.pages.talks ? [LinkPreset.Talk] : []),
...(siteConfig.pages.gallery ? [LinkPreset.Gallery] : []),
],
});

Step 2 — 确保 src/config/siteConfig.ts 中对应开关为 true

pages: {
talks: true,
gallery: true,
// ...
}

Step 3 — 重启开发服务器生效。


适用于预设列表中没有的页面,需要创建页面文件和内容文件。共 2 步(精简版),如需开关控制则 4 步。

精简版(2 步)— 无需开关控制

Step 1 — 创建页面文件 src/pages/xxx.astro

---
import MainGridLayout from "@/layouts/MainGridLayout.astro";
import { getEntry, render } from "astro:content";
import Markdown from "@components/common/Markdown.astro";
const pagePost = await getEntry("spec", "xxx");
if (!pagePost) {
throw new Error("Page content not found");
}
const { Content } = await render(pagePost);
---
<MainGridLayout title="页面标题" description="页面描述">
<div class="flex w-full rounded-(--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>

Step 2 — 创建内容文件 src/content/spec/xxx.md

---
title: 页面标题
date: 2026-05-27
---
# 页面内容
在这里写 Markdown 内容...

然后在 src/config/navBarConfig.ts 中添加导航链接。


1.5 完整操作流程(以”说说”为例)

演示使用 LinkPreset 方式添加”说说”功能的完整 8 步流程。

步骤文件修改内容
1src/content.config.ts确认 spec 集合已定义
2src/content/spec/talks.md创建内容文件
3src/types/config.ts添加枚举值 Talk = 8
4src/config/siteConfig.ts添加页面开关 talks: true
5src/config/navBarConfig.ts添加导航栏配置
6src/constants/link-presets.ts添加预设映射
7src/i18n/i18nKey.ts添加国际化键值
8src/pages/talks.astro创建页面路由

1.6 快速添加自定义页面(以”书架”为例)

使用 NavBarLink 方式,只需 3 步(无需枚举、i18n、预设映射)。

Step 1:创建内容文件

文件src/content/spec/books.md

---
title: 书架
date: 2026-05-27
---
# 我的书架
## 正在读
- 《深入理解 TypeScript》
## 已读完
- 《JavaScript 高级程序设计》

Step 2:创建页面文件

文件src/pages/books.astro

---
import MainGridLayout from "@/layouts/MainGridLayout.astro";
import { getEntry, render } from "astro:content";
import Markdown from "@components/common/Markdown.astro";
const booksPost = await getEntry("spec", "books");
if (!booksPost) {
throw new Error("Books page content not found");
}
const { Content } = await render(booksPost);
---
<MainGridLayout title="书架" description="我读过的和正在读的书籍">
<div class="flex w-full rounded-(--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>

Step 3:在导航栏添加链接

文件src/config/navBarConfig.ts

// 方式 A:作为顶级菜单
links.push({
name: "书架",
url: "/books/",
icon: "material-symbols:book-5",
});
// 方式 B:作为下拉子菜单
links.push({
name: "记录",
url: "/records/",
icon: "material-symbols:camera-outdoor",
children: [
{ name: "书架", url: "/books/", icon: "material-symbols:book-5" },
// ...其他子菜单
],
});

1.7 两种方式对比

对比项LinkPreset 预设NavBarLink 自定义
需要修改的文件8 个3 个
需要 i18n
需要枚举值
名称/URL 可自定义
适用场景主题内置页面自定义新页面
适合初学者推荐推荐

1.8 页面开关配置

文件src/config/siteConfig.tspages 对象

pages: {
friends: true, // 友链
sponsor: true, // 赞助
guestbook: false, // 留言板(关闭)
bangumi: true, // 番组计划
gallery: true, // 相册
talks: true, // 说说
}
  • true = 导航栏显示 + 页面可访问
  • false = 导航栏隐藏 + 访问返回 404

1.9 导航栏样式配置

文件src/config/siteConfig.tsnavbar 对象

navbar: {
logo: {
type: "image", // icon | image | url
value: "assets/images/logo.webp", // 图标/图片路径
alt: "Logo",
},
title: "我的博客", // 导航栏标题
hoverTitle: "👋 别走嘛,再看看!", // 鼠标悬停时显示的标题
widthFull: false, // false=居中, true=全宽
menuAlign: "center", // left | center
followTheme: false, // 是否跟随主题色
stickyNavbar: true, // 是否固定顶部
},

1.10 导航栏模块升级功能

本次对博客导航栏模块进行了五项核心改进:

改进项说明优先级
分类独立页面新增 /categories/ 页面,与归档分离
hoverTitle鼠标悬停 Logo 时标题变化为趣味文字
点击触发下拉桌面端下拉菜单从 hover 改为 click
Guestbook 统一移除重复顶级入口,仅保留在子菜单
枚举扩展LinkPreset 新增 Categories/Books 等

五层架构总览

类型层 (config.ts) → 定义 TypeScript 类型和枚举
配置层 (navBarConfig.ts) → 动态生成导航链接
常量层 (link-presets.ts) → 预设链接映射
组件层 (Navbar.astro 等) → 渲染 UI 组件
样式层 (navbar.css / main.css) → 视觉呈现

1.11 图标资源参考

导航栏图标使用 Iconify,格式为 图标库:图标名

常用图标

图标名说明
material-symbols:home首页
material-symbols:archive归档
material-symbols:person关于
material-symbols:group友链
material-symbols:favorite赞助
material-symbols:chat留言板
material-symbols:chat-bubble说说
material-symbols:photo-library相册
material-symbols:movie电影/影视
material-symbols:music-note音乐
material-symbols:book-5书架
material-symbols:history更新日志
material-symbols:location-on足迹
material-symbols:list-alt规划
material-symbols:camera-outdoor记录
material-symbols:local-cafe动态
material-symbols:public网站导航
material-symbols:info信息/关于
fa7-brands:githubGitHub

二、页面功能实现

2.1 网站导航页面自定义

网站导航页面支持以下功能:

  • 分类管理:可自由添加、删除、重命名分类
  • 网站卡片:每个网站显示图标、名称、描述和标签
  • 分类筛选:点击分类标签可筛选显示对应分类
  • 响应式设计:自适应手机、平板、电脑
  • 暗色模式:支持深色/浅色主题切换
  • 自定义颜色:每个分类和网站可独立配置颜色

配置文件位置

src/config/navigationConfig.ts

配置结构说明

export const navigationConfig = {
// 页面标题
title: "网站导航",
// 页面描述
description: "我常用和推荐的网站",
// 分类配置数组
categories: [
{
id: "分类ID", // 唯一标识符
name: "分类名称", // 显示名称
icon: "图标名称", // Iconify 图标
color: "#颜色代码", // 主题颜色
dotColor: "#颜色代码", // 标签圆点颜色(可选)
sites: [ // 网站数组
// ...网站配置
],
},
// ...更多分类
] as NavCategory[],
};

自定义网站

在对应分类的 sites 数组中添加网站对象:

{
name: "网站名称",
url: "https://example.com",
description: "网站描述",
icon: "mdi:earth", // 图标名称
iconColor: "#4CAF50", // 图标背景颜色(可选)
tags: ["标签1", "标签2"], // 标签数组
}

2.2 音乐页面搭建指南

音乐系统由三部分组成:

MusicManager (音频引擎,单例)
↓ fm:* 事件通信
MusicPlayer (侧边栏/导航栏小播放器)
MusicPage (独立音乐页面,大播放器 + 歌曲网格)

配置文件

所有音乐配置在 src/config/musicConfig.ts

import type { MusicPlayerConfig } from "../types/config";
export const musicPlayerConfig: MusicPlayerConfig = {
// 导航栏显示音乐入口
showInNavbar: true,
// 模式:"meting" 用云端 API,"local" 用本地文件
mode: "meting",
// 默认音量
volume: 0.7,
// 播放模式:list / one / random
playMode: "list",
// 启用歌词
showLyrics: true,
// Meting API 配置
meting: {
api: "https://api.i-meto.com/meting/api?server=:server&type=:type&id=:id&r=:r",
server: "netease",
type: "playlist",
id: "10046455237",
auth: "",
fallbackApis: [
"https://api.injahow.cn/meting/?server=:server&type=:type&id=:id",
"https://api.moeyao.cn/meting/?server=:server&type=:type&id=:id",
],
},
// 本地音乐配置
local: {
playlist: [
{
name: "歌曲名",
artist: "歌手名",
url: "/assets/music/歌曲.mp3",
cover: "/assets/music/cover/封面.webp",
lrc: "",
},
],
},
};

使用云端音乐(Meting API)

  1. 选择音乐平台:netease=网易云, tencent=QQ, kugou=酷狗
  2. 选择获取类型:song=单曲, playlist=歌单, album=专辑, artist=艺术家
  3. 填入 ID:打开对应平台的歌曲/歌单页面,URL 中的数字就是 ID
  4. 配置备用 API(推荐)

使用本地音乐

public/assets/music/ 目录下放置音频文件,支持格式:MP3、M4A、OGG、WAV

export const musicPlayerConfig: MusicPlayerConfig = {
mode: "local",
local: {
playlist: [
{
name: "知我",
artist: "国风堂",
url: "/assets/music/知我.mp3",
cover: "/assets/music/cover/知我.webp",
lrc: "/assets/music/lrc/知我.lrc",
},
],
},
};

自动化工具

Terminal window
# Python 下载脚本(推荐)
python scripts/download_music.py "歌名"
# M4A/MP3 元数据提取
pnpm cli lrc 歌曲.m4a

2.3 应用页与集成功能

本次集成共涉及以下功能:

功能类型说明
双 CDN 图床回退新增插件主力图床失效时自动切换备用图床
图片懒加载新增插件Markdown 图片自动添加 loading=“lazy”
IndexNow新增 API + Action一键推送新内容至搜索引擎
文章置顶已有功能前端已完整实现,无需修改
应用中心新增页面展示个人应用、工具和服务链接

双 CDN 图床回退配置

astro.config.mjs
import rehypeImageFallback from "./src/plugins/rehype-image-fallback.mjs";
[
rehypeImageFallback,
{
enable: true, // ← 改为 true 启用
originalDomain: "你的主力图床域名",
fallbackDomain: "你的备用图床域名",
},
],

图片懒加载配置

astro.config.mjs
import rehypeImageAttrs from "./src/plugins/rehype-image-attrs.mjs";
rehypeImageAttrs,

IndexNow 集成

  1. 访问 indexnow.org 申请 Key
  2. 在网站根目录放置 {key}.txt 文件
  3. 在 GitHub Secrets 中配置 INDEXNOW_KEY
  4. 确认 src/pages/api/indexnow.ts 中的站点 URL

文章置顶使用方法

在文章的 frontmatter 中添加 pinned: true

---
title: 我的置顶文章
published: 2026-06-05
pinned: true ← 添加这行
---

应用中心页面配置

src/config/siteConfig.ts
apps: [
{
name: "ChatGPT",
description: "AI 对话助手,支持多模态交互",
url: "https://chat.openai.com",
image: "https://cdn.oaistatic.com/images/favicon-o.svg",
external: true,
},
],

三、组件功能

3.1 AI 功能

FireflyBlog 集成了两套 AI 功能,基于 DeepSeek API 实现:

功能入口能力
AI 问答文章页面右下角「🤖」按钮基于当前文章内容进行多轮对话
文章概括文章标题下方「✨ AI 概括」卡片一键生成文章摘要

环境变量配置

.env.local 文件中添加:

Terminal window
AI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx

AI 配置文件

src/config/aiConfig.ts
export const aiConfig = {
enable: true,
apiEndpoint: 'https://api.deepseek.com/v1/chat/completions',
model: 'deepseek-chat',
maxTokens: 4096,
temperature: 0.7,
summaryTemperature: 0.1,
chatEnabled: true,
summaryEnabled: true,
summaryAutoGenerate: false,
authorName: 'Firefly',
authorBio: '这是一个技术博客,分享编程、AI、Web 开发等技术内容。',
};

3.2 开发者工具提示信息

当用户按下快捷键打开浏览器开发者工具时,自动弹出提示信息。

功能特点

  • ✅ 支持所有主流浏览器(Chrome、Firefox、Edge、Safari)
  • ✅ 响应式设计,适配各种屏幕尺寸
  • ✅ 支持暗色模式
  • ✅ 可自定义提示信息内容
  • ✅ 可配置显示时长
  • ✅ 仅在首次打开开发者工具时显示

配置说明

src/config/siteConfig.ts
devtoolsWarning: {
enable: true,
message: "请按本站规定合法使用开发者工具",
time: 3,
},

涉及文件

文件修改内容
src/components/features/DevToolsWarning.astro新建组件文件
src/types/config.ts添加类型定义
src/config/siteConfig.ts添加配置参数
src/layouts/MainGridLayout.astro导入并使用组件

3.3 恋爱倒计时组件

浪漫的侧边栏小组件,可以实时显示双方在一起的时间。

功能特点

  • ✅ 实时计时:每秒更新,显示年、月、天、时、分、秒
  • ✅ 双人头像:显示双方头像和爱心
  • ✅ 个性化问候:显示双方名字
  • ✅ 响应式设计:适配桌面端和移动端
  • ✅ 深色模式支持:自动切换主题样式
  • ✅ Swup 兼容:页面切换时自动更新

配置文件

src/config/relationshipConfig.ts
import type { RelationshipConfig } from "../types/config";
export const relationshipConfig: RelationshipConfig = {
startDate: "2026-01-06",
name1: "---------TSH",
name2: "CXY---------",
avatar1: "https://re.tsh520.cn/zl/tsh.jpg",
avatar2: "https://re.tsh520.cn/zl/cxy.jpg",
title: "我和宝宝在一起已经",
};

涉及文件

文件路径说明
组件本身src/components/widget/RelationshipTimer.astro核心组件代码
配置文件src/config/relationshipConfig.ts双方信息配置
类型定义src/types/config.ts添加 relationship 类型
侧边栏映射src/components/layout/SideBar.astro注册组件
侧边栏配置src/config/sidebarConfig.ts启用组件

3.4 欢迎弹窗组件

轻量级的欢迎弹窗组件,当访客第一次打开页面时,右下角会弹出一个欢迎卡片。

功能特点

  • ✅ 首次访问弹出:使用 sessionStorage 去重
  • ✅ IP 地理位置问候:自动获取访客位置
  • ✅ 自动消失:5 秒后自动关闭
  • ✅ 手动关闭:支持点击关闭按钮
  • ✅ 响应式设计:适配桌面端和移动端
  • ✅ 深色模式支持:自动切换主题样式
  • ✅ Swup 兼容:完美适配 SPA 客户端路由

涉及文件

文件路径
组件本身src/components/WelcomeToast.astro
在布局中引用src/layouts/MainGridLayout.astro

3.5 友链自助申请功能

为博客添加友链自助申请功能,实现两种申请入口:

入口位置说明
右上角按钮醒目的主题色按钮,点击直接跳转 GitHub Issue 表单
页面内文字链接在申请流程步骤中显示,体验友好

功能特点

  • ✅ 不破坏原有布局,不影响任何功能
  • ✅ 适配明暗主题
  • ✅ 支持 GitHub Issue 自动表单
  • ✅ 访客一键提交,方便管理

GitHub Issue 模板

创建 .github/ISSUE_TEMPLATE/friend-request.yml 文件。

涉及文件

文件修改内容
src/pages/friends.astro添加申请按钮
src/content/spec/friends.mdx添加文字链接
.github/ISSUE_TEMPLATE/friend-request.yml新增 Issue 模板

3.6 MDX 组件使用指南

博客中可用的自定义 MDX 组件,在 .mdx 文件中通过 import 导入后即可使用。

Timeline 时间轴

用于展示更新日志,左侧竖线 + 圆点 + 标签徽章。

import Timeline from "../../components/mdx/Timeline.astro";
<Timeline date="2026-05-28" type="feature" version="v1.2.0">
新增音乐页面,支持本地播放列表。
</Timeline>

MusicCard 音乐卡片

展示单首歌曲信息,包含封面、歌名、歌手和播放链接。

import MusicCard from "../../components/mdx/MusicCard.astro";
<MusicCard title="知我" artist="国风堂" />

TagBadge 标签徽章

通用类型标签,用于标记内容类别。

import TagBadge from "../../components/mdx/TagBadge.astro";
<TagBadge type="feature" />
<TagBadge type="fix" text="Bug Fix" />

四、常见问题排查

4.1 导航栏显示空白文字

原因:i18n 枚举键名大小写不一致。

// ❌ 错误:枚举名大写,引用小写
export enum I18nKey {
Talks = "talks", // 大写 T
}
name: i18n(I18nKey.talks), // 找不到 → 空白
// ✅ 正确:统一使用小写 camelCase
export enum I18nKey {
talks = "talks", // 小写 t
}
name: i18n(I18nKey.talks), // 匹配成功

4.2 页面 404

可能原因排查方法
页面文件不存在检查 src/pages/xxx.astro
内容文件不存在检查 src/content/spec/xxx.md
getEntry 参数错误第二个参数是文件名(不含扩展名)
嵌套目录未创建/life/routines/ 需要 src/pages/life/ 目录

4.3 导航栏不显示菜单项

可能原因排查方法
页面开关为 false检查 siteConfig.pages.xxx
LinkPreset 枚举值未添加检查 types/config.ts
预设映射未添加检查 constants/link-presets.ts
navBarConfig 中未添加检查 config/navBarConfig.ts

4.4 import 路径报错

// ❌ 缺少扩展名
import Markdown from "@components/common/Markdown";
// ✅ 加上 .astro 扩展名
import Markdown from "@components/common/Markdown.astro";

五、完整检查清单

添加 LinkPreset 预设页面(如”说说”)

  • src/content/spec/talks.md 已创建
  • src/types/config.tsLinkPreset 添加了 Talk = 8
  • src/config/siteConfig.tspages.talks = true
  • src/config/navBarConfig.ts 中添加了菜单项
  • src/constants/link-presets.ts 中添加了预设映射
  • src/i18n/i18nKey.ts 中添加了 talkstalksDescription
  • src/i18n/languages/zh_CN.ts(及其他语言)添加了翻译
  • src/pages/talks.astro 页面文件已创建
  • 重启开发服务器验证
  • src/content/spec/books.md 已创建
  • src/pages/books.astro 已创建
  • src/config/navBarConfig.ts 中添加了导航链接
  • 重启开发服务器验证

通用检查

  • src/content.config.tsspec 集合已定义
  • 所有 import 路径包含 .astro 扩展名
  • 枚举值无重复
  • 所有语言文件都添加了翻译

六、总结

本文档整合了 Firefly 博客导航功能的所有教程,涵盖以下内容:

模块功能状态
导航栏配置预设链接、自定义链接、样式配置✅ 完成
导航栏升级分类页面、hoverTitle、点击触发下拉✅ 完成
网站导航分类管理、网站卡片、颜色配置✅ 完成
音乐页面云端/本地音乐、歌词、收藏✅ 完成
集成功能CDN回退、懒加载、IndexNow、应用中心✅ 完成
AI功能AI问答、文章概括✅ 完成
侧边栏组件恋爱倒计时、欢迎弹窗、开发者工具提示✅ 完成
友链功能自助申请、GitHub Issue表单✅ 完成
MDX组件时间轴、音乐卡片、标签徽章✅ 完成

所有功能均已实现并经过测试,可直接使用!🎉

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Firefly 博客导航功能完整指南
https://f3f3.top/posts/blog-navigation-guide/
作者
lyf
发布于
2026-06-18
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
lyf
Hello, I'm LyF.
公告
欢迎来到一飞的博客!。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
我和宝宝在一起已经
---------TSH ❤️ CXY---------
---------TSH
❤️
CXY---------
0 0 0 0 0 00
分类
标签
站点统计
文章
18
分类
8
标签
19
总字数
74,739
运行时长
0
最后活动
0 天前

文章目录

🤖 AI 助手

👋 你好!

我可以帮你解答关于这篇文章的问题