Skip to content

Issues - 로그인, 메뉴 잘못입력 시 초기화면 돌아가는 선택지 만들기 #30

@Heewon-Seo

Description

@Heewon-Seo

1. UserSystem - SignUp

수정사항

  • 각각 반복이 되어야 하기 때문에 기존에 하나로 합쳐져있던 signUp 메소드를 각각 나누었습니다.
void signUp() { // 휴대폰 번호 입력 반복문
            System.out.println("휴대폰 번호(ID) 입력 | 0. 초기화면");
            Matcher phone;
            this.userPhoneNum = input.nextLine().trim(); // 휴대폰번호를 받아서 공백 제거
            phone = userPhonNumPattern.matcher(this.userPhoneNum); // 패턴에 맞는지 확인
            if (this.userPhoneNum.equals("0")){
                System.out.println("초기화면으로 돌아갑니다");
            } else if (!phone.find()) { // 형식에 맞지 않으면
                System.out.println("아래 형식에 맞게 입력해 주세요"); // 재입력 문구 출력
                System.out.println("ex) 010-1234-5678");
                signUp();
            } else if (userList.containsKey(userPhoneNum)) { // userList의 key에 이미 같은 번호가 있으면
                System.out.println("이미 등록된 아이디입니다"); // 등록된 아이디라고 출력
                signUp();
            } else { // 둘 다 아니면
                signUpPwd();
            }
    }

    void signUpPwd () {// 비밀번호 입력 반복문
            System.out.println("비밀번호를 입력해주세요 | 0. 초기화면");
            System.out.println("------------------------");
            System.out.println("비밀번호 형식 : \n1. 최소 영문 하나 이상 포함\n2. 특수 문자(!@#$%^&*?_~),숫자,영문(대소문자)만 가능\n3. 6글자 ~ 8글자");
            System.out.println("------------------------");
            Matcher pwd;
            this.userPwd = input.nextLine();
            pwd = userPwdPattern.matcher(this.userPwd); // 비밀번호 입력 받아서 확인
            if(this.userPwd.equals("0")){
                System.out.println("초기화면으로 돌아갑니다");
            }
            else if (!pwd.find()) { // 패턴에 맞지 않으면
                System.out.println("비밀번호 형식을 확인하고 재입력 해주세요"); // 재입력
                signUpPwd();
            } else { // 아니면
                signUpName();
            }
    }

    void signUpName() {// 이름 입력 반복문
            System.out.println("이름을 입력해주세요 | 0. 초기화면");
            Matcher name;
            userName = input.nextLine();
            name = userNamePattern.matcher(this.userName); // 이름 입력 받은 후 형식 확인

            if(userName.equals("0")){
                System.out.println("초기화면으로 돌아갑니다");
            }
            else if (!name.find()) { // 아니면
                System.out.println("다시 한 번 이름을 입력해 주세요");// 오류 출력
                System.out.println("ex) 홍길동 ");
                signUpName();
            } else {
                userList.put(userPhoneNum, new User(userPhoneNum, userName, userPwd));
                io.writeUserList();
                showResult();
            }
    }

출력 예시

image

2. UserSystem - userLogin

수정사항

  • 기존 메소드에 if문만 하나 더 추가했습니다.
public int userLogin() {
        int cnt = 0;

        while (cnt == 0) {
            System.out.println("ID를 입력해주세요 | 0. 초기화면");
            System.out.println("ID는 휴대폰 번호입니다. (010-0000-0000)");
            userPhoneNum = input.nextLine().trim();
            Matcher phone = userPhonNumPattern.matcher(userPhoneNum);
            if (userPhoneNum.equals("0")){
                System.out.println("초기화면으로 돌아갑니다");
                break;
            }
            else if (!phone.find()) {
                System.out.println("휴대폰 번호 양식에 맞춰서 다시 입력해주세요");
                System.out.println("ex) 010-1234-5678");
                continue;
            } else if (!userList.containsKey(userPhoneNum)) {
                System.out.println("ID를 찾을 수 없습니다");
                System.out.println("다시 한 번 정확히 입력해 주세요");
                continue;
            }
            for (cnt = 3; cnt > 0; cnt--) {
                System.out.println("비밀번호를 입력해주세요");
                userPwd = input.nextLine();

                if (userList.get(userPhoneNum).getUserPwd().equals(userPwd)) {
                    System.out.println();
                    System.out.println("***************");
                    System.out.println(userList.get(userPhoneNum).getUserName() + "님, 환영합니다!");
                    System.out.println("***************");
                    System.out.println();
                    Menu.cur_user_id = userPhoneNum;
                    break;

                } else {
                    if (cnt > 1) {
                        System.out.println("입력하신 비밀번호가 잘못되었습니다");
                        System.out.print((cnt - 1) + "번의 기회가 남았습니다. 올바른 ");
                    } else {
                        System.out.println("입력하신 비밀번호가 잘못되었습니다");
                        System.out.println("처음으로 돌아갑니다");
                        return cnt;
                    }
                }
            }
        }
        return cnt + 1;
    }

