python 项目之atm

1.需求分析:
card卡类:
卡号,密码,余额,锁定状态
cardid , password , money , islock

person 用户类:
用户名 身份证号 手机号 卡
name userid phone card

view 视图类
登录, 打印欢迎界面 , 打印操作界面

operation 操作类
把十个功能都在operation里面完成实现

# 主文件 main 当中进行操作
(1) 开户: register
(2) 查询: query
(3) 存钱: save_money
(4) 取钱: get_money
(5) 转账: trans_money
(6) 改密: change_pwd
(7) 锁卡: lock
(8) 解卡: unlock
(9) 补卡: new_card
(10)退出: save

2.基本要求
# 基本实现
取钱:卡是否存在,是否冻结,取钱金额是否正确
转账:把一个卡里的钱转到其他卡内 (卡是否存在,是否冻结,对方账户是否存在,转账的金额是否正确)
改密:(1)原密码改密 (2)身份证改密
解卡:判断卡号和身份证是否正确在选择解卡
补卡:将旧用户的所有信息和新卡绑定(包括名字,余额等所有卡信息和用户信息,数据重新绑定)


# 类型要判断
姓名不能为空,
密码6位包含字母数字大小写,
身份证号用正则匹配且不能为空,一个身份证号只能注册一次不能重复.
不能给自己转账
# main.py
from package.view import View
from package.operation import Operation

class Main():
    @staticmethod
    def run():
        if View.login():
            obj = Operation()
            while True:
                choice = input("请选择需要办理的业务:")
                if choice == "1":
                    obj.register()
                elif choice == "2":
                    obj.query()
                elif choice == "3":
                    obj.save_money()
                elif choice == "4":
                    obj.get_money()
                elif choice == "5":
                    obj.trans_money()
                elif choice == "6":
                    obj.change_pwd()
                elif choice == "7":
                    obj.lock()
                elif choice == "8":
                    obj.unlock()
                elif choice == "9":
                    obj.new_card()
                elif choice == "0":
                    obj.save()
                    break


if __name__ == "__main__":
    Main.run()
# 卡类card.py
# ### card 卡类
class Card():
    def __init__(self, cardid, password, money):
        self.cardid = cardid
        self.password = password
        self.money = money
        self.islock = False
# 视图类view.py
# ### view 视图类
import time


class View():
    def login():
        while True:
            name = input("请输入您的管理员账号:")
            pwd = input("请输入您的管理员密码:")
            if name == "admin" and pwd == "111":
                # 打印欢迎界面
                View.login_view()
                # 延迟一秒打印操作界面
                time.sleep(1)
                # 打印操作界面
                View.operation_view()
                return True
            print("抱歉,您的账户不正确,请重新输入")

    def login_view():
        print("*******************************************")
        print("*                                         *")
        print("*                                         *")
        print("*          Welcome To OldBoy Bank         *")
        print("*                                         *")
        print("*                                         *")
        print("*******************************************")

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


if __name__ == "__main__":
    View.login()
