本文档将帮助您在 10 分钟内完成 Personal Blog 博客系统的本地开发和部署配置。
版本: v1.4.0
更新日期: 2026-02-17
| 软件 | 最低版本 | 推荐版本 | 说明 |
|---|---|---|---|
| Node.js | 18.x | 20.x+ | JavaScript 运行时 |
| pnpm | 8.x | 9.x+ | 包管理器(推荐) |
| npm | 9.x | 10.x+ | 包管理器(备选) |
| Git | 2.x | 最新版 | 版本控制 |
您需要一个 Cloudflare 账号,并开通以下服务:
- Cloudflare Workers - 后端运行环境
- Cloudflare D1 - SQLite 数据库
- Cloudflare KV - 键值存储(可选,用于缓存)
- Cloudflare R2 - 对象存储(图片上传)
- Cloudflare Pages - 前端托管
💡 所有服务都有免费额度,足够个人博客使用。
| 服务 | 用途 | 是否必需 |
|---|---|---|
| Resend | 邮件发送(验证码、通知) | 推荐 |
| GitHub OAuth | GitHub 登录 | 可选 |
| 自定义域名 | 生产环境部署 | 推荐 |
git clone https://github.com/yourusername/personal-blog.git
cd personal-blog# 安装后端依赖
cd backend
pnpm install
# 安装前端依赖
cd ../frontend
pnpm installnpm install -g wranglerwrangler login这会打开浏览器进行授权,完成后即可在本地操作 Cloudflare 资源。
cd backend
cp .env.example .env# JWT 密钥(必需,请使用随机字符串)
JWT_SECRET=your-super-secret-jwt-key-at-least-32-chars
# Resend API Key(用于邮件发送)
RESEND_API_KEY=re_xxxxxxxxxxxx
# GitHub OAuth(可选)
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
# 前端地址(CORS配置)
FRONTEND_URL=http://localhost:5173cp wrangler.toml.example wrangler.toml编辑 wrangler.toml:
name = "personal-blog-backend"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[vars]
ENVIRONMENT = "development"
[[d1_databases]]
binding = "DB"
database_name = "personal-blog-dev"
database_id = "your-database-id" # 创建数据库后填入
[[r2_buckets]]
binding = "IMAGES"
bucket_name = "personal-blog-images-dev"
[[kv_namespaces]]
binding = "CACHE"
id = "your-kv-namespace-id" # 创建KV后填入wrangler d1 create personal-blog-dev执行后会返回数据库 ID,将其填入 wrangler.toml 的 database_id 字段。
按顺序执行以下迁移脚本:
# 基础表结构
wrangler d1 execute personal-blog-dev --file=../database/schema-v1.1-base.sql
# 通知和私信系统
wrangler d1 execute personal-blog-dev --file=../database/schema-v1.3-notification-messaging.sql
# 消息撤回功能
wrangler d1 execute personal-blog-dev --file=../database/migration-v1.4-message-recall.sql
# 文章置顶功能(v1.4.0新增)
wrangler d1 execute personal-blog-dev --file=../database/migration-v1.9-post-pinning.sqlwrangler d1 execute personal-blog-dev --command="SELECT name FROM sqlite_master WHERE type='table'"应返回以下表:
- users(用户表)
- posts(文章表)
- columns(专栏表)
- categories(分类表)
- tags(标签表)
- comments(评论表)
- post_likes(点赞表)
- post_favorites(收藏表)
- reading_history(阅读历史表)
- notifications(通知表)
- messages(私信表)
- message_threads(私信会话表)
- notification_settings(通知设置表)
- message_settings(私信设置表)
- system_notifications(系统通知表)
- config(系统配置表)
wrangler r2 bucket create personal-blog-images-dev如需在浏览器中直接访问图片,配置 R2 的 CORS 规则:
[
{
"AllowedOrigins": ["http://localhost:5173"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE"],
"AllowedHeaders": ["*"],
"MaxAgeSeconds": 3600
}
]wrangler kv:namespace create CACHE将返回的 ID 填入 wrangler.toml。
cd frontend
cp .env.example .env# 后端 API 地址
VITE_API_URL=http://localhost:8787
# 是否开启调试模式
VITE_DEBUG=truecd backend
pnpm dev后端服务将在 http://localhost:8787 启动。
打开新终端:
cd frontend
pnpm dev前端服务将在 http://localhost:5173 启动。
- 访问
http://localhost:5173 - 点击右上角「登录」
- 点击「注册」创建管理员账号
- 登录后访问
/admin进入管理后台
- 访问首页
- 查看右侧边栏「热门文章排行」模块
- 确认显示浏览量最高的文章列表
- 以管理员身份登录
- 进入管理后台 → 文章管理
- 编辑任意文章,勾选「置顶」选项
- 保存后返回首页,确认置顶文章显示在列表顶部
- 点击任意文章进入详情页
- 滚动到文章底部
- 确认显示「上一篇」「下一篇」导航链接
- 在文章详情页底部
- 确认显示「相关推荐」文章列表
- 阅读几篇文章
- 点击导航栏「阅读历史」
- 确认显示已阅读文章列表
- 点击用户头像 → 「账号设置」
- 确认可以修改密码、邮箱等账号信息
- 点击用户头像 → 「个人中心」
- 确认显示评论、点赞、收藏等标签页
- 确认不再有子页面导航
- 点击右上角主题切换按钮
- 确认可以切换亮色/暗色模式
- 确认可以调整主色调
- 确认可以调整字体大小
- 刷新页面后设置应保持
- 用户注册/登录
- 文章创建/编辑/删除
- Markdown 渲染
- 代码高亮
- 图片上传
- 评论发布
- 文章点赞/收藏
- 分类/标签筛选
- 全文搜索
- 通知中心
- 私信功能
A: 确保按顺序执行迁移脚本,且数据库 ID 正确配置在 wrangler.toml 中。
# 检查数据库列表
wrangler d1 list
# 查看数据库详情
wrangler d1 info personal-blog-devA: 检查 R2 存储桶是否正确创建:
wrangler r2 bucket list确认 wrangler.toml 中的 bucket_name 正确。
A:
- 确认 Resend API Key 正确配置
- 检查 Resend 账号是否已验证域名
- 开发环境可使用 Resend 的测试邮箱
A:
- 确认 GitHub OAuth 应用配置正确
- 回调地址应设置为:
http://localhost:5173/auth/callback - 检查 Client ID 和 Client Secret 是否正确
A:
- 确认后端服务已启动
- 检查
VITE_API_URL配置 - 检查 CORS 配置
A:
- 清除浏览器缓存
- 检查 localStorage 中是否有 theme 相关数据
- 确认 themeStore 正确初始化
A:
- 确认已执行
migration-v1.9-post-pinning.sql迁移 - 检查 posts 表是否有
is_pinned字段 - 确认文章的
is_pinned值为 1
版本: v1.4.0 | 更新日期: 2026-02-17