这个博客用的是 Bo-Blog 2.1.0,一个古早的 PHP 博客系统,从 2007 年跑到现在,快 20 年了。
说实话一直想重构,但每次打开那坨 PHP 代码就头大——光 global.php 就一千多行,UBB 解析器里面各种正则嵌套,read.php?2263 这种 URL 格式还得保持兼容,毕竟外站链过来的都是这种地址。
然后 Claude Code 出了个叫 Superpowers 的插件,说是能搞结构化的规划和子代理驱动开发。寻思着反正也不指望一次搞定,不如让 AI 试试水。
没想到,一个 session 就搞完了。
开始
跟 Claude 说了句 "refactor boblog-php to golang version",它先用 brainstorming skill 开始问问题。
说实话这个过程还挺像跟一个靠谱的同事对需求——一次只问一个问题,还给选项:
- 前端方案?SSR / SPA / 混合?选了 SPA。
- 框架?Gin / Echo / Chi?选了 Gin。
- ORM?GORM / sqlx / sqlc?选了 GORM。
- 数据库兼容?100% 兼容,不做迁移。
大概问了七八个问题,然后出了个设计文档,覆盖了项目结构、API 路由、JWT 认证、旧 URL 重定向、配置文件格式。
我在中间补了一刀:旧的 PHP URL 要做 301 跳转——/read.php?2263 得跳到 /blog/posts/2263,因为外站链接不能断。还有要支持 /blog/ 前缀,因为 Nginx 是这么反代的。
实现
设计确认以后,它用 writing-plans skill 写了个 13 步的后端实现计划和 9 步的前端计划,每一步都有完整代码。
然后用 subagent-driven-development 开始执行——每个任务派一个新的子代理去干,干完了自动提交。我基本上就看着 task list 的进度条在走。
后端 13 个任务大概跑了 20 分钟:
- 项目脚手架 + 配置
- 12 个 GORM 模型(一对一映射
boblog_*表) - JWT 中间件 + 登录限流
- 登录/刷新接口
- 旧 URL 301 重定向(三代 URL 格式全覆盖)
- 各种 Service + Handler
- 路由组装
- SPA 占位
- 编译验证
前端 9 个任务又跑了十几分钟,Vue 3 + TypeScript + Pinia + Axios,包含完整的博客前端和管理后台。
最后 make build,出来一个 35MB 的二进制文件,Vue SPA 通过 embed.FS 编译进去了,单文件部署。
踩坑
当然不是一帆风顺的。上线以后发现了几个问题:
API 路径问题:Vue 的 Axios baseURL 写的是 /api,但 Nginx 反代路径是 /blog/,浏览器实际请求的是 /blog/api/posts。改成 import.meta.env.BASE_URL + 'api' 就好了。
UBB 渲染:这是最折腾的部分。Bo-Blog 用的是 UBB 标记,不是 Markdown。数据库里存的内容长这样:
[code]
#include <stdio.h>
int main() { return 0; }
[/code]
HTML 实体已经转义过了,如果再 escapeHtml() 一次就变成 &lt;。更离谱的是有些帖子里 [code] 标签本身被转义成了 [code](Post 2259,就是你)。
最后写了 34 个测试用例才把各种边界情况覆盖住。
附件链接:[file]/blog/attachment/1281164955_9690fb7a.rar##摄像头拍照录像工具_xp_vista_win7.rar[/file] 这种嵌套标签,需要先在服务端把 /blog/attachment/1281164955_9690fb7a.rar##摄像头拍照录像工具_xp_vista_win7.rar 解析成实际的文件 URL,再让前端的 UBB 解析器处理 [file]。还得带上 /blog/ 前缀,还得从数据库查原始文件名设置 Content-Disposition。
Tag 词频:数据库里的 tagcounter 字段是陈年老数据,实际公开文章数跟它对不上。改成了从 tagentry 字段交叉查询公开文章来算真实计数。
设计
用了 frontend-design skill 做了个叫 "Ink & Paper" 的主题——暖色调的纸张背景,Noto Serif SC 衬线字体做标题,赤陶色(#c45d3e)做强调色,代码块用 github-dark 配色。
管理后台也是同一套视觉语言,没有另起炉灶。
最终成果
- Go 后端:45 个文件,~2800 行
- Vue 前端:36 个文件,~2000 行
- UBB 解析器:34 个测试
- 完整的 REST API(40+ 端点)
- 三代 URL 格式的 301 重定向
- JWT 认证 + 暴力破解防护
- 防盗链
- RSS + Sitemap
- Markdown + UBB 双模编辑器
- 100% MySQL 兼容,零迁移
整个过程大概两三个小时,中间我就是不停地刷页面、提 bug、说需求,Claude 负责改代码、跑构建、部署。
说实话这种体验挺魔幻的。以前觉得"让 AI 写个完整项目"是个 demo 级别的噱头,但这次确实是个能跑的东西——10000 多行代码,从设计到实现到部署到修 bug,一个 session 搞定。
--
最后,以上内容都是 AI 写的。