# 操作类operation.py
# ### operation 操作类
"""
如何往数据库存数据?
卡号:用户     123:user_obj
身份证:卡号   210201:123

"""
import os
import pickle
import random
from .card import Card
from .person import Person
import re
class Operation():
    # 当进入到系统的时,优先把数据库中的数据拿出来
    def __init__(self):
        self.load_user_dict()
        self.load_user_id_dict()
        print(self.user_dict)
        print(self.user_id_dict)

    # 加载{卡号:用户} 字典数据
    def load_user_dict(self):
        if os.path.exists("user.txt"):
            with open("user.txt", "rb") as fp:
                self.user_dict = pickle.load(fp)
        else:
            self.user_dict = {}

    # 加载{卡号:用户} 字典数据
    def load_user_id_dict(self):
        if os.path.exists("userid.txt"):
            with open("userid.txt", "rb") as fp:
                self.user_id_dict = pickle.load(fp)
        else:
            self.user_id_dict = {}

    def save(self):
        with open("user.txt", "wb") as fp:
            pickle.dump(self.user_dict, fp)

        with open("userid.txt", "wb") as fp:
            pickle.dump(self.user_id_dict, fp)

        # 用户注册
    def register(self):
        name = input("请输入您的姓名:")
        while True:
            userid = input("请输入您的身份证号:")
            userid1 = re.findall(r"^\d{17}[0-9]|X$", userid)
            if len(userid1) > 0:
                print("格式正确,可以注册!")
                break
            else:
                print("您输入身份证格式不正确,请重新输入!")
        while True:
            phone = input("请输入您的手机号:")
            phone1 = re.findall(r"^1[3|4|5|7|8]\d{9}$", phone)
            if len(phone1) > 0:
                print("格式正确,可以注册!")
                break
            else:
                print("您输入的手机号格式不正确,请重新输入!")
        # 获取密码
        password = self.get_pwd()
        # 获取卡号
        cardid = self.get_cardid()
        money = 10
        # 创建一张卡
        card = Card(cardid, password, money)
        # 创建一个用户
        user = Person(name, userid, phone, card)
        # 更新字典
        self.user_dict[cardid] = user
        self.user_id_dict[userid] = cardid
        print("恭喜%s开卡成功,您的卡号为:%s,卡内余额%s元" % (name, cardid, money))

    # 获取密码
    def get_pwd(self):
        while True:
            while True:
                pwd1 = input("请输入您的密码:")
                password1 = re.findall(r"^[1-9a-zA-Z,|%$#@&*^)(!?<>]{6}$", pwd1)
                if len(password1) > 0:
                    print("格式正确,可以注册!")
                    break
                else:
                    print("您输入的密码格式不正确,请重新输入!")
            pwd2 = input("请确认您的密码:")
            if pwd1 == pwd2:
                return pwd1
            else:
                print("两次密码不一致,请重新输入")

    # 获取卡号
    def get_cardid(self):
        while True:
            cardid = str(random.randrange(100000, 1000000))
            # 如果不在当前字典当中,证明该卡号可用
            if cardid not in self.user_dict:
                return cardid

    # 查询
    def query(self):
        card = self.get_card_info()
        if not card:
            print("抱歉,您的卡不存在")
        else:
            if card.islock:
                print("您的卡被锁住了")
            else:
                # 卡存在没有被锁住的情况下,让用户就行输入密码
                if self.check_pwd(card):
                    print("您的卡内余额是%s元" % (card.money))
    # 查询卡的信息
    def get_card_info(self):
        cardid = input("请输入您的卡号:")
        if cardid not in self.user_dict:
            return False
        else:

            user = self.user_dict[cardid]
            card = user.card
            return card

    # 如果输错三次卡就会被锁住
    def check_pwd(self, card):
        count = 1
        while count < 4:
            pwd = input("请输入您的密码:")
            if pwd == card.password:
                return True
            else:
                print("密码错误,您还剩余%s次机会" % (3-count))
                if count == 3:
                    card.islock = True
                    print("抱歉,因为密码错了三次,卡被锁住了")

            count += 1
    # 存钱
    def save_money(self):
        card = self.get_card_info()
        if not card:
            print("对不起,卡不存在")

        else:
            if card.islock:
                print("对不起你的卡被锁住了")

            else:
                user = self.user_dict[card.cardid]
                print("您这张卡的用户名是:%s" %(user.name))
                key_sure = input("确认存款请按 1 ,任意按键回上一层:")
                if key_sure == "1":
                    str_money = input("请输入零的存款金额:")
                    if str_money.isdecimal():
                        money = int(str_money)
                        card.money += money
                        print("成功存入%s元" % (money))
                    else:
                        print("您输入的金额有误")
    # 取钱
    def get_money(self):
        card = self.get_card_info()
        if not card:
            print("该卡不存在,请检查之后再输入。")
        else:
            user = self.user_dict[card.cardid]
            if self.check_pwd(card):
                while True:
                    qukuan = int(input("请输入取款的金额:"))
                    if user.card.money < qukuan:
                        print("您输入的取款金额有误,请重新输入!")
                    else:
                        user.card.money -= qukuan
                        print("取款成功%d" % (qukuan))
                        break

    # 锁卡
    def lock(self):
        card = self.get_card_info()
        if not card:
            print("对不起,您输入的卡不存在")

        else:
            num = input("1:使用密码冻结  2:使用身份证号冻结")
            if num == "1":
                if self.check_pwd(card):
                    card.islock = True
                    print("锁卡成功")

            elif num == "2":
                userid = input("请输入您的身份证号:")
                user = self.user_dict[card.cardid]
                if userid == user.userid:
                    card.islock = True
                    print("=====锁卡成功========")
                else:
                    print("锁卡失败")
    # 转账
    def trans_money(self):
        # 得到用户的卡的信息包括
        card = self.get_card_info()
        if not card:
            print("您输入的卡号不存在,请检查后再输入")
        else:
            if self.check_pwd(card):
                while True:
                    duifangzhanghu = input("请输入对方账户:")
                    if duifangzhanghu == card.cardid:
                        print("不能给自己转账,请重新输入账号!")
                        continue
                    user = self.user_dict[duifangzhanghu]
                    while True:
                        count_money = int(input("请输入转账金额:"))
                        num = input("您将给%s转账%s,确认请输入1,返回主菜单输入其他的键" % (user.name, count_money))
                        if num == "1":
                            if int(card.money) > int(count_money):
                                card.money -= count_money
                                print("您给%s成功转账%d元" %(user.name, count_money))
                                break
                            else:
                                print("转账金额有误!")
                        if num.isdecimal():
                            break
                    break
    # 改密码
    def change_pwd(self):
        card = self.get_card_info()
        if not card:
            print("您输入的卡号不存在")
        else:
            user = self.user_dict[card.cardid]
            num = input("1:原密码改密  2:身份信息改密")
            if num == "1":
                if self.check_pwd(card):
                    pwd_new = input("请输入你的新密码:")
                    pwd_new1 = input("请再次确认你的新密码:")
                    if pwd_new == pwd_new1:
                        user.card.password = pwd_new
                        print("修改密码成功")
            if num == "2":
                userid = input("请输入您的身份证号码:")
                if user.userid == userid:
                    pwd_new = input("请输入您的新密码:")
                    pwd_new1 = input("请再次确认你的密码:")
                    if pwd_new == pwd_new1:
                        user.card.password = pwd_new1
                        print("修改密码成功")

    # 解卡
    def unlock(self):
        card = self.get_card_info()
        if not card:
            print("您输入的卡号不存在,请检查后再次输入,谢谢!")
        else:
            user = self.user_dict[card.cardid]
            userid = input("请输入身份证号码:")
            if userid == user.userid:
                user.card.islock = False
                print("解卡成功")
    # 补卡
    def new_card(self):
        userid = input("请输入您的身份证号码:")
        cardid = self.user_id_dict[userid]
        user = self.user_dict[cardid]
        if userid in self.user_id_dict:
            new_cardid = self.get_cardid()
            print("%s补卡办理成功新卡号为:%s" % (user.name, new_cardid))
            self.user_dict.pop(cardid)
            self.user_id_dict.pop(userid)
            self.user_dict[new_cardid] = user
            self.user_id_dict[userid] = new_cardid
        else:
            print("您输入身份证号不正确,请检测后再输入")
