├── .gitattributes ├── .gitignore ├── .idea ├── .gitignore ├── artifacts │ └── StoreManagementSystem_jar.xml ├── compiler.xml ├── dataSources.xml ├── description.html ├── encodings.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml ├── libraries │ └── sqlite_jdbc_3_31_1.xml ├── misc.xml ├── modules.xml ├── sqldialects.xml ├── uiDesigner.xml └── vcs.xml ├── LICENSE ├── README.md ├── StoreManagementSystem.iml ├── database.png ├── diagram.png ├── diagram.uml ├── docs ├── allclasses-frame.html ├── allclasses-noframe.html ├── app │ ├── Main.html │ ├── class-use │ │ └── Main.html │ ├── package-frame.html │ ├── package-summary.html │ ├── package-tree.html │ ├── package-use.html │ └── utils │ │ ├── HelperMethods.html │ │ ├── PasswordUtils.html │ │ ├── class-use │ │ ├── HelperMethods.html │ │ └── PasswordUtils.html │ │ ├── package-frame.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html ├── constant-values.html ├── controller │ ├── LoginController.html │ ├── RegisterController.html │ ├── UserSessionController.html │ ├── admin │ │ ├── MainDashboardController.html │ │ ├── class-use │ │ │ └── MainDashboardController.html │ │ ├── package-frame.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ ├── package-use.html │ │ └── pages │ │ │ ├── CustomersController.html │ │ │ ├── HomeController.html │ │ │ ├── OrdersController.html │ │ │ ├── ProductsController.html │ │ │ ├── SettingsController.html │ │ │ ├── class-use │ │ │ ├── CustomersController.html │ │ │ ├── HomeController.html │ │ │ ├── OrdersController.html │ │ │ ├── ProductsController.html │ │ │ └── SettingsController.html │ │ │ ├── package-frame.html │ │ │ ├── package-summary.html │ │ │ ├── package-tree.html │ │ │ └── package-use.html │ ├── class-use │ │ ├── LoginController.html │ │ ├── RegisterController.html │ │ └── UserSessionController.html │ ├── package-frame.html │ ├── package-summary.html │ ├── package-tree.html │ ├── package-use.html │ └── user │ │ ├── UserMainDashboardController.html │ │ ├── class-use │ │ └── UserMainDashboardController.html │ │ ├── package-frame.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ ├── package-use.html │ │ └── pages │ │ ├── UserHomeController.html │ │ ├── UserOrdersController.html │ │ ├── UserProductsController.html │ │ ├── class-use │ │ ├── UserHomeController.html │ │ ├── UserOrdersController.html │ │ └── UserProductsController.html │ │ ├── package-frame.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html ├── deprecated-list.html ├── help-doc.html ├── index-files │ ├── index-1.html │ ├── index-10.html │ ├── index-11.html │ ├── index-12.html │ ├── index-13.html │ ├── index-14.html │ ├── index-15.html │ ├── index-16.html │ ├── index-17.html │ ├── index-18.html │ ├── index-19.html │ ├── index-2.html │ ├── index-20.html │ ├── index-3.html │ ├── index-4.html │ ├── index-5.html │ ├── index-6.html │ ├── index-7.html │ ├── index-8.html │ └── index-9.html ├── index.html ├── model │ ├── Customer.html │ ├── Datasource.html │ ├── Order.html │ ├── Product.html │ ├── User.html │ ├── class-use │ │ ├── Customer.html │ │ ├── Datasource.html │ │ ├── Order.html │ │ ├── Product.html │ │ └── User.html │ ├── package-frame.html │ ├── package-summary.html │ ├── package-tree.html │ └── package-use.html ├── overview-frame.html ├── overview-summary.html ├── overview-tree.html ├── package-list ├── script.js └── stylesheet.css ├── screenshots ├── 1.login.png ├── 10.admin-addproduct.png ├── 11.search.png ├── 2.register.png ├── 3.admin-home.png ├── 4.admin-products.png ├── 5.admin-orders.png ├── 6.admin-customers.png ├── 7.customer-home.png ├── 8.customer-products.png └── 9.customer-orders.png └── src ├── app ├── Main.java ├── db │ └── store_manager.sqlite └── utils │ ├── HelperMethods.java │ └── PasswordUtils.java ├── controller ├── LoginController.java ├── RegisterController.java ├── UserSessionController.java ├── admin │ ├── MainDashboardController.java │ └── pages │ │ ├── CustomersController.java │ │ ├── HomeController.java │ │ ├── OrdersController.java │ │ ├── SettingsController.java │ │ └── products │ │ ├── AddProductController.java │ │ ├── EditProductController.java │ │ ├── ProductsController.java │ │ └── ViewProductController.java └── user │ ├── UserMainDashboardController.java │ └── pages │ ├── UserHomeController.java │ ├── UserOrdersController.java │ └── UserProductsController.java ├── model ├── Categories.java ├── Customer.java ├── Datasource.java ├── Order.java ├── Product.java └── User.java └── view ├── admin ├── main-dashboard.fxml └── pages │ ├── customers │ ├── add-customer.fxml │ ├── customers.fxml │ ├── edit-customer.fxml │ └── view-customer.fxml │ ├── home │ └── home.fxml │ ├── orders │ └── orders.fxml │ ├── products │ ├── add-product.fxml │ ├── edit-product.fxml │ ├── products.fxml │ └── view-product.fxml │ └── settings │ └── settings.fxml ├── login.fxml ├── register.fxml ├── resources ├── css │ ├── bootstrap3.css │ ├── dashboard.css │ └── login.css └── img │ └── brand │ ├── fav.png │ ├── loginBg.jpg │ ├── sm-logo-admin.png │ ├── sm-logo.png │ ├── sm-logo.psd │ └── store-manager-logo.ai └── user ├── main-dashboard.fxml └── pages ├── home └── home.fxml ├── orders └── orders.fxml └── products ├── products.fxml └── view-product.fxml /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # Database Files 23 | *.db 24 | *.sq 25 | *.sqm 26 | *.sql 27 | *.sqlite 28 | 29 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 30 | hs_err_pid* 31 | 32 | #out dir 33 | 34 | out/ -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /../../../../../../../../:\Users\sajmi\OneDrive\Documents\GitHub\StoreManager\.idea/dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /.idea/artifacts/StoreManagementSystem_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/out/artifacts/StoreManagementSystem_jar 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /.idea/dataSources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | sqlite.xerial 6 | true 7 | org.sqlite.JDBC 8 | jdbc:sqlite:$PROJECT_DIR$/src/app/db/store_manager.sqlite 9 | $ProjectFileDir$ 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple JavaFX 2.0 application that includes simple .fxml file with attached controller and Main class to quick start. Artifact to build JavaFX application is provided. 2 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 41 | -------------------------------------------------------------------------------- /.idea/libraries/sqlite_jdbc_3_31_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/sqldialects.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Sajmir Doko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Store Management System 2 | 3 | The **Store Management System** is a JavaFX application that offers essential CRUD (Create, Read, Update, Delete) functionalities for managing a physical store's operations digitally. This application is designed to help store owners and clients streamline their everyday activities efficiently. 4 | 5 | ## Table of Contents 6 | 7 | - [Getting Started](#getting-started) 8 | - [Technologies Used](#technologies-used) 9 | - [Features](#features) 10 | - [User Types](#user-types) 11 | - [Credentials](#credentials) 12 | - [Screenshots](#screenshots) 13 | 14 | ## Getting Started 15 | 16 | To get started with the **Store Management System**, follow these steps: 17 | 18 | 1. Clone the repository: 19 | 20 | ```bash 21 | git clone https://github.com/sajdoko/StoreManagementSystem.git 22 | ``` 23 | 2. Open the project in your preferred integrated development environment, such as IntelliJ IDEA. 24 | 3. Configure your project to use Amazon Corretto 8 as the Java Development Kit (JDK). 25 | 4. Make sure you have JavaFX installed for the graphical user interface. 26 | 5. Set up your database using SQLite. 27 | 6. Build and run the application. 28 | 29 | ## Technologies Used 30 | 31 | The Store Management System is developed using the following technologies: 32 | * Integrated Development Environment (IDE): IntelliJ IDEA 33 | * Software Development Kit (SDK): Amazon Corretto 8 34 | * Graphical User Interface (GUI): JavaFX 35 | * Database: SQLite 36 | 37 | ## Features 38 | 39 | ### Store Administrator 40 | 41 | * Login/Logout: Secure access to the system with user authentication. 42 | * Dashboard Overview: Get a quick overview of key metrics and activities. 43 | * Product Management: Create, view, update, search, and delete product records. 44 | * Customer Orders: View a list of customer orders. 45 | * Customer Management: List, search, and delete customer records. 46 | 47 | ### Client 48 | 49 | * Registration/Login/Logout: Clients can create an account or log in for personalized experiences. 50 | * Dashboard Overview: Clients have access to an overview of their activities. 51 | * Product Listings: Browse and search for available products. 52 | * Product Purchase: Buy products easily. 53 | * Order History: View their own order history. 54 | 55 | ## User Types 56 | * Store Administrator 57 | * Client 58 | 59 | ## Credentials 60 | Use the following credentials to access the system: 61 | 62 | | Username | Password | 63 | | -------- | -------------- | 64 | | sajdoko | 1 | 65 | | testuser | 123456 | 66 | 67 | ## Screenshots 68 | 69 | 70 | ### Store Administrator View 71 | ![App Screenshot](https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/refs/heads/main/screenshots/4.admin-products.png) 72 | 73 | ### Client View 74 | ![App Screenshot](https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/refs/heads/main/screenshots/8.customer-products.png) 75 | -------------------------------------------------------------------------------- /StoreManagementSystem.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/database.png -------------------------------------------------------------------------------- /diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/diagram.png -------------------------------------------------------------------------------- /diagram.uml: -------------------------------------------------------------------------------- 1 | 2 | 3 | JAVA 4 | 5 | 6 | controller.RegisterController 7 | model.Customer 8 | controller.user.pages.UserOrdersController 9 | controller.admin.pages.SettingsController 10 | app.utils.PasswordUtils 11 | controller.admin.pages.products.AddProductController 12 | controller.UserSessionController 13 | model.Order 14 | app.Main 15 | model.Categories 16 | app.utils.HelperMethods 17 | controller.admin.pages.products.ViewProductController 18 | controller.admin.pages.products.ProductsController 19 | model.User 20 | model.Datasource 21 | controller.user.pages.UserProductsController 22 | controller.admin.pages.HomeController 23 | model.Product 24 | controller.admin.pages.OrdersController 25 | controller.admin.MainDashboardController 26 | controller.user.UserMainDashboardController 27 | controller.admin.pages.CustomersController 28 | controller.LoginController 29 | controller.user.pages.UserHomeController 30 | controller.admin.pages.products.EditProductController 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | Constructors 55 | Inner Classes 56 | Methods 57 | 58 | All 59 | private 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/allclasses-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | All Classes 7 | 8 | 9 | 10 | 11 | 12 |

