前言
作为一名计算机技术爱好者,拥有一个自己的博客是必不可缺的。在我使用过WordPress、Typecho、Hexo等主流的博客框架后,我想为什么不自己设计一款个人博客系统呢。设计思路主要围绕着灵活性、轻量化、安全性等几个方面。
轻量化要求内存占用低并且高效,让性能不那么好的服务器或者小主机也能很轻松的跑起来;安全性除了必要的日志、权限校验外还有内存安全;至于灵活性,用户最好能够切换各种样式主题,通过插件实现各种功能扩展,以及更好的支持第三方实现,同时还要方便用户能够低学习成本的添加他们,以及各个部分尽量解耦合方便不同模块各司其职。
项目演示
话不多说,先上默认主题预览图

默认主题还有个液态玻璃模式

文章页面也十分简洁

当然你也可以通过主题配置切换主题强调色

后台管理界面也是非常清爽

还有必不可少的插件扩展,支持可视化管理和配置


当然,博客主题也可自定义(配置项取决于主题作者设计,框架要求主题提供一个Panel来进行可视化管理)

默认主题目前支持这些配置:
- 强调色。
- 字体。
- 每页文章数。
- 热门文章。
- 最新评论。
- 页脚标签数量。
- 置顶文章。
- 自定义导航页面。
- 页脚链接。
- 又拍云页脚展示。
- Liquid Glass 样式。
- 自定义 CSS。
站点支持SEO配置以及Gravatar解析(众所周知Gravatar在境内支持并不太好,所以站点支持URL配置来使用镜像,如Cravatar)

至于垃圾评论过滤,则设置了Hook通过插件来支持。
演示站点CairBin's Blog
关于更多细节以及开发可以参考文档
以及Github前端项目仓库 TiphiaPress/tiphia-frontend 和 Github后端项目仓库 TiphiaPress/tiphia
如果你喜欢这个项目欢迎给出Star,同时也欢迎来参与代码贡献。
技术选型
- 持久化数据库:默认SQLite(具体看SeaORM支持,支持Redis缓存数据库限流)
- ORM:SeaORM
- 后端WebAPI框架:Axum
- 前端:React
- Docker/Compose:支持
项目设计
主要功能包括:
- RESTful API,方便前后端分离。
- 后台管理和博客前台可以分开部署。
- 插件不只是"后端扩展",也能有前端配置页和前台渲染能力。
- 前端可以独立维护,不需要用户为了配置主题去改前端代码。
- 后端更重视安全、日志、限流、权限和可测试性。
- 迁移旧博客数据时,文章、分类、标签、评论、浏览量都尽量保留下来。
后端插件不是运行时动态加载的 .so 或脚本,而是 Rust crate,和主程序一起编译。这么做的缺点是不能像传统 CMS 那样在线上传插件立即运行;优点是依赖关系、类型检查和部署风险更可控。
TiphiaPress 从一开始就把 API 当成核心接口,而不是后台页面的附属品。比如文章、评论、分类、设置、插件配置、主题配置等都通过 API 管理。前端后台只是这些 API 的一个消费者。这带来一个好处:以后如果不喜欢当前后台,理论上可以重新写一个后台,只要 API 合约稳定即可。
前端不是简单的React集合,而是分三层:前端骨架 -> 主题 -> 插件 Hook
前端不是简单的 React 页面集合,而是分成三层:
text
前端骨架 -> 主题 -> 插件 Hook
更准确地说:
src/blog负责公开博客的数据加载、路由、SEO、评论提交等非视觉逻辑。src/admin负责后台管理。src/themes负责公开博客的视觉呈现。src/plugins负责前端插件逻辑、配置面板和 Hook 渲染。src/framework提供 Hook、i18n、插件注册等基础能力。
公开博客页面尽量由主题控制,而不是骨架偷偷写死样式和标签。骨架只负责把数据取回来,然后交给主题。主题作者可以在主题目录里提供一个 ThemeConfigPanel.tsx,后台会直接渲染这个配置面板,与用户进行交互,用于保存/修改主题配置。
插件系统
插件分为后端插件和前端插件。
后端插件负责:
- 自己的配置 schema。
- 自己的路由。
- 数据库迁移。
- 后端 Hook。
- 后端持久化。
前端插件负责:
- 后台配置页面。
- 前台 Hook 渲染。
- head 副作用,例如加载 SDK。
- i18n
总的来说就是后端为前端提供持久化、路由/API,前端负责渲染或者执行一些JS脚本。
目前为了方便使用,官方已经默认集成了一些插件:
- 评论审计插件
- 友情链接插件
- 备案信息插件。
- GeeTest 验证码插件
- 代码高亮插件
- Google Auth二步校验插件
- 邮件推送插件
以友情链接插件为例,后端负责保存链接数据,并提供 /api/v1/links;前端插件负责在 slug 为 links 的页面下渲染友链卡片。主题只需要在合适位置放 Hook。这种设计的好处是插件能力不局限在后端,也不需要直接改主题源码。
如果不喜欢,你可以在后端编译/前端打包的时候去掉他们,或者在管理页面禁用他们。当然你也可以把这些插件当作参考,实现你自己的插件。
从Typecho迁移
我实现了一个Typecho命令行迁移工具,目前支持迁移内容有:
- 文章
- 页面
- 分类
- 标签
- 文章与分类标签关系
- 评论
- 浏览量
请注意,此工具不会迁移用户信息和插件配置。
你可以用以下命令来进行数据迁移
dry run不会写入数据:
rust
cargo run -p tiphia-typecho-import -- \
--typecho-url "mysql://user:password@127.0.0.1:3306/typecho" \
--typecho-prefix "typecho_" \
--tiphia-url "sqlite://tiphia.db?mode=rwc" \
--author-id 1
确认输出无误后加上 --execute:
rust
cargo run -p tiphia-typecho-import -- \
--typecho-url "mysql://user:password@127.0.0.1:3306/typecho" \
--typecho-prefix "typecho_" \
--tiphia-url "sqlite://tiphia.db?mode=rwc" \
--author-id 1 \
--execute
项目部署
如果你想使用此项目来构建个人博客的话可以参考: