1 前言
不知不觉中我的个人博客网站创建了两年多了,两年来 Hexo 一直是我主要的建站工具,换了很多主题,在界面美化、细节优化上投入了大量时间和精力,也曾对比试用过WordPress、Halo以及Hugo、VuePress等多种建站工具,但用下来还是觉得 Hexo 最顺手、最灵活,最终无一例外的用回 Hexo。
不过,用Hexo的时间长了,也渐渐遇到了一些让我困扰的问题。最主要的两点,一是跨设备创作不太方便,我用的是 GitHub Actions 工作流,每次在不同设备上写文章,都需要拉取仓库、编辑、提交再触发部署,流程虽自动化了,但总缺少点无缝和即时的体验;二是各种功能依赖第三方服务比较分散,为了更好的体验,我得额外部署 Artalk 评论、Moments 动态,还得接入 51la 统计、Algolia 搜索、Follow 订阅等服务,管理起来有点零散。这些问题时不时让我动念头,想换到更一体化的系统,一站式的管理创作和全部功能。
于是我花了很长时间研究 WordPress 和 Halo。WordPress 生态非常成熟,插件主题应有尽有,但对我来说它太“重”了,PHP环境、数据库、频繁的安全更新和插件冲突,维护成本让我望而却步;Halo 则轻量很多,Java 写成也挺现代,可定制门槛较高,生态也还不够丰富,用起来总觉得差了点完全贴合自己习惯的灵活度。一番深入研究后,收获颇丰,虽然没能找到理想的“替代品”,但让我对建站方式有了更多思考。
这种思考持续了一段时间后,我开始认真考虑另一种可能性:为什么不试着自己来搭建一个更符合个人需求的博客程序呢?从选定技术栈开始,我一点点实现核心功能,用户管理、文章编辑、评论、动态、搜索、统计等功能的内置支持,以及跨设备访问的优化。开发过程中不断调整方案,平衡细节优化和性能打磨,代码结构也在迭代中越来越清晰有条理。
随着功能一个个完善,在前段时间我正式把站点迁了过来,文章、评论、动态、友链都保留完整,唯独统计信息只能选择放弃。现在没了繁琐的发布流程,也没有割裂的三方服务,所有操作都收归一处,这番折腾总算没白费,困扰许久的问题在这里找到了最舒服的解法。
2 新站展示
2.1 博客端
博客端,即前端前台,基于 Nuxt 4.2.2 框架,整体风格极简,参考 清羽飞扬 大佬的 Butterfly 主题魔改设计。
- 首页



- 文章


- 归档/分类/标签



- 友链/动态/留言



- 关于


- 个人信息/通知中心


2.2 管理端
管理端,即前端后台,使用 Vue 3 + Element Plus 创建,以操作简单、功能实用为设计原则,可以更好的将重心放在文章创作和内容输出上。
- 仪表盘

- 内容管理



- 互动管理


- 系统管理





- 文章创作



2.3 服务端
服务端,即后端,使用 Go 语言编写,遵循 RESTful 设计原则,且 Swagger 文档完善,推荐使用 Docker 部署,资源占用极低。
- Seagger 文档


