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 无论是类还是对象都可以调用。