출력 예시

image

3. AdminSystem - addBike()

수정사항

  • 기존 코드에 이전화면으로 돌아가기(0) 추가
  • 등록 대수 입력 시 숫자를 제외한 아무키를 누를 경우 (try/catch) 취소 처리 (이전화면)
    HashMap<String, Bike> addBike() {
        System.out.println("등록하고자 하는 자전거의 종류를 입력하세요");
        System.out.println("1. 1인용 자전거 | 2. 2인용 자전거 | 0. 돌아가기");
        while (true) {
            int input = 0;
            try {
                input = Integer.parseInt(scan.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("1인용은 1번, 2인용은 2번, 이전 메뉴로 돌아가시려면 0번을 입력해 주세요");
                continue;
            }
            if (!(input == 1 || input == 2 | input == 0)) {
                System.out.println("1인용 혹은 2인용만 등록 가능합니다");
                System.out.println("1인용은 1번, 2인용은 2번, 이전 메뉴로 돌아가시려면 0번을 입력해 주세요");
            } else if (input == 0) {
                System.out.println("이전메뉴으로 돌아갑니다"); // 추가
                return null;
            } else {
                System.out.println("등록할 자전거 대수를 입력하세요 | 취소: 숫자 제외 아무키");
                int amount = 0;
                try {
                    amount = Integer.parseInt(scan.nextLine());
                } catch (NumberFormatException e) {
                    System.out.println("자전거 등록이 취소되었습니다");
                    System.out.println("이전 메뉴로 돌아갑니다");
                    return null;
                }
                String bikeId;
                if (input == 1) {
                    for (int i = 0; i < amount; i++) {
                        bikeId = String.format("S-%04d", bikeList.size());
                        bikeList.put(bikeId, new Bike(BikeType.Single, 1000));
                        io.writeBikeList();
                        System.out.println("[" + bikeId + "가 등록되었습니다]");
                    }
                    return bikeList;
                } else {
                    for (int i = 0; i < amount; i++) {
                        bikeId = String.format("T-%04d", bikeList.size());
                        bikeList.put(bikeId, new Bike(BikeType.Twin, 2000));
                        io.writeBikeList();
                        System.out.println("[" + bikeId + "가 등록되었습니다]");
                    }
                    return bikeList;
                }
            }
        }
    }

출력 예시

image

4. AdminSystem - removeBike()

수정사항

  • 기존 코드에 돌아가기(0번) 기능 추가
  • 삭제 일련번호 입력 시 취소 기능 추가
  • 특정 자전거 삭제 메서드 분리
   void removeBike() {
        io.loadRentList();
        int menu = 0;
        try {
            scan = new Scanner(System.in);
            System.out.println("원하는 삭제 방법을 선택해 주세요");
            System.out.println("1. 특정 자전거 삭제 | 2. 일괄 삭제 | 0. 돌아가기");
            menu = Integer.parseInt(scan.nextLine());
        } catch (NumberFormatException e) {
            System.out.println("숫자만 입력 가능합니다");
        }
        if (!(menu == 1 || menu == 2 | menu == 0)) {
            System.out.println("잘못 입력하셨습니다");
        } else if (menu == 0) {
            System.out.println("이전메뉴로 돌아갑니다"); // 추가
        }
        else if (bikeList.isEmpty()) {
            System.out.println("등록된 자전거가 없습니다."); // 수정
        } else if (menu == 2) {
            for (Map.Entry<String, Bike> entrySet : bikeList.entrySet()) {
                if (entrySet.getValue().getRentalStatus().equals(RentalStatus.UNAVAILABLE)) {
                    System.out.println("대여중인 자전거가 있습니다");
                    System.out.println("자전거를 모두 반납 후 시도해 주세요");
                    break;
                } else {
                    bikeList.clear();
                    System.out.println("리스트가 초기화 되었습니다");
                    io.writeBikeList();
                    break;
                }
            }
        } else removeById();
    }

    void removeById() {
        while (true) {
            String id = null;
            try {
                System.out.println("삭제 하고자 하는 자전거의 일련번호를 입력해 주세요");
                id = scan.nextLine();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            if (id.equals("0")){
                System.out.println("삭제가 취소되었습니다.");
                break;
            }
            else if (!bikeList.containsKey(id)) {
                System.out.println("일치하는 자전거가 없습니다 | 0. 취소");
            } else if (bikeList.get(id).getRentalStatus().equals(RentalStatus.UNAVAILABLE)) {
                System.out.println("해당 자전거는 대여중 입니다 | 0. 취소");
            } else {
                bikeList.remove(id);
                System.out.println(id + " 자전거가 삭제되었습니다");
                io.writeBikeList();
                break;
            }
        }
    }

###출력 예시
image

5. AdminSystem - adminLogin() / Menu - displayDefaultMenu()

  • 기존 코드에 ID 입력 및 비밀번호 입력 화면에서 초기화면 돌아가기 추가
  • 디폴트 메뉴 메서드에 3번 변수 a > '성공여부'로 변수명 변경
  • adminLogin 성공시만 true 값 반환받아 adminMenu 출력되도록 수정
boolean adminLogin() {
        String id;
        String pwd;
        while (true) {
            System.out.println("관리자 ID | 0. 초기화면");
            id = scan.nextLine().trim().toLowerCase();
            if (id.equals("0")) {
                System.out.println("초기화면으로 돌아갑니다"); // 돌아가기 추가
                return false;
            } else if (!adminMap.containsKey(id)) {
                System.out.println("ID가 맞지 않습니다. 재입력 해주세요");
            } else break;
        }
            System.out.println("관리자 비밀번호를 입력해주세요 | 0. 초기화면");
            pwd = scan.nextLine().trim();
            if (pwd.equals("0")) {
                System.out.println("초기화면으로 돌아갑니다");
            } else if (adminMap.get(id).equals(pwd)) {
                System.out.println("관리자 인증이 완료되었습니다!");
                return true;
            } else {
                System.out.println("비밀번호가 맞지 않습니다. 재입력 해주세요");
                adminLogin();
            } return false;
        }
public void displayDefaultMenu() { // 첫 메뉴 번호입력
        // 회원가입, 사용자 인증, 관리자 인증, 프로그램 종료
        while (true) {
            System.out.println();
            System.out.println("******비트를 타쇼 자전거 대여 시스템******");
            System.out.println("     원하는 메뉴의 번호를 입력하세요");
            System.out.println("        1. 회원 가입");
            System.out.println("        2. 사용자 인증");
            System.out.println("        3. 관리자 인증");
            System.out.println("        4. 프로그램 종료");
            System.out.println("**********************************");
            int menu;
            do {
                try {
                    menu = Integer.parseInt(input.nextLine());
                    if (menu >= 1 && menu <= 4) {
                        break;
                    } else {
                        throw new Exception("메뉴 번호 오류");
                    }

                } catch (Exception e) {
                    System.out.println("오류발생: " + e.getMessage());
                    System.out.println("1~4 중 다시 입력해주세요");
                }
            } while (true);

            switch (menu) {
                case 1:
                    userSystem.signUp();
                    break;
                case 2: // 변수명 수정
                    int isSuccess = userSystem.userLogin();
                    if (!(isSuccess == 1)) {
                        displayUserMenu();
                    }
                    break;
                case 3: // 로직 수정
                    if((adminSystem.adminLogin())) {
                        displayAdminMenu();
                    }
                    break;
                case 4:
                    System.out.println("이용해주셔서 감사합니다!");
                    return;
            }

        }
    }

출력 예시

image
image

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions