Teek-one模板手把手使用文档 推荐1
Teek-one模板手把手使用文档
Teek~一款简约、唯美、丝滑且强大的VitePress主题博客(博客和知识库二合一)

目录
[toc]
前言
为什么要创建个人博客
- 个人博客,不止是技术的记录,也是生活,更是人生。
- 让别人拿着我写的文档保准出效果,避免踩坑。
- 热爱分享、传播、开源。
- 记录博客的人,多半也是孤独的人吧。
- 每更新一次博客,就像在精心打理着自己的小庄园。
你的需求
所以,对一个写博客的人来说,他自己的需求是什么?(很关键)
1.是想要一个博客,有空了写几篇文章丢上去 --那么建议选择 博客风格的;(很多,例如wp,hexo等等,但是还是推荐teek博客,或者张洪heo风格)
2.是想要一个同时支持 博客和文档库 的博客,后续会持续且成体系地更新数据 -----那么建议选择 博客风格的;(推荐teek博客-基于vitepress开发的)
🍀
重点:
博客只适合碎片化知识分享,而知识库才是沉淀知识的理想方式。
产生背景
提示
以下文字来源于《天客Teeker》作者《我用 VitePress 打造了一个文档风、博客风主题,VuePress 晚安!》文章,介绍了Teek的产生背景,这里只记录相关信息,感谢作者的优秀作品。
相信使用 VitePress 的小伙伴们知道,VitePress 默认主题适合搭建文档站,不适合搭建博客站,但是 VitePress 提供了大量的插槽支持拓展或者覆盖其内置的主题,于是我在默认主题的基础上进行拓展:vitepress-theme-teek 诞生了🎉。
我第一次搭建博客使用 VuePress 的主题 Vdoing,如果用过 Vdoing 搭建的小伙伴可能熟悉我的网站 Young Kbt,然后一直用到了现在,此时我的博客已经有了很多的文档,但是 VuePress 面对大量的文档已经显得力不从心,本地启动需要花费很长时间才能成功,于是我把目光移到了 VitePress。
但是 VitePress 主题较于 VuePress 主题太少了,很多的都是在个人项目里定制开发,并没有抽离出来(如一个 NPM 包),而已有的主题不符合我的使用习惯,毕竟用了 Vdoing 的很多便捷功能(PS: Vdoing 真好用),所以一直等待着平替品。
2025 年初我打算给一个项目 Hd Security 写使用文档,于是打算尝试用 VitePress 来搭建,在搭建的时候竟然发现 VitePress 默认是基于文档路径来当作 URL 访问,而不是像 VuePress 可以单独给文章设置一个自定义永久链接来访问,这就难受了🙂。
于是我打算实现这个 Permalink 永久链接功能,慢慢开始阅读 VitePress 源码、一些开源的 VitePress 主题源码,寻找灵感,慢慢事情就不对劲了🤔,我了解了 VitePress 的许多拓展用法,然后动了坏心思:实现一个类似于 Vdoing 的 VitePress 主题,利用 VitePress 即时启动、闪电般的热更新特性解决 VuePress 启动/构建慢的问题,于是 Teek 诞生了🎉。
Teek 一开始是照着 Vdoing 原型开发,毕竟没有大量时间从零设计。后来慢慢实现了 Vdoing 大部分功能,原本打算就此收手,然而 Vdoing 群里的 2 个小伙伴尝试使用了初版 Teek,并给予了我极大的鼓励和支持。他们边使用边提大量需求(照着其他开源项目的功能使劲提 😭),我想着正好熟悉下前端开发,于是不断完善 Teek,重构架构、规范代码和版本、编写使用文档,最后就是大家现在看到的 Teek。
在此感谢 Teek 参考的优质 VitePress、VuePress 主题和博客 vuepress-theme-vdoing、粥里有勺糖、VitePress 快速上手中文教程、友人A、Lumen、Nólëbase 集成。
背景
为什么要写这篇文章呢?
静态类型博客(ssg)部署非常简单,无非就是拉取代码,本地运行,构建数据,推送数据。但是对小白来说,如何快速部署一个ssg类型博客,如何使用博客,且将其发布到自己个人域名下,尤其是面对一个全新的博客,总会显得不知所措。
老夫也是过来人,不想见小白因为各种小问题踩各种坑,浪费了光阴却中途放弃,于是鄙人写了这篇手把手使用Teek博客的文档,各位小伙伴使用过程中有任何问题,可以在群里@我,我会帮大家快速部署属于自己的博客博客哦😜。
所以:
那就按这篇手把手教程快速部署一个宇宙最美博客哦,哈哈哈。🤣
简介
Teek 是一个 轻量、简洁高效、灵活配置,易于扩展 的 VitePress 主题 ✨,可以轻松打造属于你自己的知识管理平台,它有如下特性:
知识管理
包含三种典型的知识管理形态:结构化、碎片化、体系化。轻松打造属于你自己的知识管理平台。
结构化 & 体系化
自动生成侧边栏、目录页、索引页、面包屑等,轻松构建一个结构化知识库。
碎片化 & 个性化
博客功能提供快速构建知识的碎片化形态,并提供大量个性化的主题配置。
文档风 & 博客风
支持通过配置随意切换文档风和博客风,支持个人博客、文档站、知识库等场景。
🍊视频讲解
https://www.bilibili.com/video/BV1YuaUzWE1Z/?vd_source=77325423ced14ef15b0723db235167e3 Teek~一款简约、唯美、丝滑且强大的VitePress主题博客(博客和知识库二合一)

