历时两个星期来,总算完善ATM取款机系统,让我学习到python很多知识用法。
项目详细情况如下:
1、在atm项目目录下新建以下文件
2、代码如下(360多行代码,想想真的有点辛苦!)
root@kali:~/python/atm# cat atm.py
#!/usr/bin/python
# --*-- coding:utf-8 --*--
import time#引入时间模块
import datetime#引入日期小时
import tab#引入换行、历史命令操作模块
'''各种全局变量、与全局参数'''
tempusercardmoney = []#定义用户信用卡临时消费总额度的列表
f9 = open('usercardmoney.txt','r')#只读打开用户消费信用卡总额度文件
for p in f9.readlines():#读取用户消费信用卡总额度文件中每行内容
tempusercardmoney.append(p)#读取用户消费信用卡总额度文件中每行内容,到用户信用卡临时消费总额度的列表,对用户查询用户可用额度有用
#print p
f9.close()
#print int(tempusercardmoney[0])
inittotalmoney = int(tempusercardmoney[0])#从用户信用卡临时消费总额度的列表的第一个元素,把数据变成整形数据,赋值初始总可用额度
shishitotalmoney = []#实时变化的总余额列表
shishitotalmoney.append(inittotalmoney)#把初始总可用额度值增加到实时消费总额度的列表中
shouxufei = []#总手续费变化列表
jiamoney = []#金钱增加的列表
jianmoney = []#金钱减少的列表
buyshop = []#消费商场购物购买的商品
'''读取当前系统的时间'''
def curtime():
#now = int(time.time())
now = datetime.datetime.now()#获取当前时间时分秒
otherstyletime = now.strftime('%Y-%m-%d %H:%M:%S')#显示当前时间的时分秒
#print otherstyletime
return otherstyletime#返回当前时间的时分秒
'''查询账单要求:所有用户共享一个xiaofeilist.txt文件,用户查询只显示当前用户账单信息,
还款记录在日志中高亮显示出来,用户查询显示收入、支出和消费总额(此条未实现)'''
def searchbill():
gudingedu = 15000#固定总额度
bl_hktotalmoney = gudingedu - shishitotalmoney[-1]#账单还款总额度等于固定总额度减去实时花费的总额度
bl_min_hktotalmoney = bl_hktotalmoney*0.01#最低还款额度等于账单还款总额度的百分之一
print '信用卡总额度为15000¥,信用卡可用额度为%d,本期还款总额为%d,本期最低还款额度为%d' %(shishitotalmoney[-1],bl_hktotalmoney,bl_min_hktotalmoney)
print '-------------------------------------------------------------------------------'
bl_file = open('xiaofeilist.txt','r')#只读打开消费清单文件
for p in bl_file.readlines():#读取消费清单文件中每行内容
print p
bl_file.close()
'''消费商城要求:1、产品及产品价格
2、消费后扣除价格:判断账户余额是否足够,将消费记录写入xiaofeilist.txt账单'''
def buy():#消费商城
products = []#定义可以购买商品名称的列表
prices = []#定义可以购买商品价格的列表
xf_money = 0#初始商品的价格
xf_date = []#定义消费购物清单列表
f_shoplist = open('shoplist.txt','r')#只读方式打开商城可以购买的商品文件
for p in f_shoplist.readlines():#每行数据读取
new_p = p.split()#对商城可以购买的商品文件中每个元素进行空格分割
products.append(new_p[0])#把每行读取的元素第一个值赋值给购买商品名称的列表
prices.append(new_p[1])#把每行读取的元素第二个值赋值给购买商品价格的列表
print products
print prices
while True:
choice = raw_input('请输入要购买的产品:')#输入需要购买的商品名称
f_choice = choice.strip()#对输入的商品名称进行整块前后空格过滤
#print f_choice
if f_choice != 'q':#如果输入不是字母q,则进入
if f_choice in products:#如果输入商品名称在可以购买商品名称的列表中,则进入
#print products.index(f_choice)#可以购买的商品在可以购买商品名称的列表中索引编号
xf_money = int(prices[products.index(f_choice)])#利用可以购买的商品在可以购买商品名称的列表中索引编号,来定位对应的价格,为整形
#print type(xf_money)#打印类型
#print shishitotalmoney[-1]#打印实时变化的且可用的余额
if xf_money <= shishitotalmoney[-1] and shishitotalmoney[-1] > 0:#输入的商品价格小于可用余额,并可用余额大于0
buyshop.append(f_choice)#把成功购买的商品加入全局的购物清单中
jianmoney.append(xf_money)#把成功购买的商品价格增加到全局的减金额的列表中
curtime()#引入当前时间函数,查看当前交易时间
xf_date.append(curtime())#把当前交易时间增加到消费购物清单列表
xf_date.append(str(f_choice))#把成功购买的商品增加到消费购物清单列表
xf_date.append(str(xf_money))#把成功购买商品价格增加到消费购物清单列表
xf_date.append('0')#把购物手续费0元增加到消费购物清单列表
#print xf_date
#print buyshop,jianmoney
print '恭喜你购买了%s'% f_choice
creditcardmoneyleft()#引入总余额函数,查看当前可以余额,必须放到减金额列表才能实时查看余额
f7 = open('xiaofeilist.txt','a+')#使用追加写入的方式打开消费清单文件
f7.write(xf_date[-4])#把交易时间列表中倒数第4个元素写入消费清单中
f7.write('\t')#把一个tab写入消费清单中
f7.write('购买:')#写入‘购买’说明信息
f7.write(xf_date[-3])#把交易时间列表中倒数第三个元素写入消费清单中
f7.write('\t')
f7.write(xf_date[-2])#把交易时间列表中倒数第二个元素写入消费清单中
f7.write('\t\t')
f7.write(xf_date[-1])#把交易时间列表倒数中第一个元素写入消费清单中
f7.write('\n')
f7.close()
else:
print '余额不足!请存入足够的金额进行购买!按q键退出购物!'
else:
print '你购买的商品,商铺清单没有!请选择商铺存在的物品!'
else:
print '你购买的清单如下:'
print buyshop
break#退出该函数模块
'''存款要求:额度不能低于100,额度不能高于2000,必须为100的整数倍,
存款金额只能为数字为字母时会提示,将该笔写入xiaofeilist.txt账单'''
def deposit():#存款
ck_totalmoney = 0#初始存款的总金额
ck_shouxufei = 0#初始存款的手续费金额
ck_date = []#定义交易时间列表
while True:
ck_money = int(raw_input('额度不低于100,不高于2000,必须为100整数倍,请输入你要存款的金额:'))#输入存款金额
if ck_money%100 == 0:#存款金额为100的整数倍
if ck_money > 99 and ck_money < 2001:#存款金额不低于100,不高于2000
curtime()#引入当前时间函数,计算当前存款的时间
ck_date.append(curtime())#把当前时间值加入交易时间列表中
ck_date.append(str(ck_money))#把当前输入的存款金额转换成字符存入交易时间列表中
ck_date.append(str(ck_shouxufei))#把当前输入存款的手续费金额转换成字符存入交易时间列表中
print '你存入的金额为%d' % ck_money
jiamoney.append(ck_money)#把存款金额加入金钱增加的列表
creditcardmoneyleft()#引入总余额函数,查看当前可以余额,必须放到加金额列表才能实时查看余额
f6 = open('xiaofeilist.txt','a+')#使用追加写入的方式打开消费清单文件
f6.write(ck_date[0])#把交易时间列表中第一个元素写入消费清单中
f6.write('\t')#把一个tab写入消费清单中
f6.write('存款')#写入‘存款’说明信息
f6.write('\t\t')
f6.write(ck_date[1])#把交易时间列表中第二个元素写入消费清单中
f6.write('\t\t')
f6.write(ck_date[2])#把交易时间列表中第三个元素写入消费清单中
f6.write('\n')
f6.close()
break#退出该函数模块
else:
print '你输入的存款金额不能低于100元,不能高于2000元!'
else:
print '输入的存款金额不为100的整数倍,请输入100整数倍!'
'''取款要求:额度不能低于100,额度不能高于2000,必须为100的整数倍,扣除% 5的手续费,
取现额度不能超过余额,取款金额只能为数字为字母时会提示,将该笔记录写入xiaofeilist.txt账单'''
def withdraw():#取款
qk_totalmoney = 0#初始取款的总金额
qu_shouxufei = 0#初始取款的手续费
qk_date = []#定义交易时间列表
while True:
qk_money = int(raw_input('取款金额不低于100元,不高于2000元,为100整数倍,请输入取款金额:'))#输入取款金额
if qk_money < shishitotalmoney[-1] and shishitotalmoney[-1] > 0 and qk_money > 0:#取款金额小于总可用余额,总可用余额大于0,取款金额大于0
print shishitotalmoney[-1]
if qk_money%100 == 0:#取款金额为100的整数倍
if qk_money > 99 and qk_money < 2001:#取款金额不低于100,不高于2000
qk_shouxufei = qk_money * 0.05#计算取款手续费
qk_totalmoney = qk_money + qk_shouxufei#取款总金额
curtime()#引入当前时间函数
qk_date.append(curtime())#把当前时间值加入交易时间列表中
qk_date.append(str(qk_totalmoney))#把当前输入的取款金额转换成字符存入交易时间列表中
qk_date.append(str(qk_shouxufei))#把当前输入取款的手续费金额转换成字符存入交易时间列表中
jianmoney.append(qk_money)#把取款金额加入金钱减少的列表
shouxufei.append(qk_shouxufei)#把手续费金额加入金钱减少的列表
#print qk_date[1],qk_date[2]
print '取款实际金额为%d元,手续费为%d元,总取款花费金额为%d元' %(qk_money,qk_shouxufei,qk_totalmoney)
creditcardmoneyleft()#引入总余额函数,查看当前可以余额,必须放到减金额列表才能实时查看余额
f5 = open('xiaofeilist.txt','a+')#使用追加写入的方式打开消费清单文件
f5.write(qk_date[0])#把交易时间列表中第一个元素写入消费清单中
f5.write('\t')
f5.write('取款')
f5.write('\t\t')
f5.write(qk_date[1])#把交易时间列表中第二个元素写入消费清单中
f5.write('\t\t')
f5.write(qk_date[2])#把交易时间列表中第三个元素写入消费清单中
f5.write('\n')
f5.close()
break#退出该函数模块
else:
print '你输入的取款金额不能低于100元,不能高于2000元!'
else:
print '输入的取款金额不为100的整数倍,请输入100整数倍!'
else:
print '你输入的取款金额超过总余额,请重新输入大于0的金额!'
'''查询当前账户可用余额'''
def creditcardmoneyleft():#查询当前可用余额
zhengtotalmoney = 0#初始正符号的总金额
futotalmoney = 0#初始负符号的总金额
jiatotalmoney = []#定义加的总金额的列表
jiantotalmoney = []#定义减的总金额的列表
for p in range(len(shouxufei)):#遍历手续费列表中所有元素
#print shouxufei[p]
jiantotalmoney.append(shouxufei[p])#把手续费的每个元素增加到‘减的总金额列表’中
for m in range(len(jianmoney)):#遍历减金额列表中所有元素
#print jianmoney[m]
jiantotalmoney.append(jianmoney[m])##把减金额的每个元素增加到‘减的总金额列表’中
for n in range(len(jiamoney)):#遍历加金额列表中所有元素
#print jiamoney[n]
jiatotalmoney.append(jiamoney[n])#把加金额的每个元素增加到‘加的总金额列表’中
for i in range(len(jiatotalmoney)):#遍历加的金额列表中所有元素
#print jiatotalmoney[i]
zhengtotalmoney = zhengtotalmoney + jiatotalmoney[i]#计算正符号金额总额
for j in range(len(jiantotalmoney)):#遍历减的金额列表中所有元素
#print jiantotalmoney[j]
futotalmoney = futotalmoney + jiantotalmoney[j]#计算负符号金额总额
totalmoney = inittotalmoney + zhengtotalmoney - futotalmoney#计算总余额
shishitotalmoney.append(totalmoney)#把实时变化的总余额增加到shishitotalmoney列表中
f8 = open('usercardmoney.txt','w')#写入方式打开用户消费信用卡总额度文件
f8.write(str(int(totalmoney)))#总金额变成整形数据,然后变成字符类型写入用户消费信用卡总额度文件
f8.close()
print '-------------------------------'
print '你的总可用的余额为% d'% totalmoney
print '-------------------------------'
'''修改密码要求:旧密码验证后才能提示修改新密码
新密码需输入两次。两次相同即可通过
密码长度必须在6位以上'''
def modpassword():
pd_oldtmp = []#定义临时修改旧密码列表
pd_old = raw_input('请输入信用卡的旧的密码:')#输入旧密码
f3 = open('userinfo.txt','r')#只读打开用户信息文件
for p in f3.readlines():#每行读取用户信息文件内容
new_p = p.split()[1]#对用户信息文件中元素使用空格分割,并把第二个元素值赋值给new_p
#print new_p
pd_oldtmp.append(new_p)#把赋值给new_p的值增加到临时修改旧密码列表中
if pd_old == pd_oldtmp[0]:#如果输入旧密码与存入临时修改旧密码列表中第一个元素值相等,则进入
moduser = []#定义修改用户列表
modpd = []#定义修改密码列表
moduserinfo = []#定义修改用户、密码列表
f1 = open('userinfo.txt','r')#只读打开用户信息文件
#print type(f1)
for p in f1.readlines():#每行读取用户信息文件内容
new_p = p.split()#对用户信息文件中元素使用空格分割,并把每个元素值循环赋值给new_p
moduser.append(new_p[0])#把取到的第一个元素增加到修改用户列表中
modpd.append(new_p[1])#把取到的第二个元素增加到修改用户列表中
f1.close()
#print moduser,modpd
moduserinfo.append(moduser[0])#把修改用户的第一个元素值增加到‘修改用户、密码列表’中
moduserinfo.append(modpd[0])#把修改密码的第一个元素值增加到’修改用户、密码列表‘中
pd_new1 = raw_input('请输入新信用卡密码,至少6位以上:')#第一次输入的密码值
pd_new2 = raw_input('请再次输入新信用卡密码,至少6位以上:')#第二次输入的密码值
if pd_new1 == pd_new2:#如果第一次输入的密码值与第二次输入的密码值相等,则进入
#print moduserinfo
moduserinfo[1] = pd_new1#把第一次输入的密码值赋值到‘修改用户、密码列表’中第二个元素
#print moduserinfo
f1 = open('userinfo.txt','w')#写入模块打开用户信息文件
f1.write('')#把用户信息文件所有内容清空
f1.close()
f2 = open('userinfo.txt','a+')#追加写入模式打开用户信息文件
f2.write(moduserinfo[0])#把修改用户、密码列表’中第一个元素用户写入用户信息文件中
f2.write('\t')
f2.write(moduserinfo[1])#把修改用户、密码列表’中第二个元素用户写入用户信息文件中
f2.close()
print '恭喜您!信用卡密码修改成功!'
else:
print '你输入的两次新的信用卡密码不相同!请重新输入!'
else:
print '你输入的信用卡密码错误,请重新输入!'
'''转账要求:额度不能低于100元,额度不能高于20000元
必须为100的整数倍,扣除手续费10%
将该笔记录写入账单中'''
def tranfer():
tr_totalmoney = 0#初始转账总金额
tr_shouxufei = 0#初始转账手续费
tr_date = []#定义转账交易时间清单列表
while True:
tr_money = int(raw_input('转账金额不低于100元,不高于2000元,为100整数倍,请输入转账金额:'))#输入转账金额
if tr_money < shishitotalmoney[-1] and shishitotalmoney[-1] > 0 and tr_money > 0:#转账金额小于总余额,总余额与转账金额必须大于0
if tr_money%100 == 0:#转账金额为100整数倍
if tr_money > 99 and tr_money < 2001:#转账金额大于100,不高于2000
tr_shouxufei = tr_money*0.1#计算转账手续费
tr_totalmoney = tr_money + tr_shouxufei#计算转账总金额
curtime()#引入当前交易时间函数
tr_date.append(curtime())#增加当前时间到转账交易时间清单列表中
tr_date.append(str(tr_totalmoney))#增加转账总金额到转账交易时间清单列表中
tr_date.append(str(tr_shouxufei))##增加转账手续费到转账交易时间清单列表中
#print tr_date[1],tr_date[2]
jianmoney.append(tr_money)#把转账金额增加到加金额列表中
shouxufei.append(tr_shouxufei)#把转账手续费增加到手续费列表中
print '转账实际金额为%d元,手续费为%d元,总转账金额花费为%d元' %(tr_money,tr_shouxufei,tr_totalmoney)
creditcardmoneyleft()#引入总余额函数,查看当前可以余额,必须放到减金额列表才能实时查看余额
f4 = open('xiaofeilist.txt','a+')#追加写入方式打开消费清单文件
f4.write(tr_date[0])#把转账交易时间清单列表中第一个元素写入消费清单文件中
f4.write('\t')
f4.write('转账')
f4.write('\t\t')
f4.write(tr_date[1])##把转账交易时间清单列表中第二个元素写入消费清单文件中
f4.write('\t\t')
f4.write(tr_date[2])#把转账交易时间清单列表中第三个元素写入消费清单文件中
f4.write('\n')#换行写入
f4.close()
break#退出该函数模块
else:
print '你输入的转账金额不能低于100元,不能高于2000元!'
else:
print '输入的转账金额不为100的整数倍,请输入100整数倍!'
else:
print '你输入的转账金额超过总余额,请重新输入大于0的金额!'
def gongneng():#选择的业务功能模块
print '''请选择操作的业务:(输入q退出系统)
(1) 消费商城购物
(2) 查询余额
(3) 存款
(4) 取款
(5) 转账
(6) 查询账单
(7) 修改密码'''
while True:
choice = raw_input('请输入需要操作业务编号:')
f_choice = choice.strip()#除去空格
if f_choice != 'q':
if f_choice != ''or f_choice ==1 or f_choice ==2 or f_choice ==3 or f_choice ==4 or f_choice ==6 or f_choice ==7:
if f_choice == '1':
buy()
elif f_choice == '2':
creditcardmoneyleft()
elif f_choice == '3':
deposit()
elif f_choice == '4':
withdraw()
elif f_choice == '5':
tranfer()
elif f_choice == '6':
searchbill()
elif f_choice == '7':
modpassword()
else:
continue
else:
print '你已经退出中国银行ATM取款系统!欢迎下次光临!'
exit()
'''多个账户(未实现)/单个账户登录验证,密码输入超过三次错误冻结帐号30秒'''
while True:
counttime = 30#初始锁定时间值
count = 0#初始初始次数
user = []#定义用户列表
pd = []#定义密码列表
file = open('userinfo.txt','r+')#只读打开用户信息文件
for p in file.readlines():#每行读取用户信息文件
new_p = p.split()#把每个元素空格分割,并循环赋值给new_p
user.append(new_p[0])#把new_p取到的第一个元素增加到用户列表中
pd.append(new_p[1])#把new_p取到的第二个元素增加到用户列表中
file.close()
#print user[0],pd[0]
creditcard = raw_input('请输入信用卡卡号:')#输入用户信用卡信息
#f_creditcard = creditcard.strip()
if creditcard == user[0]:#如果输入用户信用卡信息与用户列表中第一个元素相等,则进入
creditcardpd = pd[0]#把密码列表中第一个元素赋值给creditcardpd
while True:
if count != 3:#如果锁定次数没有达到3次,则进入
creditcardpassword = raw_input('请输入信用卡密码:')#输入用户密码
#f_creditcardpassword = creditcardpassword.strip()
if creditcardpassword != creditcardpd:#如果不想等,则进入
count = count + 1#每次循环增加1次
print '输入的密码不对,还有%d次机会,请重新输入密码' % count
else:
print '恭喜你!欢迎进入中国银行ATM取款系统!'
curtime()#引入当前时间函数
gongneng()#引入业务功能函数
else:
print '对不起,你输入密码错误次数已达到3次,将锁定30秒!'
timeseconds = 0#设置锁定时间值,锁定功能,倒计时
while (counttime != timeseconds):#锁定时间参数不等于设置锁定时间值,则进入
time.sleep(1)#30秒倒计时
counttime -= 1#每次减少一秒
print counttime
break#倒计到0秒退出,跳到用户输入信用卡帐号
else:
print '输入的信用卡号%s错误!请重新输入你的信用卡号码!' % creditcard
root@kali:~/python/atm#
代码截图
3、运行情况如下