파이썬

[파이썬] 숙소 예약 프로그램 3일차 오픈소스

Nohsw 2023. 12. 29. 21:24
#키오스크 만들어보기
import time
import getpass
from Kiosk_File.kiosk_reservation import *
from Kiosk_File.kiosk_reservation_check import *

reser = Kiosk_reservation_Package()
reser_check = Kisok_reservation_ckeck_Package(reser)

class Kiosk:    
    def __init__(self):
        self.admin_password = "admin"
        self.admin_authenticateed = False

    def process_user_input(self, user_input):
        if user_input == "1": #예약
            print("\n[안내] 예약 화면으로 이동합니다. 잠시만 기다려 주십시오.\n")
            time.sleep(0.5)
            reser.clear_screen() #cmd 화면 지우기
            reser.reservation() #예약 화면 메뉴
            reser.clear_screen()

        elif user_input == "2": #예약 확인
            print("\n[안내] 예약 확인 화면으로 이동합니다. 잠시만 기다려 주십시오.\n")
            time.sleep(2)
            reser.clear_screen()
            reser_check.user_check()  # 인스턴스를 통한 접근
        
        elif user_input == "3": #예약자 명단
            reser.clear_screen()
            if self.admin_authenticateed or self.authenticate_admin():
                reser.display_user_info()
            else:
                print("\n[안내] 비밀번호를 틀렸습니다. 접속할 수 없습니다.")
                print("메뉴로 돌아갑니다.")
                time.sleep(2)
                reser.clear_screen()
        
        elif user_input == "4": #종료
            print("\n[안내] 프로그램을 종료합니다.\n")
        
        else:
            print("잘못된 입력입니다. 다시 입력해주세요.")

    def authenticate_admin(self):
        print("[안내] 관리자 암호가 필요합니다. 암호를 입력해주세요.")
        admin_password_input = getpass.getpass("입력: ")
        if admin_password_input == self.admin_password:
            self.admin_authenticate = True
            return True
        else:
            return False
        
while True:
    print("\n키오스크 테스트\n")
    print("[1. 예약]\n[2. 예약 확인]\n[3. 예약자 명단]\n[4. 종료]")
    
    kiosk = Kiosk()
    print()
    user_input = input("입력:")
    kiosk.process_user_input(str(user_input))

    #3번 입력 시 프로그램 종료
    if user_input == "4":
        break

메인.py

import os
import time

class Kiosk_reservation_Package:
    def __init__(self):
        self.user_info = []

    def clear_screen(self):
        if os.name == 'nt':
            os.system('cls')
        else:
            os.system('clear')

    def reservation_save_file(self, user_info):
        print("\n저장하였습니다.\n")
        header = "이름\t전화번호\n"
        with open("reservation.txt", "a", encoding="utf8") as reservation_save_file:
            if not os.path.exists("reservation.txt"):
                reservation_save_file.write(header)
            print(f"예약자 이름: {user_info['name']}\n예약자 휴대폰번호: {user_info['phoneNumber']}\n", 
                  file=reservation_save_file)

    def reservation_load_file(self):
        print("\n파일을 불러옵니다.")
        try:
            with open("reservation.txt", "r", encoding="utf8") as reservation_load_file:
                for line in reservation_load_file:
                    print(line, end="")
        except FileNotFoundError:
            print("파일을 찾을 수 없습니다.")

    def reservation(self):
        print("\n[안내] 키오스크 예약 화면입니다.\n")
        print("[1. 숙소 예약]\n[2. 테스트]")
        r_user_input = input("입력:")

        if r_user_input == "1":
            print("\n[안내] 숙소를 예약하겠습니다.\n")
            while True:
                name = input("\n[안내] 예약할 예약자님의 이름을 입력해주세요.\n입력: ")
                phoneNumber = input("\n[안내] 예약자님의 전화번호를 입력해주세요.\n입력: ")
                self.clear_screen()

                print("\n[안내] 입력하신 정보를 확인해주세요.\n")
                print(f"이름: {name}\n전화번호: {phoneNumber}\n")
                info = input("[안내] 입력하신 정보가 맞으면 Y를, 다르면 N을 입력해주세요:")
                
                if info == "Y" or info == "y":
                    print("예약이 완료되었습니다. 메인화면으로 이동합니다.")
                    user_info = {"name": name, "phoneNumber": phoneNumber}
                    self.user_info.append(user_info)
                    self.reservation_save_file(user_info)
                    time.sleep(3)
                    break
                elif info == "N" or info == "n":
                    print("예약을 다시 시도합니다. 잠시만 기다려주십시오.")
                    time.sleep(3)
                    self.clear_screen()
                else:
                    print("잘못 입력하였습니다. 처음부터 다시 입력해주세요.")
            return name, phoneNumber
            
        elif r_user_input == "2":
            print("\n테스트\n")

        else:
            print("else")
    
    def display_user_info(self):
        if not self.user_info:
            print("예약한 정보가 없습니다.")
        else:
            print("\n[안내] 예약자가 예약한 정보입니다.\n")
            for idx, user_info in enumerate(self.user_info, start=1):
                print(f"예약 번호: {idx}\n이름: {user_info['name']}\n전화번호: {user_info['phoneNumber']}\n")