3 设计理念
这次自建博客的核心理念可以用三个词概况:极简、一体化、个人化。
极简是视觉和交互层面的双向追求,我不想让博客变成信息过载的门户,只希望访客进来就能安静阅读。我在保证一切是自己喜欢的前提下,尽可能保留干净的排版、可读性强的字体和舒适的配色。说到这里就不得不再次提到清羽飞扬大佬,他的站点太漂亮了,我甚至想把配图、配色也借鉴过来,本站博客端有八成以上参考了他的设计,另外他写的文章也都是干货满满,强烈安利一波。
以前我遇到的痛点之一就是服务太分散,评论、统计、搜索等功能需要借助自部署或第三方服务,而现在的一体化则完全解决了这一问题。所有操作、功能都归于一处,打开管理端就可以完成创作、发布、管理、统计,跨设备也只需要重新登录,再也不用拉仓库、推代码、等构建了。
最后压轴说的是个人化。市面上动态的、静态的博客框架非常多,虽如此,我也没能找到一个完全契合自己的,与其反复妥协,不如自己动手。用惯了 Hexo框架和 Butterfly 类主题,于是延续了很多管理方法和呈现理念,在此基础上不断完善各项功能,最终做出了一个完全遵循我的习惯、尽量适配大众习惯的个人博客系统。
技术栈的选择也遵循了这三个核心理念。首先博客端使用 Nuxt 4,我对 Vue 生态最熟,Nuxt 的 SSR(服务端渲染) 也能保证首屏加载速度和 SEO,于我而言这是作为内容型网站最佳选择;而像管理端,则直接使用了 Vue 3,配合 Element plus 组件,让我快速完成开发,且极低的服务器开销,完美流畅的页面体验,让一切变得轻快。
最重要的部分当属后端,他是维持着一切的基础。我的后端技能远不如前端,最熟悉的是 Python,因此第一个 Demo 就是拿 Django 做的,但后来一些深入了解后,让我决定后端使用性能更好的 Gin,也就是 Go 最流行的 Web 框架。这是我第一次使用 Go 完成完整的项目,在此必须感叹 AI 辅助编程的强大,从方案决策到代码实现,AI 都提供了巨大帮助。经过反复迭代,最终形成了一个基本完善的项目。
还有就是数据库,我从最开始就坚持使用 PgSQL,对于个人博客这样的中小型网站,利用 PgSQL 的一些特性,在很多时候可以避免额外引入 Redis 做缓存、ES 做搜索,从而节省资源并简化架构(仅代表个人看法),但这就导致了一个问题,为了一些方言和拓展,我很难再去兼容 Mysql 或其他数据库。
总的来说,这次自建博客就是为了把“用着最舒服”这件事落到实处。极简让我保持了阅读的纯粹,一体化治好了分散的痛,个人化则让一切都贴合习惯。现在系统轻快稳定,维护几乎零负担,创作更能专心内容本身。未来还会慢慢迭代,但当前这个版本,已经有了我理想博客的雏形。
4 核心功能
4.1 用户管理与认证
用户模块最初打算参考 RuoYi 那样做,但后来想想完全没必要,像个人博客这样简单的网站,没必要把角色和权限弄得这么复杂。
我认为一张用户表搭配四个内置角色就足够了,分别是超级管理员、管理员、普通用户和游客,超级管理员拥有全部权限,管理员则在其基础上去除了一些敏感操作权限。最复杂的是处理普通用户与游客的关系。因为评论系统沿用了 Artalk 支持匿名评论的特性,所以我引入了“游客”身份。我的目标是在操作简便的前提下,清晰界定这两种身份的权限,并确保它们之间可能的转换流程都能正常工作。
另外还有第三方登录,目前内置了 QQ、Google、Github,主要依赖 Goth 库(Go 的 OAuth 库,国内支持较差,像 QQ 就需要额外自定义实现)。第三方登录和邮箱登录组成了完整的登录方式,可以任意组合,有完整的绑定流程以及各种登录方式异常的逻辑处理。(为什么 QQ 登录不给邮箱 无语ing)
4.2 文章编辑
文章的编辑以及预览是整个博客最为重要的部分,我习惯于 Markdown 写作,于是 markdown-it 成了不二之选,我能轻松的找到各种语法支持,并且还可以非常容易的自定义语法,目前本站除了原生 Markdown 语法支持外,还有提示框、标签页、折叠面板、链接卡片以及照片墙等自定义语法支持,基本满足了我大部分写作需求。
还有就是编辑器的选择,我一度纠结于 CodeMirror 和 md-editor-v3,后者是一个开箱即用的 Markdown 编辑器,我可以非常轻松的接入它,可以节省大半的时间成本,但是它被封装的太好了,而我对核心的编辑功能更多希望的是深度定制且更高的拓展上限,于是我选择了 CodeMirror,它本质是编辑器内核,就意味着我花了大量时间去完成基础建设和能力体系,但最后的结果我还是比较满意的。
另外还有 AI 集成、封面制作、全文导出、微信公众号导出等一系列功能,没有什么值得讲的,我最喜欢的就是封面制作功能,我只需要点击制作封面,文章标题、作者姓名、头像就会自动填充到模板里,我只需要在此基础上简单调整位置和文本,就可以快速完成封面的制作。
4.3 丰富的配置项
延续了之前 Hexo 的习惯,我喜欢把更多的选项以配置呈现,而不是写死在代码里,这就组成了现在丰富的配置项。
所有配置都在一张表里,使用了 KV 配置表结构,额外搭配分组和是否公开 Bool,组成了完整的请求策略,截至目前,配置项拥有六十多个,涵盖了主题、通知、AI、上传等大部分功能。
4.4 实用的其他页面
除了像文章详情页、归档/分类/标签页、友链页、关于页等基础功能页面,还包含有留言、动态、反馈投诉这样的实用页面和 Cookies、隐私政策、版权协议、提问须知等展示页面或者有趣的页面。
5 写在最后
前段时间新站就已经用上了,未来我也会不断去完善,这个项目花了我太多心思,在写这篇文章的时候有好多创意和设计我都想更深入的分享,但碍于是一篇介绍为主的文章,我还是尽量克制住了长篇大论。
现在仓库历史提交还比较混乱,待我整理优化后再公开,现在有感兴趣的朋友可以联系我要源码。如果你对本项目有什么好的建议或者发现了什么问题,欢迎告知在评论区。(求求了)
评论
暂无评论,快来发表第一条评论吧!