一个现代化的博客系统,基于 Next.js + Rust + PostgreSQL 构建,支持 Markdown 文件上传和数据库存储。
- 📝 Markdown 文件上传和管理
- 💾 数据库存储文章内容
- 🗂️ 侧边栏文件导航
- 🏠 默认 README 首页
- 🎨 代码高亮(Shiki)
- 🎭 毛玻璃 UI 效果
- 🔍 Markdown 扩展支持(GFM、自动链接标题等)
- 毛玻璃效果
- 渐变背景
- 实时文章列表
- 现代化界面
- Next.js 16 - React 框架(App Router)
- React 19 - UI 库
- TypeScript - 类型安全
- Tailwind CSS - 样式框架
- MDX Remote - Markdown 渲染
- Shiki - 代码高亮
- Rust - 系统编程语言
- Axum - Web 框架
- SQLx - 数据库客户端
- PostgreSQL - 关系型数据库
- Tokio - 异步运行时
- Node.js >= 18
- Rust >= 1.75 (安装指南)
- PostgreSQL >= 14
# 创建数据库
sudo -u postgres psql
CREATE DATABASE blog;
CREATE USER bloguser WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE blog TO bloguser;
\qcd apps/api
cp .env.example .env
# 编辑 .env 文件,设置 DATABASE_URL.env 示例:
DATABASE_URL=postgresql://bloguser:your_password@localhost:5432/blog
PORT=2600# 启动后端
./scripts/start-backend.sh
# 启动前端(新终端)
./scripts/start-frontend.sh- 在浏览器访问:
http://localhost:2500/manage - 使用默认账号登录:
- 用户名:
admin - 密码:
123456
- 用户名:
- 登录后可以管理文章和修改账号信息
- 创建文章:点击"新建文章"按钮,填写文章信息
- 编辑文章:在列表中点击"编辑"
- 删除文章:在列表中点击"删除"
- 发布控制:通过"发布"复选框控制文章可见性
slug: URL 标识符(必填,创建后不可修改)title: 文章标题(必填)content: Markdown 内容(必填)summary: 文章摘要(可选)tags: 标签,逗号分隔(可选)published: 是否发布(默认发布)
在管理后台点击"设置"按钮可以:
- 修改管理员用户名
- 修改管理员密码
blog/
├── apps/
│ ├── api/ # Rust 后端
│ │ ├── src/
│ │ │ ├── main.rs # 主程序
│ │ │ ├── db.rs # 数据库连接 + SQL 迁移
│ │ │ ├── auth.rs # 认证模块
│ │ │ ├── models.rs # 数据模型
│ │ │ └── posts.rs # 文章逻辑
│ │ └── .env # 环境配置
│ └── web/ # Next.js 前端
│ ├── app/
│ │ ├── layout.tsx # 布局
│ │ ├── page.tsx # 首页(README)
│ │ └── [slug]/ # 文章详情
│ ├── components/ # 组件
│ │ ├── ClientLayout.tsx
│ │ └── Sidebar.tsx
│ └── lib/
│ └── api.ts # API 客户端
├── scripts/ # 脚本文件
│ ├── start-backend.sh # 后端启动脚本
│ ├── start-frontend.sh # 前端启动脚本
│ └── build-production.sh # 生产构建脚本
├── README.md # 本文件
└── SETUP.md # 详细配置指南
后端提供 RESTful API:
公开 API:
GET /api/posts- 获取所有文章列表GET /api/posts/:slug- 获取单篇文章
认证 API:
POST /api/auth/login- 管理员登录POST /api/auth/logout- 管理员登出GET /api/auth/verify- 验证 token
管理员 API(需要认证):
POST /api/admin/posts- 创建文章PUT /api/admin/posts/:slug- 更新文章DELETE /api/admin/posts/:slug- 删除文章PUT /api/admin/password- 修改密码PUT /api/admin/username- 修改用户名
健康检查:
GET /health- 服务健康检查GET /db/health- 数据库健康检查
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
slug VARCHAR(255) UNIQUE NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
summary TEXT,
tags TEXT[],
published BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE admins (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE sessions (
id SERIAL PRIMARY KEY,
admin_id INTEGER NOT NULL REFERENCES admins(id) ON DELETE CASCADE,
token VARCHAR(255) UNIQUE NOT NULL,
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);检查以下内容:
- PostgreSQL 是否运行:
sudo systemctl status postgresql .env中的DATABASE_URL是否正确- 数据库用户权限是否足够
如果遇到版本错误:
cd apps/web
rm -rf node_modules package-lock.json
npm install修改端口配置:
- 前端:
apps/web/package.json中的dev脚本 - 后端:
apps/api/.env中的PORT
详细的配置和使用说明请查看 SETUP.md
./scripts/build-production.sh这会创建 dist/ 目录,包含:
api/- 后端可执行文件(已优化)web/- 前端构建文件start.sh- 一键启动脚本(可选,手动创建)README.md- 部署说明
# 1. 复制到服务器
scp -r dist/ user@server:/path/to/blog/
# 2. 配置数据库
cd /path/to/blog/dist/api
cp .env.example .env
nano .env # 设置 DATABASE_URL
# 3. 安装前端依赖
cd ../web
npm install --production
# 4. 启动服务
cd ..
./start.sh- 操作系统: Linux / macOS
- Node.js: 18+
- PostgreSQL: 14+
可以添加的功能:
- 文章搜索
- 标签筛选
- 图片上传
- 评论系统
- RSS 订阅
- 深色模式
MIT
Happy Blogging! 📝✨