1. 程式人生 > >python面向物件—銀行作業系統

python面向物件—銀行作業系統

使用python面向物件寫銀行系統:

  • 銀行卡類:卡號、金額、密碼、狀態
  • 使用者類:名字、身份證、銀行卡
  • 管理員類:賬號、密碼、登入頁面、選單介面、歡迎資訊
  • 操作類:開戶、存款、查詢、取款、轉賬、鎖定、解鎖、改密、退出
  • 新建一個專案,建議使用pycharm。

1,新建card.py 檔案,寫銀行卡類

# 銀行卡類
class Card:
    def __init__(self, cid, pwd):
        self.cid = cid          # 卡號
        self.pwd = pwd          # 密碼
        self.money = 0          # 金額
        self.is_lock = False    # 是否鎖定

2,User.py 檔案,使用者資訊類

import os
import pickle

# 使用者類
class User:
    def __init__(self, uid, name, card):
        self.uid = uid          # 身份證
        self.name = name        # 姓名
        self.card = card        # 銀行卡

    def __str__(self):
        return '姓名:{},身份證:{},卡號:{}'.format(self.name, self.uid, self.card.cid)

    # 將使用者資訊序列化儲存
    @staticmethod
    def save_user(userinfo):
        pathname = os.path.join(os.getcwd(), 'userinfo.db')
        with open(pathname, 'wb') as fp:
            pickle.dump(userinfo, fp)

    # 從檔案中載入使用者資訊
    @staticmethod
    def load_user():
        pathname = os.path.join(os.getcwd(), 'userinfo.db')
        # 判斷是否存在
        if os.path.exists(pathname):
            with open(pathname, 'rb') as fp:
                userinfo = pickle.load(fp)
            return userinfo
        return {}

3,新建admin.py檔案,寫銀行管理員類

# 管理員類
class Admin:
    def __init__(self, account='admin', password='123456'):
        self.account = account
        self.password = password

    # 顯示歡迎資訊
    def welcome(self):
        print('*' * 30)
        print(' ' * 5 + '歡迎使用XX銀行管理系統')
        print('*' * 30)

    # 登入頁面
    def login(self):
        account = input('請輸入賬號:')
        password = input('請輸入密碼:')
        if account == self.account and password == self.password:
            return True
        return False

    # 操作選單
    def menu(self):
        print('*' * 30)
        print('開戶[1] 銷戶[2] 查詢[3] 存款[4]')
        print('取款[5] 轉賬[6] 改密[7] 鎖定[8]')
        print('解鎖[9] 退出[0] 顯示所有使用者[10]')
        print('*' * 30)

4 ,bank.py 檔案,銀行資訊操作類

from user import User
from admin import Admin
from operate import Operate


if __name__ == '__main__':
    # 記錄管理員登入失敗次數,若達到3次則直接結束
    count = 0
    # 建立管理員物件
    admin = Admin()
    while True:
        # 顯示歡迎頁面
        admin.welcome()
        # 登入檢查
        ret = admin.login()
        if ret:
            # 記錄是否退出
            is_quit = False
            # 先從檔案中載入使用者資訊
            userinfo = User.load_user()
            # 建立操作物件
            op = Operate(userinfo)
            while True:
                # 顯示操作選單
                admin.menu()
                # 獲取使用者的操作
                num = int(input('請選擇操作:'))
                if num == 0:
                    print('退出')
                    is_quit = True
                    break
                elif num == 1:
                    op.new_user()
                elif num == 2:
                    op.del_user()
                elif num == 3:
                    op.query_money()
                elif num == 4:
                    op.save_money()
                elif num == 5:
                    op.get_money()
                elif num == 6:
                    op.transfer_money()
                elif num == 7:
                    op.change_pwd()
                elif num == 8:
                    op.lock_user()
                elif num == 9:
                    op.unlock_user()
                elif num == 10:
                    op.show_users()
                else:
                    print('操作代號有誤,請重新輸入')
            if is_quit:
                break
        else:
            print('賬戶或密碼有誤,登入失敗')
            count += 1
            if count >= 3:
                print('錯誤已達上限,禁止登入')
                break
    print('OVER')

5,operate.py 檔案,使用者操作類

from user import User
from card import Card
from helper import Helper