🍊关于Teek博客介绍,详情见如下链接:
https://onedayxyy.cn/teek/teek-blog 《Teek博客》

🍊细节展示
链接访问:文档地址 | Github 仓库 (欢迎点个 star✨~)
Teek 的官方文档站默认采用 VitePress 原始风格,当然您可以点击右上角的主题面板,切换 Demo 来查看效果。

🍊 博客案例
Teek 文档站的内容仅仅基于 Teek 本身功能构建的,并没有添加一些第三方美化的插件、功能,您可以访问下面使用 Teek 搭建的博客地址(一开始跟随 Teek 的两位小伙伴的博客),这些博客添加了很多美化功能,也许更符合您的爱好。
🍊 功能概览
相较于 VitePress 默认主题,Teek 主要实现了博客风格的功能,这些功能也兼容文档风格。
全局
- 侧边栏自动生成,根据目录自动生成侧边栏,无需手动配置
- 提供目录页,根据
Markdown文件路径自动生成目录 - 自动生成
frontmatter,并且支持拓展frontmatter格式 - 自动生成一级标题
- 全站背景图片
Markdown拓展:居中、居右容器、卡片容器、Demo容器、TODO列表、Video容器- 主题多元化:4 种布局模式、8 种主题风格选择,且支持自定义扩展新的主题风格
- ...
首页
Banner功能:提供 3 种风格选择:局部背景色、局部图片、全屏图片,提供打印个性签名、切换个性签名选择,提供feature功能- 文章列表:支持切换列表和卡片模式,展示文章标题、封面图、作者、创建时间、更新时间、标签、分类,且支持重写文章列表
- 博客卡片栏:博主信息栏、精选文章栏、分类栏、标签栏、友情链接栏、站点信息栏
- 全屏壁纸模式:只保留
Banner背景图片或全站背景图片,且禁止滚动、打开开发者工具、右键功能 - 页脚:展示社交图标、版权信息、备案信息、自定义信息
- ...
文章页
- 文章信息:展示面包屑、作者、创建时间、更新时间、标签、分类、字数、阅读时长
- 评论区:提供
Giscus、Twikoo、Waline、Artalk四种评论提供商选择,并且支持自定义评论区 - 代码块:UI 升级,支持一键折叠/展开
- 文章页风格书页化:提供 3 种风格选择:
VitePress原生、整体卡片化、片段卡片化 - 文章打赏:支持 3 种打赏风格选择
- 文章分享:提供一键复制文章链接功能
- 最近更新栏:展示最近更新文章
- ...
功能页
- 分类页
- 标签页
- 归档页
- 清单页
- 登录页
- 风险链接提示页
除了上述功能,Teek 也提供了各种 CSS 文件来增强 VitePress 的样式,并提供大量的插槽支持二次开发。
如果您是其他主题的用户,也可以按需引入 Teek 的功能,增强自己的站点风格。
亮点
Teek最大亮点:
Teek~一款简约、唯美、丝滑且强大的VitePress主题博客 ❤️❤️❤️
- 理念超前:Teek 以“将本地目录的 Markdown 文档渲染成博客”这一设计思想贯穿其中,大道至简,实用且强大。
- 双模式支持:能同时满足 知识库 & 博客 & 云笔记 需求,且功能完整、体验丝滑,试问全网还有哪个网站能与其争锋?
- 纯静态部署:一键轻松部署,最低配服务器即可满足需求,真正做到轻量化、高效化。
- 极致体验:风格简约、唯美,阅读/编辑文章就像读一本书一样清晰、舒适,细节打磨到位,操作丝滑流畅,用户体验无可挑剔。
- 数据管理:本地typora/obsidian维护markdown文档,git管理,一键发布本地md知识目录到网站;
- 社区氛围:群内热心小伙伴手把手教学,耐心解答问题,价值感和情绪价值双拉满,群主对小伙伴提出的需求基本有求必应……
- 持续迭代:开发者热心持续开发新功能,及时修复 Bug,完全开源,诚意满满。
无论是从设计理念、功能丰富度,还是从用户体验和社区支持来看,Teek 都堪称全网最美博客,实至名归!
版权
警告
此《vitepress-theme-teek 》项目是《天客 - Teeker》大佬开源的,感谢大佬开发的优秀主题,大佬威武,这里仅记录下个人日常使用teek的一些信息,关于项目具体信息,可访问其官网,多谢。❤️❤️❤️
- 官方demo及仓库
Teek官方文档:https://vp.teek.top/
Teek原作者博客:https://notes.teek.top/
模板:
Teek爱好者《One》开源的模板:Teek-one(本人 开箱即用的 漂亮博客风,适合小白,强烈推荐😜) https://cnb.cool/onedayxyy/vitepress-theme-teek-one-public
官方开箱即用版仓库(官方 开箱即用的 简约文档风,适合小白,强烈推荐😜):https://github.com/Kele-Bingtang/vitepress-theme-teek-docs-template
官方开发版仓库(想二开Teek的可选择这个):https://github.com/Kele-Bingtang/vitepress-theme-teek
推广文章:
原作者天客 - Teeker掘金发表的文章:《我用 VitePress 打造了一个文档风、博客风主题,VuePress 晚安!》
一切博客,凡是作者不能很好地支持更新,都不如 Teek博客。🤣
开箱即用版
开箱即用版~Teek-one💖 介绍
我的网站效果 https://onedayxyy.cn/
NOTE
自己开源的 《vitepress-theme-teek-one-public》网站模板。
此模板是在《天客 - Teeker》大佬开源项目《vitepress-theme-teek 》基础上 添加了 一些友好的用户体验 开源的,非常适合小白使用(强烈建议小白直接拉取次库体验效果😜)。
感谢大佬开发的主题,大佬威武。❤️❤️
部分效果见如下图所示:
- 简约文档风格

