我的blog开发完毕了

一个使用claude code 开发的blog!一个小时搞定。

🎯 项目目标
开发一个基于 Golang 的动态博客系统。数据全部存储在 SQLite,通过 Gin 提供前台实时渲染和后台管理 API。前台模板系统兼容 Hugo 主题语法和文件布局,用户只需下载 Hugo 主题放入指定目录即可切换外观,无需自行开发模板。系统最终编译为一个可执行文件,配合外部资源目录运行。

🛠️ 核心技术栈
Web 框架:Gin(处理前台 SSR 和后台管理 API)
数据库:SQLite + GORM
模板引擎:基于 html/template 扩展,实现 Hugo 模板函数和变量,兼容 Hugo 主题的模板文件结构和语法
管理后台:React + Vite,构建产物通过 go:embed 嵌入可执行文件
权限管理:Casbin RBAC(作用于后台 API)
插件系统:Yaegi 解释器,插件脚本存放在外部目录
AI 框架:Eino,异步 Agent 协作
🏗️ 关键架构决策
1. 部署形态
交付物:1 个可执行文件 (blog.exe) + 外部数据目录。可执行文件内仅嵌入 React 管理后台,前台模板、静态资源、媒体文件、插件等均保存在外部目录,便于修改。

data/
├── themes/         # Hugo 主题(用户自行放置)
├── static/         # 前台静态资源(也可直接使用主题内的 static)
├── plugins/        # Yaegi 插件脚本
├── media/          # 上传的媒体文件
├── blog.db         # SQLite 数据库
└── config.toml     # 站点配置(主题名、站点信息等)
首次运行自动创建目录和默认配置。媒体文件直接保存在文件系统,数据库仅记录元信息。

2. Hugo 模板兼容实现
前台所有路由(首页、单页、列表页、分类/标签页等)均由 Gin Handler 调用 Service 获取数据,然后使用 Hugo 兼容的模板引擎渲染。模板引擎需要支持:

Hugo 的模板文件查找逻辑(如 layouts/_default/single.html、layouts/_default/list.html、layouts/index.html、partials/ 等)
Hugo 核心变量:.Title、.Content、.Date、.Site、.Pages、.Params 等
Hugo 核心函数:partial、range、where、dateFormat、markdownify 等
支持 Hugo 主题的 config.toml 基础参数,并能够与后台设置的站点信息合并
支持 Hugo 主题中 static/ 目录的资源在前台直接访问(Gin 静态文件服务)
目标: 任意标准的 Hugo 主题放入 data/themes/ 后,只需在配置中指定主题名,前台即可直接呈现该主题的样式和布局,无需修改系统代码。

3. 分层架构
Handler 层:解析 HTTP 请求,将数据注入 Hugo 模板并返回 HTML 响应(前台),或处理后台 JSON API。
Service 层:不含任何 Web 框架上下文,可同时被 HTTP 和 CLI 调用。包含内容管理、AI 审计、定时发布等业务逻辑。
Repository 层:GORM 数据操作。
4. AI 智能体(Eino)
文章发布流程保持异步审核建议模式:作者保存草稿后请求 AI 审校,后端创建异步任务(goroutine + 任务状态表),React 后台轮询查看建议,作者决定是否应用。AI 生成的结果(SEO 标题、描述、润色建议)存储在数据库中,前台渲染时直接使用。

5. 插件系统(Yaegi)
插件扩展点可包括:文章发布前后 Hook、页面渲染前后 Hook、自定义短代码等。插件脚本位于 data/plugins/,启动时加载。管理后台提供插件管理界面。

6. 定时发布
后台 Goroutine 每秒检查一次到达发布时间的文章,自动将状态改为“已发布”并清除相关缓存。

📦 功能模块
内容管理:Page 和 Post,支持分类/标签、草稿/已发布/定时发布。
编辑器:React 双模式编辑器(Markdown/富文本),剪贴板图片自动上传至 data/media/ 并替换链接。
媒体库:后台可浏览、删除已上传文件。
友情链接:后台 CRUD,前台由模板决定是否显示。
站点设置:博客标题、描述、主题名、每页文章数等,通过管理后台配置。
缓存:对热门页面启用内存缓存,文章更新或发布时自动失效。
📁 代码结构建议
/cmd/blog
    main.go              # 启动入口
/internal
    /handler             # 前台 + 后台 API Handler
    /service             # 业务逻辑
    /repository          # 数据访问
    /model               # 数据模型
    /hugo                # Hugo 模板引擎适配(模板加载、函数映射)
    /plugin              # 插件接口
    /ai                  # Eino Agent
/web/admin              # React 管理后台源码
/embed
    admin.go             # go:embed web/admin/dist/*
/data                   # 默认数据目录模板(开发用)
⚠️ 需要特别注意的点
必须实现一套完整的 Hugo 模板函数和变量,至少覆盖主流主题所需的核心子集,否则大部分主题无法直接使用。
前台所有路由都需要手工定义并映射到对应的 Hugo 模板类型(home、single、list 等),确保模板能正确获取数据。
Hugo 的短代码(shortcodes)机制如果短期内难以完整实现,可先支持部分常用短代码,或提供自定义函数让插件扩展。
媒体文件 URL 在文章中应存储为 /media/xxx.jpg,由 Gin 静态文件服务提供访问。
管理后台内嵌资源的路由需处理 /admin/* 全部指向 index.html,避免刷新 404。