小程序3:ATM小程序

ATM实现流程

1.欢迎界面和菜单

显示部分的代码代码放到view.py中

import time

class View():
    def login():
        """
        管理员登录
        :return: 
        """
        while True:
            username = input("请输入管理员用户名:")
            password = input("请输入管理员密码:")
            if username == 'admin' and password == '123':
                View.welcome_view()
                time.sleep(1)
                View.operate_view()
                return True
            else:
                print("管理员用户或密码错误,请重新输入")

    def welcome_view():
        """
        欢迎界面
        :return: 
        """
        print("**************************************")
        print("*                                    *")
        print("*                                    *")
        print("*     Welcome to Kengdie's Bank      *")
        print("*                                    *")
        print("*                                    *")
        print("**************************************")

    def operate_view():
        """
        菜单
        :return: 
        """
        print("**************************************")
        print("*       开户(1)         查询(2)       *")
        print("*       存钱(3)         取钱(4)       *")
        print("*       转账(5)         改密(6)       *")
        print("*       锁卡(7)         解卡(8)       *")
        print("*       补卡(9)         退出(0)       *")
        print("**************************************")

实现效果如下图所示

2.创建Card类和Person类

Card类存储了一个卡的基本信息,Card类相关参数如下所示:

class Card:
    def __init__(self,cardid,password,money):
        self.cardid = cardid # 卡号
        self.password = password # 卡号对应的密码
        self.money = money # 卡内余额
        self.islock = False # 卡的状态,False代表卡未被冻结

Person类存储了一个用户的基本信息,Person类相关参数如下所示:

class Person():
    def __init__(self,name,userid,phone,card):
        self.name = name # 用户姓名
        self.userid = userid # 身份证号
        self.phone = phone # 手机号
        self.card = card # 用户卡对象

3.通过pickle获取user.txt和userid.txt中的数据

 def __init__(self):
        """
        初始化方法,用来加载txt中文件数据
        """
        self.get_user_dict()
        self.get_userid_dict()

    def get_user_dict(self):
        """
        加载user.txt中的数据
        :return:
        """
        if os.path.exists("user.txt"):
            with open("user.txt", mode='rb') as fp:
                self.user_dict = pickle.load(fp)
        else:
            self.user_dict = {}

    def get_userid_dict(self):
        """
        加载userid.txt中的数据
        :return:
        """
        if os.path.exists("userid.txt"):
            with open("userid.txt", mode='rb') as fp:
                self.userid_dict = pickle.load(fp)
        else:
            self.userid_dict = {}

4.当我们选择为0,要实现保存操作

    def save(self):
        """
        存储两个字典
        :return:
        """
        with open("user.txt", mode='wb') as fp:
            pickle.dump(self.user_dict,fp) # 退出时,将字典写回文件中
        with open("userid.txt", mode='wb') as fp:
            pickle.dump(self.userid_dict,fp)

5.选择为1:开户(注册)功能

    def register(self):
        """
        开户(注册)
        :return:
        """
        name = self.check_name()
        userid = self.check_userid()
        phone = self.check_phone()
        password = self.get_pwd("请输入您的密码","请确认您的密码")
        cardid = self.get_cardid()
        money = 10
        card = Card(cardid,password,money)
        person = Person(name,userid,phone,card)

        self.user_dict[cardid] = person
        self.userid_dict[userid] = cardid

        print("恭喜{}开卡成功,卡号{},卡上余额{}元".format(name,cardid,money))

1.关于输入的合法性:在注册时,我们需要输入名字、身份证号、手机号等众多信息,而这些输入内容都需要进行正则匹配后才可以通过的

下面的函数是专门用来判断用户输入的内容是否合法:

  def check_name(self):
        """
        检查名字是否合法
        :return:
        """
        while True:
            name = input("请输入您的名字:")
            if name == "" or " "in name:
                print("名字不符合规范")
            else:
                return name


    def check_userid(self):
        """
        检查身份证号码是否规范
        :return:
        """
        while True:
            userid = input("请输入您的身份证号:")
            value = re.search("^d{6}([1-9]d{3})([0][1-9]|[1][0-2])([0][1-9]|[12][0-9]|[3][01])d{3}[Xd]$", userid)
            if value != None:
                return userid
            else:
                print("身份证号码不符合规范")

    def check_phone(self):
        """
        检查手机号是否规范
        :return:
        """
        while True:
            phone = input("请输入您的手机号:")
            value = re.findall("^[1][3-9]d{9}$",phone)
            if value != []:
                return value
            else:
                print("手机号不符合规范")

    def check_pwd(self,check_pwd):
        """
        检测密码是否规范
        :param check_pwd:
        :return:
        """
        value = re.findall("^w{6}$",check_pwd)
        if value != []:
            return value[0]
        else:
            print("密码不符合规范")

