1.需求分析:
card卡类:
卡号,密码,余额,锁定状态
cardid , password , money , islock
person 用户类:
用户名 身份证号 手机号 卡
name userid phone card
view 视图类
登录, 打印欢迎界面 , 打印操作界面
operation 操作类
把十个功能都在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
2.基本要求
# 基本实现
取钱:卡是否存在,是否冻结,取钱金额是否正确
转账:把一个卡里的钱转到其他卡内 (卡是否存在,是否冻结,对方账户是否存在,转账的金额是否正确)
改密:(1)原密码改密 (2)身份证改密
解卡:判断卡号和身份证是否正确在选择解卡
补卡:将旧用户的所有信息和新卡绑定(包括名字,余额等所有卡信息和用户信息,数据重新绑定)
# 类型要判断
姓名不能为空,
密码6位包含字母数字大小写,
身份证号用正则匹配且不能为空,一个身份证号只能注册一次不能重复.
不能给自己转账
# main.py
from package.view import View
from package.operation import Operation
class Main():
@staticmethod
def run():
if View.login():
obj = Operation()
while True:
choice = input("请选择需要办理的业务:")
if choice == "1":
obj.register()
elif choice == "2":
obj.query()
elif choice == "3":
obj.save_money()
elif choice == "4":
obj.get_money()
elif choice == "5":
obj.trans_money()
elif choice == "6":
obj.change_pwd()
elif choice == "7":
obj.lock()
elif choice == "8":
obj.unlock()
elif choice == "9":
obj.new_card()
elif choice == "0":
obj.save()
break
if __name__ == "__main__":
Main.run()
# 卡类card.py
# ### card 卡类
class Card():
def __init__(self, cardid, password, money):
self.cardid = cardid
self.password = password
self.money = money
self.islock = False
# 视图类view.py
# ### view 视图类
import time
class View():
def login():
while True:
name = input("请输入您的管理员账号:")
pwd = input("请输入您的管理员密码:")
if name == "admin" and pwd == "111":
# 打印欢迎界面
View.login_view()
# 延迟一秒打印操作界面
time.sleep(1)
# 打印操作界面
View.operation_view()
return True
print("抱歉,您的账户不正确,请重新输入")
def login_view():
print("*******************************************")
print("* *")
print("* *")
print("* Welcome To OldBoy Bank *")
print("* *")
print("* *")
print("*******************************************")
def operation_view():
strvar = """
*******************************************
* 开户(1) 查询(2) *
* 存钱(3) 取钱(4) *
* 转账(5) 改密(6) *
* 锁卡(7) 解卡(8) *
* 补卡(9) 退出(0) *
*******************************************
"""
print(strvar)
if __name__ == "__main__":
View.login()
# 操作类operation.py
# ### operation 操作类
"""
如何往数据库存数据?
卡号:用户 123:user_obj
身份证:卡号 210201:123
"""
import os
import pickle
import random
from .card import Card
from .person import Person
import re
class Operation():
# 当进入到系统的时,优先把数据库中的数据拿出来
def __init__(self):
self.load_user_dict()
self.load_user_id_dict()
print(self.user_dict)
print(self.user_id_dict)
# 加载{卡号:用户} 字典数据
def load_user_dict(self):
if os.path.exists("user.txt"):
with open("user.txt", "rb") as fp:
self.user_dict = pickle.load(fp)
else:
self.user_dict = {}
# 加载{卡号:用户} 字典数据
def load_user_id_dict(self):
if os.path.exists("userid.txt"):
with open("userid.txt", "rb") as fp:
self.user_id_dict = pickle.load(fp)
else:
self.user_id_dict = {}
def save(self):
with open("user.txt", "wb") as fp:
pickle.dump(self.user_dict, fp)
with open("userid.txt", "wb") as fp:
pickle.dump(self.user_id_dict, fp)
# 用户注册
def register(self):
name = input("请输入您的姓名:")
while True:
userid = input("请输入您的身份证号:")
userid1 = re.findall(r"^\d{17}[0-9]|X$", userid)
if len(userid1) > 0:
print("格式正确,可以注册!")
break
else:
print("您输入身份证格式不正确,请重新输入!")
while True:
phone = input("请输入您的手机号:")
phone1 = re.findall(r"^1[3|4|5|7|8]\d{9}$", phone)
if len(phone1) > 0:
print("格式正确,可以注册!")
break
else:
print("您输入的手机号格式不正确,请重新输入!")
# 获取密码
password = self.get_pwd()
# 获取卡号
cardid = self.get_cardid()
money = 10
# 创建一张卡
card = Card(cardid, password, money)
# 创建一个用户
user = Person(name, userid, phone, card)
# 更新字典
self.user_dict[cardid] = user
self.user_id_dict[userid] = cardid
print("恭喜%s开卡成功,您的卡号为:%s,卡内余额%s元" % (name, cardid, money))
# 获取密码
def get_pwd(self):
while True:
while True:
pwd1 = input("请输入您的密码:")
password1 = re.findall(r"^[1-9a-zA-Z,|%$#@&*^)(!?<>]{6}$", pwd1)
if len(password1) > 0:
print("格式正确,可以注册!")
break
else:
print("您输入的密码格式不正确,请重新输入!")
pwd2 = input("请确认您的密码:")
if pwd1 == pwd2:
return pwd1
else:
print("两次密码不一致,请重新输入")
# 获取卡号
def get_cardid(self):
while True:
cardid = str(random.randrange(100000, 1000000))
# 如果不在当前字典当中,证明该卡号可用
if cardid not in self.user_dict:
return cardid
# 查询
def query(self):
card = self.get_card_info()
if not card:
print("抱歉,您的卡不存在")
else:
if card.islock:
print("您的卡被锁住了")
else:
# 卡存在没有被锁住的情况下,让用户就行输入密码
if self.check_pwd(card):
print("您的卡内余额是%s元" % (card.money))
# 查询卡的信息
def get_card_info(self):
cardid = input("请输入您的卡号:")
if cardid not in self.user_dict:
return False
else:
user = self.user_dict[cardid]
card = user.card
return card
# 如果输错三次卡就会被锁住
def check_pwd(self, card):
count = 1
while count < 4:
pwd = input("请输入您的密码:")
if pwd == card.password:
return True
else:
print("密码错误,您还剩余%s次机会" % (3-count))
if count == 3:
card.islock = True
print("抱歉,因为密码错了三次,卡被锁住了")
count += 1
# 存钱
def save_money(self):
card = self.get_card_info()
if not card:
print("对不起,卡不存在")
else:
if card.islock:
print("对不起你的卡被锁住了")
else:
user = self.user_dict[card.cardid]
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 get_money(self):
card = self.get_card_info()
if not card:
print("该卡不存在,请检查之后再输入。")
else:
user = self.user_dict[card.cardid]
if self.check_pwd(card):
while True:
qukuan = int(input("请输入取款的金额:"))
if user.card.money < qukuan:
print("您输入的取款金额有误,请重新输入!")
else:
user.card.money -= qukuan
print("取款成功%d" % (qukuan))
break
# 锁卡
def lock(self):
card = self.get_card_info()
if not card:
print("对不起,您输入的卡不存在")
else:
num = input("1:使用密码冻结 2:使用身份证号冻结")
if num == "1":
if self.check_pwd(card):
card.islock = True
print("锁卡成功")
elif num == "2":
userid = input("请输入您的身份证号:")
user = self.user_dict[card.cardid]
if userid == user.userid:
card.islock = True
print("=====锁卡成功========")
else:
print("锁卡失败")
# 转账
def trans_money(self):
# 得到用户的卡的信息包括
card = self.get_card_info()
if not card:
print("您输入的卡号不存在,请检查后再输入")
else:
if self.check_pwd(card):
while True:
duifangzhanghu = input("请输入对方账户:")
if duifangzhanghu == card.cardid:
print("不能给自己转账,请重新输入账号!")
continue
user = self.user_dict[duifangzhanghu]
while True:
count_money = int(input("请输入转账金额:"))
num = input("您将给%s转账%s,确认请输入1,返回主菜单输入其他的键" % (user.name, count_money))
if num == "1":
if int(card.money) > int(count_money):
card.money -= count_money
print("您给%s成功转账%d元" %(user.name, count_money))
break
else:
print("转账金额有误!")
if num.isdecimal():
break
break
# 改密码
def change_pwd(self):
card = self.get_card_info()
if not card:
print("您输入的卡号不存在")
else:
user = self.user_dict[card.cardid]
num = input("1:原密码改密 2:身份信息改密")
if num == "1":
if self.check_pwd(card):
pwd_new = input("请输入你的新密码:")
pwd_new1 = input("请再次确认你的新密码:")
if pwd_new == pwd_new1:
user.card.password = pwd_new
print("修改密码成功")
if num == "2":
userid = input("请输入您的身份证号码:")
if user.userid == userid:
pwd_new = input("请输入您的新密码:")
pwd_new1 = input("请再次确认你的密码:")
if pwd_new == pwd_new1:
user.card.password = pwd_new1
print("修改密码成功")
# 解卡
def unlock(self):
card = self.get_card_info()
if not card:
print("您输入的卡号不存在,请检查后再次输入,谢谢!")
else:
user = self.user_dict[card.cardid]
userid = input("请输入身份证号码:")
if userid == user.userid:
user.card.islock = False
print("解卡成功")
# 补卡
def new_card(self):
userid = input("请输入您的身份证号码:")
cardid = self.user_id_dict[userid]
user = self.user_dict[cardid]
if userid in self.user_id_dict:
new_cardid = self.get_cardid()
print("%s补卡办理成功新卡号为:%s" % (user.name, new_cardid))
self.user_dict.pop(cardid)
self.user_id_dict.pop(userid)
self.user_dict[new_cardid] = user
self.user_id_dict[userid] = new_cardid
else:
print("您输入身份证号不正确,请检测后再输入")
项目要点:
1.怎么去存数据,和拿数据
2.把模块细化写,比如需要产生一个随机的卡号,由于我们需要判断每张卡是否重复,需要定义一个函数
def get_cardid()函数
检测密码:
无论是取钱还是存款还是查询都是需要输入密码的,而且输入密码之后会给卡一个状态即是锁卡还是非锁卡,于是又定义了一个函数
def check_pwd()
输入卡号的时候,假如输入的卡号本身就不存在那么就不能就行下面的操作,确定是一张卡之后才能就行下面的操作,于是定义了一个get_card_info()
编写注册模块的时候,出现了我们需要实例化一个卡,一个人而且还要就行绑定。
1.其中操作类当中就是一个一个的操作方法,那么要操作其中的方法,必定需要数据,那么这个对象的属性就是存入的self.user_dict/self.user_id_dict()
2.当退出整个操作的时候,我们需要就注册时候写的数据就行存下,从而设计了pickle.dump(存入数据,可以是多种类型的数据)序列化 pickle.load(读出数据)反序列化
3.最重要的一点,操作类的2张数据表,也就是字典uer_dict/user_id_dict 存入的是 什么对应关系,这个对本项目的影响是是最大的,我们需要用的数据类型是什么形式?当我们去银行办卡的时候会出现
两种的对应方式:(1)一个卡号:对应一个用户名 当你的卡不见了的时候,需要另外中关系是,身份证号:对应卡号,这样才能去完成补办。
4.main.py 模块的导入是典型的单入口模式。@staticmethod 无论是类还是对象都可以调用。