- Banner 大图

- 卡片风格

更多效果,请访问我的网站One。
前提条件
自己电脑得提前安装好git和nodejs:
以下配置是讲述了如何拉取自己Teek-one模板,且想要修改把当前网站修改为自己网站的配置信息,都是手把手教程,按着配置弄就完全OK,保准无坑。😍
项目需知
1.项目结构
以下是Teek的各目录结构。

Teek目录结构官方文档:《结构化目录》

2.命名规则
🍊命名规则
我们在维护Teek仓库之前,必须得弄清楚Teek里目录及文件的命名规则,以方便后续维护Teek网站。
🍊原文链接
原文链接:结构化目录 | vitepress-theme-teek

如果你搭建的是博客风的站点,那么 Teek 建议和 vdoing 一样,使用以下命名约定:
- 无论是文件还是文件夹,请为其名称添加上正确的正整数序号和
.,从00或01开始累计,如01.文件夹、02.文件.md,我们将会按照序号的顺序来决定其在侧边栏当中的顺序 - 同一级别目录别内即使只有一个文件或文件夹也要为其加上序号
序号只是用于决定先后顺序,并不一定需要连着,如 01、02、03...,实际可能会在两个文章中间插入一篇新的文章,因此为了方便可以采用间隔序号 10、20、30...,后面如果需要在 10 和 20 中间插入一篇新文章,可以给定序号 15。
当然可以使用非序号的命名,这并不影响使用,添加序号只是为了排序,且更具有结构化,如果同一个目录下同时存在带序号和不带序号的文件,在生成侧边栏时,Teek 会分为两个区:带序号区和不带序号区,两个区内部按照各自的逻辑排序,在最终生成侧边栏的时候,不带序号区始终放在带序号区的后面。
从维护性、可读性的角度分析,带有序号的文件名在本地目录看起来更加直观;从站点渲染的角度分析,在生成侧边栏时,Teek 会根据文件名的序号进行排序。
🍊最佳姿势
一级目录下只能存在一个md,其余必须为目录。目录按序号递增(例如10. 20. 30. 40.);


3.rewrite模式
🍊模式选择
当前Teek-one默认的模式已强制修改为rewrite,别问为什么,贫道自有道理,肯定是最佳实践啦。
那么,为什么要切换到rewrite呢?
- 左下角会有中文路径提示
- url打开会有中文提示
这2个问题导致proxy模式的vitepress主题体验就是一坨粑粑(所以不得不切到rewrite模式)。🤣
Teek里文件路径使用原则
- Teek里的每个页面url链接只能是
https://域名/一级前缀/随机uid(例如我网站《Teek博客》文章的唯一链接就是https://onedayxyy.cn/teek/teek-blog,此时 一级前缀 就是teek,随机uid 就是teek-blog) - 必须保证 一级目录下的 所有md都得有同一个一级前缀,例如
/一级前缀/随机uid - 一级前缀决定了是否都在同一个侧边栏显示。你一级目录下,都是其子目录,默认都弄成同一个一级前缀就好了。如果不想让他出现在侧边栏,那就单独指定一个一级目录。
- 所以,一级前缀 就统一整成 /技术/xxx /专题/xxx /生活/xxx /兴趣/xxx /关于/xxx (这里的中文可以替换为对应的英文)


1、拉取模板
(1)克隆仓库
#来到自己电脑d盘
cd /d/
#项目拉取
git clone https://cnb.cool/onedayxyy/vitepress-theme-teek-one-public.git
cd /d/vitepress-theme-teek-one-public
#依赖安装(只能用 pnpm 安装依赖)
pnpm install
#项目本地运行
pnpm docs:dev #本地运行
#项目打包
pnpm docs:build(2)浏览器访问http://localhost:5173/观察效果
执行pnpm docs:dev后,浏览器默认就会打开一个http://localhost:5173/网页:(恭喜你,此时你的Teek博客已经部署完成了)

以上,Teek博客本地部署好了,接下来,那么我们把模板中的一些信息修改为自己的个人信息。
🍊扩展:
dockre部署
警告
仅用于快速拉起一个teek博客,实际部署推荐以上源码部署。
#dockre一键启动teek博客
docker run -d -p 8054:80 --name docker.cnb.cool/onedayxyy/vitepress-theme-teek-one-public/teek-blog --restart unless-stopped teek-blog2、修改信息
左上角网站名称、标签页名称、首页网站名称、网站logo
1.左上角网站名称
编辑docs\.vitepress\config.ts文件:
title: "One", //左上角网站名称
效果:

2.标签页名称
编辑docs\index.md文件:
#标签页名称
title: One
#标签页-副标题
titleTemplate: 明心静性,爱自己
效果:

