439 lines
8.9 KiB
Markdown
439 lines
8.9 KiB
Markdown
# Les 14: Project Setup & Repository Structure
|
|
|
|
---
|
|
|
|
## Hoofdstuk
|
|
**Deel 4: Advanced AI Features** (Les 13-18)
|
|
|
|
## Beschrijving
|
|
Leer professionele project setup en repository structuur. Begrijp hoe een goed georganiseerd project AI tools effectiever maakt en samenwerking vergemakkelijkt.
|
|
|
|
---
|
|
|
|
## Te Behandelen
|
|
|
|
### Groepsdiscussie (15 min)
|
|
Bespreek klassikaal de AI assistant reflecties uit Les 13 - welke instructies werkten goed en welke niet?
|
|
|
|
### Waarom Project Structuur Belangrijk Is
|
|
|
|
**Voor jezelf:**
|
|
- Sneller code terugvinden
|
|
- Makkelijker onderhouden
|
|
- Minder bugs door consistentie
|
|
|
|
**Voor AI tools:**
|
|
- Betere context understanding
|
|
- Consistentere code generation
|
|
- Cursor/Claude begrijpt je project beter
|
|
|
|
**Voor samenwerking:**
|
|
- Anderen begrijpen je code sneller
|
|
- Standaard conventies = minder discussie
|
|
- Onboarding nieuwe developers eenvoudiger
|
|
|
|
---
|
|
|
|
### Next.js 14 Project Structuur
|
|
|
|
**Aanbevolen structuur:**
|
|
```
|
|
project-root/
|
|
├── src/
|
|
│ ├── app/ # Next.js App Router
|
|
│ │ ├── (auth)/ # Route group voor auth pagina's
|
|
│ │ │ ├── login/
|
|
│ │ │ └── register/
|
|
│ │ ├── api/ # API routes
|
|
│ │ │ └── chat/
|
|
│ │ ├── dashboard/
|
|
│ │ ├── layout.tsx
|
|
│ │ ├── page.tsx
|
|
│ │ └── globals.css
|
|
│ │
|
|
│ ├── components/ # React components
|
|
│ │ ├── ui/ # Basis UI components
|
|
│ │ │ ├── Button.tsx
|
|
│ │ │ ├── Input.tsx
|
|
│ │ │ └── Card.tsx
|
|
│ │ ├── layout/ # Layout components
|
|
│ │ │ ├── Header.tsx
|
|
│ │ │ ├── Footer.tsx
|
|
│ │ │ └── Sidebar.tsx
|
|
│ │ └── features/ # Feature-specifieke components
|
|
│ │ ├── auth/
|
|
│ │ └── dashboard/
|
|
│ │
|
|
│ ├── lib/ # Utilities en configuraties
|
|
│ │ ├── supabase.ts # Supabase client
|
|
│ │ ├── utils.ts # Helper functies
|
|
│ │ └── constants.ts # App constanten
|
|
│ │
|
|
│ ├── hooks/ # Custom React hooks
|
|
│ │ ├── useAuth.ts
|
|
│ │ └── useTodos.ts
|
|
│ │
|
|
│ └── types/ # TypeScript types
|
|
│ ├── database.ts
|
|
│ └── api.ts
|
|
│
|
|
├── public/ # Static assets
|
|
│ ├── images/
|
|
│ └── favicon.ico
|
|
│
|
|
├── docs/ # Documentatie
|
|
│ ├── PROMPT-LOG.md
|
|
│ ├── AI-DECISIONS.md
|
|
│ └── PROJECT-BRIEF.md
|
|
│
|
|
├── .cursorrules # Cursor AI configuratie
|
|
├── .env.local # Environment variables (niet in git!)
|
|
├── .env.example # Template voor env vars
|
|
├── .gitignore
|
|
├── package.json
|
|
├── tsconfig.json
|
|
├── tailwind.config.ts
|
|
└── README.md
|
|
```
|
|
|
|
---
|
|
|
|
### Component Organisatie
|
|
|
|
**UI Components (src/components/ui/):**
|
|
- Herbruikbare, generieke components
|
|
- Geen business logic
|
|
- Props-driven
|
|
- Voorbeelden: Button, Input, Modal, Card
|
|
|
|
**Layout Components (src/components/layout/):**
|
|
- Structurele components
|
|
- Meestal één per type
|
|
- Voorbeelden: Header, Footer, Sidebar, Navigation
|
|
|
|
**Feature Components (src/components/features/):**
|
|
- Business logic bevattend
|
|
- Specifiek voor één feature
|
|
- Groepeer per feature/domein
|
|
|
|
---
|
|
|
|
### File Naming Conventions
|
|
|
|
**Components:**
|
|
```
|
|
✅ Button.tsx # PascalCase
|
|
✅ UserProfile.tsx
|
|
❌ button.tsx
|
|
❌ user-profile.tsx
|
|
```
|
|
|
|
**Hooks:**
|
|
```
|
|
✅ useAuth.ts # camelCase met 'use' prefix
|
|
✅ useTodos.ts
|
|
❌ UseAuth.ts
|
|
❌ auth-hook.ts
|
|
```
|
|
|
|
**Utilities:**
|
|
```
|
|
✅ formatDate.ts # camelCase
|
|
✅ utils.ts
|
|
✅ constants.ts
|
|
```
|
|
|
|
**Types:**
|
|
```
|
|
✅ database.ts # camelCase
|
|
✅ User.types.ts # optioneel: .types suffix
|
|
```
|
|
|
|
---
|
|
|
|
### .cursorrules Setup
|
|
|
|
**Maak .cursorrules in project root:**
|
|
```markdown
|
|
# Project: [Jouw Project Naam]
|
|
|
|
## Tech Stack
|
|
- Next.js 14 met App Router
|
|
- TypeScript (strict mode)
|
|
- Tailwind CSS
|
|
- Supabase
|
|
- React Query
|
|
|
|
## File Structure
|
|
- Components in src/components/
|
|
- UI components in src/components/ui/
|
|
- API routes in src/app/api/
|
|
|
|
## Code Conventions
|
|
- Functional components only
|
|
- Named exports (geen default exports)
|
|
- Props interface boven component
|
|
- Nederlandse comments
|
|
|
|
## Naming
|
|
- Components: PascalCase (Button.tsx)
|
|
- Hooks: camelCase met use prefix (useAuth.ts)
|
|
- Utils: camelCase (formatDate.ts)
|
|
|
|
## Styling
|
|
- Tailwind CSS classes
|
|
- Geen inline styles
|
|
- Responsive mobile-first
|
|
|
|
## TypeScript
|
|
- Strict mode
|
|
- Geen any types
|
|
- Interfaces voor props
|
|
- Types voor data
|
|
|
|
## Don'ts
|
|
- Geen console.log in productie
|
|
- Geen hardcoded strings
|
|
- Geen unused imports
|
|
```
|
|
|
|
---
|
|
|
|
### Git Best Practices
|
|
|
|
**Commit Message Format:**
|
|
```
|
|
type: korte beschrijving
|
|
|
|
Types:
|
|
- feat: nieuwe feature
|
|
- fix: bug fix
|
|
- refactor: code verbetering
|
|
- docs: documentatie
|
|
- style: formatting
|
|
- test: tests toevoegen
|
|
```
|
|
|
|
**Voorbeelden:**
|
|
```bash
|
|
git commit -m "feat: add user authentication with Supabase"
|
|
git commit -m "fix: resolve hydration error in TodoList"
|
|
git commit -m "docs: update README with setup instructions"
|
|
```
|
|
|
|
**.gitignore essentials:**
|
|
```
|
|
# Dependencies
|
|
node_modules/
|
|
|
|
# Environment
|
|
.env*.local
|
|
|
|
# Next.js
|
|
.next/
|
|
out/
|
|
|
|
# IDE
|
|
.idea/
|
|
.vscode/
|
|
|
|
# OS
|
|
.DS_Store
|
|
```
|
|
|
|
---
|
|
|
|
### Environment Variables
|
|
|
|
**Structuur:**
|
|
```bash
|
|
# .env.local (NOOIT committen!)
|
|
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGci...
|
|
OPENAI_API_KEY=sk-...
|
|
|
|
# .env.example (WEL committen)
|
|
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
OPENAI_API_KEY=your-openai-key
|
|
```
|
|
|
|
**Regels:**
|
|
- `NEXT_PUBLIC_` prefix = zichtbaar in browser
|
|
- Zonder prefix = alleen server-side
|
|
- Nooit secrets in `NEXT_PUBLIC_` vars
|
|
|
|
---
|
|
|
|
### README.md Template
|
|
|
|
```markdown
|
|
# Project Naam
|
|
|
|
Korte beschrijving van je project.
|
|
|
|
## Features
|
|
- Feature 1
|
|
- Feature 2
|
|
- Feature 3
|
|
|
|
## Tech Stack
|
|
- Next.js 14
|
|
- TypeScript
|
|
- Tailwind CSS
|
|
- Supabase
|
|
- Vercel AI SDK
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
- Node.js 18+
|
|
- npm of yarn
|
|
- Supabase account
|
|
|
|
### Installation
|
|
|
|
1. Clone de repository
|
|
```bash
|
|
git clone https://github.com/username/project.git
|
|
cd project
|
|
```
|
|
|
|
2. Installeer dependencies
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
3. Maak .env.local (zie .env.example)
|
|
|
|
4. Start development server
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
## Environment Variables
|
|
Zie `.env.example` voor benodigde variabelen.
|
|
|
|
## Deployment
|
|
Deployed op Vercel: [productie-url]
|
|
|
|
## Documentatie
|
|
- [PROMPT-LOG.md](docs/PROMPT-LOG.md)
|
|
- [AI-DECISIONS.md](docs/AI-DECISIONS.md)
|
|
```
|
|
|
|
---
|
|
|
|
## Tools
|
|
- Cursor
|
|
- Git
|
|
- GitHub
|
|
|
|
---
|
|
|
|
## Lesopdracht (2 uur)
|
|
|
|
### Setup Je Eindproject
|
|
|
|
**Deel 1: Project Structuur (45 min)**
|
|
|
|
1. Maak nieuw Next.js project:
|
|
```bash
|
|
npx create-next-app@latest mijn-eindproject --typescript --tailwind --app
|
|
```
|
|
|
|
2. Maak de mappenstructuur:
|
|
- src/components/ui/
|
|
- src/components/layout/
|
|
- src/components/features/
|
|
- src/lib/
|
|
- src/hooks/
|
|
- src/types/
|
|
- docs/
|
|
|
|
3. Maak placeholder files:
|
|
- src/lib/supabase.ts
|
|
- src/lib/utils.ts
|
|
|
|
**Deel 2: Configuratie (30 min)**
|
|
|
|
1. Maak .cursorrules met jouw conventies
|
|
2. Maak .env.example
|
|
3. Update .gitignore
|
|
4. Maak README.md met template
|
|
|
|
**Deel 3: Git Setup (25 min)**
|
|
|
|
1. git init
|
|
2. Initial commit met goede message
|
|
3. Push naar GitHub
|
|
4. Check: .env.local NIET gecommit?
|
|
|
|
**Deel 4: Documentatie Start (20 min)**
|
|
|
|
Maak in docs/:
|
|
- PROJECT-BRIEF.md (beschrijving eindproject)
|
|
- PROMPT-LOG.md (leeg template)
|
|
- AI-DECISIONS.md (leeg template)
|
|
|
|
### Deliverable
|
|
- GitHub repository met correcte structuur
|
|
- .cursorrules file
|
|
- README.md
|
|
- docs/ folder met templates
|
|
|
|
---
|
|
|
|
## Huiswerk (2 uur)
|
|
|
|
### Bouw Project Foundation
|
|
|
|
**Deel 1: Base Components (1 uur)**
|
|
|
|
Maak basis UI components met AI hulp:
|
|
- src/components/ui/Button.tsx
|
|
- src/components/ui/Input.tsx
|
|
- src/components/ui/Card.tsx
|
|
- src/components/layout/Header.tsx
|
|
- src/components/layout/Footer.tsx
|
|
|
|
Requirements:
|
|
- TypeScript interfaces voor props
|
|
- Tailwind styling
|
|
- Responsive design
|
|
- Volg je .cursorrules
|
|
|
|
**Deel 2: Supabase Setup (30 min)**
|
|
|
|
1. Maak Supabase project (of hergebruik van Les 9)
|
|
2. Configureer src/lib/supabase.ts
|
|
3. Voeg env vars toe aan .env.local
|
|
4. Test connectie
|
|
|
|
**Deel 3: Eerste Feature (30 min)**
|
|
|
|
Kies je eindproject en implementeer 1 basisfeature:
|
|
- Recipe Generator: ingredient input form
|
|
- Budget Buddy: expense entry form
|
|
- Travel Planner: destination search
|
|
|
|
Commit en push!
|
|
|
|
### Deliverable
|
|
- Werkende UI components
|
|
- Supabase connectie
|
|
- 1 basic feature
|
|
- Alle commits met goede messages
|
|
|
|
---
|
|
|
|
## Leerdoelen
|
|
Na deze les kan de student:
|
|
- Een professionele project structuur opzetten
|
|
- File naming conventions toepassen
|
|
- Een effectieve .cursorrules file schrijven
|
|
- Git best practices volgen
|
|
- Environment variables correct beheren
|
|
- Een README.md schrijven
|
|
- Project documentatie structureren
|