1. Home
  2. Projects
  3. TourPlanner

Fullstack · Semester project

TourPlanner

A web app for planning tours and keeping logs of the trips you have done. Create a tour between two places, see the route drawn on a map, and write logs with rating, difficulty and a photo.

  • Team 2 students (with Matej Krsteski)
  • Course Software Engineering, UAS Technikum Wien
  • Tests 35 backend unit tests
Illustration of a hiker in the mountains

The assignment

Build a two-tier tour planner in a team of two, with Angular in the frontend and Spring Boot or ASP.NET in the backend. All must-have requirements were met, plus our own unique feature.

  • Layered architecture (presentation, business, data access)
  • MVVM in Angular and a reusable UI component
  • PostgreSQL through an O/R mapper, images on the file system
  • OpenRouteService and Leaflet integration
  • Logging with Log4j2 and config kept out of the code
  • 20+ unit tests (we wrote 35)
  • Documented with UML diagrams and wireframes
  • Unique feature: per-tour image gallery

What it does

  • Real routes

    Distance and travel time come from OpenRouteService, and the route is drawn on a Leaflet map.

  • Tour logs

    Each log has date, comment, difficulty, distance, time, a 1–5 rating and one photo.

  • Image gallery

    Photos from all logs on a tour are gathered in one gallery you can flip through.

  • Search & export

    Full-text search across tours and logs, plus JSON import and export.

How it is built

Backend

  • Java 21 and Spring Boot, split into controller, service and repository layers
  • PostgreSQL with Spring Data JPA and Hibernate
  • Login with Spring Security and JWT tokens
  • Bean Validation on all input, logging with Log4j2
  • Unit tests with JUnit and Mockito, no database needed

Frontend

  • Angular with standalone components
  • MVVM: signal-based ViewModels hold the state
  • Leaflet hidden behind a Facade service
  • Interceptors send the token and handle errors
  • Java
  • Spring Boot
  • PostgreSQL
  • JPA / Hibernate
  • JWT
  • Angular
  • Leaflet
  • OpenRouteService
  • JUnit
  • Mockito

My part

We split the work between us. My main areas were:

  • Frontend screens and ViewModels
  • Writing the backend unit tests
  • Full-text search, JSON import/export and the computed values for popularity and child-friendliness
  • Project setup and planning

From sketch to app

We started with hand-drawn sketches for desktop and mobile, then made a wireframe of the main screen.

Hand-drawn sketch of the desktop view with search, route list and map
Desktop sketch
Hand-drawn sketch of the mobile view with list and map
Mobile sketch
Wireframe of the main screen with tour list, map, tour details, logs and image gallery
Wireframe of the main screen

Challenges & what I learned

Searching for values that are not in the database

Problem
Tours have a popularity and a child-friendliness rating, worked out from the logs each time. Since they are never stored, a database query can't search them, so searching for "child-friendly" found nothing.
What I chose
Search in two passes. First a JPQL query over stored fields and log comments, then a filter in the service layer over the computed labels, merging the results without duplicates.
Why
Storing the values would mean keeping them in sync every time a log changes. Computing them on request keeps one source of truth, at the cost of a little more work per search.
Back to all projects