All Classes

13 |
14 | 37 |
38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/allclasses-noframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | All Classes 7 | 8 | 9 | 10 | 11 | 12 |

All Classes

13 |
14 | 37 |
38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/app/class-use/Main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class app.Main 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
app.Main

74 |
75 |
No usage of app.Main
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/app/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | app 7 | 8 | 9 | 10 | 11 | 12 |

app

13 |
14 |

Classes

15 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/app/package-tree.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | app Class Hierarchy 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Hierarchy For Package app

74 | Package Hierarchies: 75 | 78 |
79 |
80 |

Class Hierarchy

81 | 92 |
93 | 94 |
95 | 96 | 97 |
Skip navigation links
98 | 99 | 100 | 101 | 111 |
112 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /docs/app/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Package app 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Package
app

74 |
75 |
No usage of app
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/app/utils/class-use/HelperMethods.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class app.utils.HelperMethods 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
app.utils.HelperMethods

74 |
75 |
No usage of app.utils.HelperMethods
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/app/utils/class-use/PasswordUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class app.utils.PasswordUtils 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
app.utils.PasswordUtils

74 |
75 |
No usage of app.utils.PasswordUtils
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/app/utils/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | app.utils 7 | 8 | 9 | 10 | 11 | 12 |

app.utils

13 |
14 |

