Ứng dụng quản lý ý tưởng nội dung với tính năng sinh ý tưởng tự động bằng AI. Backend sử dụng Fastify + TypeScript + PostgreSQL, frontend sử dụng Next.js + Tailwind CSS.
- Quản lý ý tưởng thủ công: Tạo, đọc, cập nhật, xóa ý tưởng nội dung
- Sinh ý tưởng bằng AI: Tự động tạo 10 ý tưởng nội dung chất lượng cao
- 🆕 Generate Brief từ Idea: AI tự động tạo kế hoạch nội dung chi tiết từ ý tưởng
- Quản lý Content Briefs: Lưu trữ và quản lý các bản kế hoạch nội dung
- Hỗ trợ nhiều model AI: Gemini (Google) và Deepseek
- Validate JSON với AJV: Đảm bảo dữ liệu từ AI luôn đúng định dạng
- Retry với exponential backoff: Tự động thử lại khi API lỗi
- UI/UX hiện đại: Loading spinner, error handling, responsive design
├── backend/ # Fastify API server
│ ├── src/
│ │ ├── routes/ # API routes
│ │ │ └── ideaRoutes.ts # Routes cho ideas + AI generation
│ │ ├── services/ # Business logic
│ │ │ ├── IdeaService.ts # Service xử lý ideas
│ │ │ └── LLMClient.ts # Client cho Gemini & Deepseek
│ │ ├── types.ts # TypeScript types
│ │ ├── database.ts # Database connection
│ │ └── server.ts # Server entry point
│ ├── migrations/ # Database migrations
│ ├── package.json
│ └── tsconfig.json
├── frontend/ # Next.js frontend
│ ├── app/
│ │ ├── page.tsx # Main page với AI generation form
│ │ ├── layout.tsx # Root layout
│ │ └── globals.css # Global styles
│ ├── package.json
│ └── ├── tailwind.config.js
├── docker-compose.yml # PostgreSQL container
└── README.md
docker-compose up -dTạo file backend/.env và thêm API keys:
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/content_ideas
PORT=3911
NODE_ENV=development
# AI API Keys
GEMINI_API_KEY=your_gemini_api_key_here
DEEPSEEK_API_KEY=your_deepseek_api_key_hereLấy API Keys:
- Gemini API: Truy cập https://makersuite.google.com/app/apikey
- Deepseek API: Truy cập https://platform.deepseek.com/api_keys
cd backend
npm install
npm run devBackend sẽ chạy tại http://localhost:3911
cd frontend
npm install
npm run devFrontend sẽ chạy tại http://localhost:3910
GET /api/ideas- Lấy tất cả ý tưởngGET /api/ideas/:id- Lấy ý tưởng theo IDPOST /api/ideas- Tạo ý tưởng mớiPUT /api/ideas/:id- Cập nhật ý tưởngDELETE /api/ideas/:id- Xóa ý tưởngPOST /api/ideas/generate- Tự động sinh ý tưởng bằng AI
Request body cho /api/ideas/generate:
{
"persona": "Content Creator",
"industry": "Technology",
"model": "gemini",
"temperature": 0.7
}GET /api/briefs- Lấy tất cả briefsGET /api/briefs/:id- Lấy brief theo IDPOST /api/briefs- Tạo brief mớiPUT /api/briefs/:id- Cập nhật briefDELETE /api/briefs/:id- Xóa briefPOST /api/briefs/generate- Tự động sinh brief từ idea bằng AI 🤖PATCH /api/ideas/:id/status- 🔒 Cập nhật status của idea (required: 'selected' để generate brief)
Request body cho /api/briefs/generate:
{
"idea_id": 2,
"model": "gemini",
"temperature": 0.7,
"additional_context": "Tập trung vào các chiến lược marketing thực tế"
}Response:
{
"success": true,
"message": "Brief generated successfully by AI",
"brief": {
"id": 10,
"idea_id": 2,
"title": "Chiến Lược Bán Tivi Hiệu Quả Mùa Giáng Sinh",
"content_plan": "Bản kế hoạch chi tiết...",
"target_audience": "Khách hàng mua sắm mùa lễ...",
"key_points": ["Khuyến mãi", "Bundle deals", "Free delivery"],
"tone": "friendly, promotional",
"word_count": 1500,
"keywords": ["tivi", "giáng sinh", "khuyến mãi"],
"status": "draft"
}
}GET /health- Health check
id(SERIAL PRIMARY KEY)title(VARCHAR(255) NOT NULL)description(TEXT)rationale(TEXT) - Lý do ý tưởng sẽ hiệu quảpersona(VARCHAR(100))industry(VARCHAR(100))status(VARCHAR(50) DEFAULT 'pending')created_at(TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP)
id(SERIAL PRIMARY KEY)idea_id(INTEGER REFERENCES ideas(id)) - Liên kết với ideatitle(VARCHAR(255) NOT NULL)content_plan(TEXT NOT NULL) - Kế hoạch nội dung chi tiếttarget_audience(TEXT NOT NULL) - Đối tượng mục tiêukey_points(TEXT[] NOT NULL) - Các điểm chính cần covertone(VARCHAR(100)) - Tone viếtword_count(INTEGER) - Số từ đề xuấtkeywords(TEXT[]) - Từ khóa SEOstatus(VARCHAR(50) DEFAULT 'draft') - draft, review, approved, publishedcreated_at(TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP)updated_at(TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP)
- Truy cập
http://localhost:3910 - Điền form "🤖 Tự động sinh ý tưởng bằng AI":
- Persona: Đối tượng mục tiêu (VD: Content Creator, Digital Marketer)
- Industry: Lĩnh vực (VD: Technology, Fashion, Food)
- Model AI: Chọn Gemini hoặc Deepseek
- Temperature: Độ sáng tạo (0 = conservative, 2 = creative)
- Click "🚀 Generate Ideas"
- Chờ loading spinner và xem 10 ý tưởng được tạo
status = 'selected' trước khi generate brief.
# Bước 1: Update idea status thành 'selected'
curl -X PATCH http://localhost:3911/api/ideas/2/status \
-H "Content-Type: application/json" \
-d '{"status": "selected"}'
# Bước 2: Generate brief
curl -X POST http://localhost:3911/api/briefs/generate \
-H "Content-Type: application/json" \
-d '{
"idea_id": 2,
"model": "gemini",
"temperature": 0.7,
"additional_context": "Focus on practical examples"
}'
# Hoặc dùng test script (tự động làm cả 2 bước)
./test-brief-validation.shKết quả: AI sẽ tạo ra một brief chi tiết bao gồm:
- ✅ Title (tiêu đề hấp dẫn)
- ✅ Content Plan (kế hoạch 3-5 đoạn)
- ✅ Target Audience (đối tượng mục tiêu)
- ✅ Key Points (3-10 điểm chính)
- ✅ Tone (friendly, professional, etc.)
- ✅ Word Count (số từ đề xuất)
- ✅ Keywords (5-10 từ khóa SEO)
🔒 Status Validation:
- Chỉ ideas có
status = 'selected'mới được generate brief - Đảm bảo quality control và tiết kiệm AI quota
- Xem chi tiết: STATUS_VALIDATION_GUIDE.md
Chi tiết kỹ thuật: BRIEF_GENERATION_GUIDE.md
- Sử dụng form "Tạo ý tưởng mới" để thêm ý tưởng thủ công
- Xem danh sách tất cả ý tưởng ở bên phải
- Xóa ý tưởng không cần thiết
- Framework: Fastify 4.24.3
- Language: TypeScript 5.2.2
- Database: PostgreSQL 15
- AI SDK:
- @google/generative-ai (Gemini)
- openai (Deepseek)
- Validation: AJV
- ORM: Node.js postgres driver
- Framework: Next.js 14
- UI Library: React 18
- Styling: Tailwind CSS 3.3.5
- HTTP Client: Axios
- Language: TypeScript 5
- Database: PostgreSQL (Docker)
- Containerization: Docker Compose
# Backend
cd backend
npm run build
# Frontend
cd frontend
npm run buildcd backend
npm run migrate-
API Keys không hợp lệ
- Kiểm tra lại API keys trong file
.env - Đảm bảo API keys có quyền truy cập
- Kiểm tra lại API keys trong file
-
Database connection failed
- Đảm bảo PostgreSQL container đang chạy:
docker-compose ps - Kiểm tra connection string trong
.env
- Đảm bảo PostgreSQL container đang chạy:
-
CORS errors
- Backend đã cấu hình CORS cho
localhost:3910,localhost:3911 - Kiểm tra port frontend đang chạy
- Backend đã cấu hình CORS cho
-
AI generation fails
- Kiểm tra API keys và quota
- Thử đổi model AI khác
- Xem console logs cho chi tiết lỗi
MIT License