https://github.com/msskowron/cinemamak
System for managing a cinema multiplex.
https://github.com/msskowron/cinemamak
docker java java-fx postgresql spring
Last synced: about 2 months ago
JSON representation
System for managing a cinema multiplex.
- Host: GitHub
- URL: https://github.com/msskowron/cinemamak
- Owner: MSSkowron
- Created: 2023-01-10T22:29:47.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2023-01-11T19:02:09.000Z (over 3 years ago)
- Last Synced: 2025-02-26T19:39:50.241Z (over 1 year ago)
- Topics: docker, java, java-fx, postgresql, spring
- Language: Java
- Homepage:
- Size: 4.3 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# CinemaMAK
## Spis treści
- [Skład](#skład)
- [Technologie](#technologie)
- [Opis projektu](#opis-projektu)
- [Model obiektowy](#model-obiektowy)
- [Schemat bazy danych](#schemat-bazy-danych)
- [Widoki](#widoki)
- [Instalacja](#instalacja)
- [Uruchomienie](#uruchomienie)
## Skład
- Skowron Mateusz
- Chrobot Adrian
- Wilk Karol
## Technologie
- Java
- Gradle
- Spring Framework
- JavaFX
- PostgreSQL
- Docker
## Opis projektu
Projekt jest to aplikacja desktopowa udostępniająca system do obsługi multipleksu kinowego.
Użytkownik może posiadać jedną z trzech ról: Administrator, Menadżer lub Pracownik.
W zależności od tego ma on odpowiednie funkcje w systemie i dostęp do odpowiednich widoków.\
Funkcjonalności:
- Zarządzanie bazą filmów
- Planowanie seansów
- Sprzedawanie biletów
- Tworzenie rekomendacji dla filmów
- Wyświetlanie statystyk
- Wysyłanie wiadomości e-mail z powiadomieniami do pracowników
- Zarządzanie użytkownikami systemu
Do cześci frontendowej apliakacji została wykorzystana JavaFX, a odpowiednie widoki zaimplementowane w postaci plików FXML.
Część backendowa została zaimplementowana przy użyciu Javy oraz Spring Framework'a.
Dane przechowywane są w relacyjnej bazie danych. Jako system do zarządzania relacyjną bazą danych wybrano jeden z popularniejszych systemów - PostgreSQL.
Automatyzacje procesu kompilacji zapewnia wykorzystanie Gradle'a.
## Model obiektowy

Warstwa persystencji realizowana jest poprzez JPA (wzorzec Repository).
Obiekty `Repository` (`UserRepository`, `RoleRepository`, `MovieRepository`, `GenreRepository`, `TicketRepository`, `PerformanceRepository`, `RoomRepository`, `SeatRepository`, `RecommendationRepository`) udostępniają poprzez JPA kwerendy, których wynikami są encje i kolekcje encji.
Obiekty `Service` korzystają z funkcjonalności obiektów `Repository` i udostępniają bardziej ograniczone i złożone API w celu wprowadzenia warstwy abstrakcji pomiędzy kontrolerami i warstwą persystencji. Warto zauważyć, że niektóre obiekty `Service` obsługują więcej niż jeden obiekt `Repository`. Dzieje się tak, kiedy `Repository` ma znaczenie jedynie w kontekscie innej encji (np. encje `Role` mają znaczenie jedyne w konteksie encji `User`).
Następna warstwa aplikacji składa się z obiektów `Controller`, które realizują funkcjonalność warstwy kontrolerów we wzorcu MVC. Korzystając z obiektów `Service` realizują wysokopoziomową logikę biznesową. W szczególności można wyróżnić trzy główne typy kontrolerów:
- Kontrolery sesji i uwierzytelniania, odpowiedzialne za rejestrację/logowanie
- Kontrolery administracyjne, dostępne jedynie dla Admina/Menedżera, pozwalające na modyfikację danych
- Kontrolery wyświetlania, dostępne dla zwykłego pracownika. Nie pozwalają one na wprowadzanie zmian. Wyjątkiem jest kontroler `TicketController`, który pracownikowi pozwala na rejestrację sprzedaży biletów.
Każdemu kontrolerowi przypada odpowiedni widok - są to widoki `FXML` z biblioteki JavaFX, pozwalające na imlpementację reaktywnego GUI poprzez powiązania `Binding` JavaFX.
## Schemat bazy danych
Ze względu na potrzebę zapewnienia wszystkich potrzebnych informacji, które zostaną wykorzystane do statystyk
oraz są niezbędne do poprawnego działania systemu, zgodnie z wymaganiami, w bazie znalazły się następujące tabele:

- **Roles** - Pełni funkcję słownika. Zawiera role użytkowników występujące w systemie. \
Dane znajdujące się w tabeli wczytywane są z pliku _roles.txt_ przy starcie aplikacji. \
W trakcie działania aplikacji nie będzie możliwości dodania innych ról, gdyż muszą być one wcześniej zdefiniowane, aby aplikacja działała poprawnie.
- **Genres** - Pełni funkcję słownika. Zawiera gatunki filmów występujące w systemie. \
Dane znajdujące się w tabeli wczytywane są z pliku _genres.txt_ przy starcie aplikacji.\
W trakcie działania aplikacji będzie możliwość dodania innych gatunków do tabeli.
- **Users** - Zawiera dane użytkowników systemu. \
Klucz obcy _role_id_ wskazuje rekord z tabeli roles, definiuje rolę użytkownika w systemie.
- **Movies** - Zawiera dane filmów, które były/będą transmitowane w kinie. \
Klucz obcy _genre_id_ wskazuje rekord z tabeli genres, definiuje gatunek filmu.
- **Rooms** - Zawiera sale kinowe, które znajdują sie w placówce kina.
- **Seats** - Zawiera miejsca dostępne w kinie. \
Klucz obcy _room_id_ wskazuje rekord z tabeli rooms, definiuje to, w której sali kinowej znajduję się dane miejsce.
- **Performances** - Zawiera dane seansów, które odbyły/odbędą się w kinie. \
Klucz obcy _movie_id_ wskazuje rekord z tabeli movies, definiuje to, jaki film był/będzie transmitowany na danym seansie. \
Klucz obcy _room_id_ wskazuje rekord z tabeli rooms, definiuje to, w jakiej sali odbył/odbędzie się seans. \
Klucz obcy _supervisor_id_ wskazuje rekord z tabeli users, definiuje to, który pracownik pełni opiekę nad danym seansem.
- **Recommendations** - Zawiera polecenia, które były/będą w danych dniach. \
Klucz obcy _movie_id_ wskazuje rekord z tabeli movies, definiuje to, który film był/będzie polecany w danej rekomendacji.
- **Tickets** - Zawiera bilety, na dane seanse. \
Klucz obcy _performance_id_ wskazuje rekord z tabeli performances, definiuje to, na był/jaki seans jest dany bilet.
Klucz obcy _seat_id_ wskazuje rekord z tabeli seats, definiuje to, które miejsce zostało zarezerwowane.
## Widoki
- **Logowanie**

Widok umożliwia logowanie się do systemu. \
Należy podać poprawny adres email w pierwszym polu formularza oraz hasło w drugim. \
Po podaniu niepoprawnych danych pojawa się wyskakującę okno blokujące działanie aplikacji w tle,
informującę o błędzie. Po jego zamknięciu możliwa jest kolejna próba logowania. \
Po poprawnym zalogowaniu zostajemy przeniesieni do głównego okna aplikacji. \
Przycisk _Sign In_ zatwierdza formularz. \
Przycisk _Don't have an account? Sign up_ umożliwia przejścia do okna rejestracji użytkownika.
- **Rejestracja**

Widok umożliwia założenie konta w systemie. \
Po podaniu niepoprawnych lub niekompletnych danych pojawa się wyskakującę okno blokujące działanie aplikacji w tle,
informującę o błędzie. Po jego zamknięciu możliwa jest kolejna próba rejestracji. \
Po poprawnym utworzeniu konta zostajemy przeniesieni do okna logowania. \
Przycisk _Sign Up_ zatwierdza formularz.\
Przycisk _Already have an account? Sign in_ umożliwia przejścia do okna logowania.
- **Widok główny aplikacji**

W górnym lewym rogu za pomocą przycisku _Sign out_ możemy się wylogować. \
Obok przycisku służącego do wylogowywania widoczny jest aktualnie zalogowany użytkownik. \
Po lewej stronie widoku znajduje się panel boczny, za pomocą którego możemy przełączać widoki.
- **Filmy**

Widok dostępny jest dla użytkowników z rolą admina/menadżera. \
W tabeli wyświetlane są filmy obecnie znajdującę się w bazie. \
W górnej części widoku znajduje się pole tekstowe, w którym możemy wyszukać film po tytule lub reżyserze. \
Po dwukrotnym wciśnięciu danego rekordu wyświetla się widok szczegółowych danych o filmie. \
Po kliknięciu w przycisk _NEW_ otwiera się formularz dodawania nowego filmu.

Za pomocą przycisku _Delete_ możemy usunąć film.

Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Submit_ film zostaje dodany do bazy danych.
- **Seanse**

Widok dostępny jest dla użytkowników z rolą admina/menadżera. \
W tabeli wyświetlane są seanse obecnie zarejestrowane w bazie. \
Seanse można wyświetlić w tabeli po uprzednim ich wyszukaniu \
za pomocą odpowiednich pól u góry widoku i kliknięciu przycisku _Search_.\
Przycisk _Reset_ służy do czyszczenia tabeli z wyszukiwanych wyników. \
Po wskazaniu seansu i wciśnięciu przycisku _Delete_ zostaje on usunięty. \
Po wciśnięciu przycisku _Add_ otwiera się formularz dodawania nowego seansu.\
Po dwukrotnym kliknięciu _Wiersza_ otwiera się formularz edytowania seansu. \

Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Add_ seans zostaje zatwierdzony.

Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Apply_ seans zostaje zatwierdzony.
- **Rekomendacje**

Widok dostępny jest dla użytkowników z rolą admina/menadżera. \
W tabeli wyświetlane są rekomendacje obecnie zarejestrowane w bazie. \
Rekomendacje można wyświetlić w tabeli po uprzednim ich wyszukaniu \
za pomocą odpowiednich pól u góry widoku i kliknięciu przycisku _Search_.\
Przycisk _Reset_ służy do czyszczenia tabeli z wyszukiwanych wyników. \
Po wskazaniu rekomendacji i wciśnięciu przycisku _Delete_ zostaje on usunięty. \
Po wciśnięciu przycisku _Add_ otwiera się formularz dodawania nowej rekomendacji.\
Po dwukrotnym kliknięciu _Wiersza_ otwiera się formularz edytowania rekomendacji.

Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Add_ rekomendacja zostaje zatwierdzona.

Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Apply_ rekomandacja zostaje zatwierdzona.
Dla widoków dodawania i edycji rekomendacji oraz seansów:
Po kliknięciu przycisku _Search_ obok pola tekstowego z tytułem filmu można przejść do widoku wyszukiwania filmu.

Filmy można wyświetlić w tabeli po uprzednim ich wyszukaniu \
za pomocą odpowiednich pól u góry widoku i kliknięciu przycisku _Search_.\
Przycisk _Reset_ służy do czyszczenia tabeli z wyszukiwanych wyników. \
Przycisk _Apply_ służy do dodania filmu do pola tekstowego. \
Przycisk _Cancel_ służy do wyjścia z widoku.
- **Bilety**

Widok dostępny jest dla wszystkich użytkowników, niezależnie od roli. \
Widok na początku wyświetla listę seansów, z których użytkownik wybiera jeden. \
Za pomocą _Select genre_ można wyświetlić tylko filmy z danej kategorii. \
Wówczas wyświetli się tabela z nazwami poszczególych foteli w sali, w której odbędzie się seans.

Użytkownik wybiera odpowiedni fotel klikając w jego nazwę.

Z pomocą przycisku "Sell ticket" użytkownik może sprzedać bilet na wybrany fotel w danym seansie.

Nazwa fotela jest obramowana na czerwono, co oznacza, że ten fotel jest zarezerwowany i nie da się sprzedać biletu na ten fotel i seans. \
W przypadku zwrotu biletu, użytkownik może wybrać zarezerwowany fotel w celu realizacji zwrotu.

Za pomocą przycisku "Cancel reservation" rezerwacja na fotel jest anulowana.

- **Statystyki**
Dla Administratora i Menedżera dostępny jest widok statystyk podzielony na dwie części.
Widok statystyk ogólnych pokazuje rozkład filmów oraz zaplanowanych seansów na poszczególne gatunki

Widok szczegółowych raportów pozwala użytkownikowi na wprowadzenie zakresu dni, z jakich należy wygenerować raport. Po naciśnięciu przycisku "Generate Reports" pojawią się wykresy przedstawiające liczbę sprzedanych biletów oraz sumę zysków za te bilety.

- **Panel administratora**

Widok dostępny jest jedynie dla użytkownika z rolą administratora. \
Administrator systemu może zmieniać rolę użytkowników wybierając ich z listy, a następnie po wyborze roli zatwierdzić ją przyciskiem _Set_. \
Dodatkowo po zaznaczeniu _Send Email Notification_ zostanie wysłany email do użytkownika powiadamiający go o zmianie jego roli.
## Instalacja
```
git clone https://github.com/MSSkowron/CinemaMAK
```
## Uruchomienie
Pierwszym krokiem jest uruchomienie bazy danych, która będzie działać w kontenerze.
W katalogu głównym projektu wykonujemy polecenie:
```
docker compose -f .\src\main\resources\docker-compose.yml up -d
```
Następnie uruchamiamy aplikację:
```
./gradlew bootRun
```