阅读目录
面向对象实现一个银行系统
需求文档:
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
'''