3.首页网站名称
编辑docs\.vitepress\theme\config\teekConfig.ts文件:
修改banner.name属性为One Blog 🎉 (记得批量把 博客默认配置/小图/大图/全图/卡片等下的banner.name属性都配置一遍)
import type { TeekConfig } from "vitepress-theme-teek/config";
// 文档配置
export const teekDocConfig: TeekConfig = {
themeEnhance: {
layoutSwitch: {
defaultMode: "bothWidthAdjustable",
},
},
};
// 博客基础配置
const teekBlogCommonConfig: TeekConfig = {
teekHome: true,
vpHome: false,
loading: true,
wallpaper: {
enabled: true,
hideBanner: true,
},
footerInfo: {
customHtml: `<span id="runtime"></span>`, // 需要搭配 .vitepress/theme/helper/useRuntime.ts 使用
},
docAnalysis: {
createTime: "2025-03-23",
statistics: {
provider: "busuanzi",
},
},
friendLink: {
list: [
{
name: "Teeker",
desc: "朝圣的使徒,正在走向编程的至高殿堂!",
avatar: "https://testingcf.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar2.png",
link: "http://notes.teek.top/",
},
{
name: "vuepress-theme-vdoing",
desc: "🚀一款简洁高效的VuePress 知识管理&博客 主题",
avatar: "https://doc.xugaoyi.com/img/logo.png",
link: "https://doc.xugaoyi.com/",
},
{
name: "One",
desc: "明心静性,爱自己",
avatar: "https://onedayxyy.cn/img/xyy.webp",
link: "https://onedayxyy.cn/",
},
{
name: "Hyde Blog",
desc: "人心中的成见是一座大山",
avatar: "https://teek.seasir.top/avatar/avatar.webp",
link: "https://teek.seasir.top/",
},
{
name: "二丫讲梵",
desc: "💻学习📝记录🔗分享",
avatar: "https://wiki.eryajf.net/img/logo.png",
link: " https://wiki.eryajf.net/",
},
{
name: "粥里有勺糖",
desc: "简约风的 VitePress 博客主题",
avatar: "https://theme.sugarat.top/logo.png",
link: "https://theme.sugarat.top/",
},
{
name: "VitePress 快速上手中文教程",
desc: "如果你也想搭建它,那跟我一起做吧",
avatar: "https://avatars.githubusercontent.com/u/90893790?v=4",
link: "https://vitepress.yiov.top/",
},
{
name: "友人A",
desc: "おとといは兎をみたの,昨日は鹿,今日はあなた",
avatar: "http://niubin.site/logo.jpg",
link: "http://niubin.site/",
},
],
autoScroll: true,
},
social: [
{
icon: "mdi:github",
name: "GitHub",
link: "https://github.com/kele-bingtang",
},
{
icon: "simple-icons:gitee",
name: "Gitee",
link: "https://gitee.com/kele-bingtang",
},
],
};
// 博客默认配置
export const teekBlogConfig: TeekConfig = {
...teekBlogCommonConfig,
banner: {
name: "One Blog 🎉",
description: "故事由我书写,旅程由你见证,传奇由她聆听 —— 来自 Young Kbt",
bgStyle: "partImg",
},
};
// 博客小图配置
export const teekBlogParkConfig: TeekConfig = {
...teekBlogCommonConfig,
banner: {
name: "One Blog 🎉",
bgStyle: "partImg",
imgSrc: ["/blog/bg1.webp", "/blog/bg2.webp", "/blog/bg3.webp"],
description: [
"故事由我书写,旅程由你见证,传奇由她聆听 —— 来自 Young Kbt",
"积跬步以至千里,致敬每个爱学习的你 —— 来自 Evan Xu",
"这一生波澜壮阔或是不惊都没问题 —— 来自 Weibw",
],
descStyle: "switch",
},
footerGroup: [
{
title: "外部链接",
links: [
{ name: "示例 1", link: "https://vp.teek.top" },
{ name: "示例 2", link: "https://vp.teek.top" },
{ name: "示例 3", link: "https://vp.teek.top" },
],
},
{
title: "内部链接",
links: [
{ name: "快速开始", link: "/guide/quickstart" },
{ name: "配置简介", link: "/reference/config" },
],
},
],
};
// 博客大图配置
export const teekBlogFullConfig: TeekConfig = {
...teekBlogCommonConfig,
post: {
coverImgMode: "full",
},
banner: {
name: "One Blog 🎉",
bgStyle: "fullImg",
imgSrc: ["/blog/bg1.webp", "/blog/bg2.webp", "/blog/bg3.webp"],
description: [
"故事由我书写,旅程由你见证,传奇由她聆听 —— 来自 Young Kbt",
"积跬步以至千里,致敬每个爱学习的你 —— 来自 Evan Xu",
"这一生波澜壮阔或是不惊都没问题 —— 来自 Weibw",
],
descStyle: "types",
},
comment: {
provider: "giscus",
options: {
repo: "Kele-Bingtang/vitepress-theme-teek",
repoId: "R_kgDONpVfBA",
category: "Announcements",
categoryId: "DIC_kwDONpVfBM4Cm3v9",
},
},
codeBlock: {
overlay: true,
},
themeEnhance: {
themeColor: {
append: [
{
label: "博客扩展主题",
tip: "博客扩展主题",
options: [
{ label: "紫罗兰", value: "violet", color: "#7166f0" },
{ label: "珊瑚粉", value: "coral-pink", color: "#ff6b6b" },
{ label: "天蓝", value: "sky-blue", color: "#00bbf9" },
{ label: "蓝绿", value: "blue-green", color: "#00f5d4" },
{ label: "石板灰", value: "slate-gray", color: "#708090" },
{ label: "粉红", value: "pink", color: "#f15bb5" },
{ label: "黄绿", value: "yellow-green", color: "#8ac926" },
{ label: "橙红", value: "orange-red", color: "#ff9e6b" },
],
},
],
},
},
};
// 博客全图配置
export const teekBlogBodyConfig: TeekConfig = {
...teekBlogCommonConfig,
pageStyle: "segment-nav",
bodyBgImg: {
imgSrc: ["/blog/bg1.webp", "/blog/bg2.webp", "/blog/bg3.webp"],
},
banner: {
name: "One Blog 🎉",
description: [
"故事由我书写,旅程由你见证,传奇由她聆听 —— 来自 Young Kbt",
"积跬步以至千里,致敬每个爱学习的你 —— 来自 Evan Xu",
"这一生波澜壮阔或是不惊都没问题 —— 来自 Weibw",
],
descStyle: "types",
},
themeEnhance: {
layoutSwitch: {
defaultMode: "original",
},
},
};
// 博客卡片配置
export const teekBlogCardConfig: TeekConfig = {
...teekBlogCommonConfig,
post: {
postStyle: "card",
},
homeCardListPosition: "left",
banner: {
name: "One Blog 🎉",
bgStyle: "fullImg",
imgSrc: ["/blog/bg1.webp", "/blog/bg2.webp", "/blog/bg3.webp"],
description: [
"故事由我书写,旅程由你见证,传奇由她聆听 —— 来自 Young Kbt",
"积跬步以至千里,致敬每个爱学习的你 —— 来自 Evan Xu",
"这一生波澜壮阔或是不惊都没问题 —— 来自 Weibw",
],
descStyle: "types",
},
};