Classes

15 | 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /docs/app/utils/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Package app.utils 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Package
app.utils

74 |
75 |
No usage of app.utils
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/class-use/MainDashboardController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.admin.MainDashboardController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.admin.MainDashboardController

74 |
75 |
No usage of controller.admin.MainDashboardController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | controller.admin 7 | 8 | 9 | 10 | 11 | 12 |

controller.admin

13 |
14 |

Classes

15 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/controller/admin/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Package controller.admin 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Package
controller.admin

74 |
75 |
No usage of controller.admin
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/pages/class-use/CustomersController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.admin.pages.CustomersController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.admin.pages.CustomersController

74 |
75 |
No usage of controller.admin.pages.CustomersController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/pages/class-use/HomeController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.admin.pages.HomeController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.admin.pages.HomeController

74 |
75 |
No usage of controller.admin.pages.HomeController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/pages/class-use/OrdersController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.admin.pages.OrdersController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.admin.pages.OrdersController

74 |
75 |
No usage of controller.admin.pages.OrdersController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/pages/class-use/SettingsController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.admin.pages.SettingsController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.admin.pages.SettingsController

74 |
75 |
No usage of controller.admin.pages.SettingsController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/admin/pages/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | controller.admin.pages 7 | 8 | 9 | 10 | 11 | 12 |

controller.admin.pages

13 |
14 |

Classes

15 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/controller/admin/pages/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Package controller.admin.pages 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Package
controller.admin.pages

74 |
75 |
No usage of controller.admin.pages
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/class-use/LoginController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.LoginController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.LoginController

74 |
75 |
No usage of controller.LoginController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/class-use/RegisterController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.RegisterController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.RegisterController

74 |
75 |
No usage of controller.RegisterController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | controller 7 | 8 | 9 | 10 | 11 | 12 |

controller

13 |
14 |

Classes

15 | 20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /docs/controller/user/class-use/UserMainDashboardController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.user.UserMainDashboardController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.user.UserMainDashboardController

74 |
75 |
No usage of controller.user.UserMainDashboardController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/user/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | controller.user 7 | 8 | 9 | 10 | 11 | 12 |

controller.user

13 |
14 |

Classes

15 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/controller/user/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Package controller.user 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Package
controller.user

74 |
75 |
No usage of controller.user
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/user/pages/class-use/UserHomeController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.user.pages.UserHomeController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.user.pages.UserHomeController

74 |
75 |
No usage of controller.user.pages.UserHomeController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/user/pages/class-use/UserOrdersController.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Class controller.user.pages.UserOrdersController 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Class
controller.user.pages.UserOrdersController

74 |
75 |
No usage of controller.user.pages.UserOrdersController
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/controller/user/pages/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | controller.user.pages 7 | 8 | 9 | 10 | 11 | 12 |

controller.user.pages

13 |
14 |

Classes

15 | 20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /docs/controller/user/pages/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uses of Package controller.user.pages 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Uses of Package
controller.user.pages

74 |
75 |
No usage of controller.user.pages
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/deprecated-list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Deprecated List 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 43 |
44 | 71 | 72 |
73 |

Deprecated API

74 |

Contents

75 |
76 | 77 |
78 | 79 | 80 |
Skip navigation links
81 | 82 | 83 | 84 | 94 |
95 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Generated Documentation (Untitled) 7 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | <noscript> 69 | <div>JavaScript is disabled on your browser.</div> 70 | </noscript> 71 | <h2>Frame Alert</h2> 72 | <p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /docs/model/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | model 7 | 8 | 9 | 10 | 11 | 12 |

model

13 |
14 |

Classes

15 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/overview-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Overview List 7 | 8 | 9 | 10 | 11 | 12 |
All Classes
13 |
14 |

Packages

15 | 25 |
26 |

 

