起初:我只是想重写一下我的网站 UI
这一切的开始是因为我的硬盘掉盘了,原本那个写得乱七八糟的个人网站源代码也一并丢失了。
我想,那就重写一个吧,反正原来的代码我自己都看不下去。这次打算做个简单一点的纯静态页面,主要是更新一下 UI,看起来舒服点
但问题是,原来那套纯静态的结构,每次要改点内容(比如友情链接)都得重新改代码、重新构建再部署一遍,非常麻烦。我当时想:要不写几个简单的接口,让我可以直接改内容?
但一琢磨,既然都要写接口了,那干嘛不干脆做全套后台系统呢?
找个CMS用用
中途我试过 WordPress,但我发现它的局限性挺多,特别是我不想用它默认的页面模板系统,只想单纯当个内容管理后端来用。结果一碰到实际需求,比如权限控制、接口返回内容结构,WordPress 反而变得有点笨重了
后来我接触到了一个新的概念:Headless CMS(无头 CMS)。这个概念一下子就打动了我——我只需要搭好前端逻辑,后端只做内容管理和 API 提供,不再绑死在页面模板里。
出于这个方向,我尝试了 Directus,一个非常灵活、功能也很强的 Headless CMS。它的灵活程度甚至可以说接近直接操作数据库
这个是个非常强大的CMS。但最终我还是放弃了它,原因主要有两个:
- 我必须手动配置 schema(数据结构):上线前还得自己一张一张地建表,配置字段,一旦字段设计要调整,还得回头维护。那很坏了😅
- 所有内容都存进数据库,包括 Markdown 文档:对于博客来说,这类内容是相对静态的文本,用数据库来管理反而显得臃肿,失去了 Markdown 文件应有的灵活性和可读性
现在回头看,Directus 其实更适合做企业内部系统的内容管理,或者用于团队协作式的后台场景。用它来做个人博客这种小体量、低变动的项目,反而显得不好用了
那时候我想到到了“也许自己写一个后端,反而更简单一些” 很显然那个时候的我还没意识到问题的严重性🫠
还是自己写吧
一开始其实也只是想做点简单的东西,比如把 header 里的链接配置抽出来,这样我以后就不用每次都改代码重新部署了。
这部分的逻辑不复杂,很快就做好了。但我意识到,如果 header 可以动态控制,那友链这些是不是也可以存数据库、通过接口管理?
于是我就开始接入数据库,最初我试着写了一个非常简化的“ORM” 它只是封装了几行基本的 SQL 操作,让我可以少写点 CRUD 逻辑。
但用了一阵我发现不对劲——我几乎把时间全花在维护这个轮子上了,尤其是字段映射和条件拼接这些地方,一旦数据结构稍微复杂点,维护成本就蹭蹭上涨。
于是我换成了 GORM,后来证明我这个决定是对的
原因有以下几点
- 自动迁移:我不再需要手动写 SQL 初始化数据库结构,AutoMigrate 能帮我完成 schema 的创建,这大大降低了出错和重复工作
- 写起来很顺:GORM 本身的设计就非常灵活,它的 API 接近自然语言式的表达,让我在写数据库逻辑时几乎不会卡壳
关于数据的组织,因为有了 GORM 的助力,进展还算顺利,很快就完成了数据库设计。
但接下来我意识到一个大问题——数据库搭好了,可我该怎么管理数据呢?总不能天天手动去操作数据库吧?
这时候我才发现,自己挖了一个大坑——管理面板。
起初,我是把管理面板直接集成进后端项目里的。刚开始觉得这样方便,部署也简单,但用着用着问题就暴露出来了:
- 面板和后端不独立,更新面板的时候就得连后端一起重启;
- 而且代码混在一起,也把后端的项目结构搞得很乱。
于是我干脆把面板单独拆了出来。好处也非常明显: 我可以用前端框架 + TypeScript 来写面板了,不再受限于后端的模板系统和语言环境,开发体验一下子轻松了很多
当然这也带来了一些问题
- 独立之后,意味着部署流程更复杂了
- 虽然后期我做了一些优化,但为了安全性,目前的部署机制仍然稍显繁琐
虽然后端的结构和功能还在逐步完善,但基础的内容管理系统已经能用了。 既然数据有了、接口也跑得通了,接下来就是做一件表面功夫——把网站做得像个样子
说实话,前端这部分其实没太多东西可以讲。
因为我从一开始就考虑了 SEO 和内容渲染,所以直接选择了 Nuxt —— 服务端渲染、路由系统成熟
但虽然功能不复杂,我却在这部分花了大量时间。 一方面是动画、布局反复调试;另一方面……纯粹就是“看着不爽就想改”。 不过截止到目前其实还有很多功能没有实现
Futures
有些功能已经上线了,有些还在路上。
就当是一个 TODO 清单,慢慢补完:
- RSS
- 友情链接
- 点赞功能
- 留言板
- 评论系统
- 我的项目
- ......
总结一下
这个网站的开发其实断断续续花了我差不多三个月时间,现在也还只是个“功能够用”的半成品
为了把它跑起来,我折腾过 CMS、重写过数据库操作、拆分过管理面板,也几乎把前端重构了几遍
光是动到的技术就一长串:go-chi、GORM、Nuxt、Tailwind CSS、Docker、Nginx、Redis……
文章里很多地方其实讲得比较简略 —— 有些细节实在太碎、太杂,没法一一展开。
但它们的确构成了我这段时间开发的主旋律:一边踩坑、一边修坑,再顺便盖点新房子
讲到底,这个项目对我来说更像一个实验场,也是一个能折腾、能乱来的地方
虽然还有很多功能没做完,但至少现在它终于能用了,那就够了