效果:

4.网站logo
编辑docs\.vitepress\config.ts文件:
logo: "/xyy-favicon.ico", //网站logo
效果:

侧边栏 个人头像、呢称、背景图、座右铭、首页3个banner图片
1.侧边栏 个人头像、呢称、背景图、座右铭
编辑docs\.vitepress\teekConfig.ts文件:
blogger: {
// 博主信息,显示在首页侧边栏
name: "One", // 侧边栏个人昵称
slogan: "明心静性,爱自己", // 侧边栏个人座右铭
avatar: "/img/xyy.webp", //侧边栏个人头像
shape: "circle-rotate", // 头像风格:square 为方形头像,circle 为圆形头像,circle-rotate 可支持鼠标悬停旋转
circleBgImg: "https://img.onedayxyy.cn/images/Teek/TeekBg/14.webp", // 侧边栏个人头像圆形背景图
circleBgMask: false, // 头像圆形背景图是否显示遮罩层
color: "#ffffff",
circleSize: 120,
status: {
icon: "😪",
size: 28,
title: "困",
},
},
效果:

2.首页3个banner图片
编辑docs\index.md文件:
features: # 可选的
- title: 初见
details: 茫茫人海,我们相遇
link: / # 可选
# imgUrl: /img/web.png # 可选
image: /img/xyy-1.webp # 可选
- title: 幸福
details: 与你一起,真的幸福
link: /
# imgUrl: /img/ui.png
image: /img/xyy-2.webp
- title: 后来
details: 再见竟是,再也不见
link: /
# imgUrl: /img/other.png
image: /img/xyy-3.webp
效果:

