面向对象 编写 银行系统 实战

面向对象实现一个银行系统

需求文档:
card 类 存储卡类
'''
卡号  ,  密码  ,    余额  ,  锁定状态
cardid    password    money    islock
'''
person 类 用户类
'''
用户名 , 身份证 , 手机号 , 卡
name , userid , phone , card
'''
view 类 视图类

登录 , 打印欢迎界面 , 打印操作界面

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

往文件中存储数据:
二套数据;
user.txt => 卡号:用户 => user_dict 
userid.txt => 身份证:卡号 => user_id_dict

身份证 卡号 用户
'''
模块基本实现
需要实现的功能
'''
取钱:卡是否存在,是否冻结,取钱金额是否正确

转账:把一个卡里的钱转到其他卡内 (卡是否存在,是否冻结,对方账户是否存在,转账的金额是否正确)

改密:(1)原密码改密  (2)身份证改密

解卡:判断卡号和身份证是否正确在选择解卡

补卡:将旧用户的所有信息和新卡绑定(包括名字,余额等所有卡信息和用户信息,数据重新绑定)

'''
类型要判断 使用正则
 姓名不能为空,
 密码长度6位不能空,
 身份证号长度18位不能为空,一个身份证号只能注册一次不能重复.
 不能给自己转账
实现
目录结构

在这里插入图片描述

card.py
class Card(object):
     def __init__(self, card_id, password, money):
          self.card_id = card_id
          self.password = password
          self.money = money
          # 默认新开的卡都不锁
          self.is_lock = False
user.py
class User(object):
     def __init__(self,name,user_id,phone,card):
          self.name = name
          self.user_id = user_id
          self.phone = phone
          self.card = card
view.py
import time


class View(object):
    @staticmethod
    def login():
        while True:
            name = input("请输入管理员账户:")
            pwd = input("请输入管理员密码:")
            if name == "admin" and pwd == "111":
                # 打印欢迎界面
                View.login_view()
                # 延迟一秒刷新界面
                time.sleep(1)
                # 打印操作界面
                View.operation_view()
                # 账号密码正确返回True
                return True
            else:
                print("管理员账号或密码不正确")

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

    @staticmethod
    def operation_view():
        print("*******************************************")
        print("*           开户(1)    查询(2)             *")
        print("*           存钱(3)    取钱(4)             *")
        print("*           转账(5)    改密(6)             *")
        print("*           锁卡(7)    解卡(8)             *")
        print("*           补卡(9)    退出(0)             *")
        print("*******************************************")
operation.py
import os
import pickle
import random
from .card import Card
from .user import User


class Operation(object):
    # 初始化操作

    dic_func = {1: 'register', 2: 'query', 3: 'save_money', 7: 'lock', 8: 'unlock', 0: 'save'}

    def __init__(self):
        # 程序进行操作时加载两套存储数据(用函数分离写法)
        # 第一套:卡号:用户对象
        self.load_user()

        # 第二套:身份证:卡号
        self.load_user_id()

    def load_user(self):
        # 判断文件是否存在,存在时候就拿数据,否则初始化空字典
        if os.path.exists("user.txt"):
            with open("user.txt", 'rb')as rf:
                self.user_dict = pickle.load(rf)
        else:
            self.user_dict = {}
        print(self.user_dict)

    def load_user_id(self):
        if os.path.exists("user_id.text"):
            with open("user_id.txt", "rb")as rf:
                self.user_id_dict = pickle.load(rf)
        else:
            self.user_id_dict = {}
        print(self.user_id_dict)

    # 保存退出操作
    def save(self):
        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.user_id_dict, fp)

    # 开户操作
    def register(self):
        name = input("请输入您的姓名:")
        user_id = input("请输入您的身份证号:")
        phone = input("请输入您的手机号:")
        # 获取卡密码
        password = self.get_cwd()
        # 获取卡号
        card_id = self.get_cardid()

        # 余额默认10块
        money = 10

        # 创建一张新卡
        card = Card(card_id, password, money)
        # 创建一个用户
        user = User(name, user_id, phone, card)

        # 存储数据
        # 存储 (卡号:用户对象)
        # self.user_dict[card.card_id]=user
        self.user_dict[card_id] = user
        # 存储(身份证:卡号)
        # self.user_id_dict[user.user_id]=card_id
        self.user_id_dict[user_id] = card_id

        # 给出提示
        print("恭喜{}开卡成功,您的卡号为:{},卡内余额{}元".format(name, card_id, money))

    # 获取密码
    def get_cwd(self):
        while True:
            pwd1 = input("请输入您的密码:")
            pwd2 = input("请确认您的密码:")
            if pwd1 == pwd2:
                return pwd1  # 返回给上面的password
            else:
                print("两次密码不一致,请重新输入")

    # 获取卡号
    def get_cardid(self):
        card_id = ""
        for i in range(6):
            card_id += str(random.randrange(0, 10))
        if card_id not in self.user_dict:
            return card_id

    #  查询操作
    def query(self):  # 查询
        # 先获取到一张卡
        # 获取卡信息
        card = self.get_card_info()
        # card 要么返回False  要么返回真实对象
        if not card:
            print("对不起,你的卡不存在")
        else:
            # 判断卡是否锁定
            if card.is_lock:  # islock=True
                print("对不起,您的卡被锁了")
            else:
                # 检查卡密码
                if self.check_cwd(card):
                    print("你的卡内余额是{}元".format(card.money))

    # 获取卡信息
    def get_card_info(self):
        card_id = input("请输入您的卡号")
        if card_id not in self.user_dict:
            print("您的卡不存在")
        else:  # 获取用户对象
            # 通过: 卡号:用户对象 取到对象
            user = self.user_dict[card_id]
            # 拿到 封装在用户类中的卡对象
            return user.card

    # 检查卡密码
    def check_cwd(self, card):
        count = 1
        while count < 4:
            pwd = input("请输入您的密码")
            if pwd == card.password:
                return True
            else:
                # 剩余次数 = 总次数-已经循环的次数
                print("密码错误,您还剩下%d次机会" % (3 - count))
                # 等于三次,直接锁卡
                if count == 3:
                    card.is_lock = True
                    print("抱歉,因为密码错了三次,你的卡被锁了")

            count += 1

    # 存钱操作
    def save_money(self):
        card = self.get_card_info()
        if not card:
            print("抱歉,你的卡不存在!")
        else:
            # 获取用户对象
            user = self.user_dict[card.card_id]  # 卡号:用户对象 表
            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 lock(self):
        card = self.get_card_info()
        if not card:
            print("抱歉,您的卡不存在")
        else:
            num = input("1.使用密码冻结  2.使用身份证冻结")
            if num == "1":
                if self.check_cwd(card):
                    card.is_lock = True
                    print("======锁卡成功======")
            elif num == "2":
                user_id = input("请输入您的身份证号:")
                user = self.user_dict[card.card_id]
                if user_id == user.user_id:
                    card.is_lock = True
                    print("======锁卡成功======")
                else:
                    print("======锁卡失败======")

    # 解卡操作
    def unlock(self):
        card = self.get_card_info()
        if not card:
            print("抱歉,您的卡不存在")
        else:
            while True:
                user_id = input("请输入您的身份证号:")
                user = self.user_dict[card.card_id]
                if user_id != user.user_id:
                    print('您输入的身份证有误,请重新输入!')
                    break
                else:
                    if self.check_cwd(card):
                        card.is_lock = False
                        print("======解卡成功======")
                        return
bank_main.py
from Bank.view import View
from Bank.operation import Operation


class Main():
    @staticmethod
    def run():
        if View.login():
            obj = Operation()
            while True:
                choice = input("请选选择需要办理的业务:")
                # 用反射来实现
                get_func = Operation.dic_func[int(choice)]
                var = getattr(obj, get_func)
                if get_func=='save':
                    var()
                    break
                else:
                    var()

                # 卡户
                # if choice == "1":
                #     obj.register()
                # # 查询
                # elif choice == "2":
                #     obj.query()
                # # 存钱
                # elif choice == "3":
                #     obj.save_money()
                # elif choice == "4":
                #     print(4)
                # elif choice == "5":
                #     print(5)
                # elif choice == "6":
                #     print(6)
                # # 锁卡
                # elif choice == "7":
                #     obj.lock()
                # # 解卡
                # elif choice == "8":
                #     obj.unlock()
                # elif choice == "9":
                #     print(9)
                # # 退出保存
                # elif choice == "0":
                #     obj.save()
                #     break


if __name__ == '__main__':
    Main.run()

总结

这个阶段没有用到数据库,主要练习一下如何连接起:不同类、代码架构,
以及可以使用“反射”!

# 小彩蛋
'''
这是我写的第一篇文章,开始连markdown编辑器都不会用,
而且你可以看到上面,标题乱加,排版不好看,内容总结也不到位;
我是10月31号又回来修改了一次,后面我其他文章写的就逐渐变好了!
感慨一下:当初有想整理知识、写文章的念头,开始总是感觉难,但只要你迈出了第一步,总会变得得心应手!
写于:2019.10.31
'''
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值