完成 Next.js 14+ 全栈应用的 MVP 实现,包含以下功能: ## 项目设置 - 初始化 Next.js 14+ 项目,配置 TypeScript 严格模式 - 配置 Tailwind CSS、ESLint、Prettier 代码质量工具 - 集成 shadcn/ui 组件库和 next-intl 国际化方案 ## 数据层 - 配置 PostgreSQL + Prisma ORM - 定义 Project、Tag、ExternalLink 数据模型 - 实现种子数据脚本(5个AI项目) ## 用户故事 1:浏览和搜索 AI 项目 - 实现首页,展示热门标签云和精选项目 - 实现项目列表页,支持搜索和标签筛选 - 创建 TagCloud、ProjectCard、ProjectList、SearchBar 组件 - 实现 ISR 缓存策略优化性能 ## 用户故事 2:查看项目详细信息 - 实现项目详情页,显示完整信息 - 创建 ExternalLinkCard 组件展示外部链接 - 实现安全的 target="_blank" 外链跳转 ## 用户故事 4:数据更新和管理 - 实现 webhook API 端点接收 n8n 数据推送 - 实现 API Key 身份验证 - 支持部分成功模式的批量数据处理 - 完善的错误处理和日志记录 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
88 lines
1.8 KiB
Plaintext
88 lines
1.8 KiB
Plaintext
// This is your Prisma schema file,
|
|
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
previewFeatures = ["postgresqlExtensions"]
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
// ================================
|
|
// Enums
|
|
// ================================
|
|
|
|
enum ProjectStatus {
|
|
ACTIVE
|
|
ARCHIVED
|
|
}
|
|
|
|
enum LinkType {
|
|
WEBSITE
|
|
GITHUB
|
|
HUGGINGFACE
|
|
PAPER
|
|
}
|
|
|
|
// ================================
|
|
// Models
|
|
// ================================
|
|
|
|
model Project {
|
|
id String @id @default(cuid())
|
|
name String
|
|
nameEn String?
|
|
slug String @unique
|
|
description String
|
|
descriptionEn String?
|
|
content String? @db.Text
|
|
contentEn String? @db.Text
|
|
status ProjectStatus @default(ACTIVE)
|
|
source String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
tags Tag[]
|
|
links ExternalLink[]
|
|
|
|
// Indexes
|
|
@@index([status, createdAt], map: "idx_project_status_createdAt")
|
|
@@index([slug], map: "idx_project_slug")
|
|
@@map("projects")
|
|
}
|
|
|
|
model Tag {
|
|
id String @id @default(cuid())
|
|
name String @unique
|
|
nameEn String?
|
|
slug String @unique
|
|
createdAt DateTime @default(now())
|
|
|
|
// Relations
|
|
projects Project[]
|
|
|
|
// Indexes
|
|
@@index([slug], map: "idx_tag_slug")
|
|
@@map("tags")
|
|
}
|
|
|
|
model ExternalLink {
|
|
id String @id @default(cuid())
|
|
type LinkType
|
|
url String
|
|
title String?
|
|
projectId String
|
|
|
|
// Relations
|
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
|
|
// Indexes
|
|
@@index([projectId], map: "idx_link_projectId")
|
|
@@index([type], map: "idx_link_type")
|
|
@@map("external_links")
|
|
}
|