文章中的截图都做过去敏处理,数字、标题、域名和评论内容只用于展示效果,不对应真实数据。

Rinvay Blog 的一次大更新

今天把 Rinvay Blog Go 版整理出来了。

这次不是简单改主题,也不是给旧 Typecho 继续打补丁,而是把前台、后台、评论、邮件、AI 审核、数据迁移和部署方式重新做成了一套完整系统。

我以前一直用 Typecho,也基于 pinghsu 改过自己的 Rinvay 主题。Typecho 轻、简单、能折腾,早些年确实很适合个人博客。但用得越久,问题也越明显:访问速度不够稳定,PHP 环境经常被扫,插件和主题之间边界比较散,邮件通知不完整,评论审核也主要靠人工。

后来我发现,与其继续在旧系统上这里补一点、那里修一点,不如把自己真正需要的功能重新收拢起来。

于是就有了现在这套 Go + Vue 的 Rinvay Blog。

前台首页

为什么要重写

旧系统不是不能用,而是越来越别扭。

最开始我只是想解决几个具体问题:页面慢一点、评论通知不顺、后台写文章不舒服、图片和头图管理不统一。结果越改越发现,这些问题其实不是单个功能的问题,而是整条链路没有连起来。

比如:

  • 新评论来了,站长应该收到邮件;

  • 站长回复后,访客应该收到回复提醒;

  • 评论通过审核后,访客也应该知道;

  • 广告评论不只会写在正文里,用户名和网址也可能是引流;

  • 文章头图、附件、Markdown、页面模板应该都能在后台统一处理;

  • 部署时不应该前台、后台、静态资源、上传目录各写一堆 nginx 规则。

这些事情单独看都不大,但长期维护下来就很烦。

所以这次我想做的不是“换个皮”,而是把博客从写文章、展示文章、处理评论、发送通知,到最终部署,都放到一套可维护的系统里。

系统结构

现在整体链路大概是这样:

Rinvay Blog 系统链路

前台负责阅读体验,后台负责内容管理,中间由 Go API 统一处理模板渲染、数据库、邮件通知、AI 审核和静态资源代理。

这套结构对个人博客来说比较省心:

  • 一个 Go 服务;

  • 一个数据库;

  • 一个上传目录;

  • nginx 只需要反代 8080;

  • 后台页面也由 Go 直接代理;

  • 静态资源、表情包、头图和上传图片都走统一路径。

我不太想让博客部署变成另一个复杂项目。个人站嘛,能简单就简单一点。

前台更新内容

页面和布局

前台保留了我原来博客的感觉,但整体重新整理了一遍。

目前支持:

  • 首页文章列表;

  • 竖向布局和方块布局切换;

  • 分类页、标签页、归档页、搜索页;

  • 关于、友链、音乐等独立页面模板;

  • 文章头图选择、上传和自动分配;

  • footer 最近文章、最近评论和运行时间统计。

我比较在意的一点是,页面不能只是“能显示”。正文区域、评论区、标题栏、图片间距、代码块、移动端布局,这些都会直接影响阅读感觉。所以前台这块改了很多细节,尤其是文章页和评论区。

文章页面和评论区

Markdown 和代码高亮

以前文章里有不少 Markdown、图片引用和代码块。迁移以后如果渲染不好,文章看起来就会很乱。

这次前台做了这些处理:

  • Markdown 内容直接渲染为前台正文;

  • 兼容旧文章里的本地图片引用;

  • 代码块使用 Prism.js,不再自己硬写高亮样式;

  • # 标题做了更贴近旧博客的样式处理;

  • 行内代码、图片、表情都做了统一渲染。

代码块这块我之前自己写过一版,后来还是觉得成熟方案更稳。博客文章里代码不少,代码高亮不好看,整篇文章的质感会差很多。

评论区

评论区是这次改得最多的地方之一。

一开始我想做无限级缩进回复,后来发现真实评论多了以后并不好看,尤其移动端会被挤得很窄。现在改成更偏“平铺 + 回复上下文”的方案:可以看清楚谁回复谁,但不会一层套一层把页面撑坏。

目前评论区支持:

  • 表情选择和渲染;

  • 回复关系展示;

  • 评论分页;

  • 本地记住评论者昵称、邮箱和网址;

  • 默认头像和 Gravatar 兼容;

  • 页面评论和文章评论都支持。

这些都是看起来很小,但实际用起来很影响体验的地方。

后台更新内容

后台没有继续模仿 Typecho,而是重新做成了一个 Dashboard。

后台仪表盘

