{"id":19623912,"url":"https://github.com/msskowron/cinemamak","last_synced_at":"2026-04-29T23:05:29.057Z","repository":{"id":68676004,"uuid":"587500787","full_name":"MSSkowron/CinemaMAK","owner":"MSSkowron","description":"System for managing a cinema multiplex.","archived":false,"fork":false,"pushed_at":"2023-01-11T19:02:09.000Z","size":4512,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-26T19:39:50.241Z","etag":null,"topics":["docker","java","java-fx","postgresql","spring"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MSSkowron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-10T22:29:47.000Z","updated_at":"2023-07-28T12:14:12.000Z","dependencies_parsed_at":"2023-05-10T16:31:02.600Z","dependency_job_id":null,"html_url":"https://github.com/MSSkowron/CinemaMAK","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MSSkowron/CinemaMAK","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MSSkowron%2FCinemaMAK","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MSSkowron%2FCinemaMAK/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MSSkowron%2FCinemaMAK/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MSSkowron%2FCinemaMAK/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MSSkowron","download_url":"https://codeload.github.com/MSSkowron/CinemaMAK/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MSSkowron%2FCinemaMAK/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281047743,"owners_count":26435124,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-26T02:00:06.575Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","java","java-fx","postgresql","spring"],"created_at":"2024-11-11T11:36:03.965Z","updated_at":"2025-10-26T02:14:15.054Z","avatar_url":"https://github.com/MSSkowron.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CinemaMAK\n\n## Spis treści\n\n- [Skład](#skład)\n- [Technologie](#technologie)\n- [Opis projektu](#opis-projektu)\n- [Model obiektowy](#model-obiektowy)\n- [Schemat bazy danych](#schemat-bazy-danych)\n- [Widoki](#widoki)\n- [Instalacja](#instalacja)\n- [Uruchomienie](#uruchomienie)\n\n\u003ca name=\"skład\"\u003e\u003c/a\u003e\n\n## Skład\n\n- Skowron Mateusz\n- Chrobot Adrian\n- Wilk Karol\n\n\u003ca name=\"technologie\"\u003e\u003c/a\u003e\n\n## Technologie\n\n- Java\n- Gradle\n- Spring Framework\n- JavaFX\n- PostgreSQL\n- Docker\n\n\u003ca name=\"opis-projektu\"\u003e\u003c/a\u003e\n\n## Opis projektu\n\nProjekt jest to aplikacja desktopowa udostępniająca system do obsługi multipleksu kinowego.\nUżytkownik może posiadać jedną z trzech ról: Administrator, Menadżer lub Pracownik.\nW zależności od tego ma on odpowiednie funkcje w systemie i dostęp do odpowiednich widoków.\\\nFunkcjonalności:\n\n- Zarządzanie bazą filmów\n- Planowanie seansów\n- Sprzedawanie biletów\n- Tworzenie rekomendacji dla filmów\n- Wyświetlanie statystyk\n- Wysyłanie wiadomości e-mail z powiadomieniami do pracowników\n- Zarządzanie użytkownikami systemu\n\nDo cześci frontendowej apliakacji została wykorzystana JavaFX, a odpowiednie widoki zaimplementowane w postaci plików FXML.\nCzęść backendowa została zaimplementowana przy użyciu Javy oraz Spring Framework'a.\nDane przechowywane są w relacyjnej bazie danych. Jako system do zarządzania relacyjną bazą danych wybrano jeden z popularniejszych systemów - PostgreSQL.\nAutomatyzacje procesu kompilacji zapewnia wykorzystanie Gradle'a.\n\n\u003ca name=\"model-obiektowy\"\u003e\u003c/a\u003e\n\n## Model obiektowy\n\n![Model_obiektowy](./images/uml.png)\n\nWarstwa persystencji realizowana jest poprzez JPA (wzorzec Repository).\n\nObiekty `Repository` (`UserRepository`, `RoleRepository`, `MovieRepository`, `GenreRepository`, `TicketRepository`, `PerformanceRepository`, `RoomRepository`, `SeatRepository`, `RecommendationRepository`) udostępniają poprzez JPA kwerendy, których wynikami są encje i kolekcje encji.\n\nObiekty `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`).\n\nNastę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:\n\n- Kontrolery sesji i uwierzytelniania, odpowiedzialne za rejestrację/logowanie\n- Kontrolery administracyjne, dostępne jedynie dla Admina/Menedżera, pozwalające na modyfikację danych\n- 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.\n\nKażdemu kontrolerowi przypada odpowiedni widok - są to widoki `FXML` z biblioteki JavaFX, pozwalające na imlpementację reaktywnego GUI poprzez powiązania `Binding` JavaFX.\n\n\u003ca name=\"schemat-bazy-danych\"\u003e\u003c/a\u003e\n\n## Schemat bazy danych\n\nZe względu na potrzebę zapewnienia wszystkich potrzebnych informacji, które zostaną wykorzystane do statystyk\noraz są niezbędne do poprawnego działania systemu, zgodnie z wymaganiami, w bazie znalazły się następujące tabele:\n\n![Schemat_bazy_danych](./images/schemat_bazy_danych.png)\n\n- **Roles** - Pełni funkcję słownika. Zawiera role użytkowników występujące w systemie. \\\n  Dane znajdujące się w tabeli wczytywane są z pliku _roles.txt_ przy starcie aplikacji. \\\n  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.\n\n- **Genres** - Pełni funkcję słownika. Zawiera gatunki filmów występujące w systemie. \\\n  Dane znajdujące się w tabeli wczytywane są z pliku _genres.txt_ przy starcie aplikacji.\\\n  W trakcie działania aplikacji będzie możliwość dodania innych gatunków do tabeli.\n\n- **Users** - Zawiera dane użytkowników systemu. \\\n  Klucz obcy _role_id_ wskazuje rekord z tabeli roles, definiuje rolę użytkownika w systemie.\n\n- **Movies** - Zawiera dane filmów, które były/będą transmitowane w kinie. \\\n  Klucz obcy _genre_id_ wskazuje rekord z tabeli genres, definiuje gatunek filmu.\n\n- **Rooms** - Zawiera sale kinowe, które znajdują sie w placówce kina.\n\n- **Seats** - Zawiera miejsca dostępne w kinie. \\\n  Klucz obcy _room_id_ wskazuje rekord z tabeli rooms, definiuje to, w której sali kinowej znajduję się dane miejsce.\n\n- **Performances** - Zawiera dane seansów, które odbyły/odbędą się w kinie. \\\n  Klucz obcy _movie_id_ wskazuje rekord z tabeli movies, definiuje to, jaki film był/będzie transmitowany na danym seansie. \\\n  Klucz obcy _room_id_ wskazuje rekord z tabeli rooms, definiuje to, w jakiej sali odbył/odbędzie się seans. \\\n  Klucz obcy _supervisor_id_ wskazuje rekord z tabeli users, definiuje to, który pracownik pełni opiekę nad danym seansem.\n\n- **Recommendations** - Zawiera polecenia, które były/będą w danych dniach. \\\n  Klucz obcy _movie_id_ wskazuje rekord z tabeli movies, definiuje to, który film był/będzie polecany w danej rekomendacji.\n\n- **Tickets** - Zawiera bilety, na dane seanse. \\\n  Klucz obcy _performance_id_ wskazuje rekord z tabeli performances, definiuje to, na był/jaki seans jest dany bilet.\n  Klucz obcy _seat_id_ wskazuje rekord z tabeli seats, definiuje to, które miejsce zostało zarezerwowane.\n\n\u003ca name=\"widoki\"\u003e\u003c/a\u003e\n\n## Widoki\n\n- **Logowanie**\n\n  ![Logowanie](./images/logowanie.png)\n\n  Widok umożliwia logowanie się do systemu. \\\n  Należy podać poprawny adres email w pierwszym polu formularza oraz hasło w drugim. \\\n  Po podaniu niepoprawnych danych pojawa się wyskakującę okno blokujące działanie aplikacji w tle,\n  informującę o błędzie. Po jego zamknięciu możliwa jest kolejna próba logowania. \\\n  Po poprawnym zalogowaniu zostajemy przeniesieni do głównego okna aplikacji. \\\n  Przycisk _Sign In_ zatwierdza formularz. \\\n  Przycisk _Don't have an account? Sign up_ umożliwia przejścia do okna rejestracji użytkownika.\n\n- **Rejestracja**\n\n  ![Rejestracja](./images/rejestracja.png)\n\n  Widok umożliwia założenie konta w systemie. \\\n  Po podaniu niepoprawnych lub niekompletnych danych pojawa się wyskakującę okno blokujące działanie aplikacji w tle,\n  informującę o błędzie. Po jego zamknięciu możliwa jest kolejna próba rejestracji. \\\n  Po poprawnym utworzeniu konta zostajemy przeniesieni do okna logowania. \\\n  Przycisk _Sign Up_ zatwierdza formularz.\\\n  Przycisk _Already have an account? Sign in_ umożliwia przejścia do okna logowania.\n\n- **Widok główny aplikacji**\n\n  ![Widok początkowy](./images/widok_glowny_aplikacji.png)\n\n  W górnym lewym rogu za pomocą przycisku _Sign out_ możemy się wylogować. \\\n  Obok przycisku służącego do wylogowywania widoczny jest aktualnie zalogowany użytkownik. \\\n  Po lewej stronie widoku znajduje się panel boczny, za pomocą którego możemy przełączać widoki.\n\n- **Filmy**\n\n  ![Widok początkowy](./images/filmy.png)\n\n  Widok dostępny jest dla użytkowników z rolą admina/menadżera. \\\n  W tabeli wyświetlane są filmy obecnie znajdującę się w bazie. \\\n  W górnej części widoku znajduje się pole tekstowe, w którym możemy wyszukać film po tytule lub reżyserze. \\\n  Po dwukrotnym wciśnięciu danego rekordu wyświetla się widok szczegółowych danych o filmie. \\\n  Po kliknięciu w przycisk _NEW_ otwiera się formularz dodawania nowego filmu.\n\n  ![Widok początkowy](./images/filmy_szczegoly.png)\n\n  Za pomocą przycisku _Delete_ możemy usunąć film.\n\n  ![Widok początkowy](./images/filmy_formularz.png)\n\n  Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Submit_ film zostaje dodany do bazy danych.\n\n- **Seanse**\n\n  ![Widok początkowy](./images/performances_view.jpg)\n\n  Widok dostępny jest dla użytkowników z rolą admina/menadżera. \\\n  W tabeli wyświetlane są seanse obecnie zarejestrowane w bazie. \\\n  Seanse można wyświetlić w tabeli po uprzednim ich wyszukaniu \\\n  za pomocą odpowiednich pól u góry widoku i kliknięciu przycisku _Search_.\\\n  Przycisk _Reset_ służy do czyszczenia tabeli z wyszukiwanych wyników. \\\n  Po wskazaniu seansu i wciśnięciu przycisku _Delete_ zostaje on usunięty. \\\n  Po wciśnięciu przycisku _Add_ otwiera się formularz dodawania nowego seansu.\\\n  Po dwukrotnym kliknięciu _Wiersza_ otwiera się formularz edytowania seansu. \\\n\n  ![Widok początkowy](./images/performance_form_view.jpg)\n\n  Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Add_ seans zostaje zatwierdzony.\n\n  ![Widok początkowy](./images/performance_edit_view.jpg)\n\n  Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Apply_ seans zostaje zatwierdzony.\n\n- **Rekomendacje**\n\n  ![Widok początkowy](./images/recommendations_view.jpg)\n\n  Widok dostępny jest dla użytkowników z rolą admina/menadżera. \\\n  W tabeli wyświetlane są rekomendacje obecnie zarejestrowane w bazie. \\\n  Rekomendacje można wyświetlić w tabeli po uprzednim ich wyszukaniu \\\n  za pomocą odpowiednich pól u góry widoku i kliknięciu przycisku _Search_.\\\n  Przycisk _Reset_ służy do czyszczenia tabeli z wyszukiwanych wyników. \\\n  Po wskazaniu rekomendacji i wciśnięciu przycisku _Delete_ zostaje on usunięty. \\\n  Po wciśnięciu przycisku _Add_ otwiera się formularz dodawania nowej rekomendacji.\\\n  Po dwukrotnym kliknięciu _Wiersza_ otwiera się formularz edytowania rekomendacji.\n\n  ![Widok początkowy](./images/recommendation_form_view.jpg)\n\n  Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Add_ rekomendacja zostaje zatwierdzona.\n\n  ![Widok początkowy](./images/recommendation_edit_view.jpg)\n\n  Po poprawnym uzupełnieniu danych i wciśnięciu przycisku _Apply_ rekomandacja zostaje zatwierdzona.\n\n  Dla widoków dodawania i edycji rekomendacji oraz seansów:\n  Po kliknięciu przycisku _Search_ obok pola tekstowego z tytułem filmu można przejść do widoku wyszukiwania filmu.\n\n  ![Widok początkowy](./images/movie_search_view.jpg)\n\n  Filmy można wyświetlić w tabeli po uprzednim ich wyszukaniu \\\n  za pomocą odpowiednich pól u góry widoku i kliknięciu przycisku _Search_.\\\n  Przycisk _Reset_ służy do czyszczenia tabeli z wyszukiwanych wyników. \\\n  Przycisk _Apply_ służy do dodania filmu do pola tekstowego. \\\n  Przycisk _Cancel_ służy do wyjścia z widoku.\n\n- **Bilety**\n\n  ![Widok początkowy](./images/tickets_view.jpg)\n\n  Widok dostępny jest dla wszystkich użytkowników, niezależnie od roli. \\\n  Widok na początku wyświetla listę seansów, z których użytkownik wybiera jeden. \\\n  Za pomocą _Select genre_ można wyświetlić tylko filmy z danej kategorii. \\\n  Wówczas wyświetli się tabela z nazwami poszczególych foteli w sali, w której odbędzie się seans.\n\n  ![Wybór miejsca 2](./images/tickets_view_full.png)\n\n  Użytkownik wybiera odpowiedni fotel klikając w jego nazwę.\n\n  ![Wybór miejsca 3](./images/tickets_view_selected.jpg)\n\n  Z pomocą przycisku \"Sell ticket\" użytkownik może sprzedać bilet na wybrany fotel w danym seansie.\n\n  ![Sprzedaż biletu_4](./images/tickets_view_marked.jpg)\n\n  Nazwa fotela jest obramowana na czerwono, co oznacza, że ten fotel jest zarezerwowany i nie da się sprzedać biletu na ten fotel i seans. \\\n  W przypadku zwrotu biletu, użytkownik może wybrać zarezerwowany fotel w celu realizacji zwrotu.\n\n  ![Zwrot biletu 1](./images/tickets_view_marked_many.jpg)\n\n  Za pomocą przycisku \"Cancel reservation\" rezerwacja na fotel jest anulowana.\n\n  ![Zwrot biletu 2](./images/tickets_view_cancel_seat.jpg)\n\n- **Statystyki**\n\n  Dla Administratora i Menedżera dostępny jest widok statystyk podzielony na dwie części.\n\n  Widok statystyk ogólnych pokazuje rozkład filmów oraz zaplanowanych seansów na poszczególne gatunki\n\n  ![Statystyki ogólne](./images/statystyki_1.png)\n\n  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.\n\n  ![Raporty szczegółowe](./images/statystyki_2.png)\n\n- **Panel administratora**\n\n  ![Panel_administratowa](./images/panel_administratora.png)\n\n  Widok dostępny jest jedynie dla użytkownika z rolą administratora. \\\n  Administrator systemu może zmieniać rolę użytkowników wybierając ich z listy, a następnie po wyborze roli zatwierdzić ją przyciskiem _Set_. \\\n  Dodatkowo po zaznaczeniu _Send Email Notification_ zostanie wysłany email do użytkownika powiadamiający go o zmianie jego roli.\n\n\u003ca name=\"instalacja\"\u003e\u003c/a\u003e\n\n## Instalacja\n\n```\ngit clone https://github.com/MSSkowron/CinemaMAK\n```\n\n\u003ca name=\"uruchomienie\"\u003e\u003c/a\u003e\n\n## Uruchomienie\n\nPierwszym krokiem jest uruchomienie bazy danych, która będzie działać w kontenerze.  \nW katalogu głównym projektu wykonujemy polecenie:\n\n```\ndocker compose -f .\\src\\main\\resources\\docker-compose.yml up -d\n```\n\nNastępnie uruchamiamy aplikację:\n\n```\n./gradlew bootRun\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsskowron%2Fcinemamak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmsskowron%2Fcinemamak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmsskowron%2Fcinemamak/lists"}