本项目是一个基于 Next.js 16 的全栈个人博客系统,采用现代化的技术栈和架构设计,支持访客阅读、作者创作与后台管理。系统具备高性能、易用性和可维护性,是一个功能完整的现代博客平台。
- 🚀 现代化技术栈:Next.js 16 App Router + React 19 + TypeScript
- 🎨 精美 UI:Tailwind CSS + Shadcn UI 组件库
- 🔐 安全认证:NextAuth v5 身份认证
- 📊 数据持久化:Prisma ORM + PostgreSQL
- 🌙 主题切换:支持明暗主题,自动记忆用户偏好
- 📱 响应式设计:完美适配桌面、平板、移动设备
- 🔍 SEO 优化:完整的 Meta 标签、Sitemap、RSS Feed
- ✍️ Markdown 编辑:实时预览的 Markdown 编辑器
| 层级 |
技术选型 |
说明 |
| 前端框架 |
Next.js 16 |
App Router 架构,支持 SSR/SSG/ISR |
| UI 框架 |
React 19 |
最新版本,支持并发特性 |
| 样式方案 |
Tailwind CSS 4 |
原子化 CSS,高效开发 |
| 组件库 |
Shadcn UI |
基于 Radix UI 的高质量组件 |
| 类型系统 |
TypeScript 5 |
全链路类型安全 |
| 数据库 |
PostgreSQL |
关系型数据库 |
| ORM |
Prisma 7 |
类型安全的数据库访问 |
| 认证 |
NextAuth v5 |
JWT 会话管理 |
| 主题 |
next-themes |
明暗主题切换 |
| Markdown |
unified/remark/rehype |
Markdown 解析与渲染 |
| 测试 |
Vitest |
单元测试和属性测试 |
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 公共页面 │ │ 后台管理 │ │ 共享组件/Hooks │ │
│ │ (SSG/ISR) │ │ (SSR) │ │ (Shadcn UI) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Next.js API 层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Auth API │ │ Posts API │ │ Tags/Categories │ │
│ │ (NextAuth) │ │ (CRUD) │ │ API │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据访问层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Prisma ORM + PostgreSQL │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
my-app/
├── app/ # Next.js App Router
│ ├── (admin)/ # 后台管理路由组
│ │ ├── admin/
│ │ │ ├── page.tsx # 仪表盘
│ │ │ ├── posts/ # 文章管理
│ │ │ ├── tags/ # 标签管理
│ │ │ └── categories/ # 分类管理
│ │ └── layout.tsx # 后台布局
│ ├── api/ # API 路由
│ │ ├── auth/[...nextauth]/ # NextAuth 认证
│ │ ├── posts/ # 文章 CRUD API
│ │ ├── tags/ # 标签 API
│ │ ├── categories/ # 分类 API
│ │ ├── search/ # 搜索 API
│ │ └── stats/ # 统计 API
│ ├── posts/[slug]/ # 文章详情页
│ ├── tags/ # 标签页面
│ ├── categories/ # 分类页面
│ ├── search/ # 搜索页面
│ ├── login/ # 登录页面
│ ├── rss.xml/ # RSS Feed
│ ├── sitemap.ts # Sitemap 生成
│ ├── layout.tsx # 根布局
│ └── page.tsx # 首页
├── components/ # React 组件
│ ├── ui/ # Shadcn UI 基础组件
│ ├── posts/ # 文章相关组件
│ ├── editor/ # Markdown 编辑器
│ ├── admin/ # 后台管理组件
│ └── layout/ # 布局组件
├── lib/ # 工具库
│ ├── prisma.ts # Prisma 客户端
│ ├── auth.ts # NextAuth 配置
│ ├── markdown.ts # Markdown 处理
│ ├── metadata.ts # SEO 元数据
│ ├── serialization.ts # 数据序列化
│ └── utils.ts # 通用工具函数
├── prisma/
│ ├── schema.prisma # 数据库模型定义
│ └── seed.ts # 种子数据脚本
└── types/ # TypeScript 类型定义
┌──────────┐ ┌──────────┐ ┌──────────┐
│ User │───────│ Post │───────│ Category │
└──────────┘ 1:N └──────────┘ N:1 └──────────┘
│
│ N:M
▼
┌──────────┐
│ PostTag │
└──────────┘
│
│ N:1
▼
┌──────────┐
│ Tag │
└──────────┘
| 模型 |
说明 |
主要字段 |
| User |
用户 |
id, email, passwordHash, name, role, avatarUrl |
| Post |
文章 |
id, title, slug, content, summary, coverUrl, status, views, publishedAt |
| Tag |
标签 |
id, name, slug |
| Category |
分类 |
id, name, slug |
| PostTag |
文章-标签关联 |
postId, tagId |
| Setting |
系统设置 |
id, key, value |
enum Role {
ADMIN
AUTHOR
}
enum PostStatus {
DRAFT
PUBLISHED
}
- 首页文章列表:分页展示已发布文章,每页 10 篇,按发布日期降序
- 标签筛选:点击标签查看该标签下的所有文章
- 分类筛选:按分类浏览文章
- 文章详情:完整展示文章内容,包含目录导航、阅读计数、上下篇导航
- 支持标题、摘要、正文的模糊搜索
- 空白关键词验证和拒绝
- 仅搜索已发布文章
- 明亮/暗黑模式切换
- 自动保存用户偏好到 localStorage
- 支持跟随系统主题
- 桌面端:完整布局,侧边栏展示标签云
- 平板端:优化的中等屏幕布局
- 移动端:折叠导航菜单,单列布局
- 统计卡片:文章总数、草稿数、已发布数
- 最近文章列表:最近发布的 5 篇文章
- 快速操作入口
- 文章列表:支持搜索、筛选、排序
- 新建文章:Markdown 编辑器,实时预览
- 编辑文章:修改已有文章内容
- 发布/草稿切换:控制文章可见性
- 封面上传:支持文章封面图片
- 标签 CRUD 操作
- 名称唯一性验证
- 删除时自动解除文章关联
- 分类 CRUD 操作
- 名称唯一性验证
- 删除时文章分类置空
- 根布局:title、description、keywords
- 文章页:Open Graph、Twitter Card
- 动态生成各页面元数据
- 自动生成 sitemap.xml
- 包含所有已发布文章 URL
- 包含静态页面 URL
- 符合 RSS 2.0 规范
- 包含最新 20 篇已发布文章
- 支持 Atom 命名空间
- 邮箱 + 密码登录
- JWT 会话管理
- 密码 bcrypt 哈希存储
- 中间件保护后台路由
- 未认证用户重定向到登录页
- 已认证用户自动跳转后台
| 方法 |
路径 |
说明 |
| GET |
/api/posts |
获取文章列表(分页、筛选) |
| GET |
/api/posts/[slug] |
获取文章详情 |
| POST |
/api/admin/posts |
创建文章(需认证) |
| PUT |
/api/admin/posts/[id] |
更新文章(需认证) |
| DELETE |
/api/admin/posts/[id] |
删除文章(需认证) |
| 方法 |
路径 |
说明 |
| GET |
/api/tags |
获取所有标签 |
| POST |
/api/tags |
创建标签 |
| PUT |
/api/tags/[id] |
更新标签 |
| DELETE |
/api/tags/[id] |
删除标签 |
| GET |
/api/categories |
获取所有分类 |
| POST |
/api/categories |
创建分类 |
| PUT |
/api/categories/[id] |
更新分类 |
| DELETE |
/api/categories/[id] |
删除分类 |
| 方法 |
路径 |
说明 |
| GET |
/api/search?q=keyword |
搜索文章 |
| GET |
/api/stats |
获取统计数据 |
| GET |
/rss.xml |
RSS Feed |
| GET |
/sitemap.xml |
Sitemap |
| 组件 |
文件 |
功能 |
PostList |
components/posts/post-list.tsx |
文章列表展示 |
PostCard |
components/posts/post-card.tsx |
文章卡片 |
PostDetail |
components/posts/post-detail.tsx |
文章详情 |
Pagination |
components/posts/pagination.tsx |
分页控件 |
TagCloud |
components/posts/tag-cloud.tsx |
标签云 |
TableOfContents |
components/posts/table-of-contents.tsx |
目录导航 |
MarkdownRenderer |
components/posts/markdown-renderer.tsx |
Markdown 渲染 |
| 组件 |
文件 |
功能 |
MarkdownEditor |
components/editor/markdown-editor.tsx |
Markdown 编辑器 |
CategorySelector |
components/editor/category-selector.tsx |
分类选择器 |
TagSelector |
components/editor/tag-selector.tsx |
标签选择器 |
CoverUpload |
components/editor/cover-upload.tsx |
封面上传 |
| 组件 |
文件 |
功能 |
Header |
components/layout/header.tsx |
网站头部 |
Footer |
components/layout/footer.tsx |
网站底部 |
ThemeToggle |
components/theme-toggle.tsx |
主题切换 |
AdminSidebar |
components/admin/admin-sidebar.tsx |
后台侧边栏 |
- Node.js 18+
- PostgreSQL 14+
- pnpm 8+
# 数据库连接
DATABASE_URL="postgresql://user:password@localhost:5432/blog"
# NextAuth 配置
AUTH_SECRET="your-secret-key"
AUTH_URL="http://localhost:3000"
# 站点配置
NEXT_PUBLIC_SITE_URL="http://localhost:3000"
pnpm install
pnpm db:generate
pnpm db:migrate:deploy
pnpm db:seed
pnpm build
pnpm start
- Redis 缓存:引入 Redis 缓存热门文章、标签列表等高频数据
- ISR 优化:为文章详情页配置增量静态再生成,设置合理的 revalidate 时间
- CDN 加速:静态资源和图片使用 CDN 分发
- 数据库查询优化:添加适当的索引,优化复杂查询
- 图片压缩:上传时自动压缩图片
- WebP 格式:自动转换为 WebP 格式
- 懒加载:图片懒加载,减少首屏加载时间
- 响应式图片:根据设备提供不同尺寸的图片
- 代码分割:按路由和组件进行代码分割
- Tree Shaking:移除未使用的代码
- Bundle 分析:定期分析打包体积,优化依赖
model Comment {
id String @id @default(cuid())
content String @db.Text
authorName String
authorEmail String
postId String
post Post @relation(fields: [postId], references: [id])
parentId String?
parent Comment? @relation("CommentReplies", fields: [parentId], references: [id])
replies Comment[] @relation("CommentReplies")
status CommentStatus @default(PENDING)
createdAt DateTime @default(now())
}
enum CommentStatus {
PENDING
APPROVED
REJECTED
}
功能点:
- 访客评论(需填写昵称和邮箱)
- 评论审核机制
- 嵌套回复支持
- 邮件通知作者
- 垃圾评论过滤(集成 Akismet)
- 阅读时间估算:根据字数自动计算预计阅读时间
- 文章系列:支持将多篇文章组织为系列
- 文章置顶:支持置顶重要文章
- 定时发布:设置文章定时发布时间
- 文章版本历史:保存文章修改历史,支持回滚
- 文章导入/导出:支持 Markdown 文件批量导入导出
- 多用户支持:支持多作者协作
- 用户注册:开放用户注册功能
- OAuth 登录:支持 GitHub、Google 等第三方登录
- 用户角色细分:管理员、编辑、作者、访客等角色
- 权限管理:基于角色的权限控制
- 访问统计:PV/UV 统计,访问来源分析
- 阅读分析:文章阅读时长、跳出率
- 热门文章:基于阅读量的热门文章排行
- 搜索分析:热门搜索词统计
- 数据可视化:图表展示统计数据
| 功能 |
说明 |
优先级 |
| 友情链接 |
管理友情链接,支持分类 |
高 |
| 页面管理 |
自定义静态页面(关于、联系等) |
高 |
| 媒体库 |
统一管理上传的图片和文件 |
中 |
| 草稿箱 |
独立的草稿管理界面 |
中 |
| 回收站 |
已删除内容的恢复功能 |
低 |
| 功能 |
说明 |
优先级 |
| 文章点赞 |
访客可以点赞文章 |
高 |
| 文章收藏 |
登录用户收藏文章 |
中 |
| 分享功能 |
一键分享到社交平台 |
中 |
| 订阅通知 |
邮件订阅新文章通知 |
中 |
| 站内信 |
用户间私信功能 |
低 |
| 功能 |
说明 |
优先级 |
| 结构化数据 |
JSON-LD 结构化数据标记 |
高 |
| Canonical URL |
规范化 URL 设置 |
高 |
| robots.txt |
自定义 robots.txt |
中 |
| AMP 支持 |
加速移动页面 |
低 |
| 多语言支持 |
i18n 国际化 |
低 |
| 功能 |
说明 |
优先级 |
| API 文档 |
OpenAPI/Swagger 文档 |
高 |
| Webhook |
文章发布等事件的 Webhook |
中 |
| 插件系统 |
可扩展的插件架构 |
低 |
| 主题系统 |
可切换的前端主题 |
低 |
- 登录失败锁定:连续 5 次失败锁定账户 15 分钟
- 双因素认证:支持 TOTP 二次验证
- 会话管理:查看和管理活跃会话
- 密码策略:强制密码复杂度要求
- XSS 防护:加强 Markdown 渲染的 XSS 过滤
- CSRF 防护:API 请求 CSRF Token 验证
- Rate Limiting:API 请求频率限制
- 内容审核:敏感词过滤和内容审核
- 数据备份:定时自动备份数据库
- 操作日志:记录管理员操作日志
- 数据加密:敏感数据加密存储
- 应用监控:集成 Sentry 错误监控
- 性能监控:Web Vitals 性能指标监控
- 服务健康检查:定时健康检查接口
- 告警通知:异常情况邮件/短信通知
- 结构化日志:统一的日志格式
- 日志聚合:集中式日志管理
- 日志分析:日志查询和分析
以下属性测试任务标记为可选,建议后续补充:
| 任务 |
属性 |
验证需求 |
| 2.2 |
分页列表排序一致性 |
1.1, 1.2 |
| 2.3 |
标签筛选准确性 |
1.3 |
| 2.4 |
分类筛选准确性 |
1.4 |
| 2.6 |
阅读计数增量 |
2.5 |
| 2.8 |
文章保存完整性 |
5.2 |
| 2.9 |
发布状态切换正确性 |
5.4, 5.5, 5.6 |
| 4.3 |
标签/分类名称唯一性 |
6.1-6.4 |
| 5.2 |
搜索结果包含性 |
3.1, 3.4 |
| 7.2 |
序列化往返一致性 |
11.1, 11.2 |
| 7.4 |
目录生成正确性 |
2.3 |
| 7.5 |
Markdown 解析往返一致性 |
11.3, 11.4 |
- 图片存储:当前仅支持 URL 引用,未实现本地上传存储
- 搜索功能:使用数据库 LIKE 查询,大数据量时性能受限
- 缓存机制:未实现应用层缓存
- 国际化:仅支持中文界面
- 需求文档:
.kiro/specs/blog-system/requirements.md
- 设计文档:
.kiro/specs/blog-system/design.md
- 任务列表:
.kiro/specs/blog-system/tasks.md
| 版本 |
日期 |
说明 |
| 0.1.0 |
2024-12 |
初始版本,完成核心功能 |
文档生成时间:2024年12月
项目版本:0.1.0