难度:⭐⭐ 中等 | 预计时间:2-4 小时 | 技术栈:Next.js + MDX
构建一个支持 Markdown 的个人博客系统,具备:
复制以下提示词给 AI:
我想用 Vibe Coding 的方式开发一个个人博客系统。
技术要求:
- 框架:Next.js 14 (App Router)
- 内容:MDX 格式的 Markdown 文章
- 样式:Tailwind CSS
- 部署:Vercel
功能需求:
1. 首页显示文章列表(标题、日期、摘要)
2. 文章详情页(支持代码高亮)
3. 标签页面(按标签筛选文章)
4. 关于页面
请帮我:
1. 确认技术栈是否合适
2. 生成项目结构
3. 一步步指导我完成开发
要求:每完成一步问我是否成功,再继续下一步。
my-blog/
├── app/
│ ├── layout.tsx # 根布局
│ ├── page.tsx # 首页
│ ├── posts/
│ │ └── [slug]/
│ │ └── page.tsx # 文章详情
│ ├── tags/
│ │ └── [tag]/
│ │ └── page.tsx # 标签页
│ └── about/
│ └── page.tsx # 关于页
├── components/
│ ├── Header.tsx
│ ├── Footer.tsx
│ ├── PostCard.tsx
│ └── MDXContent.tsx
├── content/
│ └── posts/ # MDX 文章
│ ├── hello-world.mdx
│ └── vibe-coding.mdx
├── lib/
│ └── posts.ts # 文章处理逻辑
└── tailwind.config.js
import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'
const postsDirectory = path.join(process.cwd(), 'content/posts')
export interface Post {
slug: string
title: string
date: string
tags: string[]
excerpt: string
content: string
}
export function getAllPosts(): Post[] {
const fileNames = fs.readdirSync(postsDirectory)
const posts = fileNames
.filter(name => name.endsWith('.mdx'))
.map(fileName => {
const slug = fileName.replace(/\.mdx$/, '')
const fullPath = path.join(postsDirectory, fileName)
const fileContents = fs.readFileSync(fullPath, 'utf8')
const { data, content } = matter(fileContents)
return {
slug,
title: data.title,
date: data.date,
tags: data.tags || [],
excerpt: data.excerpt || content.slice(0, 150),
content
}
})
.sort((a, b) => (a.date < b.date ? 1 : -1))
return posts
}
export function getPostBySlug(slug: string): Post | undefined {
return getAllPosts().find(post => post.slug === slug)
}
import Link from 'next/link'
import { Post } from '@/lib/posts'
export function PostCard({ post }: { post: Post }) {
return (
<article className="border-b border-gray-200 py-6">
<Link href={`/posts/${post.slug}`}>
<h2 className="text-xl font-bold hover:text-blue-600">
{post.title}
</h2>
</Link>
<time className="text-sm text-gray-500">{post.date}</time>
<p className="mt-2 text-gray-600">{post.excerpt}</p>
<div className="mt-2 flex gap-2">
{post.tags.map(tag => (
<Link
key={tag}
href={`/tags/${tag}`}
className="text-xs bg-gray-100 px-2 py-1 rounded hover:bg-gray-200"
>
#{tag}
</Link>
))}
</div>
</article>
)
}
---
title: "Hello World"
date: "2024-01-01"
tags: ["入门", "博客"]
excerpt: "这是我的第一篇博客文章"
---
# Hello World
欢迎来到我的博客!
## 代码示例
javascript console.log('Hello, Vibe Coding!')
## 总结
这就是我的第一篇文章。
完成基础版本后,可以尝试: