Python银行实战系统

先附上源代码:

│ admin.py                         管理员界面
│ alluser.txt                        保存用户信息
│ atm.py                             银行的各部分操作方法(存钱取钱等等)
│ card.py                            定义卡的类
│ main.py                           主程序 while True
│ user.py                            用户的类
 
 

main.py的源代码

"""
人
类名:User
属性:姓名  身份证号  电话号  卡
行为:

卡
类名:Card
属性:卡号  密码  余额
行为:

提款机
类名:ATM
属性:用户字典
行为:开户  查询  取款  存款  转账  改密  锁定  解密  补卡  销户  退出

管理员
类名:Admin
属性:
行为:管理员界面  管理员验证  系统功能界面

"""
import os
import pickle

import admin
from atm import ATM


def main():
    # 管理员对象
    admin1 = admin.Admin()

    # 管理员开机
    admin1.printAdminView()
    if admin1.adminOption():
        return -1

    # 提款机对象
    filepath = os.path.join(os.getcwd(), "alluser.txt")
    f = open(filepath, "rb")
    allUsers = pickle.load(f)
    f.close()
    atm = ATM(allUsers)

    while True:
        admin1.printFunctionView()
        # 等待用户的操作
        option = input("请输入您的操作:")
        if option == "1" or option == "开户":
            atm.creatUser()
        elif option == "2" or option == "查询":
            atm.searchUserInfo()
        elif option == "3" or option == "取款":
            atm.withdrawals()
        elif option == "4" or option == "存款":
            atm.saveMoney()
        elif option == "5" or option == "转账":
            atm.transferMoney()
        elif option == "6" or option == "改密":
            atm.changePasswd()
        elif option == "7" or option == "锁定":
            atm.lockUser()
        elif option == "8" or option == "解锁":
            atm.unlockUser()
        elif option == "9" or option == "补卡":
            atm.newCard()
        elif option == "0" or option == "销户":
            atm.killUser()
        elif option == "t" or option == "退出":
            if not admin1.adminOption():
                # 将当前系统中的用户信息保存到文件中
                f = open(filepath, "wb")
                pickle.dump(atm.allUsers, f, 2)
                f.close()
                return -1
        else:
            print("指令错误,请重新输入!!")

        admin.timeFlush()


if __name__ == '__main__':
    main()

admin.py的源代码

import time


def timeFlush():
    sum = 2  # 设置倒计时时间
    timeflush = 0.25  # 设置屏幕刷新的间隔时间
    for i in range(0, int(sum / timeflush)):
        list = ["\\", "|", "/", "—"]
        index = i % 4
        print("\r操作成功!请稍等 {} ".format(list[index]), end="")
        time.sleep(timeflush)


class Admin(object):
    admin = "1"
    passwd = "1"

    def printAdminView(self):
        print("*****************************************************************")
        print("*                                                               *")
        print("*                                                               *")
        print("*                     欢迎登录csdn银行                           *")
        print("*                                                               *")
        print("*                                                               *")
        print("*****************************************************************")

    def printFunctionView(self):
        print("\r*****************************************************************")
        print("*             开 户(1)                    查 询(2)                *")
        print("*             取 款(3)                    存 款(4)                *")
        print("*             转 账(5)                    改 密(6)                *")
        print("*             锁 定(7)                    解 锁(8)                *")
        print("*             补 卡(9)                    销 户(0)                *")
        print("*                          退 出(t)                               *")
        print("*******************************************************************")

    def adminOption(self):
        inputAdmin = input("请输入管理员账号:")
        if self.admin != inputAdmin:
            print("账号输入有误!!")
            return -1
        inputPasswd = input("请输入管理员密码:")
        if self.passwd != inputPasswd:
            print("密码输入有误!!")
            return -1

        # 能执行到这里说明账户密码正确!!
        timeFlush()
        return 0

user.py的源代码

class User(object):
    def __init__(self, name, idCard, phone, card):
        self.name = name
        self.idCard = idCard
        self.phone = phone
        self.card = card

card.py的源代码

class Card(object):
    def __init__(self, cardId, cardPasswd, cardMoney):
        self.cardId = cardId
        self.cardPasswd = cardPasswd
        self.cardMoney = cardMoney
        self.cardLock = False

atm.py的源代码

import random

from card import Card
from user import User


class ATM(object):
    def __init__(self, allUsers):
        self.allUsers = allUsers

    # 开户
    def creatUser(self):
        # 向用户字典中添加一对键值对(卡号 -- 用户)
        name = input("请输入您的姓名:")
        idCard = input("请输入您的身份证号码:")
        phone = input("请输入您的电话号码:")

        prestoreMoney = int(input("请输入预存储金额:"))
        if prestoreMoney < 0:
            print("预存储金额有误!!开户失败")
            return -1

        onePasswd = input("请设置密码:")
        # 验证密码
        if not self.checkPasswd(onePasswd):
            print("密码输入错误!!开户失败")
            return -1

        # 生成随机的卡号
        cardId = self.randomCardId()

        # 生成卡的信息
        card = Card(cardId, onePasswd, prestoreMoney)
        # 生成用户信息
        user = User(name, idCard, phone, card)

        # 存到字典里面
        self.allUsers[cardId] = user
        print("您的卡号是%s, 请牢记卡号!!" % cardId)

    # 查询
    def searchUserInfo(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1
        print("账号:%s    余额:%d" % (user.card.cardId, user.card.cardMoney))

    # 取款
    def withdrawals(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1

        # 进行到这一步说明卡号信息都正确,进行取款操作
        theMoney = int(input("请输入您需要取款的金额:"))
        if theMoney > user.card.cardMoney:
            print("余额不足!!")
            return -1
        elif theMoney < 0:
            print("您输入金额有误!!")
        else:
            user.card.cardMoney -= theMoney
            print("取款成功!! 余额为:%d" % user.card.cardMoney)

    # 存款
    def saveMoney(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1

        # 进行到这一步说明卡号信息都正确,进行存款操作
        theMoney = int(input("请输入您需要存款的金额:"))
        if theMoney < 0:
            print("您输入金额有误!!")
        else:
            user.card.cardMoney += theMoney
            print("存款成功!! 余额为:%d" % user.card.cardMoney)

    # 转账
    def transferMoney(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1

        # 到这里说明卡号信息正确,进行转账操作
        theOtherCardId = input("请输入您需要转账的卡号:")
        # 验证是否存在该卡号
        otheruser = self.allUsers.get(theOtherCardId)
        if not otheruser:
            print("该卡号不存在!!转账失败")
            return -1
        if otheruser.card.cardLock:
            print("该卡已被锁定!!")
            return -1
        theOtherCardName = input("请输入您需要转账人的姓名:")
        # 验证转账人的姓名是否正确
        if otheruser.name != theOtherCardName:
            print("转账人姓名输入错误")
            return -1
        print("您的账户为%s   您的余额为%d" % (user.card.cardId, user.card.cardMoney))
        # 开始转账
        theMoney = int(input("请输入您需要转账的金额:"))
        if theMoney < 0:
            print("您输入金额有误!!")
        else:
            user.card.cardMoney -= theMoney
            otheruser.card.cardMoney += theMoney
            print("转账成功!!您的余额为%d" % user.card.cardMoney)
            return -1

    # 改密
    def changePasswd(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1

        # 下面进行改密操作
        newPasswd = input("请输入新密码:")
        if newPasswd == user.card.cardPasswd:
            print("新旧密码不能一致!!操作失败")
            return -1
        # 验证密码
        if not self.checkPasswd(newPasswd):
            print("密码输入错误!!")
            return -1
        user.card.cardPasswd = newPasswd
        print("密码修改成功!!请牢记您的密码")

    # 锁定
    def lockUser(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!输入错误")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后再使用其他功能")
            return -1
            # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!锁定失败")
            return -1
        tempIdCard = input("请输入您的身份证号码")
        if tempIdCard != user.idCard:
            print("身份证输入错误!!锁定失败")
            return -1
        # 进行到这一步说明信息输入成功,锁定开始
        user.card.cardLock = True
        print("锁定成功")

    # 解锁
    def unlockUser(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!输入错误")
            return -1
        if not user.card.cardLock:
            print("该卡没有被锁定!!无需解锁")
            return -1
            # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!锁定失败")
            return -1
        tempIdCard = input("请输入您的身份证号码")
        if tempIdCard != user.idCard:
            print("身份证输入错误!!锁定失败")
            return -1
        # 进行到这一步说明信息输入成功,解锁开始
        user.card.cardLock = False
        print("解锁成功")

    # 补卡
    def newCard(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1

        CardName = input("请输入您的姓名:")
        # 验证姓名是否正确
        if user.name != CardName:
            print("姓名输入错误!!")
            return -1

        useridCard = input("请输入您的身份证号码:")
        # 验证身份证是否正确
        if user.idCard != useridCard:
            print("身份证号码输入错误!!")
            return -1

        # 进行到这一步说明信息都正确,下面进行补卡操作,只换卡号,其他信息都不换
        newIdCard= self.randomCardId()
        self.allUsers[newIdCard] = self.allUsers.pop(user.card.cardId)
        user.card.cardId = newIdCard
        print("您的新卡号为:%s  请牢记!!" % user.card.cardId)

    # 销户
    def killUser(self):
        cardNum = input("请输入您的卡号:")
        # 验证是否存在该卡号
        user = self.allUsers.get(cardNum)
        if not user:
            print("该卡号不存在!!查询失败")
            return -1
        if user.card.cardLock:
            print("该卡已被锁定!!请解锁后在进行其他操作!")
            return -1

        # 验证密码
        if not self.checkPasswd(user.card.cardPasswd):
            print("密码输入错误!!该卡已被锁定!!请解锁后在进行其他操作!")
            user.card.cardLock = True
            return -1

        CardName = input("请输入您的姓名:")
        # 验证姓名是否正确
        if user.name != CardName:
            print("姓名输入错误!!")
            return -1

        useridCard = input("请输入您的身份证号码:")
        # 验证身份证是否正确
        if user.idCard != useridCard:
            print("身份证号码输入错误!!")
            return -1

        answer = input("请问您确定要销户吗?确定(1)  取消(2)")
        if answer == "1" or answer == "确定":
            del self.allUsers[cardNum]
            print("已销户")
            return -1
        elif answer == "2" or answer == "取消":
            print("取消成功!!")
            return -1
        else:
            print("输入错误!!")
            return -1

    # 验证密码
    def checkPasswd(self, realPasswd):
        for i in range(3):
            tempPasswd = input("请再次输入密码:")
            if tempPasswd == realPasswd:
                return True

        return False

    def randomCardId(self):
        while True:
            str = ""
            for i in range(6):
                # 随机生成一个数字
                ch = chr(random.randrange(ord("0"), ord("9") + 1))
                str += ch

            # 判断是否重复
            if not self.allUsers.get(str):
                return str

alluser.txt源代码

�}q X   123456qcuser
User
q)�q}q(X   nameqX   1qX   idCardqhX   phoneqhX   cardq	ccard
Card
q
)�q}q(X   cardIdq
hX
   cardPasswdqhX	   cardMoneyqKX   cardLockq�ububs.

因为运用pickle库,要持久化存储用户信息(字典),故打开读取写入会乱码,第一排中的123456是卡号,其他信息全部是1,不要试图pycharm中修改这个allUsers。txt文件,否则会产生无法启动程序的bug,这个笔者也不知道该如何改进乱码现象,希望读者能优化

如果遇到因为alluser.txt而无法运行的情况:请往下看:

因为pickle库的原因,开始我们是要读取这个文件的,读的到程序顺利,读不到程序凉凉,故我们必须要在alluser.txt里面有pickle库可以识别的源代码。如果您是在pycharm里面复制粘贴的因为alluser.txt代码,故pycharm会自动转化为utf-8或者其他

我们要先把alluser.txt删除,让pickle库先不读取,创建一个空字典,我们先开户,然后退出程序是会自动创建一个新的alluser.txt文件,会把我们刚刚创建好的用户信息全部保存在txt文件中,这样我们再恢复,达到持久化保存的目的

filepath = os.path.join(os.getcwd(), "alluser.txt")
	# 把之前的给注释掉,不让程序读取
    # f = open(filepath, "rb")
    # allUsers = pickle.load(f)
    # f.close()
    # 创建一个新的空字典
    allUsers = {}
    atm = ATM(allUsers)

然后我们进行开户操作,最后退出,会自动创建一个全新的alluser.txt文件

filepath = os.path.join(os.getcwd(), "alluser.txt")
    f = open(filepath, "rb")
    allUsers = pickle.load(f)
    f.close()
    # 然后我们恢复它
    # allUsers = {}
    atm = ATM(allUsers)

ok,完成了

运行结果:

Python银行实战系统_第1张图片
如有疑惑请联系笔者

你可能感兴趣的:(Python练习)