Python簡易銀行システム

17869 ワード

機能:口座開設、照会、引き出し、預金、振替、秘密変更、ロック解除、カード補充、口座販売、退出
簡単な説明:ユーザーは身分証明書番号で口座を開設して銀行カード番号を登録する必要があり、照会、預金引き出しなどの機能を実現することができる.このシステムは主にオブジェクト向けの方法を採用し,情報記憶方式はjsonモジュールを用いて記憶する.(データストレージはpickleモジュールも使用できます.宝くじシステムはすでに採用されています.このシステムはpickleモジュールではなく、jsonモジュールを採用しています.以下、jsonとpickleの長所と短所を簡単に紹介します.個人的な見解です)
システムの主関数:
説明:
1、このシステムがファイルの絶対パスを取得する方法はosモジュールを採用する(宝くじシステムは指定の方式で絶対パスを取得する)
2、データストレージ:
終了時には、書き込みデータ方式は「a」(追加)ではなく「w」である.
理由:終了時に書き込みデータを「a」(追加)にすると、プログラムを実行するたびにデータ量が倍増し、メモリがいっぱいになりやすい.
3、ファイル操作:
文の中で2つの方式を採用してファイルに対して操作を行って、1つはファイルを読み終わった後に自動的にファイルを閉じます(つまりwith方式で)、1つはファイルを読み終わった後に手動でファイルを閉じなければなりません
from amt import Amt
from admin import Admin
from card import Card
from uers import Uers
import os
import json