# 操作類
class Operate:
    def __init__(self, userinfo={}):
        # 使用者存放所有的使用者資訊
        self.userinfo = userinfo

    # 開戶
    def new_user(self):
        name = input('請輸入姓名:')
        uid = input('請輸入身份證:')
        pwd = input('請輸入密碼:')
        # 密碼加密
        pwd = Helper.generate_password_hash(pwd)
        # 生成隨機卡號
        cid = Helper.generate_cid()
        # 建立銀行卡
        card = Card(cid, pwd)
        # 建立使用者
        user = User(uid, name, card)
        # 儲存使用者資訊
        self.userinfo[cid] = user
        # 儲存使用者資訊到檔案
        User.save_user(self.userinfo)
        print('開戶成功')

    # 銷戶
    def del_user(self):
        print('銷戶成功')

    # 查詢
    def query_money(self):
        cid = input('請輸入您的卡號:')
        user = self.userinfo.get(cid)
        if user:
            print('您的餘額為:', user.card.money)
        else:
            print('無效的卡號')

    # 轉賬
    def transfer_money(self):
        cid = input('請輸入您的卡號:')
        user = self.userinfo.get(cid)
        if user:
            dst_cid = input('請輸入對方卡號:')
            dst_user = self.userinfo.get(dst_cid)
            if dst_user:
                money = float(input('請輸入轉賬金額:'))
                # 判斷餘額是否充足
                if user.card.money < money:
                    print('餘額不足,轉賬失敗')
                    return
                pwd = input('請輸入密碼:')
                if Helper.check_password_hash(pwd, user.card.pwd):
                    user.card.money -= money
                    dst_user.card.money += money
                    User.save_user(self.userinfo)
                    print('轉賬成功')
                else:
                    print('密碼有誤,轉賬失敗')
            else:
                print('無效的卡號')
        else:
            print('無效的卡號')

    # 存款
    def save_money(self):
        cid = input('請輸入您的卡號:')
        user = self.userinfo.get(cid)
        if user:
            # 檢視使用者是否鎖定
            if user.card.is_lock:
                print('該卡已鎖定,請先去解鎖')
                return
            # 記錄密碼錯誤次數
            count = 0
            while count < 3:
                pwd = input('請輸入密碼:')
                if Helper.check_password_hash(pwd, user.card.pwd):
                    money = input('請輸入您的存款金額:')
                    user.card.money += float(money)
                    User.save_user(self.userinfo)
                    print('存款成功')
                    break
                else:
                    count += 1
                    print('密碼有誤,請重新輸入')
            else:
                user.card.is_lock = True
                User.save_user(self.userinfo)
                print('密碼錯誤已達上限,該卡已鎖定')
        else:
            print('無效的卡號')

    # 取款
    def get_money(self):
        print('取款成功')

    # 改密
    def change_pwd(self):
        print('密碼修改成功')

    # 鎖定
    def lock_user(self):
        print('使用者鎖定')

    # 解鎖
    def unlock_user(self):
        cid = input('請輸入卡號:')
        user = self.userinfo.get(cid)
        if user:
            user.card.is_lock = False
            User.save_user(self.userinfo)
            print('解鎖成功')
        else:
            print('無效的卡號')

    # 顯示所有使用者資訊
    def show_users(self):
        for user in self.userinfo.values():
            print(user)

6 ,helper.py 檔案,幫助檔案,寫生產隨機卡號、資訊資料儲存持久化

import hashlib
from random import randint

# 助手函式類
class Helper:
    # 生成銀行卡號
    @staticmethod
    def generate_cid(length=8):
        cid = ''
        for i in range(length):
            cid += str(randint(0, 9))
        return cid

    # 加密密碼
    @staticmethod
    def generate_password_hash(password):
        # 建立加密物件
        m = hashlib.md5()
        # 設定加密字串
        m.update(password.encode('utf-8'))
        # 返回加密字串
        return m.hexdigest()

    # 檢驗密碼
    @staticmethod
    def check_password_hash(pwd, pwd_hash):
        m = hashlib.md5()
        m.update(pwd.encode('utf-8'))
        return m.hexdigest() == pwd_hash

7,成果。專案執行後的效果

******************************
     歡迎使用XX銀行管理系統
******************************
請輸入賬號:admin
請輸入密碼:123456
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:1
請輸入姓名:tang
請輸入身份證:4109282018
請輸入密碼:654321
開戶成功
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:10
姓名:tang,身份證:4109282018,卡號:50646598
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:3
請輸入您的卡號:50646598
您的餘額為: 0
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:4
請輸入您的卡號:50646598
請輸入密碼:654321
請輸入您的存款金額:800000
存款成功
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:3
請輸入您的卡號:50646598
您的餘額為: 800000.0
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:5
取款成功
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:5
取款成功
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:6
請輸入您的卡號:50646598
請輸入對方卡號:
無效的卡號
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:1
請輸入姓名:xin
請輸入身份證:4109282017
請輸入密碼:111222
開戶成功
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:10
姓名:tang,身份證:4109282018,卡號:50646598
姓名:xin,身份證:4109282017,卡號:28496879
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:6
請輸入您的卡號:50646598
請輸入對方卡號:28496879
請輸入轉賬金額:500000
請輸入密碼:654321
轉賬成功
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:3
請輸入您的卡號:28496879
您的餘額為: 500000.0
******************************
開戶[1] 銷戶[2] 查詢[3] 存款[4]
取款[5] 轉賬[6] 改密[7] 鎖定[8]
解鎖[9] 退出[0] 顯示所有使用者[10]
******************************
請選擇操作:0
退出
OVER