基于python的一个简单的ATM实现,使用了面对对象思想,josn序列化对数据进行持久化处理。
登陆主界面
类的设计:
class Card:
def __init__(self,cardNum,Password,money,boolOne=False):
self.cardNum = cardNum
self.__Password = Password
self.__money = money
self.boolOne = boolOne
@property
def Password(self):
return self.__Password
@Password.setter
def Password(self,Password):
self.__Password = Password
@property
def money(self):
return self.__money
@money.setter
def money(self, money):
self.__money = money
class User:
def __init__(self,name,idcard,phonenum,card):
self.name = name
self.idcard = idcard
self.phonenum = phonenum
self.card = card
注册功能:
@classmethod
def OpenAccount(cls):
name = input("请输入你的姓名:")
idcard = input("请输入你的身份证号码:")
phonenum = input("请输入你的电话号码:")
password = input("请输入你的银行卡密码:")
password1 = input("请确认你的银行卡密码:")
if password == password1:
cardnum = cls.getcardnum()
Card1 = Card(cardnum,password1,money=0,boolOne=False)
User1 = User(name,idcard,phonenum,Card1)
cls.ATMDict[cardnum] = User1
cls.addObj(User1)
print("开户成功!你的卡号为%s,请牢记!"%cardnum)
else:
print("开户失败")
json处理数据的读写:
系统数据的读写是使用json进行文件的修改,先用Xg函数匹配出修改的位置然后进行文件的修改,因为无法直接修改导入了fileinput模块实现文件的按行删除具体在delLine函数。需要修改就删除需要修改的一行数据,然后添加一个新的数据,原信息不变,修改修改的地方。
def User2dict(User):
return User.__dict__
def User2User(b):
return User(b["name"],b["idcard"],b["phonenum"],Card(b["card"]["cardNum"],b["card"]["_Card__Password"],
b["card"]["_Card__money"],b["card"]["boolOne"]))
def UserA(Num):
with open("User.txt","r",encoding="utf-8") as f:
for line in f.readlines():
dict1 = json.loads(line)
x = User2User(dict1)
if x.card.cardNum == Num:
return x
else:
return None
def Xg(cardNum1,key,value):
with open("User.txt", "r", encoding="utf-8") as f:
for line in f.readlines():
dict1 = json.loads(line)
x = User2User(dict1)
if x.card.cardNum ==cardNum1:
dict1["card"][key] = value
x2 = User2User(dict1)
return x2
else:
return None
def delLine(cardNum1):
for line in fileinput.input("User.txt",inplace=True):
if cardNum1 in line:
pass
else:
print(line.rstrip())
文件数据写入
@classmethod #数据写入文件
def addObj(cls, obj):
with open(cls.path, "a", encoding="utf-8") as f:
json.dump(obj, f, default=User2dict)
f.write("\n")
@classmethod #开户账号随机函数
def getcardnum(cls):
while True:
cardnum = ""
for x in range(6):
cardnum += str(random.randrange(0,10))
if cardnum not in cls.ATMDict:
return cardnum
开户操作
@classmethod
def OpenAccount(cls):
name = input("请输入你的姓名:")
idcard = input("请输入你的身份证号码:")
phonenum = input("请输入你的电话号码:")
password = input("请输入你的银行卡密码:")
password1 = input("请确认你的银行卡密码:")
if password == password1:
cardnum = cls.getcardnum()
Card1 = Card(cardnum,password1,money=0,boolOne=False)
User1 = User(name,idcard,phonenum,Card1)
cls.ATMDict[cardnum] = User1
cls.addObj(User1)
print("开户成功!你的卡号为%s,请牢记!"%cardnum)
else:
print("开户失败")
登陆
@classmethod
def Login(cls):
cardnum = input(" 账号名:")
user = UserA(cardnum)
if user:
if user.card.boolOne == False:
if user:
psd = input(" 密码:")
if psd == user.card.Password:
print(" 登陆成功!")
cls.islogin = user.card.cardNum
else:
cls.index += 1
if cls.index ==3:
print(" 你的卡号已经被锁,请联系管理员解锁")
m=Xg(user.card.cardNum,"boolOne",True)
delLine(user.card.cardNum)
ATM.addObj(m)
else:
print(" 登陆失败!你还有%d次机会登陆" % (3 - cls.index))
else:
print(" 你的卡号已经被锁,请联系管理员解锁")
else:
print(" 账号名密码错误!")
存款取款
@classmethod
def Deposit(cls):
if cls.islogin:
print("您当前的余额为%d" % UserA(cls.islogin).card.money)
num = input("请输入存款金额:")
# UserA(cls.islogin).card.money += int(num)
Num=UserA(cls.islogin).card.money+int(num)
m = Xg(UserA(cls.islogin).card.cardNum, "_Card__money",Num)
delLine(UserA(cls.islogin).card.cardNum)
ATM.addObj(m)
print("存款成功!")
else:
print("请登陆后存款")
@classmethod
def Withdrawal(cls):
if cls.islogin:
print("您当前的余额为%d" % UserA(cls.islogin).card.money)
num = input("请输入取款金额:")
if UserA(cls.islogin).card.money > int(num):
# UserA(cls.islogin).card.money -= int(num)
Num = UserA(cls.islogin).card.money - int(num)
m = Xg(UserA(cls.islogin).card.cardNum, "_Card__money", Num)
delLine(UserA(cls.islogin).card.cardNum)
ATM.addObj(m)
print("取款成功!")
else:
print("余额不足,请重新选择!")
else:
print("请登陆后取款")
解锁、锁卡
@classmethod
def LockCard(cls):
if cls.islogin:
cardnum = input(" 请输入你需要锁卡的账号名:")
user = UserA(cardnum)
if user:
m = Xg(user.card.cardNum, "boolOne", True)
delLine(user.card.cardNum)
ATM.addObj(m)
print(" 锁卡成功")
else:
print(" 不存在此卡号!!!")
else:
print("请登陆后进行锁卡操作")
@classmethod
def UnLock(cls):
cardnum = input(" 请输入你需要解锁的账号名:")
user = UserA(cardnum)
if user:
m = Xg(user.card.cardNum, "boolOne", False)
delLine(user.card.cardNum)
ATM.addObj(m)
print(" 解锁成功")
else:
print(" 不存在此卡号!!!")
查询、转账
@classmethod
def search(cls):
if cls.islogin:
print(" 您当前的余额为%d"%UserA(cls.islogin).card.money)
else:
print(" 请登陆后查询")
@classmethod
def Transfer(cls):
if cls.islogin:
cardnum =input("请输入你的转账账户:")
if UserA(cardnum):
num = input("请输入转账金额:")
x=UserA(cls.islogin).card.money - int(num)
m = Xg(UserA(cls.islogin).card.cardNum, "_Card__money", x)
delLine(UserA(cls.islogin).card.cardNum)
ATM.addObj(m)
x1=UserA(cardnum).card.money + int(num)
i = Xg(UserA(cardnum).card.cardNum, "_Card__money", x1)
delLine(UserA(cardnum).card.cardNum)
ATM.addObj(i)
print("转账成功")
else:
print("不好意思没有此卡信息!")
else:
print(" 请登陆后进行转账操作")