壁纸
编辑docs\.vitepress\ConfigHyde\Wallaper.ts文件,把自己喜欢的图片放进去就好:
// 首页壁纸 - 动态获取本地图片服务器的图片
// 壁纸服务配置 - 统一配置服务地址,一处修改全局生效
export const WALLPAPER_SERVICE_CONFIG = {
baseUrl: 'https://imgapi.onedayxyy.cn',
// baseUrl: 'https://imgapi.onedayxyy.cn',
apiEndpoint: '/api/images',
get fullUrl() {
return `${this.baseUrl}${this.apiEndpoint}`
}
}
// 备用图片列表(当本地服务不可用时使用)
const fallbackImages = [
"https://img.onedayxyy.cn/images/Teek/TeekBg/1.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/2.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/3.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/4.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/5.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/6.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/7.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/8.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/9.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/10.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/11.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/12.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/13.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/14.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/15.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/16.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/17.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/18.webp",
// "https://img.onedayxyy.cn/images/Teek/TeekBg/19.webp",
];
// 动态获取图片列表的函数
async function fetchDynamicWallpapers(): Promise<string[]> {
try {
// 使用统一配置的图片服务API
const response = await fetch(WALLPAPER_SERVICE_CONFIG.fullUrl, {
method: 'GET',
headers: {
'Accept': 'application/json',
},
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const data = await response.json();
const images = data.images || [];
// 将相对路径转换为完整的服务器URL
const wallpapers = images.map((imagePath: string) => `${WALLPAPER_SERVICE_CONFIG.baseUrl}${imagePath}`);
// 如果获取到图片,返回动态图片列表,否则返回备用图片
return wallpapers.length > 0 ? wallpapers : wallpapers;
} catch (error) {
console.warn('无法获取动态壁纸,使用备用图片:', error);
return fallbackImages;
}
}
// 创建一个Promise来获取壁纸
let wallpaperPromise: Promise<string[]> | null = null;
// 获取壁纸的函数
function getWallpapers(): Promise<string[]> {
if (!wallpaperPromise) {
wallpaperPromise = fetchDynamicWallpapers();
}
return wallpaperPromise;
}
// 导出的Wallpaper数组 - 在服务端渲染时使用备用图片,客户端动态加载
export const Wallpaper: string[] = fallbackImages;
// 导出动态获取函数供主题使用
export { getWallpapers, fetchDynamicWallpapers };这里的Teek博客的首页壁纸使用的是XGQ大佬开发的Go壁纸api,你可以选择继续使用我的壁纸。或者把这一行注释掉,然后换成自己的壁纸。
文章封面
编辑docs\.vitepress\ConfigHyde\Cover.ts文件,把自己喜欢的图片放进去就好:
// 首页壁纸
export const Cover = [
"https://img.onedayxyy.cn/images/Teek/TeekCover/1.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/2.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/3.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/4.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/5.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/6.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/7.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/8.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/9.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/10.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/11.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/12.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/13.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/14.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/15.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/16.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/17.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/18.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/19.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/20.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/21.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/22.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/23.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/24.webp",
"https://img.onedayxyy.cn/images/Teek/TeekCover/25.webp",
];以上的壁纸路径是我图床里的,你也可以把图片放大项目里,此时的路径就需要改为
/img/xx.jpg了,这里使用的是相对路径,相对于docs\public目录而言的。
Twikoo评论
(1)docker部署twikoo服务
Twikoo评论需要单独搭建服务,具体部署方法见如下链接:《 https://onedayxyy.cn//zhuanti/twikoo-install 》

(2)次项目配置Twikoo
编辑docs\.vitepress\theme\components\Twikoo.vue文件:
envId: 'https://twikoo.onedayxyy.cn/', // 换成你自己配置的域名
Algolia搜索
Algolia搜索需要单独搭建服务,具体部署方法见如下链接:《 https://onedayxyy.cn/teek/algolia 》
Teek博客默认支持本地搜索,但是当数据量大的时候,就会出现卡顿现象。因此这里需手动配置下Algolia搜索。配置过程,稍微会复杂点,但是按文档提示的来,一般没多大问题。

以上文档包含了Algolia配置过程,及项目配置过程。
3、管理数据
以上个人信息修改完后,我们看下如何往博客里新增文章数据呢?
- 如何把原有博客数据迁移到Teek博客?
- 如何在Teek博客新建文章呢?
请看下文。
1.迁移数据
(特别注意🛑)
(1)删除模板中存在的老数据
此时,就可以把模板docs目录下的10.运维、15.前端……65.Teek等 目录都 给删除了,然后把你之前的个人笔记数据给放到Teek的docs目录下,然后按上面提到的方式命名。

(2)创建自己的新数据
例如,我们会创建如下目录结构:(每个目录下有多个子目录或者md)

具体目录结构截图示例:


特别注意:
在把你之前的数据迁移到teek时,这里需要格外注意一个问题。
teek目前使用rewrite模式的autoformatter插件来给md强制注入永久permalink,每个md的permalink格式为/一级前缀/随机uid。
因此,当你想要使用teek的rewrite模式后,这里需要我们提前配置一点东西,后续就可以丝滑使用了:
(3)指定一级前缀规则
编辑docs\.vitepress\config.ts文件:
{ folderName: "10.运维", prefix: "/linux/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "15.前端", prefix: "/qianduan/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "20.编程", prefix: "/code/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "25.黑客", prefix: "/hacker/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "30.专题", prefix: "/zhuanti/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "35.工具", prefix: "/tools/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "40.生活", prefix: "/life/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "45.精神小屋", prefix: "/love/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "50.娱乐", prefix: "/yule/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "55.兴趣", prefix: "/xingqu/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "60.关于", prefix: "/about/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
{ folderName: "65.Teek", prefix: "/teek/$uuid5", removeLevel: 99}, // 清空前缀并且添加前缀使用随机数
即:有多少个一级目录,那么配置文件那里就必须配置多少行,这样每个一级目录下的内容就会出现在同一个侧边栏了。
配置完成后,不管你之前的md是否有permalink,teek的autoformatter插件都会强制注入永久permalink。(先可以用其他少量文档做下测试,没问题后,再迁移自己的个人数据。我这里都是测试没问题的,大家可以放心食用。🤣)
(4)配置导航栏项
你需要做的就是,在docs\.vitepress\ConfigHyde\Nav.ts文件里配置对应的url即可:
这里为了方便管理,每个一级目录下最好存放一个md,其序号可以命名为01. 让其为最优先的一个文件。(导航栏对应的菜单就可以配置对应一级目录下这个文件的permalink就行了。)
详细信息
// nav导航栏配置
import { TeekIcon, VdoingIcon, SSLIcon, BlogIcon } from "./icon/NavIcon";
export const Nav = [
{ text: "🏡首页", link: "/" },
// 笔记
{
text: '📚文档',
items: [
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/linux.svg" alt="" style="width: 16px; height: 16px;">
<span>运维</span>
</div>
`,
link: '/linux/linux-index',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/前端.svg" alt="" style="width: 16px; height: 16px;">
<span>前端</span>
</div>
`,
link: '/qianduan/qianduan-index',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/编程.svg" alt="" style="width: 16px; height: 16px;">
<span>编程</span>
</div>
`,
link: '/code/code-index',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/黑客.svg" alt="" style="width: 16px; height: 16px;">
<span>黑客</span>
</div>
`,
link: '/hacker/hacker-index',
},
],
},
// 专题
{
text: '🛠️专题',
items: [
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/teek.svg" alt="" style="width: 16px; height: 16px;">
<span>Teek</span>
</div>
`,
link: '/teek/teek-blog',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/Git.svg" alt="" style="width: 16px; height: 16px;">
<span>Git</span>
</div>
`,
link: '/zhuanti/git',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/脚本.svg" alt="" style="width: 16px; height: 16px;">
<span>脚本</span>
</div>
`,
link: '/zhuanti/jiaoben',
},
],
},
// 生活
{
text: '🏓生活',
items: [
{
// 分组标题1
text: '娱乐',
items: [
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/相册.svg" alt="" style="width: 16px; height: 16px;">
<span>相册</span>
</div>
`,
link: '/yule/photo',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/电影.svg" alt="" style="width: 16px; height: 16px;">
<span>电影</span>
</div>
`,
link: '/yule/movie',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/音乐.svg" alt="" style="width: 16px; height: 16px;">
<span>音乐</span>
</div>
`,
link: '/yule/music',
},
],
},
{
// 分组标题2
text: '小屋',
items: [
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/精神小屋.svg" alt="" style="width: 16px; height: 16px;">
<span>精神小屋</span>
</div>
`,
link: '/love/inner',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/时间管理.svg" alt="" style="width: 16px; height: 16px;">
<span>时间管理</span>
</div>
`,
link: '/love/time-plan',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/文案.svg" alt="" style="width: 16px; height: 16px;">
<span>情感文案</span>
</div>
`,
link: '/love/wenan',
},
// { text: "💖情侣空间", link: "https://fxj.onedayxyy.cn/" },
],
},
// 兴趣
{
text: '兴趣',
items: [
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/旅行.svg" alt="" style="width: 16px; height: 16px;">
<span>旅行</span>
</div>
`,
link: '/xingqu/travel',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/读书.svg" alt="" style="width: 16px; height: 16px;">
<span>读书</span>
</div>
`,
link: '/xingqu/reading',
},
],
},
],
},
// // 兴趣
// {
// text: '🎨兴趣',
// items: [
// {
// text: `
// <div style="display: flex; align-items: center; gap: 4px;">
// <img src="/img/nav/旅行.svg" alt="" style="width: 16px; height: 16px;">
// <span>旅行</span>
// </div>
// `,
// link: '/xingqu/travel',
// },
// {
// text: `
// <div style="display: flex; align-items: center; gap: 4px;">
// <img src="/img/nav/读书.svg" alt="" style="width: 16px; height: 16px;">
// <span>读书</span>
// </div>
// `,
// link: '/xingqu/reading',
// },
// ],
// },
// 索引
{
text: '👏索引',
items: [
{ text: '📃分类页', link: '/categories' },
{ text: '🔖标签页', link: '/tags' },
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/归档.svg" alt="" style="width: 16px; height: 16px;">
<span>归档页</span>
</div>
`,
link: '/archives',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/清单.svg" alt="" style="width: 16px; height: 16px;">
<span>清单页</span>
</div>
`,
link: '/articleOverview',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/登录.svg" alt="" style="width: 16px; height: 16px;">
<span>登录页</span>
</div>
`,
link: '/login',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/风险提示.svg" alt="" style="width: 16px; height: 16px;">
<span>风险链接提示页</span>
</div>
`,
link: '/risk-link?target=https://onedayxyy.cn/',
},
],
},
// 关于
{
text: '🍷关于',
items: [
{ text: '👋关于我', link: '/about/me' },
{ text: '🎉关于本站', link: '/about/website' },
{ text: '💖友链', link: '/about/friend-links' },
{ text: '🌐网站导航', link: '/about/websites' },
{ text: "👂留言区", link: "/about/liuyanqu" },
{ text: "💡思考", link: "/about/thouht" },
{ text: "💡情侣相册", link: "/about/love" },
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/时间轴.svg" alt="" style="width: 16px; height: 16px;">
<span>时间轴</span>
</div>
`,
link: '/about/time-line',
},
{ text: "💡朋友圈", link: "/about/pyq" },
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/网站统计.svg" alt="" style="width: 16px; height: 16px;">
<span>网站统计</span>
</div>
`,
link: 'https://umami.onedayxyy.cn/share/DzS4g85V8JkxsNRk/onedayxyy.cn',
},
{
text: `
<div style="display: flex; align-items: center; gap: 4px;">
<img src="/img/nav/站点监控.svg" alt="" style="width: 16px; height: 16px;">
<span>站点监控</span>
</div>
`,
link: 'https://status.onedayxyy.cn/status/monitor',
},
{ text: "📌我的云盘", link: "https://zdir.onedayxyy.cn/" },
],
},
]最后形成的导航栏如下:

2.新增md
如果你想要新建一个md,该如何呢?
你只需要在对应目录下,新创建一个md就好,但是注意命名必须类似为 20.中国.md才行(以此为例)。
运行项目后,Teek里的autoformatter插件会自动给注入formater参数(如下截图)(你无需做任何操作):
运行,然后观察效果:
pnpm docs:dev
4、发布博客
以上个人的笔记数据已经整理好了,接下来,我们就把自己博客发布到公网上,供其它用户访问。
有以下2种方式:
- cnb+eop(无服务器版)(推荐)
- 传统云服务器部署:云服务器+nginx
方式1:CNB+Eo Pages(推荐)
这里推荐使用CNB+Eo Pages,非常丝滑。
《CNB配合eo托管静态博客》(腾讯的eo Pages也的确丝滑)

具体步骤:
备注:
CNB是腾讯推出的云原生构建产品,EO是腾讯推出的免费cdn;
方式2:传统的云服务器部署
传统的云服务器部署,然后利用nginx代理。
(1)自己电脑得提前安装好git和nodejs:
(2)在自己winodws pc上部署Teek
#来到自己电脑d盘
cd /d/
#项目拉取
git clone https://cnb.cool/onedayxyy/vitepress-theme-teek-one-public.git
cd /d/vitepress-theme-teek-one-public
#依赖安装(只能用 pnpm 安装依赖)
pnpm install
#项目本地运行
pnpm docs:dev #本地运行
#项目打包
pnpm docs:build执行pnpm docs:dev后,浏览器默认就会打开一个http://localhost:5173/网页:(恭喜你,此时你的Teek博客已经部署完成了)
(3)将Teek生成的静态文件推送到云服务器的nginx站点目录下
利用pnpm docs:build 命令打包好静态文件,然后把docs\.vitepress\dist路径下的内容直接传输到自己的云服务器的nginx站点目录下,这样其它小伙伴就可以通过域名来访问你的博客了。
特别注意:
一般情况,自己的云服务器都是通过nginx来代理静态站点的,但是这里需要单独做一个额外的配置,否则自己的Teek博客部署到云服务器后,刷新url会报404。
具体配置方法如下:
vim /etc/nginx/conf.d/onedayxyy.cn.conf (这里编辑自己的nginx配置文件就好)
location / {
index index.html index.htm;
try_files $uri $uri.html $uri/ =404; #添加这一行
……
}
配置后重启nginx: nginx -s reload
nginx完整配置如下:
[root@wiki ~]# cat /etc/nginx/conf.d/onedayxyy.cn.conf
server {
listen 80;
server_name onedayxyy.cn;
#配置https重定向
return 301 https://$host$request_uri;
}
server {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
listen 443 ssl;
server_name onedayxyy.cn;
root /root/rsync/rsync-vitepress/dist;
location / {
index index.html index.htm;
try_files $uri $uri.html $uri/ =404;
# non existent pages
error_page 404 /404.html;
# a folder without index.html raises 403 in this setup
error_page 403 /404.html;
# adjust caching headers
# files in the assets folder have hashes filenames
location ~* ^/assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
location /images {
alias /images;
index index.html;
valid_referers none blocked *.onedayxyy.cn onedayxyy.cn *.gitee.com gitee.com *.cnb.cool cnb.cool *.sleele.com localhost 127.0.0.1;
if ( $invalid_referer ) {
# 如不满足,指定访问如下资源
rewrite ^/ https://onedayxyy.cn/error/1.png;
return 403;
}
}
location /error {
autoindex on; # 启用目录索引
alias /FdangDaoLianImages;
index index.html; # 默认显示index.html文件,如果没有则列出目录内容
}
ssl_certificate /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/onedayxyy.cn/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000";
access_log /var/log/nginx/onedayxyy.cn.https.log;
}(4)验证
访问自己域名:

扩展
如何将本地Teek生成的静态文件推送到云服务器的nginx站点目录,有多种办法(见如下详细链接):
- shell一键发布 (shell一键发布版内容到teek网站)
- 或者利用其它传输软件;(例如sftp,ftp,winscp……)
5、升级
一条命令就可以完成在线升级,特别丝滑哦。
pnpm add vitepress-theme-teek@latest -DFAQ
日志
具体官方更新日志见如下链接:《更新日志》

计划
- 重点优化 简约 风格博客功能
- 添加一些其他主题/博客 有趣的元素到Teek里
- Teek性能、细节持续优化
- 希望有更多大佬能参与到这个项目,贡献自己一份力量
- 选一些好看的壁纸(风景/妹纸/动漫等)
- ……
反馈
在使用过程中有任何问题和想法,请给作者提 Issue。 你也可以在 Issue 查看别人提的问题和给出解决方案。
或者加入我们的交流群,请前往 Teek 官网 的首页查看进群方式。(或者 添加我的微信并备注 进Teek群)

赞赏
警告
次赞赏为直接给原作者充电,感谢大家热爱开源。好的产品,值得付费。😜
如果您正在使用这个项目并感觉这个项目给你带来帮助,或者是想支持我继续开发,您可以通过如下任意方式支持我:
- Star 并分享 VitePress Theme Teek 🚀
- 通过以下二维码进行赞助,打赏作者一杯茶 🍵
谢谢!❤️
| 微信赞赏 | 微信 | 支付宝 |
|---|---|---|
![]() | ![]() | ![]() |
您的赞助将帮助 Teek:
- 维护项目的基础设施
- 投入更多时间进行开发
- 提供更好的技术支持
- 开发更多实用功能
致谢
❤️ 感谢威武的群主开发了这个优秀的产品。
❤️ 感谢支持这个项目的朋友,您的每一份帮助都让这个项目变得更好!
❤️ 感谢为这个项目贡献代码的朋友 → Contributors
扩展


关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 个人网站

🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎
https://www.zhihu.com/people/foryouone

最后
如果你还有疑惑,可以去我的网站查看更多内容或者联系我帮忙查看。
如果你有更好的方式,评论区留言告诉我。谢谢!
好了,本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!



