흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)

(파이썬, MySQL, 과제) 자판기 프로그램 본문

과제

(파이썬, MySQL, 과제) 자판기 프로그램

흰둥아솜사탕 2023. 3. 28. 10:02
728x90
반응형

MySQL

use kdt;

create table tb_machine(
	m_num int auto_increment primary key,
    m_name varchar(50) unique,
    m_price int not null,
    m_cnt int default 0
);

 

DTO

class MachineDTO:
    def __init__(self, mNum, mName, mPrice, mCnt):
        self.mNum = mNum
        self.mName = mName
        self.mPrice = mPrice
        self.mCnt = mCnt
    
    def setMNum(self, mNum):
        self.mNum = mNum
    
    def getMNum(self):
        return self.mNum
    
    def setMName(self, mName):
        self.mName = mName
        
    def getMName(self):
        return self.mName
    
    def setMPrice(self, mPrice):
        self.mPrice = mPrice
        
    def getMPrice(self):
        return self.mPrice
    
    def setMCnt(self, mCnt):
        self.mCnt = mCnt
        
    def getMCnt(self):
        return self.mCnt

DAO

import MySQLdb

class MachineDAO:
    def __init__(self):
        self.db = None
        
    def connect(self):
        self.db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
        
    def disconnect(self):
        self.db.close()
        
    def selectAll(self):
        self.connect()
        cur = self.db.cursor(MySQLdb.cursors.DictCursor)
        sql = "select m_num, m_name, m_price, m_cnt from tb_machine"
        cur.execute(sql)
        datas = []
        while True:
            data = cur.fetchone()
            if data:
                datas.append(data)
            else:
                break
        self.disconnect()
        return datas
    
    def selectOne(self, mNum):
        self.connect()
        cur = self.db.cursor(MySQLdb.cursors.DictCursor)
        sql = "select m_num, m_name, m_price, m_cnt from tb_machine  where m_num = %s"
        data = (mNum,)
        cur.execute(sql, data)
        data = cur.fetchone()
        self.disconnect()
        return data
    
    def insert(self, mDto):
        self.connect()
        cur = self.db.cursor()
        sql = "insert into tb_machine (m_name, m_price, m_cnt) values (%s, %s, %s)"
        data = (mDto.getMName(), mDto.getMPrice(), mDto.getMCnt())
        cur.execute(sql, data)
        self.db.commit()
        self.disconnect()

    def update(self, column, content, mNum):
        self.connect()
        cur = self.db.cursor()
        sql = "update tb_machine set " + column + " = %s where m_num = %s"
        data = (content, mNum)
        cur.execute(sql, data)
        self.db.commit()
        self.disconnect()
        
    def delete(self, mNum):
        self.connect()
        cur = self.db.cursor()
        sql = "delete from tb_machine where m_num = %s"
        data = (mNum,)
        cur.execute(sql, data)
        self.db.commit()
        self.disconnect()

Service

class AdminMachineService:
    def __init__(self):
        self.mDao = MachineDAO()
        
    def login(self):
        check = input('관리자 비밀번호를 입력하세요')
        if check == '1234':
            return True
        else:
            return False
        
    def showAll(self):
        datas = self.mDao.selectAll()
        for data in datas:
            print(f"제품번호 : {data['m_num']}\n제품명 : {data['m_name']}\n가격 : {data['m_price']}\n수량 : {data['m_cnt']}\n")
    
    def create(self):
        mName = input('제품명을 입력하세요: ')
        mPrice = int(input('가격을 입력하세요: '))
        mCnt = int(input('수량을 입력하세요: '))
        mDto = MachineDTO(_, mName, mPrice, mCnt)
        
        try:
            self.mDao.insert(mDto)
            print('제품이 등록되었습니다')
        except:
            print('이미 존재하는 제품입니다')
            
    def modify(self):
        columns = {1:'m_name', 2:'m_price', 3:'m_cnt'}
        mNum = int(input('제품번호를 입력하세요: '))
        columnNum = int(input('1. 제품명수정 2. 가격수정 3. 수량수정'))
        if columnNum<1 or columnNum>3:
            print('숫자를 잘못입력하셨습니다')
            return
        content = input('수정값을 입력하세요: ')
        column = columns[columnNum]
        
        try:
            self.mDao.update(column, content, mNum)
        except:
            print('수정사항을 다시 확인해주세요.')
    
    def drop(self):
        mNum = int(input('제품번호를 입력하세요: '))
        try:
            self.mDao.delete(mNum)
            print('삭제가 완료되었습니다')
        except:
            print('제품번호를 확인하세요')
class UserMachineService:
    def __init__(self):
        self.mDao = MachineDAO()
        self.money = 0
        
    def inputMoney(self):
        try:
            money = int(input('투입할 금액을 입력하세요: '))
            self.money += money
        except:
            print('잘못된 입력 방식입니다.')
            
        print(f'현재 잔액: {self.money}')
        
    def showAll(self):
        datas = self.mDao.selectAll()
        for data in datas:
            cnt_str = ''
            if data['m_cnt'] <= 0:
                cnt_str = '*********매진*********\n'
            print(f"{cnt_str}제품번호 : {data['m_num']}\n제품명 : {data['m_name']}\n가격 : {data['m_price']}\n")

    def pay(self):
        print(f'현재 잔액: {self.money}')
        mNum = int(input('제품번호를 입력하세요: '))
        data = self.mDao.selectOne(mNum)
        
        if data['m_cnt'] <= 0:
            print('매진된 상품입니다')
            
        elif self.money < data['m_price']:
            print('잔액이 부족합니다')
        
        else:
            self.money -= data['m_price']
            self.mDao.update('m_cnt', data['m_cnt']-1, data['m_num'])
            print('결제가 완료되었습니다.')
            print(f'남은 잔액: {self.money}')

    def returnMoney(self):
        print(f'반환 금액: {self.money}')
        self.money = 0

view

class Machine:
    def __init__(self):
        self.aMService = AdminMachineService()
        self.uMService = UserMachineService()
    
    def aRun(self):
        while True:
            
            menu = int(input('1.목록보기 2.제품등록 3.제품수정 4.제품삭제 0.관리자모드 종료'))
            
            if menu == 1:
                self.aMService.showAll()
            elif menu == 2:
                self.aMService.create()
            elif menu == 3:
                self.aMService.modify()
            elif menu == 4:
                self.aMService.drop()
            elif menu == 0:
                print('관리자 모드를 종료합니다')
                break
                
    def uRun(self):
        while True:
            
            menu = int(input('1.목록보기 2.잔액 충전 3. 구매하기 4. 잔액 반환 0.자판기 종료'))
            
            if menu == 1:
                self.uMService.showAll()
            elif menu == 2:
                self.uMService.inputMoney()
            elif menu == 3:
                self.uMService.pay()
            elif menu == 4:
                self.uMService.returnMoney()
            elif menu == 0:
                print('프로그램을 종료합니다')
                break                
            elif menu == 1234:
                if self.aMService.login():
                    self.aRun()
                else:
                    print('잘못된 접근입니다.')
start = Machine()
start.uRun()
728x90
반응형
Comments