def Main():
    admin = Admin()
    allUserDict = {}
    path = os.path.join(os.getcwd(), "allUers.txt")
    with open(path,"r") as f:
        for line in f.readlines():
            dict1 = eval(line)
            user = Uers.dict2obj(dict1)
            allUserDict[user.bankCard.bankCardNum] = user
    amt = Amt(allUserDict)
    admin.printAdminView()
    if admin.adminOption() == -1:
        print("            !      ...".center(48,"*"))
        return -1
    while True:
        admin.printSysFunctionView()
        operation = input("       :".center(42," "))
        if operation == "1":
            print("  ".center(48,"*"))
            amt.createUers()
        elif operation == "2":
            print("  ".center(48,"*"))
            amt.query()
        elif operation == "3":
            print("  ".center(48,"*"))
            amt.getMoney()
        elif operation == "4":
            print("  ".center(48,"*"))
            amt.saveMoney()
        elif operation == "5":
            print("  ".center(48,"*"))
            amt.transferMoney()
        elif operation == "6":
            print("  ".center(48,"*"))
            amt.changePassword()
        elif operation == "7":
            print("  ".center(48,"*"))
            amt.lockCard()
        elif operation == "8":
            print("  ".center(48,"*"))
            amt.solutionCard()
        elif operation == "9":
            print("  ".center(48,"*"))
            amt.repairCard()
        elif operation == "0":
            print("  ".center(48,"*"))
            amt.destoryCard()
        elif operation == "t":
            print("  ".center(48,"*"))
            close = admin.adminOption()
            if close != -1:
                print("      !".center(43,"*"))
                f = open(path, "w", encoding="utf-8")
                for key, value in allUserDict.items():
                    json.dump(value, f, default=Uers.obj2dict)
                    f.write("
") f.close() return -1 else: print(" ! ...".center(33,"*")) continue else: print(" ! ...".center(38,"*")) return -1 if __name__ == "__main__": Main()

システムのメインインタフェースモジュール:
主にシステムインタフェースの表示を実現する. 
import time
class Admin(object):
    def __init__(self):
        self.admin = "1"
        self.passwd = "1"

    def printAdminView(self):
        print("**************************************************")
        print("*                                                *")
        print("*                                                *")
        print("*                                     *")
        print("*                                                *")
        print("*                                                *")
        print("*                                                *")
        print("**************************************************")

    def printSysFunctionView(self):
        print("**************************************************")
        print("*          (1)             (2)               *")
        print("*          (3)             (4)               *")
        print("*          (5)             (6)               *")
        print("*          (7)             (8)               *")
        print("*          (9)             (0)               *")
        print("*                  (t)                         *")
        print("**************************************************")

    def adminOption(self):
        inputAdmin = input("        :")
        inputPasswd = input("        :")
        if self.admin != inputAdmin or self.passwd != inputPasswd:
            return -1
        time.sleep(1)
        return True

if __name__ == "__main__":
    pass

システム機能モジュール:
主にシステムの口座開設、照会、引き出しなどの機能を実現する.
from card import Card
from uers import Uers
import check

class Amt(object):
    def __init__(self, allUers):
        self.allUers = allUers

    def createUers(self):
        name = input("       :").strip()
        if not check.checkName(name):
            return -1
        identityCardNum = input("          :").strip()
        if not check.checkIdentity(identityCardNum):
            return -1
        phoneNum = input("         :").strip()
        if not check.checkPhone(phoneNum):
            return -1
        bankCardNum = check.getBankCardNum()
        #             ,        
        while True:
            if self.allUers.get(bankCardNum) != None:
                bankCardNum = check.getBankCardNum()
            else:
                break
        prestoredMoney = int(input("        :"))
        if not check.checkPrestoredMoney(prestoredMoney):
            return -1
        onePassword = input("       :").strip()
        for x in range(2):
            if not check.checkPassword(onePassword):
                print("       !")
            else:
                break
        else:
            print("       !    ...")
            return -1
        #        ,       
        card = Card(bankCardNum, onePassword, prestoredMoney)
        #         ,       
        uers = Uers(name, identityCardNum, phoneNum, card)
        self.allUers[bankCardNum] = uers
        print("   !    ,       :", bankCardNum)

    def query(self):
        bankCardNum = input("       :").strip()
        cardPassword = input("       :").strip()
        uers = self.allUers.get(bankCardNum)
        if uers == None or uers.bankCard.bankCardPassword != cardPassword:
            print("           !")
            return -1
        if uers.bankCard.bankCardLock:
            print("      !          ...")
            return -1
        print("   :%s
:%d" % (uers.bankCard.bankCardNum, uers.bankCard.bankCardMoney)) def getMoney(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 money = int(input(" :")) if uers.bankCard.bankCardMoney > money: uers.bankCard.bankCardMoney -= money else: print(" !") return -1 print(" :%s
:%d" % (uers.bankCard.bankCardNum, uers.bankCard.bankCardMoney)) def saveMoney(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 money = int(input(" :")) uers.bankCard.bankCardMoney += money print(" :%s
:%d" % (uers.bankCard.bankCardNum, uers.bankCard.bankCardMoney)) def transferMoney(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 receiveBankCardNum = input(" :").strip() receiveUers = self.allUers.get(receiveBankCardNum) if receiveUers == None: print(" !!!") return -1 transferMoney = int(input(" :")) if transferMoney > uers.bankCard.bankCardMoney: print(" ! ...") return -1 uers.bankCard.bankCardMoney -= transferMoney receiveUers.bankCard.bankCardMoney += transferMoney print(" :%s
:%d" % (uers.bankCard.bankCardNum, uers.bankCard.bankCardMoney)) def changePassword(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 onePassword = input(" :").strip() if not check.checkPassword(onePassword): print(" ! ...") return -1 uers.bankCard.bankCardPassword = onePassword print(" ! !") def lockCard(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 uers.bankCard.bankCardLock = 1 print(" :%s !" % uers.bankCard.bankCardNum) def solutionCard(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if not uers.bankCard.bankCardLock: print(" ! !") return -1 uers.bankCard.bankCardLock = 0 print(" :%s !" % uers.bankCard.bankCardNum) def repairCard(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 # newBankCardNum = check.getBankCardNum() while True: if self.allUers.get(newBankCardNum) != None: newBankCardNum = check.getBankCardNum() else: break print(" :%s" % newBankCardNum) # onePassword = input(" :").strip() if not check.checkPassword(onePassword): return -1 card = Card(newBankCardNum, onePassword, uers.bankCard.bankCardMoney) newUser = Uers(uers.name, uers.identityCardNum, uers.phoneNum, card) self.allUers[newBankCardNum] = newUser print(" :%s :%d" % (newBankCardNum, newUser.bankCard.bankCardMoney))#newUser.bankCardNum.bankCardMoney)) self.allUers.pop(bankCardNum) def destoryCard(self): bankCardNum = input(" :").strip() cardPassword = input(" :").strip() uers = self.allUers.get(bankCardNum) if uers == None or uers.bankCard.bankCardPassword != cardPassword: print(" !") return -1 if uers.bankCard.bankCardLock: print(" ! ...") return -1 destory = input(" ?【yes/no】").strip() if destory == 'yes': self.allUers.pop(bankCardNum) print(" !") return -1 else: print(" !") return -1 if __name__ == "__main__": pass

システム補助機能モジュール:
主にユーザー名、パスワード、身分証明書などの情報が正しいかどうかを検証するために使用されます.
import random
#            
def checkName(user):
    if len(user) != 1:
        print("        !")
        return False
    for x in user:
        if x >= '0' and x <= '9' or x >= 'a' and x <= 'z' or x >= 'A' and x <= 'Z' or x == '_':
            pass
        else:
            print("        !")
            return False
    return True
#            
def checkIdentity(identity):
    if len(identity) != 1:
        print("        !")
        return False
    for x in identity:
        if x >= '0' and x <= '9':
            pass
        else:
            print("        !")
            return False
    return True
#           
def checkPhone(identity):
    if len(identity) != 1:
        print("         !")
        return False
    for x in identity:
        if x >= '0' and x <= '9':
            pass
        else:
            print("         !")
            return False
    return True
#            
def checkPrestoredMoney(money):
    if money > 0:
        return True
    else:
        print("         !")
        return False
#         
def checkPassword(password):
    AgainPassword = input("       :").strip()
    if password == AgainPassword:
        return True
    else:
        return False
#       
def getBankCardNum():
    bankCardNum = ""
    for i in range(6):
        bankCardNum += chr(random.randrange(10) + 48)
    return bankCardNum

if __name__ == "__main__":
    pass

ユーザー情報:
このモジュールは主にユーザーの情報を格納するために使用されます.
jsonモジュールで情報をディスクに書き込み、strで書き込むため、ユーザーモジュールと銀行カードモジュールでは「_str_」を採用する必要はありません.ユーザー情報および銀行カード情報を再ロードします.ユーザー情報または銀行カード情報を表示すると、ストレージファイルを直接開くことができます.リロード印刷の確認は不要です.△前回宝くじシステムはpickleモジュールを用いてデータを格納し、書き込み方式はバイナリ方式であったため、情報を調べる際には、情報の再ロードや印刷が必要であった.
jsonモジュールとpickleモジュールの比較
jsonモジュールの利点:書き込み情報はstr形式で書き込まれ、情報の書き込みが正しいかどうかを確認できる
jsonモジュールの欠点:データの読み書きが面倒です.オブジェクト情報を直接ファイルに書き込むことはできません.カスタムメソッドでオブジェクト情報をファイルに書き込む必要があります.
(次の方法では、オブジェクトを辞書に変換して書き込む、オブジェクト情報を読み取るときに辞書をオブジェクトに変換する)
pickleモジュールの利点:データの読み書きが便利
pickleモジュールの欠点:情報を書き込むと、情報が正しく書き込まれているかどうかを確認できません.情報を表示するには、データを再ロードして印刷する必要があります.
from card import Card

class Uers(object):
    def __init__(self, name, identityCardNum, phoneNum, bankCard):
        self.name = name
        self.identityCardNum = identityCardNum
        self.phoneNum = phoneNum
        self.bankCard = bankCard

    # def __str__(self):
    #     return "%s-%s-%s-%s-%s-%d-%s" % (self.name, self.identityCardNum, self.phoneNum,
    #                          self.bankCard.bankCardNum, self.bankCard.bankCardPassword,
    #                          self.bankCard.bankCardMoney,  self.bankCard.bankCardLock)

    @staticmethod
    def obj2dict(uers):
        return {"name":uers.name, "identityCardNum":uers.identityCardNum,
                "phoneNum":uers.phoneNum, "bankCard":{"bankCardNum": uers.bankCard.bankCardNum,
                "bankCardPassword": uers.bankCard.bankCardPassword,"bankCardMoney": uers.bankCard.bankCardMoney,
                "bankCardLock": uers.bankCard.bankCardLock}}

    @staticmethod
    def dict2obj(dict1):
        return Uers(dict1.get("name"), dict1.get("identityCardNum"), dict1.get("phoneNum"),
                    Card(dict1["bankCard"]["bankCardNum"], dict1["bankCard"]["bankCardPassword"],
                     dict1["bankCard"]["bankCardMoney"], dict1["bankCard"]["bankCardLock"]))

if __name__ == "__main__":
    pass

銀行カード情報:
このモジュールは主にユーザーの銀行カードの情報を格納するために使用されます.
#          
class Card(object):
    def __init__(self, bankCardNum, bankCardPassword, bankCardMoney, bankCardLock = 0):
        self.bankCardNum = bankCardNum
        self.bankCardPassword = bankCardPassword
        self.bankCardMoney = bankCardMoney
        self.bankCardLock = bankCardLock

    # def __str__(self):
    #     return "%s-%s-%d-%s" % (self.bankCardNum, self.bankCardPassword, self.bankCardMoney, self.bankCardLock)

if __name__ == "__main__":
    pass