基于 Vercel + Next.js + PostgreSQL 技术栈的诗词小程序后端服务。
- 框架: Next.js 14 (App Router)
- 数据库: PostgreSQL (Vercel Postgres)
- 部署: Vercel
- 认证: JWT
- 语言: TypeScript
- ✅ 用户认证 (注册/登录/JWT)
- ✅ 作品管理 (诗词列表/详情/搜索)
- ✅ 作者管理 (作者列表/详情/作品)
- ✅ 引语管理 (引语列表/随机引语)
- ✅ 朝代管理 (朝代列表/朝代作品)
- ✅ 合集管理 (合集列表/合集作品)
- ✅ 分页支持
- ✅ 搜索功能
- ✅ CORS支持
POST /api/v1/auth/register- 用户注册POST /api/v1/auth/login- 用户登录GET /api/v1/auth/me- 获取当前用户信息
GET /api/v1/works- 获取作品列表GET /api/v1/works/:id- 获取作品详情
GET /api/v1/authors- 获取作者列表GET /api/v1/authors/:id- 获取作者详情GET /api/v1/authors/:id/works- 获取作者作品
GET /api/v1/quotes- 获取引语列表GET /api/v1/quotes/random- 获取随机引语
GET /api/v1/dynasties- 获取朝代列表GET /api/v1/dynasties/by-name/:name/works- 获取某朝代作品GET /api/v1/dynasties/by-name/:name/authors- 获取某朝代作者
GET /api/v1/collections- 获取合集列表GET /api/v1/collections/:id/works- 获取合集作品GET /api/v1/collection-kinds- 获取合集类型
npm install创建 .env.local 文件:
# 数据库配置
POSTGRES_URL="your-postgres-connection-string"
POSTGRES_HOST="localhost"
POSTGRES_PORT="5432"
POSTGRES_DATABASE="poetry_db"
POSTGRES_USER="postgres"
POSTGRES_PASSWORD="your-password"
# JWT密钥
JWT_SECRET="your-jwt-secret-key"- 使用提供的 SQL 脚本创建表结构与索引:
psql "$POSTGRES_URL" -f scripts/schema.sqlnpm run devnpm run build
npm start参考 scripts/schema.sql。
{
"code": 200,
"message": "success",
"data": {},
"timestamp": "2024-01-01T00:00:00.000Z"
}{
"code": 200,
"message": "success",
"data": [],
"pagination": {
"total": 100,
"page": 1,
"page_size": 20,
"total_pages": 5
},
"timestamp": "2024-01-01T00:00:00.000Z"
}{
"code": 400,
"message": "错误信息",
"data": null,
"timestamp": "2024-01-01T00:00:00.000Z"
}- 将代码推送到GitHub
- 在Vercel中导入项目
- 配置环境变量
- 部署
POSTGRES_URL- PostgreSQL连接字符串JWT_SECRET- JWT密钥
- 在
src/app/api/v1/下创建对应的路由文件 - 使用
createResponse和createErrorResponse统一响应格式 - 添加适当的错误处理
使用 @vercel/postgres 的模板字符串语法:
const result = await db`
SELECT * FROM works WHERE id = ${id}
`;对于需要认证的接口,使用 authMiddleware:
import { authMiddleware } from '@/lib/auth';
export async function GET(request: NextRequest) {
const authResult = await authMiddleware(request);
if (authResult instanceof NextResponse) {
return authResult;
}
// 处理业务逻辑
}MIT License