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 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!

 

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x