项目要点:
1.怎么去存数据,和拿数据
2.把模块细化写,比如需要产生一个随机的卡号,由于我们需要判断每张卡是否重复,需要定义一个函数
def get_cardid()函数
检测密码:
无论是取钱还是存款还是查询都是需要输入密码的,而且输入密码之后会给卡一个状态即是锁卡还是非锁卡,于是又定义了一个函数
def check_pwd()
输入卡号的时候,假如输入的卡号本身就不存在那么就不能就行下面的操作,确定是一张卡之后才能就行下面的操作,于是定义了一个get_card_info()
编写注册模块的时候,出现了我们需要实例化一个卡,一个人而且还要就行绑定。
  1.其中操作类当中就是一个一个的操作方法,那么要操作其中的方法,必定需要数据,那么这个对象的属性就是存入的self.user_dict/self.user_id_dict()
  2.当退出整个操作的时候,我们需要就注册时候写的数据就行存下,从而设计了pickle.dump(存入数据,可以是多种类型的数据)序列化 pickle.load(读出数据)反序列化
3.最重要的一点,操作类的2张数据表,也就是字典uer_dict/user_id_dict 存入的是 什么对应关系,这个对本项目的影响是是最大的,我们需要用的数据类型是什么形式?当我们去银行办卡的时候会出现
两种的对应方式:(1)一个卡号:对应一个用户名 当你的卡不见了的时候,需要另外中关系是,身份证号:对应卡号,这样才能去完成补办。
4.main.py 模块的导入是典型的单入口模式。@staticmethod 无论是类还是对象都可以调用。

猜你喜欢

转载自www.cnblogs.com/longerandergou/p/10958928.html