文章中的截图都做过去敏处理,数字、标题、域名和评论内容只用于展示效果,不对应真实数据。
Rinvay Blog 的一次大更新
今天把 Rinvay Blog Go 版整理出来了。
这次不是简单改主题,也不是给旧 Typecho 继续打补丁,而是把前台、后台、评论、邮件、AI 审核、数据迁移和部署方式重新做成了一套完整系统。
我以前一直用 Typecho,也基于 pinghsu 改过自己的 Rinvay 主题。Typecho 轻、简单、能折腾,早些年确实很适合个人博客。但用得越久,问题也越明显:访问速度不够稳定,PHP 环境经常被扫,插件和主题之间边界比较散,邮件通知不完整,评论审核也主要靠人工。
后来我发现,与其继续在旧系统上这里补一点、那里修一点,不如把自己真正需要的功能重新收拢起来。
于是就有了现在这套 Go + Vue 的 Rinvay Blog。

为什么要重写
旧系统不是不能用,而是越来越别扭。
最开始我只是想解决几个具体问题:页面慢一点、评论通知不顺、后台写文章不舒服、图片和头图管理不统一。结果越改越发现,这些问题其实不是单个功能的问题,而是整条链路没有连起来。
比如:
新评论来了,站长应该收到邮件;
站长回复后,访客应该收到回复提醒;
评论通过审核后,访客也应该知道;
广告评论不只会写在正文里,用户名和网址也可能是引流;
文章头图、附件、Markdown、页面模板应该都能在后台统一处理;
部署时不应该前台、后台、静态资源、上传目录各写一堆 nginx 规则。
这些事情单独看都不大,但长期维护下来就很烦。
所以这次我想做的不是“换个皮”,而是把博客从写文章、展示文章、处理评论、发送通知,到最终部署,都放到一套可维护的系统里。
系统结构
现在整体链路大概是这样:

前台负责阅读体验,后台负责内容管理,中间由 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 数据迁移到类似系统里,我建议优先注意这几件事:
先不要急着导文章,先确认分类、标签、页面、评论这些关系怎么映射;
图片路径一定要单独处理,尤其是旧文章里的引用式 Markdown 图片;
自定义字段不要忽略,很多头图、模板、标记都藏在里面;
评论父子关系要先确认旧 ID 和新 ID 是否一致;
后台功能最好和前台模板一起做,不然很容易后台能配,前台不生效。
我这次就是边迁移边修,很多问题只有真实数据导进来以后才看得出来。
后续计划
现在这套系统已经可以承接我的日常写作、评论、邮件通知和旧数据迁移,但后面还会继续优化。
接下来可能会继续做这些:
更完整的访问统计;
更好的移动端写作体验;
备份和恢复功能;
邮件队列和失败重试;
评论审核策略继续细化;
前台页面模板继续打磨;
部署包继续精简。
个人博客这种东西,永远不可能一次写完。用着用着,总会发现新的问题,也会有新的想法。
结语
Rinvay Blog Go 版算是我把过去几年用 Typecho 积累下来的不顺手,重新拆开整理了一遍。
它不是为了证明 Go 一定比 PHP 好,也不是为了把博客做得多复杂。对我来说,最重要的是它能让我更愿意打开后台,更愿意写文章,也能让我少一点维护旧系统的焦虑。
以前的 Rinvay 主题是我在 Typecho 上慢慢改出来的。
现在这套 Rinvay Blog,则更像是把前台、后台、评论、通知、审核和部署都重新连起来的一次更新。
如果它能让我继续认真写博客,那这次重写就值得。
评论