Wróć do projektów
Web Development · Fullstack
2026 Akademia Tarnowska

Blog App

Fullstackowa aplikacja blogowa zbudowana w Angular + Node.js — system postów, komentarzy, ocen i ulubionych. Panel admina, autoryzacja JWT i Server-Side Rendering.

Angular
Frontend
Node.js
Backend
TypeScript
Język
JWT + SSR
Auth & Render

Fullstack
od loginu po admina

Blog App to kompletna aplikacja webowa zrealizowana w ramach przedmiotu Technologie aplikacji webowych na Akademii Tarnowskiej. Projekt obejmuje cały stos — od komponentów Angular po REST API w Node.js.

Każdy zalogowany użytkownik może pisać posty, komentować, oceniać i zapisywać ulubione wpisy. Administrator zarządza użytkownikami i treścią przez dedykowany panel.

📝
CRUD postów
Tworzenie, edycja i usuwanie wpisów z uploadem obrazów (multer, max 5MB)
💬
Komentarze i oceny
System komentarzy per post oraz oceny gwiazdkowe z liczeniem średniej
🔐
Autoryzacja JWT
Rejestracja, logowanie i ochrona tras przez AuthGuard i AdminGuard
❤️
Ulubione & aktywność
Zapisywanie ulubionych postów i dziennik wszystkich akcji użytkownika
🔍
Wyszukiwanie i filtry
Filtrowanie po kategorii, tagach, autorze i dacie z paginacją listy
🌙
Dark / Light mode
Przełącznik motywu z zapisem preferencji w localStorage

Stack technologiczny

🅰️
Angular 17+
Standalone Components, lazy loading tras, Angular Universal (SSR), reactive forms.
🟦
TypeScript
Silne typowanie — modele, serwisy, interfejsy. 41.9% kodu projektu.
🎨
SCSS
Globalne style, zmienne CSS, media queries — pełna responsywność i dark mode.
🟩
Node.js + Express
RESTful API — endpointy dla postów, użytkowników, uploadów i aktywności.
🔑
JWT Auth
Tokeny 24h, role user/admin, walidacja przy każdym zapytaniu do API.
📦
Multer
Obsługa multipart upload — obrazy do 5MB zapisywane w backend/uploads/.
🗄️
JSON Storage
Dane postów i aktywności przechowywane w posts.json i activity.json.
🚀
Angular Universal
Server-Side Rendering przez main.server.ts — lepsza wydajność i SEO.

Jak to działa

01
Autoryzacja — JWT Guards

AuthGuard sprawdza ważność tokena JWT przed wejściem na chronioną trasę. AdminGuard dodatkowo weryfikuje rolę użytkownika z payloadu tokena.

canActivate(): boolean {
  const token = this.auth
    .getToken();
  return this.auth
    .isTokenValid(token);
}
02
System ocen (Rating)

RatingService przechowuje wszystkie głosy per post w localStorage. Średnia obliczana dynamicznie — wyświetlana jako gwiazdki z liczbą głosów.

getAverage(postId: string) {
  const ratings =
    this.data[postId] ?? [];
  return ratings.reduce(
    (a,b)=>a+b,0)/ratings.length;
}
03
Upload plików

Multer obsługuje multipart/form-data. Walidacja MIME tylko do obrazów, limit 5MB, sanityzacja nazwy pliku przed zapisem na dysk.

POST /api/upload
// multer({ limits: 5MB })
// fileFilter: image/* only
// → /uploads/[safe_name]
04
Dziennik aktywności

Każda akcja (login, create_post, delete_post) zapisywana z timestampem do activity.json. Użytkownik widzi swój feed akcji w widoku Aktywność.

{
  action: "create_post",
  userId: 1,
  timestamp: new Date(),
  meta: { postId, title }
}
05
Paginacja — custom pipe

Niestandardowy Angular pipe dzieli listę postów na strony. Zastosowany w BlogHomeComponent bez dodatkowych bibliotek.

transform(items: any[],
  page: number,
  size: number) {
  return items.slice(
    (page-1)*size, page*size);
}
06
Dark / Light Mode

ThemeService przełącza klasę na body i zapisuje preferencje w localStorage. Zmiany CSS przez custom properties — brak przeładowania strony.

toggle() {
  this.isDark = !this.isDark;
  document.body.classList
    .toggle('dark',this.isDark);
  localStorage.setItem(
    'theme', this.isDark
      ? 'dark':'light');
}

Routing

/
HomeComponent
Publiczna
/blog
BlogHomeComponent
Auth
/blog/detail/:id
BlogItemDetailsComponent
Publiczna
/add-post
AddPostComponent
Auth
/favorites
FavoritesComponent
Auth
/profile
ProfileComponent
Auth
/activity
MyActivityComponent
Auth
/admin
AdminComponent
Admin

Jak uruchomić

Wymagania
Node.js 18+ Angular CLI npm
1
Klonuj repozytorium
git clone https://github.com/Andrii418/Blog.git
cd Blog
2
Zainstaluj zależności frontendu
npm install
3
Uruchom backend
cd backend
npm install
node server.js
# Backend: http://localhost:3101
4
Uruchom frontend
npm start
# lub: ng serve
# Frontend: http://localhost:4200

Projekt indywidualny

AT
Andrii Torianyk
Frontend · Backend · UI Design · Testy
github.com/Andrii418
Wszystkie projekty