27 | 28 | 29 | -------------------------------------------------------------------------------- /docs/package-list: -------------------------------------------------------------------------------- 1 | app 2 | app.utils 3 | controller 4 | controller.admin 5 | controller.admin.pages 6 | controller.user 7 | controller.user.pages 8 | model 9 | -------------------------------------------------------------------------------- /docs/script.js: -------------------------------------------------------------------------------- 1 | function show(type) 2 | { 3 | count = 0; 4 | for (var key in methods) { 5 | var row = document.getElementById(key); 6 | if ((methods[key] & type) != 0) { 7 | row.style.display = ''; 8 | row.className = (count++ % 2) ? rowColor : altColor; 9 | } 10 | else 11 | row.style.display = 'none'; 12 | } 13 | updateTabs(type); 14 | } 15 | 16 | function updateTabs(type) 17 | { 18 | for (var value in tabs) { 19 | var sNode = document.getElementById(tabs[value][0]); 20 | var spanNode = sNode.firstChild; 21 | if (value == type) { 22 | sNode.className = activeTableTab; 23 | spanNode.innerHTML = tabs[value][1]; 24 | } 25 | else { 26 | sNode.className = tableTab; 27 | spanNode.innerHTML = "" + tabs[value][1] + ""; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /screenshots/1.login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/1.login.png -------------------------------------------------------------------------------- /screenshots/10.admin-addproduct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/10.admin-addproduct.png -------------------------------------------------------------------------------- /screenshots/11.search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/11.search.png -------------------------------------------------------------------------------- /screenshots/2.register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/2.register.png -------------------------------------------------------------------------------- /screenshots/3.admin-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/3.admin-home.png -------------------------------------------------------------------------------- /screenshots/4.admin-products.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/4.admin-products.png -------------------------------------------------------------------------------- /screenshots/5.admin-orders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/5.admin-orders.png -------------------------------------------------------------------------------- /screenshots/6.admin-customers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/6.admin-customers.png -------------------------------------------------------------------------------- /screenshots/7.customer-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/7.customer-home.png -------------------------------------------------------------------------------- /screenshots/8.customer-products.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/8.customer-products.png -------------------------------------------------------------------------------- /screenshots/9.customer-orders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/screenshots/9.customer-orders.png -------------------------------------------------------------------------------- /src/app/Main.java: -------------------------------------------------------------------------------- 1 | package app; 2 | 3 | import javafx.application.Application; 4 | import javafx.application.Platform; 5 | import javafx.fxml.FXMLLoader; 6 | import javafx.scene.Parent; 7 | import javafx.scene.Scene; 8 | import javafx.scene.image.Image; 9 | import javafx.stage.Stage; 10 | import model.Datasource; 11 | 12 | public class Main extends Application { 13 | 14 | /** 15 | * {@inheritDoc} 16 | * @param primaryStage Accepts Stage. 17 | */ 18 | @Override 19 | public void start(Stage primaryStage) throws Exception{ 20 | Parent root = FXMLLoader.load(getClass().getResource("../view/login.fxml")); 21 | primaryStage.setTitle("Store Management System"); 22 | primaryStage.getIcons().add(new Image("/view/resources/img/brand/fav.png")); 23 | primaryStage.setScene(new Scene(root, 1280, 800)); 24 | primaryStage.show(); 25 | 26 | } 27 | 28 | /** 29 | * {@inheritDoc} 30 | * This method initializes the application and opens the connection to the database. 31 | * @throws Exception If an input or exception occurred. 32 | */ 33 | @Override 34 | public void init() throws Exception { 35 | super.init(); 36 | if(!Datasource.getInstance().open()) { 37 | System.out.println("FATAL ERROR: Couldn't connect to database"); 38 | Platform.exit(); 39 | } 40 | } 41 | 42 | /** 43 | * {@inheritDoc} 44 | * This method stops the application and closes the connection to the database. 45 | * @throws Exception If an input or exception occurred. 46 | */ 47 | @Override 48 | public void stop() throws Exception { 49 | super.stop(); 50 | Datasource.getInstance().close(); 51 | } 52 | 53 | /** 54 | * {@inheritDoc} 55 | * The main method. 56 | */ 57 | public static void main(String[] args) { 58 | launch(args); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/app/db/store_manager.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sajdoko/StoreManagementSystem/b602fbd92c958ecd46358af8aad665e27388f7bd/src/app/db/store_manager.sqlite -------------------------------------------------------------------------------- /src/controller/LoginController.java: -------------------------------------------------------------------------------- 1 | package controller; 2 | 3 | 4 | import java.io.IOException; 5 | import java.sql.SQLException; 6 | 7 | import app.utils.HelperMethods; 8 | import app.utils.PasswordUtils; 9 | import javafx.event.ActionEvent; 10 | import javafx.fxml.FXML; 11 | import javafx.fxml.FXMLLoader; 12 | import javafx.scene.Node; 13 | import javafx.scene.Scene; 14 | import javafx.scene.control.PasswordField; 15 | import javafx.scene.control.TextField; 16 | import javafx.stage.Stage; 17 | import model.User; 18 | 19 | /** 20 | * This class handles the login operations of the application. 21 | * @author Sajmir Doko 22 | */ 23 | public class LoginController { 24 | @FXML 25 | public TextField usernameField; 26 | @FXML 27 | public PasswordField passwordField; 28 | 29 | Stage dialogStage = new Stage(); 30 | Scene scene; 31 | 32 | /** 33 | * This method handles the login button action event. 34 | * It gets the user entered data and makes the proper validations. 35 | * If the entered details are correct, it creates an new UserSessionController instance 36 | * and transitions the user screen to the appropriate dashboard. 37 | * @param event Accepts ActionEvent. 38 | * @throws IOException If an input or output exception occurred. 39 | * @throws SQLException If an SQL error occurred. 40 | * @since 1.0.0 41 | */ 42 | public void handleLoginButtonAction(ActionEvent event) throws SQLException, IOException { 43 | String username = usernameField.getText(); 44 | String providedPassword = passwordField.getText(); 45 | 46 | if ((username == null || username.isEmpty()) || (providedPassword == null || providedPassword.isEmpty())) { 47 | HelperMethods.alertBox("Please enter the Username and Password", null, "Login Failed!"); 48 | } else if (!HelperMethods.validateUsername(username)) { 49 | HelperMethods.alertBox("Please enter a valid Username!", null, "Login Failed!"); 50 | } else { 51 | 52 | User user = model.Datasource.getInstance().getUserByUsername(username); 53 | if (user.getPassword() == null || user.getPassword().isEmpty()) { 54 | HelperMethods.alertBox("There is no user registered with that username!", null, "Login Failed!"); 55 | } else { 56 | boolean passwordMatch = PasswordUtils.verifyUserPassword(providedPassword, user.getPassword(), user.getSalt()); 57 | 58 | if (passwordMatch) { 59 | UserSessionController.setUserId(user.getId()); 60 | UserSessionController.setUserFullName(user.getFullname()); 61 | UserSessionController.setUserName(user.getUsername()); 62 | UserSessionController.setUserEmail(user.getEmail()); 63 | UserSessionController.setUserAdmin(user.getAdmin()); 64 | UserSessionController.setUserStatus(user.getStatus()); 65 | 66 | Node node = (Node) event.getSource(); 67 | dialogStage = (Stage) node.getScene().getWindow(); 68 | dialogStage.close(); 69 | if (user.getAdmin() == 0) { 70 | scene = new Scene(FXMLLoader.load(getClass().getResource("../view/user/main-dashboard.fxml"))); 71 | } else if (user.getAdmin() == 1) { 72 | scene = new Scene(FXMLLoader.load(getClass().getResource("../view/admin/main-dashboard.fxml"))); 73 | } 74 | dialogStage.setScene(scene); 75 | dialogStage.show(); 76 | } else { 77 | HelperMethods.alertBox("Please enter correct Email and Password", null, "Login Failed!"); 78 | } 79 | } 80 | } 81 | } 82 | 83 | /** 84 | * This method handles the register button action event. 85 | * It transfers the user screen to the registration view. 86 | * @param actionEvent Accepts ActionEvent. 87 | * @throws IOException If an input or output exception occurred. 88 | * @since 1.0.0 89 | */ 90 | public void handleRegisterButtonAction(ActionEvent actionEvent) throws IOException { 91 | Stage dialogStage; 92 | Node node = (Node) actionEvent.getSource(); 93 | dialogStage = (Stage) node.getScene().getWindow(); 94 | dialogStage.close(); 95 | Scene scene = new Scene(FXMLLoader.load(getClass().getResource("/view/register.fxml"))); 96 | dialogStage.setScene(scene); 97 | dialogStage.show(); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/controller/UserSessionController.java: -------------------------------------------------------------------------------- 1 | package controller; 2 | 3 | 4 | /** 5 | * This class acts as an user session. 6 | * It stores logged in user details. 7 | * It is constructed with the Singleton Design Pattern. 8 | * 9 | * This pattern involves a single class which is responsible to create an object while making sure that only single 10 | * object gets created. This class provides a way to access its only object which can be accessed directly without 11 | * need to instantiate the object of the class. 12 | * 13 | */ 14 | public class UserSessionController { 15 | 16 | private static int userId; 17 | private static String userFullName; 18 | private static String userName; 19 | private static String userEmail; 20 | private static String userStatus; 21 | private static int userAdmin; 22 | 23 | /** 24 | * Create an object of UserSessionController 25 | */ 26 | private static final UserSessionController instance = new UserSessionController(); 27 | 28 | /** 29 | * Make the constructor private so that this class cannot be instantiated 30 | */ 31 | private UserSessionController() { } 32 | 33 | /** 34 | * Get the only object available 35 | * @return UserSessionController instance. 36 | */ 37 | public static UserSessionController getInstance() { 38 | return instance; 39 | } 40 | 41 | 42 | public static String getUserFullName() { 43 | return userFullName; 44 | } 45 | 46 | public static int getUserId() { 47 | return userId; 48 | } 49 | 50 | public static String getUserName() { 51 | return userName; 52 | } 53 | 54 | public static String getUserEmail() { 55 | return userEmail; 56 | } 57 | 58 | public static String getUserStatus() { 59 | return userStatus; 60 | } 61 | 62 | public static int getUserAdmin() { 63 | return userAdmin; 64 | } 65 | 66 | public static void setUserFullName(String userFullName) { 67 | UserSessionController.userFullName = userFullName; 68 | } 69 | 70 | public static void setUserName(String userName) { 71 | UserSessionController.userName = userName; 72 | } 73 | 74 | public static void setUserEmail(String userEmail) { 75 | UserSessionController.userEmail = userEmail; 76 | } 77 | 78 | public static void setUserStatus(String userStatus) { 79 | UserSessionController.userStatus = userStatus; 80 | } 81 | 82 | public static void setUserAdmin(int userAdmin) { 83 | UserSessionController.userAdmin = userAdmin; 84 | } 85 | 86 | public static void setUserId(int userId) { 87 | UserSessionController.userId = userId; 88 | } 89 | 90 | public static void cleanUserSession() { 91 | userId = 0; 92 | userFullName = null; 93 | userName = null; 94 | userEmail = null; 95 | userAdmin = 0; 96 | userStatus = null; 97 | } 98 | 99 | } 100 | -------------------------------------------------------------------------------- /src/controller/admin/pages/HomeController.java: -------------------------------------------------------------------------------- 1 | package controller.admin.pages; 2 | 3 | import javafx.concurrent.Task; 4 | import javafx.fxml.FXML; 5 | import javafx.scene.control.Label; 6 | import model.Datasource; 7 | 8 | /** 9 | * This class handles the admin home page. 10 | * @author Sajmir Doko 11 | */ 12 | public class HomeController { 13 | 14 | @FXML 15 | public Label productsCount; 16 | @FXML 17 | public Label customersCount; 18 | 19 | /** 20 | * This method gets the products count for the admin dashboard and sets it to the productsCount label. 21 | * @since 1.0.0 22 | */ 23 | public void getDashboardProdCount() { 24 | Task getDashProdCount = new Task() { 25 | @Override 26 | protected Integer call() { 27 | return Datasource.getInstance().countAllProducts(); 28 | } 29 | }; 30 | 31 | getDashProdCount.setOnSucceeded(e -> { 32 | productsCount.setText(String.valueOf(getDashProdCount.valueProperty().getValue())); 33 | }); 34 | 35 | new Thread(getDashProdCount).start(); 36 | } 37 | 38 | /** 39 | * This method gets the customers count for the admin dashboard and sets it to the customersCount label. 40 | * @since 1.0.0 41 | */ 42 | public void getDashboardCostCount() { 43 | Task getDashCostCount = new Task() { 44 | @Override 45 | protected Integer call() { 46 | return Datasource.getInstance().countAllCustomers(); 47 | } 48 | }; 49 | 50 | getDashCostCount.setOnSucceeded(e -> { 51 | customersCount.setText(String.valueOf(getDashCostCount.valueProperty().getValue())); 52 | }); 53 | 54 | new Thread(getDashCostCount).start(); 55 | } 56 | 57 | // TODO 58 | // Add best sellers 59 | // Add latest sold products 60 | } 61 | -------------------------------------------------------------------------------- /src/controller/admin/pages/OrdersController.java: -------------------------------------------------------------------------------- 1 | package controller.admin.pages; 2 | 3 | import javafx.collections.FXCollections; 4 | import javafx.collections.ObservableList; 5 | import javafx.concurrent.Task; 6 | import javafx.event.ActionEvent; 7 | import javafx.fxml.FXML; 8 | import javafx.scene.control.*; 9 | import model.Order; 10 | import model.Datasource; 11 | 12 | /** 13 | * This class handles the admin orders page. 14 | * @author Sajmir Doko 15 | */ 16 | public class OrdersController { 17 | 18 | @FXML 19 | private TableView tableOrdersPage; 20 | 21 | /** 22 | * This method lists all the orders to the view table. 23 | * It starts a new Task, gets all the products from the database then bind the results to the view. 24 | * @since 1.0.0 25 | */ 26 | @FXML 27 | public void listOrders() { 28 | Task> getAllOrdersTask = new Task>() { 29 | @Override 30 | protected ObservableList call() { 31 | return FXCollections.observableArrayList(Datasource.getInstance().getAllOrders(Datasource.ORDER_BY_NONE)); 32 | } 33 | }; 34 | tableOrdersPage.itemsProperty().bind(getAllOrdersTask.valueProperty()); 35 | new Thread(getAllOrdersTask).start(); 36 | } 37 | 38 | public void btnOrdersSearchOnAction(ActionEvent actionEvent) { 39 | // TODO 40 | // Add orders search functionality. 41 | System.out.println("TODO: Add orders search functionality."); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/controller/admin/pages/SettingsController.java: -------------------------------------------------------------------------------- 1 | package controller.admin.pages; 2 | 3 | public class SettingsController { 4 | // TODO 5 | // Options Page 6 | } 7 | -------------------------------------------------------------------------------- /src/controller/admin/pages/products/AddProductController.java: -------------------------------------------------------------------------------- 1 | package controller.admin.pages.products; 2 | 3 | import javafx.collections.FXCollections; 4 | import javafx.concurrent.Task; 5 | import javafx.fxml.FXML; 6 | import javafx.scene.control.*; 7 | import javafx.scene.text.Text; 8 | import model.Categories; 9 | import model.Datasource; 10 | 11 | /** 12 | * {@inheritDoc} 13 | */ 14 | public class AddProductController extends ProductsController { 15 | 16 | @FXML 17 | public ComboBox fieldAddProductCategoryId; 18 | public TextField fieldAddProductName; 19 | public TextField fieldAddProductPrice; 20 | public TextField fieldAddProductQuantity; 21 | public TextArea fieldAddProductDescription; 22 | public Text viewProductResponse; 23 | 24 | 25 | @FXML 26 | private void initialize() { 27 | fieldAddProductCategoryId.setItems(FXCollections.observableArrayList(Datasource.getInstance().getProductCategories(Datasource.ORDER_BY_ASC))); 28 | 29 | TextFormatter textFormatterDouble = formatDoubleField(); 30 | TextFormatter textFormatterInt = formatIntField(); 31 | fieldAddProductPrice.setTextFormatter(textFormatterDouble); 32 | fieldAddProductQuantity.setTextFormatter(textFormatterInt); 33 | } 34 | 35 | /** 36 | * This private method handles the add product button functionality. 37 | * It validates user input fields and adds the values to the database. 38 | * @since 1.0.0 39 | */ 40 | @FXML 41 | private void btnAddProductOnAction() { 42 | Categories category = fieldAddProductCategoryId.getSelectionModel().getSelectedItem(); 43 | int cat_id = 0; 44 | if (category != null) { 45 | cat_id = category.getId(); 46 | } 47 | 48 | assert category != null; 49 | if (areProductInputsValid(fieldAddProductName.getText(), fieldAddProductDescription.getText(), fieldAddProductPrice.getText(), fieldAddProductQuantity.getText(), cat_id)) { 50 | 51 | String productName = fieldAddProductName.getText(); 52 | String productDescription = fieldAddProductDescription.getText(); 53 | double productPrice = Double.parseDouble(fieldAddProductPrice.getText()); 54 | int productQuantity = Integer.parseInt(fieldAddProductQuantity.getText()); 55 | int productCategoryId = category.getId(); 56 | 57 | Task addProductTask = new Task() { 58 | @Override 59 | protected Boolean call() { 60 | return Datasource.getInstance().insertNewProduct(productName, productDescription, productPrice, productQuantity, productCategoryId); 61 | } 62 | }; 63 | 64 | addProductTask.setOnSucceeded(e -> { 65 | if (addProductTask.valueProperty().get()) { 66 | viewProductResponse.setVisible(true); 67 | System.out.println("Product added!"); 68 | } 69 | }); 70 | 71 | new Thread(addProductTask).start(); 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/controller/admin/pages/products/ViewProductController.java: -------------------------------------------------------------------------------- 1 | package controller.admin.pages.products; 2 | 3 | import javafx.collections.FXCollections; 4 | import javafx.collections.ObservableList; 5 | import javafx.concurrent.Task; 6 | import javafx.fxml.FXML; 7 | import javafx.scene.control.ComboBox; 8 | import javafx.scene.control.TextArea; 9 | import javafx.scene.control.TextField; 10 | import javafx.scene.text.Text; 11 | import model.Categories; 12 | import model.Datasource; 13 | import model.Product; 14 | 15 | /** 16 | * {@inheritDoc} 17 | */ 18 | public class ViewProductController extends ProductsController { 19 | 20 | @FXML 21 | public TextField fieldViewProductName; 22 | public TextField fieldViewProductPrice; 23 | public TextField fieldViewProductQuantity; 24 | public ComboBox fieldViewProductCategoryId; 25 | public TextArea fieldViewProductDescription; 26 | public Text viewProductName; 27 | 28 | @FXML 29 | private void initialize() { 30 | fieldViewProductCategoryId.setItems(FXCollections.observableArrayList(Datasource.getInstance().getProductCategories(Datasource.ORDER_BY_ASC))); 31 | } 32 | 33 | /** 34 | * This method gets the data for one product from the database and binds the values to viewing fields. 35 | * @param product_id Product id. 36 | * @since 1.0.0 37 | */ 38 | public void fillViewingProductFields(int product_id) { 39 | Task> fillProductTask = new Task>() { 40 | @Override 41 | protected ObservableList call() { 42 | return FXCollections.observableArrayList( 43 | Datasource.getInstance().getOneProduct(product_id)); 44 | } 45 | }; 46 | fillProductTask.setOnSucceeded(e -> { 47 | viewProductName.setText("Viewing: " + fillProductTask.valueProperty().getValue().get(0).getName()); 48 | fieldViewProductName.setText(fillProductTask.valueProperty().getValue().get(0).getName()); 49 | fieldViewProductPrice.setText(String.valueOf(fillProductTask.valueProperty().getValue().get(0).getPrice())); 50 | fieldViewProductQuantity.setText(String.valueOf(fillProductTask.valueProperty().getValue().get(0).getQuantity())); 51 | fieldViewProductDescription.setText(fillProductTask.valueProperty().getValue().get(0).getDescription()); 52 | 53 | Categories category = new Categories(); 54 | category.setId(fillProductTask.valueProperty().getValue().get(0).getCategory_id()); 55 | category.setName(fillProductTask.valueProperty().getValue().get(0).getCategory_name()); 56 | fieldViewProductCategoryId.getSelectionModel().select(category); 57 | }); 58 | 59 | new Thread(fillProductTask).start(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/controller/user/pages/UserHomeController.java: -------------------------------------------------------------------------------- 1 | package controller.user.pages; 2 | 3 | import controller.UserSessionController; 4 | import javafx.concurrent.Task; 5 | import javafx.scene.control.Label; 6 | import model.Datasource; 7 | 8 | /** 9 | * This class handles the users home page. 10 | * @author Sajmir Doko 11 | */ 12 | public class UserHomeController { 13 | 14 | public Label productsCount; 15 | public Label ordersCount; 16 | 17 | /** 18 | * This method gets the products count for the user dashboard and sets it to the productsCount label. 19 | * @since 1.0.0 20 | */ 21 | public void getDashboardProdCount() { 22 | Task getDashProdCount = new Task() { 23 | @Override 24 | protected Integer call() { 25 | return Datasource.getInstance().countAllProducts(); 26 | } 27 | }; 28 | 29 | getDashProdCount.setOnSucceeded(e -> { 30 | productsCount.setText(String.valueOf(getDashProdCount.valueProperty().getValue())); 31 | }); 32 | 33 | new Thread(getDashProdCount).start(); 34 | } 35 | 36 | /** 37 | * This method gets the orders count for the user dashboard and sets it to the ordersCount label. 38 | * @since 1.0.0 39 | */ 40 | public void getDashboardOrdersCount() { 41 | Task getDashOrderCount = new Task() { 42 | @Override 43 | protected Integer call() { 44 | return Datasource.getInstance().countUserOrders(UserSessionController.getUserId()); 45 | } 46 | }; 47 | 48 | getDashOrderCount.setOnSucceeded(e -> { 49 | ordersCount.setText(String.valueOf(getDashOrderCount.valueProperty().getValue())); 50 | }); 51 | 52 | new Thread(getDashOrderCount).start(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/controller/user/pages/UserOrdersController.java: -------------------------------------------------------------------------------- 1 | package controller.user.pages; 2 | 3 | import controller.UserSessionController; 4 | import javafx.collections.FXCollections; 5 | import javafx.collections.ObservableList; 6 | import javafx.concurrent.Task; 7 | import javafx.event.ActionEvent; 8 | import javafx.fxml.FXML; 9 | import javafx.scene.control.TableView; 10 | import model.Datasource; 11 | import model.Order; 12 | 13 | /** 14 | * This class handles the users orders page. 15 | * @author Sajmir Doko 16 | */ 17 | public class UserOrdersController { 18 | public TableView tableOrdersPage; 19 | 20 | /** 21 | * This method lists all the orders to the view table. 22 | * It starts a new Task, gets all the products from the database then bind the results to the view. 23 | * @since 1.0.0 24 | */ 25 | @FXML 26 | public void listOrders() { 27 | 28 | Task> getAllOrdersTask = new Task>() { 29 | @Override 30 | protected ObservableList call() { 31 | return FXCollections.observableArrayList(Datasource.getInstance().getAllUserOrders(Datasource.ORDER_BY_NONE, UserSessionController.getUserId())); 32 | } 33 | }; 34 | 35 | tableOrdersPage.itemsProperty().bind(getAllOrdersTask.valueProperty()); 36 | new Thread(getAllOrdersTask).start(); 37 | 38 | } 39 | 40 | public void btnOrdersSearchOnAction(ActionEvent actionEvent) { 41 | // TODO 42 | // Add orders search functionality. 43 | System.out.println("TODO: Add orders search functionality."); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/model/Categories.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public class Categories { 4 | private int id; 5 | private String name; 6 | private String description; 7 | 8 | public int getId() { 9 | return id; 10 | } 11 | 12 | public void setId(int id) { 13 | this.id = id; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | 20 | public void setName(String name) { 21 | this.name = name; 22 | } 23 | 24 | public String getDescription() { 25 | return description; 26 | } 27 | 28 | public void setDescription(String description) { 29 | this.description = description; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return this.getName(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/model/Customer.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public class Customer { 4 | 5 | private int id; 6 | private String fullname; 7 | private String email; 8 | private String username; 9 | private int orders; 10 | private String status; 11 | 12 | public int getId() { 13 | return id; 14 | } 15 | 16 | public void setId(int id) { 17 | this.id = id; 18 | } 19 | 20 | public String getFullname() { 21 | return fullname; 22 | } 23 | 24 | public void setFullname(String fullname) { 25 | this.fullname = fullname; 26 | } 27 | 28 | public String getEmail() { 29 | return email; 30 | } 31 | 32 | public void setEmail(String email) { 33 | this.email = email; 34 | } 35 | 36 | public String getUsername() { 37 | return username; 38 | } 39 | 40 | public void setUsername(String username) { 41 | this.username = username; 42 | } 43 | 44 | public int getOrders() { 45 | return orders; 46 | } 47 | 48 | public void setOrders(int orders) { 49 | this.orders = orders; 50 | } 51 | 52 | public String getStatus() { 53 | return status; 54 | } 55 | 56 | public void setStatus(String status) { 57 | this.status = status; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/model/Order.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | 4 | public class Order { 5 | 6 | private int id; 7 | private int product_id; 8 | private String product_name; 9 | private int user_id; 10 | private String user_full_name; 11 | private String shipping_address; 12 | private String order_email; 13 | private String order_date; 14 | private String order_status; 15 | private double order_price; 16 | 17 | public int getId() { 18 | return id; 19 | } 20 | 21 | public void setId(int id) { 22 | this.id = id; 23 | } 24 | 25 | public int getProduct_id() { 26 | return product_id; 27 | } 28 | 29 | public void setProduct_id(int product_id) { 30 | this.product_id = product_id; 31 | } 32 | 33 | public String getProduct_name() { 34 | return product_name; 35 | } 36 | 37 | public void setProduct_name(String product_name) { 38 | this.product_name = product_name; 39 | } 40 | 41 | public int getUser_id() { 42 | return user_id; 43 | } 44 | 45 | public void setUser_id(int user_id) { 46 | this.user_id = user_id; 47 | } 48 | 49 | public String getUser_full_name() { 50 | return user_full_name; 51 | } 52 | 53 | public void setUser_full_name(String user_full_name) { 54 | this.user_full_name = user_full_name; 55 | } 56 | 57 | public String getShipping_address() { 58 | return shipping_address; 59 | } 60 | 61 | public void setShipping_address(String shipping_address) { 62 | this.shipping_address = shipping_address; 63 | } 64 | 65 | public String getOrder_email() { 66 | return order_email; 67 | } 68 | 69 | public void setOrder_email(String order_email) { 70 | this.order_email = order_email; 71 | } 72 | 73 | public String getOrder_date() { 74 | return order_date; 75 | } 76 | 77 | public void setOrder_date(String order_date) { 78 | this.order_date = order_date; 79 | } 80 | 81 | public String getOrder_status() { 82 | return order_status; 83 | } 84 | 85 | public void setOrder_status(String order_status) { 86 | this.order_status = order_status; 87 | } 88 | 89 | public double getOrder_price() { 90 | return order_price; 91 | } 92 | 93 | public void setOrder_price(double order_price) { 94 | this.order_price = order_price; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/model/Product.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public class Product { 4 | 5 | private int id; 6 | private String name; 7 | private String description; 8 | private double price; 9 | private int quantity; 10 | private int category_id; 11 | private String category_name; 12 | private int nr_sales; 13 | 14 | public int getId() { 15 | return id; 16 | } 17 | 18 | public void setId(int id) { 19 | this.id = id; 20 | } 21 | 22 | public String getName() { 23 | return name; 24 | } 25 | 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | 30 | public String getDescription() { 31 | return description; 32 | } 33 | 34 | public void setDescription(String description) { 35 | this.description = description; 36 | } 37 | 38 | public double getPrice() { 39 | return price; 40 | } 41 | 42 | public void setPrice(double price) { 43 | this.price = price; 44 | } 45 | 46 | public int getQuantity() { 47 | return quantity; 48 | } 49 | 50 | public void setQuantity(int quantity) { 51 | this.quantity = quantity; 52 | } 53 | 54 | public int getCategory_id() { 55 | return category_id; 56 | } 57 | 58 | public void setCategory_id(int category_id) { 59 | this.category_id = category_id; 60 | } 61 | 62 | public String getCategory_name() { 63 | return category_name; 64 | } 65 | 66 | public void setCategory_name(String category_name) { 67 | this.category_name = category_name; 68 | } 69 | 70 | public int getNr_sales() { 71 | return nr_sales; 72 | } 73 | 74 | public void setNr_sales(int nr_sales) { 75 | this.nr_sales = nr_sales; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/model/User.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | public class User { 4 | 5 | private int id; 6 | private String fullname; 7 | private String username; 8 | private String email; 9 | private String password; 10 | private String salt; 11 | 12 | public String getFullname() { 13 | return fullname; 14 | } 15 | 16 | public void setFullname(String fullname) { 17 | this.fullname = fullname; 18 | } 19 | 20 | public String getSalt() { 21 | return salt; 22 | } 23 | 24 | public void setSalt(String salt) { 25 | this.salt = salt; 26 | } 27 | 28 | private int admin; 29 | private String status; 30 | 31 | public int getId() { 32 | return id; 33 | } 34 | 35 | public void setId(int id) { 36 | this.id = id; 37 | } 38 | 39 | public String getName() { 40 | return fullname; 41 | } 42 | 43 | public void setName(String fullname) { 44 | this.fullname = fullname; 45 | } 46 | 47 | public String getUsername() { 48 | return username; 49 | } 50 | 51 | public void setUsername(String username) { 52 | this.username = username; 53 | } 54 | 55 | public String getEmail() { 56 | return email; 57 | } 58 | 59 | public void setEmail(String email) { 60 | this.email = email; 61 | } 62 | 63 | public String getPassword() { 64 | return password; 65 | } 66 | 67 | public void setPassword(String password) { 68 | this.password = password; 69 | } 70 | 71 | public int getAdmin() { 72 | return admin; 73 | } 74 | 75 | public void setAdmin(int admin) { 76 | this.admin = admin; 77 | } 78 | 79 | public String getStatus() { 80 | return status; 81 | } 82 | 83 | public void setStatus(String status) { 84 | this.status = status; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /src/view/admin/pages/customers/add-customer.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/view/admin/pages/customers/customers.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 30 |