{"id":28359783,"url":"https://github.com/panagiotispitsikoulis/bookify","last_synced_at":"2026-05-08T07:32:56.408Z","repository":{"id":292363168,"uuid":"976465304","full_name":"PanagiotisPitsikoulis/bookify","owner":"PanagiotisPitsikoulis","description":"🚀 Bookify is a modern JavaFX desktop app for students and educators—perfect for university projects🚀 Bookify is a modern JavaFX desktop app for students and educators—perfect for university projects.","archived":false,"fork":false,"pushed_at":"2025-05-25T02:26:22.000Z","size":137803,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-09T14:35:05.811Z","etag":null,"topics":["dashboard","education","final-year-project","fxml","java","javafx","maven","model-view-controller","modern","mvc","oop","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PanagiotisPitsikoulis.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,"zenodo":null}},"created_at":"2025-05-02T06:39:45.000Z","updated_at":"2025-08-31T03:27:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"de606423-b3e4-4430-960a-a849b2cf580d","html_url":"https://github.com/PanagiotisPitsikoulis/bookify","commit_stats":null,"previous_names":["panagiotispitsikoulis/bookify"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/PanagiotisPitsikoulis/bookify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PanagiotisPitsikoulis%2Fbookify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PanagiotisPitsikoulis%2Fbookify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PanagiotisPitsikoulis%2Fbookify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PanagiotisPitsikoulis%2Fbookify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PanagiotisPitsikoulis","download_url":"https://codeload.github.com/PanagiotisPitsikoulis/bookify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PanagiotisPitsikoulis%2Fbookify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32771021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T02:36:36.067Z","status":"ssl_error","status_checked_at":"2026-05-08T02:36:07.210Z","response_time":54,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["dashboard","education","final-year-project","fxml","java","javafx","maven","model-view-controller","modern","mvc","oop","sqlite"],"created_at":"2025-05-28T10:09:37.766Z","updated_at":"2026-05-08T07:32:56.378Z","avatar_url":"https://github.com/PanagiotisPitsikoulis.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🛩️ Bookify – JavaFX Travel-Management Application\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshots/bookify.gif\" alt=\"Bookify live demo\" width=\"800\"/\u003e\n\u003c/p\u003e\n\nBookify is a **modern desktop app** for travel-agency back-office tasks (customers, destinations, bookings, reports).\nIt is written for **Java\u0026nbsp;11+**, uses **JavaFX 21**, is built with **Maven**, and ships with a clean light _Flat-Blue_ theme.\n\n---\n\n## 1. Quick Start\n\n### Prerequisites\n\n- **JDK 11** or newer (tested with Temurin 11.0.22 \u0026 17.0.10)\n- **Apache Maven 3.9** or newer\n- Screen resolution ≥ 1280 × 720\n\n### Build \u0026 Run\n\n```bash\n# clone \u0026 enter the project\ngit clone https://github.com/PanagiotisPitsikoulis/bookify.git\ncd bookify\n\n# option 1 – run directly (dev mode)\nmvn clean javafx:run\n\n# option 2 – build a fat-jar (production)\nmvn clean package                     # produces target/travel-agency-1.0-SNAPSHOT.jar\njava -jar target/travel-agency-1.0-SNAPSHOT.jar    # add --generate-data once to seed the DB\n```\n\n### Demo Credentials\n\n| Role  | Username | Password |\n| ----- | -------- | -------- |\n| Admin | `admin`  | `admin`  |\n\n---\n\n## 2. Using the Application\n\n1. **Login** – type the demo credentials. On failure a red error label appears.\n2. **Main Window** – a tabbed interface opens:\n   - **Dashboard** – live data from database\n   - **Customers** – create / update / delete customers\n   - **Destinations** – manage destinations\n   - **Bookings** – create, edit or cancel bookings\n   - **Reports** – export CSV\n\nCommon actions:\n\n- **Save** (blue) – persists the form\n- **Reset** (gray) – clears the form\n- **Delete** (red) – removes the selected item after confirmation\n\nClose the window or use **File → Exit** to quit (`Platform.exit()`).\n\n### Database \u0026 Sample Data\n\nThe app uses an **embedded SQLite** database (`travel_agency.db`). On first run it is created automatically with the required tables.\n\nRun the jar with the flag `--generate-data` to populate 100 customers, 30 destinations and 200 bookings:\n\n```bash\njava -jar target/travel-agency-1.0-SNAPSHOT.jar --generate-data\n```\n\nDatabase connection logic lives in `com.bookify.app.database.DatabaseConnection` while test data are produced by `SampleDataGenerator`.\n\n---\n\n## 3. Architecture in Two Sentences (MVC)\n\n- **Model** – Plain Java classes (`Customer`, `Destination`, `Booking`) and DAOs that talk to SQLite.\n- **View** – FXML layouts (`login.fxml`, `main.fxml`) plus `styles.css` for looks.\n- **Controller** – Java classes (`LoginController`, `MainController`) that glue Model ↔ View.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshots/bookify_diagram.png\" alt=\"Bookify Architecture Diagram\" width=\"700\"/\u003e\n\u003c/p\u003e\n\n---\n\n## 4. Features\n\n- **Flat-Blue light theme** (CSS variables, no heavy shadows)\n- **Real-time filtering** in lists \u0026 tables (`FilteredList`)\n- **Responsive dashboard** widgets (stats cards, bar \u0026 pie charts)\n- **Image cache** to avoid disk re-loading\n- **Form validation** with visual feedback\n- **Role-ready login** (hashed password store can be plugged in later)\n- **Keyboard navigation** \u0026 visible focus rings for accessibility\n\n---\n\n## 5. Algorithmic Highlights\n\n| Problem                            | Solution \u0026 Complexity                                      |\n| ---------------------------------- | ---------------------------------------------------------- |\n| Secure login throttling            | Counter + 30 s lockout after 3 failures _(O(1))_           |\n| Unique IDs for entities            | `AtomicInteger` autoincrement _(O(1))_                     |\n| Fast search in lists               | `FilteredList` for substring matches _(O(n))_              |\n| Dashboard KPI recalculation        | Single pass `updateStats()` only when data mutate _(O(n))_ |\n| Destination availability check     | Stream range-overlap `anyMatch` _(O(k))_                   |\n| Efficient image loading            | `WeakHashMap\u003cURL, Image\u003e` cache + background `Service`     |\n| FXML/controller mismatch detection | Build-time validation \u0026 handler warnings                   |\n| CSS parsing warnings eliminated    | Switched to valid `dropshadow()` calls                     |\n\n_`n` = list size, `k` = bookings for the selected destination._\n\n---\n\n## 6. Screenshots\n\n| Screen        | Preview                                       |\n| ------------- | --------------------------------------------- |\n| Login         | ![Login](screenshots/login.png)               |\n| Live Demo GIF | ![Demo](screenshots/bookify.gif)              |\n| Dashboard     | ![Dashboard](screenshots/main.png)            |\n| Customers     | ![Customers](screenshots/customers.png)       |\n| Destinations  | ![Destinations](screenshots/destinations.png) |\n| Bookings      | ![Bookings](screenshots/bookings.png)         |\n| Reports       | ![Reports](screenshots/reports.png)           |\n\n---\n\n## 7. Project Structure (key paths)\n\n```\n├─ src\n│  ├─ main\n│  │  ├─ java\n│  │  │  └─ com/bookify/app\n│  │  │     ├─ controller     # JavaFX controllers (LoginController, MainController)\n│  │  │     ├─ model          # Plain-Java entity classes (Customer, Destination, Booking)\n│  │  │     ├─ dao            # Data-Access Objects (CustomerDAO, DestinationDAO, BookingDAO)\n│  │  │     ├─ database       # SQLite connection \u0026 SampleDataGenerator\n│  │  │     └─ utils          # Helpers (IconManager, SvgIconLoader)\n│  │  ├─ resources\n│  │  │  ├─ fxml              # UI layouts (login.fxml, main.fxml)\n│  │  │  ├─ images            # Illustrations \u0026 thumbnails\n│  │  │  └─ styles.css        # Flat-Blue theme\n├─ pom.xml                     # Maven build incl. JavaFX \u0026 SQLite deps\n└─ README.md\n```\n\n---\n\n## 8. Extending Bookify\n\n- Swap in a real database layer (JPA/Hibernate) instead of in-memory lists.\n- Add multi-user roles \u0026 hashed credential store.\n- Internationalise the UI with JavaFX `ResourceBundle`s.\n- Write unit tests (`JUnit 5`) for controllers and business logic.\n\nHappy travels \u0026 happy grading! 🎉\n\n### Credits\n\nCreated with ❤️ by **Panagiotis Pitsikoulis** — [panagiotispitsikoulis.gr](https://panagiotispitsikoulis.gr)  \n[LinkedIn](https://www.linkedin.com/in/panagiotis-pitsikoulis-47141733a/)\n\n\u003e Bookify was built to demonstrate how a modern JavaFX application can look and feel: clean, minimal, and user-friendly, inspired by the best of today's desktop UIs. I focused on clear code structure (MVC), maintainability, and a pleasant developer experience, aiming to make this project both a practical tool and a learning resource for students and JavaFX newcomers. Every design choice—from the flat blue theme to the sidebar navigation—was made to balance aesthetics, usability, and code clarity.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanagiotispitsikoulis%2Fbookify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpanagiotispitsikoulis%2Fbookify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanagiotispitsikoulis%2Fbookify/lists"}