Omówienie aplikacji domowej część II
Czas na napisanie nowej częsci kodu do naszej aplikacji – zajmiemy się stworzenie fasady do rejestracji i logowania użytkownika oraz użyjemy m.in. w metodzie main, aby na żywo zobaczyć działanie naszej aplikacji.;)
UserRegisterLoginFacade
Rozpocznijmy oczywiście od fasady – jej zadaniem jest użycie serwisów, aby zapewnić logowanie i rejestrację użytkownikowi do aplikacji.
Warto oczywiście na początek stworzyć interfejs takiej fasady:
public interface UserRegisterLoginFacade { boolean registerUser(User user); boolean loginUser(String login, String password); }
A następnie go zaimplementować oczywiście.
Na surowo nasza klasa wygląda tak:’
public class UserRegisterLoginFacadeImpl implements UserRegisterLoginFacade { private UserService userService = UserServiceImpl.getInstance(); private static UserRegisterLoginFacade instance = null; private UserRegisterLoginFacadeImpl() { } public static UserRegisterLoginFacade getInstance() { if (instance == null) { instance = new UserRegisterLoginFacadeImpl(); } return instance; } public boolean registerUser(User user) { } public boolean loginUser(String login, String password) { } }
Czyli mamy UserService, a z naszej klasy jest zrobiony singleton.
RegisterUser
Rozpocznijmy od rejestracji użytkownika – czym jest rejestracja nowego użytkownika? Jest to naprawdę dodanie go do bazy danych – czy musimy coś sprawdzać? A no nie, wszystkim zajmuje się nasz userService.
public boolean registerUser(User user) { return userService.addUser(user); }
Nie było zbyt trudno, teraz przejdźmy do logowania.
loginUser
Logowanie będzie trochę bardziej skomplikowane – na początku oczywiście musimy sprawdzić czy dane (login i hasło) są poprawne – jeśli tak to logujemy użytkownika.
public boolean loginUser(String login, String password) { if (userService.isCorrectLoginAndPassword(login, password)) { return true; } return false; }
Oczywiście metoda isCorrectLoginAndPassword w UserService juz jest – stworzyliśmy ją w pierwszej częsci omawiania aplikacji domowej. 😉
Live!
Czas na live – choć dużo tu nie będę tłumaczył, ponieważ warto, gdy sam spojrzysz w mój kod, jeżeli Ci się nie udało zrobić.
Jest tu niestety sporę zamieszanie, ponieważ musimy odebrać od użytkownika sporo informacji – w wersji finalnej się to zmieni, ponieważ wtedy danę wejściowe będzie odbierała biblioteka JavaFx.
Jednak z grubsza opowiem.
Na początku mamy scanner.
public class Main { static Scanner scanner = new Scanner(System.in); }
Oczywiście mamy trzy menu, które wyświetlamy w odpowiednich sytuacjach:
public static void startMenu() { System.out.println("MANAGEMENT MENU"); System.out.println("1 - Zaloguj się"); System.out.println("2 - Zarejestruj się"); System.out.println("0 - Wyjdź"); } public static void loggedMenu() { System.out.println("MANAGEMENT MENU"); System.out.println("1 - Dodaj nowy product"); System.out.println("0 - Wyloguj się"); } public static void productTypeMenu() { System.out.println("1 - Dodaj buty"); System.out.println("2 - Dodaj ubrania");
Wszystkie pola potrzebne do obsługi użytkownika i aplikacji – najważniejsze z nich to oczywiście nasza userFacade.
public static void main(String[] args) { UserRegisterLoginFacade userFacade = UserRegisterLoginFacadeImpl.getInstance(); ProductService productService = ProductServiceImpl.getInstance(); boolean appOn = true; boolean loggedOn = false; int read; }
Dalej możemy dodać pętle naszej całej aplikacji:
while (appOn) { startMenu(); read = scanner.nextInt(); }
Obsłużyć pierwsze menu – start Menu.
switch (read) { case 1: System.out.println("Podaj login:"); String loginLog = scanner.next(); System.out.println("Podaj hasło:"); String passwordLog = scanner.next(); if (userFacade.loginUser(loginLog, passwordLog)) { loggedOn = true; System.out.println("Zalogowałeś się!"); } else { System.out.println("Niepoprawne dane!"); } break; case 2: System.out.println("Podaj login:"); String loginReg = scanner.next(); System.out.println("Podaj hasło:"); String passwordReg = scanner.next(); User user = new User(1L, loginReg, passwordReg); if (userFacade.registerUser(user)) { System.out.println("Zarejestrowałeś się!"); } else { System.out.println("Cos poszło nie tak!"); } break; case 0: appOn = false; break; }
I kolejna pętla wewnątrz aplikacji obsługująca aplikację po zalogowaniu.
while (loggedOn) { loggedMenu(); read = scanner.nextInt(); }
Oraz obsługa loggedMenu
switch (read) { case 1: productTypeMenu(); read = scanner.nextInt(); Product product = null; switch (read) { case 1: product = createBootsProduct(); break; case 2: product = createClothProduct(); break; case 3: product = createOtherProduct(); break; } if (productService.saveProduct(product)) { System.out.println("Produkt został utworzony"); } else { System.out.println("Produkt nie został utworzony."); } break; case 0: loggedOn = false; break; }
Aby wszystko było czytelniejsze utworzyłem metody createBootsProduct, CreateClothProduct, createOtherProduct, które wyglądają tak:
public static Product createOtherProduct() { String productName, color; Float price, weight; Integer count; System.out.println("ProductName: "); productName = scanner.next(); System.out.println("Price: "); price = scanner.nextFloat(); System.out.println("Weight: "); weight = scanner.nextFloat(); System.out.println("Color: "); color = scanner.next(); System.out.println("Count: "); count = scanner.nextInt(); return new Product(1L, productName, price, weight, color, count); } public static Product createBootsProduct() { String productName, color; Float price, weight; Integer count, size; Boolean isNaturalSkin; System.out.println("ProductName: "); productName = scanner.next(); System.out.println("Price: "); price = scanner.nextFloat(); System.out.println("Weight: "); weight = scanner.nextFloat(); System.out.println("Color: "); color = scanner.next(); System.out.println("Count: "); count = scanner.nextInt(); System.out.println("Size: "); size = scanner.nextInt(); System.out.println("Is natural skin: "); isNaturalSkin = scanner.nextBoolean(); return new Boots(1L, productName, price, weight, color, count, size, isNaturalSkin); } public static Product createClothProduct() { String productName, color, size, material; Float price, weight; Integer count; System.out.println("ProductName: "); productName = scanner.next(); System.out.println("Price: "); price = scanner.nextFloat(); System.out.println("Weight: "); weight = scanner.nextFloat(); System.out.println("Color: "); color = scanner.next(); System.out.println("Count: "); count = scanner.nextInt(); System.out.println("Size: "); size = scanner.next(); System.out.println("Material: "); material = scanner.next(); return new Cloth(1L, productName, price, weight, color, count, size, material); }
Jest to po prostu budowanie produktu na podstawie danych od użytkownika i zwracanie już gotowego produktu. 😉
Cała nasza klasa Main wygląda teraz tak:
import api.ProductDao; import api.ProductService; import api.UserDao; import api.UserRegisterLoginFacade; import dao.ProductDaoImpl; import dao.UserDaoImpl; import entity.Boots; import entity.Cloth; import entity.Product; import entity.User; import facade.UserRegisterLoginFacadeImpl; import service.ProductServiceImpl; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { static Scanner scanner = new Scanner(System.in); public static void startMenu() { System.out.println("MANAGEMENT MENU"); System.out.println("1 - Zaloguj się"); System.out.println("2 - Zarejestruj się"); System.out.println("0 - Wyjdź"); } public static void loggedMenu() { System.out.println("MANAGEMENT MENU"); System.out.println("1 - Dodaj nowy product"); System.out.println("0 - Wyloguj się"); } public static void productTypeMenu() { System.out.println("1 - Dodaj buty"); System.out.println("2 - Dodaj ubrania"); System.out.println("3 - Inne"); } public static Product createOtherProduct() { String productName, color; Float price, weight; Integer count; System.out.println("ProductName: "); productName = scanner.next(); System.out.println("Price: "); price = scanner.nextFloat(); System.out.println("Weight: "); weight = scanner.nextFloat(); System.out.println("Color: "); color = scanner.next(); System.out.println("Count: "); count = scanner.nextInt(); return new Product(1L, productName, price, weight, color, count); } public static Product createBootsProduct() { String productName, color; Float price, weight; Integer count, size; Boolean isNaturalSkin; System.out.println("ProductName: "); productName = scanner.next(); System.out.println("Price: "); price = scanner.nextFloat(); System.out.println("Weight: "); weight = scanner.nextFloat(); System.out.println("Color: "); color = scanner.next(); System.out.println("Count: "); count = scanner.nextInt(); System.out.println("Size: "); size = scanner.nextInt(); System.out.println("Is natural skin: "); isNaturalSkin = scanner.nextBoolean(); return new Boots(1L, productName, price, weight, color, count, size, isNaturalSkin); } public static Product createClothProduct() { String productName, color, size, material; Float price, weight; Integer count; System.out.println("ProductName: "); productName = scanner.next(); System.out.println("Price: "); price = scanner.nextFloat(); System.out.println("Weight: "); weight = scanner.nextFloat(); System.out.println("Color: "); color = scanner.next(); System.out.println("Count: "); count = scanner.nextInt(); System.out.println("Size: "); size = scanner.next(); System.out.println("Material: "); material = scanner.next(); return new Cloth(1L, productName, price, weight, color, count, size, material); } public static void main(String[] args) { UserRegisterLoginFacade userFacade = UserRegisterLoginFacadeImpl.getInstance(); ProductService productService = ProductServiceImpl.getInstance(); boolean appOn = true; boolean loggedOn = false; int read; while (appOn) { startMenu(); read = scanner.nextInt(); switch (read) { case 1: System.out.println("Podaj login:"); String loginLog = scanner.next(); System.out.println("Podaj hasło:"); String passwordLog = scanner.next(); if (userFacade.loginUser(loginLog, passwordLog)) { loggedOn = true; System.out.println("Zalogowałeś się!"); } else { System.out.println("Niepoprawne dane!"); } break; case 2: System.out.println("Podaj login:"); String loginReg = scanner.next(); System.out.println("Podaj hasło:"); String passwordReg = scanner.next(); User user = new User(1L, loginReg, passwordReg); if (userFacade.registerUser(user)) { System.out.println("Zarejestrowałeś się!"); } else { System.out.println("Cos poszło nie tak!"); } break; case 0: appOn = false; break; } while (loggedOn) { loggedMenu(); read = scanner.nextInt(); switch (read) { case 1: productTypeMenu(); read = scanner.nextInt(); Product product = null; switch (read) { case 1: product = createBootsProduct(); break; case 2: product = createClothProduct(); break; case 3: product = createOtherProduct(); break; } if (productService.saveProduct(product)) { System.out.println("Produkt został utworzony"); } else { System.out.println("Produkt nie został utworzony."); } break; case 0: loggedOn = false; break; } } } } }
Podsumowanie
To na tyle podsumowania aplikacji domowej z tygodnia 5, było sporo refaktoryzacji kodu – wprowadzania lepszych rozwiązań, stworzenia pierwsze fasady – czyli ostatatecznego interfejsu naszej aplikacji, który aktualnie obsługuję tylko Usera. A na sam koniec użyliśmy naszych serwisów i fasady w metodzie main, aby zobaczyć jak nasza aplikacja działa.
Jeśli masz jakiś problem to pytaj – a postaramy się go wspólnie rozwiązać!
Zaś jeśli wszystko jest jasne to czas na tydzień 6!