예약.py

from Kiosk_File.kiosk_reservation import Kiosk_reservation_Package
import time

class Kisok_reservation_ckeck_Package:
    def __init__(self, reser_instance):
        self.user_name_found = False
        self.reser = reser_instance
        self.reservation = Kiosk_reservation_Package()
        

    def user_check(self): #예약자 이름 입력
        print("[안내] 휴대폰번호를 입력해주세요.")
        userCheck = input("입력: ")    

        #리스트에 정보가 있고 입력한 정보가 있을 때 출력
        for self.user_info in self.reser.user_info:
            if self.user_info["phoneNumber"] == userCheck:
                self.user_name_found = True
                print("\n[안내] 예약한 정보를 확인중입니다. 잠시만 기다려주십시오.")
                time.sleep(2)                
                print("\n[안내] 예약한 정보를 찾았습니다.\n")
                print("예약 번호: {0}\n예약자: {1}\n휴대폰 번호: {2}".format(
                    self.reser.user_info.index(self.user_info) + 1,
                    self.user_info["name"],
                    self.user_info["phoneNumber"]
                ))
                break
            
        else:
            print("\n[안내] 예약한 정보를 확인중입니다. 잠시만 기다려주십시오.")
            time.sleep(2)
            print("\n[안내] 입력한 예약자를 찾을 수 없습니다. 예약을 부탁드립니다.")

        self.user_notFound()
        

        
        #리스트에 정보가 완전히 없을 때 출력
    def user_notFound(self):
        if not self.user_name_found:
            print("\n예약 정보가 없습니다.")

예약 확인.py

 

업데이트 후 프로그램 작동 영상

 

오늘은 코드 업데이트를 조금 진행했다.

버그가 몇 개 있었는데 모두 고쳤다.

버그 내용:

1. 예약.py에서 예약자의 정보 저장 후 예약 확인.py로 데이터를 가져오는 과정에서 예약자가 예약을 확인 할 때마다 예약자 수만큼 print문이 실행.

예) 예약이 n개 되었다고 했을 때 마지막에 예약한 사람이 예약확인을 했을 경우,

print("\n[안내] 예약한 정보를 확인중입니다. 잠시만 기다려주십시오.")

예약 번호가 1번일 때는 바로 예약자 명단이 출력되지만 n번 이상일때는 위 코드가 n번 실행 후 예약자 명단을 출력했음.

2. 이름이 같은 동일인이 있을 경우를 대비하여 예약 확인을 이름에서 휴대폰번호로 변경.

3. 예약 리스트 접속 시 보안 상 관리자 암호를 안보이게 처리.