2.关于获取卡号:当用户正确的填写信息后,我们需要赋予用户一个卡号,所以我们需要一个生成卡号的函数:

    def get_cardid(self):
        """
        获取随机卡号
        :return:
        """
        while True:
            cardid = str(random.randrange(100000,1000000))
            if cardid not in self.user_dict:
                return cardid

3.关于user.txt和userid.txt中数据的存储形式:当我们注册成功时,我们应该存储一些用户信息放到字典中

下面规定了数据的存储形式:

user.txt : {卡号1:用户对象1,卡号2:用户对象2,卡号3:用户对象3}

userid.txt : {身份证号1:卡号1,身份证号2:卡号2,身份证号3:卡号3}

4.实现效果如下图所示:

选择为2:查询用户卡余额

    def query(self):
        """
        查询用户卡内余额
        :return:
        """
        card = self.get_card_info()
        if not card:
            print("抱歉,这张卡不存在")
        else:
            if card.islock:
                print("您的账户已经被冻结")
            else:
                if self.pwd_validation(card):
                    print("您的卡内余额为{}元".format(card.money))

1.输入卡号获取卡号所对应的用户对象:无论是现在的查询操作,还是后面的其他操作,我们会经常需要根据当前卡号获取当前卡号所对应的卡号对象

所以我们需要定义一个get_card_info方法,目的是根据输入的用户卡号获取卡号对象,方便后面的操作

    def get_card_info(self):
        """
        获取卡号
        :return:
        """
        cardid = input("请输入您的卡号:")
        if cardid not in self.user_dict:
            return False
        else:
            user = self.user_dict[cardid]
            return user.card

2.关于逻辑:如下图所示

3.关于输入密码正确与否,以及输错次数的限定,我们需要单独定义一个函数

    def pwd_validation(self,card):
        """
        密码验证
        :param card:
        :return:
        """
        times = 1
        while times < 4:
            password = input("请输入您的密码:")
            if password == card.password:
                return True
            else:
                print("密码输入错误,您还有{}次机会".format(3-times))
                # print(card.password)
                if times == 3:
                    card.islock = True
                    print("由于您多次输入密码错误,您的账户已经被冻结~")
            times += 1

4.实现效果如下图所示

3.选择为3:存钱

    def save_money(self):
        """
        存钱
        :return:
        """
        card = self.get_card_info()
        if not card:
            print("抱歉,这张卡不存在")
        else:
            user = self.user_dict[card.cardid] # 给卡号获取用户对象
            print("您这张卡的用户名为{}".format(user.name)) # 根据用户对象取用户名
            key_sure = input("确认存钱请按1 ,按其他键返回上一层:") # 确认按钮
            if key_sure == "1":
                str_money = input("请输入您的存款金额:")
                if str_money.isdecimal() and str_money != "0": # 输入金额必须是纯数字且不可以存0元
                    money = int(str_money)
                    card.money += money # 存的钱+卡内的钱=现在卡里有多少钱
                    print("您已经成功存入{}元".format(money))
                else:
                    print("输入存款金额非法")

1.需要注意的是:可以根据user_dict中的键:card.cardid获取到值:user(用户对象)-->用来显示用户名

2.实现效果如下图所示

4:选择为4:取钱

   def get_money(self):
        """
        取钱
        :return:
        """
        card = self.get_card_info()
        if not card:
            print("抱歉,这张卡不存在")
        else:
            if card.islock:
                print("您的账户已经被冻结")
            else:
                if self.pwd_validation(card):
                    while True:
                        money = input("请输入您的取款金额:")
                        if money.isdecimal() and money != "0":
                            money = int(money)
                            if money <= card.money:# 只有输入的取款金额小于卡内的余额,才可以取款
                                card.money -= money
                                print("您已经成功取款{}元,还剩{}元".format(money,card.money))
                                break
                            else: # 如果输入的取款金额大于卡内的余额,提示余额不足
                                print("银行卡内余额不足,请重新输入")
                        else:
                            print("输入金额非法")

1.需要注意的是:只有取款金额小于卡内的余额,才可以成功取款

2.关于逻辑:如下图所示

3.实现效果如下图所示

原文地址:https://www.cnblogs.com/libolun/p/13493140.html