现在后台主要支持:

  • 文章管理;

  • 页面管理;

  • 分类和标签管理;

  • 友链和友链分组;

  • 媒体上传;

  • 评论审核和回复;

  • 邮件通知模板;

  • AI 审核配置;

  • 站点、显示、存储、安全等系统设置;

  • 登录失败限制和登录历史。

我现在更愿意把后台当成“写作工作台”,而不是一堆数据库字段表单。

比如文章编辑页里,标题、正文、头图、分类、标签、摘要、置顶和评论开关,都应该围绕写文章这件事组织。设置页也是一样,站点、显示、存储、评论、通知、AI、安全这些东西分清楚,后面自己维护的时候才不会到处找。

邮件通知

以前评论邮件一直不是很顺。

这次把 SMTP 通知直接做进系统里,只保留我真正需要的几类通知:

  • 站长收到新评论;

  • 访客收到回复;

  • 访客收到审核通过通知。

邮件通知设置

邮件模板可以在后台改,评论管理里也可以手动触发补发。这样如果邮件服务抽风,或者历史评论需要补通知,就不用再去数据库里硬改。

邮件模板也重新整理了一版,比默认纯文本通知好看一些,状态、表情和文章信息都会正常显示。

AI 评论审核

AI 审核是这次我觉得比较实用的功能。

很多广告评论并不会直接在正文里写广告。有些会把引流内容藏在用户名、邮箱前缀、网址、域名里,看起来像正常评论,实际是来挂链接的。

所以现在审核时不只看评论正文,也会一起检查:

  • 用户名;

  • 邮箱;

  • 网址;

  • 评论内容;

  • 文章标题;

  • IP 信息。

用户提交评论以后不会一直卡在等待 AI 返回。前台先提示提交成功,后端再异步审核。正常评论可以自动通过,有风险的再进入人工审核。

这样不会影响用户提交体验,也能帮我挡掉一部分隐蔽广告。

数据迁移

这次迁移比我一开始想的麻烦。

文章正文不是最难的,难的是各种关系和历史数据。

这次主要处理了:

  • Typecho 文章内容迁移;

  • 旧附件路径从 /usr/uploads/... 转成新系统的 /uploads/...

  • 文章头图从自定义字段 thumb 提取;

  • 分类从单分类改成多分类关系;

  • 标签按 Typecho 的 metas 和 relationships 迁移;

  • 评论保留父子关系;

  • 页面评论单独映射;

  • 友情链接和分组导入;

  • 旧文章中的本地图片引用兼容显示。

这里有一个比较典型的点:Typecho 文章可以属于多个分类,而我新系统最开始只有一个 category_id。如果继续用单字段,就会丢分类关系。最后改成了文章和分类的关联表,后台文章编辑也改成了多选分类。

这类东西看起来只是数据库结构调整,但它决定了迁移后的博客是不是完整。

使用提示

如果后面你也想把旧 Typecho 数据迁移到类似系统里,我建议优先注意这几件事:

  1. 先不要急着导文章,先确认分类、标签、页面、评论这些关系怎么映射;

  2. 图片路径一定要单独处理,尤其是旧文章里的引用式 Markdown 图片;

  3. 自定义字段不要忽略,很多头图、模板、标记都藏在里面;

  4. 评论父子关系要先确认旧 ID 和新 ID 是否一致;

  5. 后台功能最好和前台模板一起做,不然很容易后台能配,前台不生效。

我这次就是边迁移边修,很多问题只有真实数据导进来以后才看得出来。

后续计划

现在这套系统已经可以承接我的日常写作、评论、邮件通知和旧数据迁移,但后面还会继续优化。

接下来可能会继续做这些:

  • 更完整的访问统计;

  • 更好的移动端写作体验;

  • 备份和恢复功能;

  • 邮件队列和失败重试;

  • 评论审核策略继续细化;

  • 前台页面模板继续打磨;

  • 部署包继续精简。

个人博客这种东西,永远不可能一次写完。用着用着,总会发现新的问题,也会有新的想法。

结语

Rinvay Blog Go 版算是我把过去几年用 Typecho 积累下来的不顺手,重新拆开整理了一遍。

它不是为了证明 Go 一定比 PHP 好,也不是为了把博客做得多复杂。对我来说,最重要的是它能让我更愿意打开后台,更愿意写文章,也能让我少一点维护旧系统的焦虑。

以前的 Rinvay 主题是我在 Typecho 上慢慢改出来的。

现在这套 Rinvay Blog,则更像是把前台、后台、评论、通知、审核和部署都重新连起来的一次更新。

如果它能让我继续认真写博客,那这次重写就值得。