5.9 KiB
Blog Dashboard
Questo è uno dei progetti del corso JavaScript.
Dovrai creare un mini-blog con due pagine: una per visualizzare i post e una per crearne di nuovi, usando l'API locale (server-api).
Funzionalità da implementare
Le funzionalità sono divise in 3 fasi:
Fase 1 — Visualizzare i Post
- Recuperare i post —
GET /api/postsper ottenere tutti i post - Recuperare gli utenti —
GET /api/usersper mostrare il nome dell'autore accanto a ogni post - Mostrare i post in una tabella — con autore, titolo, contenuto (troncato), likes, data
Fase 2 — Filtri
- Ricerca per titolo — un input per cercare post per titolo
- Filtro per autore — un dropdown per mostrare solo i post di un certo autore
- I filtri devono lavorare insieme
Fase 3 — Creare ed Eliminare
- Pagina "Nuovo Post" — Form con titolo, contenuto e autore (dropdown) + validazione
- Creare un post —
POST /api/postsper salvare il nuovo post - Eliminare un post —
DELETE /api/posts/:idcon conferma
Struttura del Progetto
blog/
├── index.html ← Pagina lista post (con filtri e pulsante elimina)
├── index.js ← JS per la pagina lista (GET + DELETE + filtri)
├── nuovo.html ← Pagina creazione nuovo post (form)
├── nuovo.js ← JS per la pagina creazione (GET utenti + POST)
├── style.css ← CSS condiviso tra le due pagine
└── README.md ← Questo file
Come Iniziare
Prerequisiti
- Assicurati che il
server-apisia in esecuzione: dalla cartellaserver-api, eseguinpm start - Oppure chiedi al docente di avviare il server
- Verifica che l'API risponda: apri
http://localhost:5000/apio il link del docente nel browser
Setup del Progetto
- Crea una nuova repository
BlogDashboardsu GitHub - Clona la repo e apri la cartella in VSCode
- Copia tutti i file del progetto nella repo
- Fai il primo commit:
"Setup iniziale progetto Blog Dashboard"
Oppure fai una fork del progetto già creato dal docente e clonalo, così avrai già tutto pronto e potrai concentrarti solo sul codice. Il link del progetto del docente lo si può trovare su GitHub
Workflow Git
Dopo ogni funzionalità, fai un commit:
"Fase 1: caricamento e visualizzazione post in tabella"
"Fase 1: aggiunto nome autore con join utenti"
"Fase 2: aggiunto filtro ricerca per titolo"
"Fase 2: aggiunto filtro dropdown per autore"
"Fase 3: form creazione nuovo post con validazione"
"Fase 3: implementata eliminazione post"
API Reference
URL Base
http://localhost:5000/api
Posts — /api/posts
| Metodo | URL | Descrizione |
|---|---|---|
GET |
/api/posts |
Tutti i post |
POST |
/api/posts |
Crea un nuovo post |
DELETE |
/api/posts/:id |
Elimina un post |
Struttura di un post:
{
"id": 1,
"userId": 3,
"titolo": "Titolo del Post",
"contenuto": "Il contenuto completo del post...",
"likes": 12,
"data": "2024-01-15"
}
Users — /api/users
| Metodo | URL | Descrizione |
|---|---|---|
GET |
/api/users |
Tutti gli utenti |
Struttura di un utente:
{
"id": 1,
"nome": "Mario",
"cognome": "Rossi",
"avatar": "https://ui-avatars.com/api/?name=Mario+Rossi&..."
}
Esempi di Codice
Fetch GET (leggere dati)
const response = await fetch("http://localhost:5000/api/posts");
const posts = await response.json();
console.log(posts); // array di oggetti post
Fetch POST (creare un post)
const nuovoPost = {
userId: 3,
titolo: "Il mio primo post",
contenuto: "Ciao mondo!",
likes: 0,
data: new Date().toISOString().split("T")[0]
};
const response = await fetch("http://localhost:5000/api/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(nuovoPost)
});
const postCreato = await response.json();
Fetch DELETE (eliminare un post)
const response = await fetch("http://localhost:5000/api/posts/1", {
method: "DELETE"
});
Trovare il nome dell'autore (join)
const autore = utenti.find(u => u.id === post.userId);
const nomeAutore = autore ? autore.nome + " " + autore.cognome : "Sconosciuto";
Troncare il testo
const testoCorto = post.contenuto.substring(0, 50) + "...";
Filtrare un array
const risultati = posts.filter(post => {
return post.titolo.toLowerCase().includes(testoCercato.toLowerCase());
});
💡 Suggerimenti
-
Ordine di lavoro nella Fase 1: prima carica gli utenti, poi i post. Ti servono gli utenti già pronti in memoria per poter mostrare il nome dell'autore quando crei le righe della tabella.
-
Variabili globali: salva utenti e post in variabili
letglobali. Così puoi riusarli nelle funzioni di filtro senza ricaricarli. -
Il dropdown autore (Fase 2): il
valuedi una<option>è sempre una stringa. MauserIdnel post è un numero. Per confrontarli devi convertire uno dei due (es.Number(dropdown.value)oppurepost.userId.toString()). -
Validazione form (Fase 3): controlla i campi PRIMA di fare il fetch. Non mandare dati vuoti all'API.
-
Dopo la POST: resetta il form con
form.reset()e mostra un messaggio di conferma per far capire all'utente che il post è stato creato.
🐛 Debug
I post non si vedono
- Apri la Console (F12) e cerca errori
- Prova l'URL nel browser:
http://localhost:5000/api/posts - Controlla che il server sia avviato
Il nome autore non appare
- Hai caricato gli utenti PRIMA dei post?
- Controlla che
userIddel post corrisponda a unidnella lista utenti
La POST non funziona
- Hai messo
method: "POST"? - Hai l'header
"Content-Type": "application/json"? - Hai usato
JSON.stringify()nel body? - Controlla la tab Network in DevTools per vedere la richiesta