最近无聊又写了一个信用卡业务的练习。基于python3。功能如下:
模拟实现一个ATM+购物商城的程序
1.额度15000
2.实现购物商城,买东西加入购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额的万分之5每日计息
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户,用户额度,冻结账户
目前除了还款提醒没有实现,因为没有想到有什么方式比较简单,其他功能都已基本实现。代码中使用的都是标准包,代码也比较基础,适合新手,老鸟勿打击。本次练习项目共是哪个模块:atm(信用卡业务)、shopping(商城)和home(主模块),见源码:
atm.py
#-*-coding:utf-8-*-
import pickle
import os
import sys
import time
import random
from collections import OrderedDict
class ATM:
'''
ATM业务
'''
def __init__(self):
#self.name = None
lists = ['users.txt','acount.txt','forze.txt']
self.initFile(lists)
if not os.path.exists('acount_detail.txt'):
dics = OrderedDict()
self.edit('acount_detail.txt',dics)
if not os.path.exists('userShopList.txt'):
dics = OrderedDict()
self.edit('userShopList.txt',dics)
def initFile(self,filesList):
'''
初始化文件
:param files:
:return:
'''
for files in filesList:
if not os.path.exists(files):
self.edit(files,{})
def isForzeNot(self):
isNot = self.opens('forze.txt')
if self.name in isNot and isNot[self.name] == 'Y':
print('该账号已冻结,无法执行该操作!')
return True
else:
return False
def querys(self):
'''
查询余额
:return:
'''
nums = self.query(self.name)
print('您的账户余额为:¥',nums)
def query(self,name):
'''
查询账号余额
:return:
'''
acount = self.opens('acount.txt')
return acount[name]
def opens(self,files):
'''
读取信息
:return:
'''
with open(files,'rb') as f:
acount = pickle.load(f)
return acount
def edit(self,files,content):
'''
写入文件
:param f:
:return:
'''
with open(files,'wb') as f:
pickle.dump(content,f)
def changes(self,name,now):
'''
修改账号信息
:return:
'''
isNot = self.isForzeNot()
if not isNot:
acount = self.opens('acount.txt')
acount[name] = now
self.edit('acount.txt',acount)
def login(self):
'''
登录
:param name:
:param pwd:
:return:
'''
name = input('请输入用户名:')
pwd = input('请输入密码:')
users = self.opens('users.txt')
if name in users and users[name] == pwd:
self.name = name
return True
else:
print('用户名或密码错误!')
return False
def register(self):
'''
注册账号
:param name:
:param pwd:
:return:
'''
print('注册账号!')
name = input('请输入新用户名:')
user_all = self.opens('users.txt')
if name not in user_all:
self.name = name
pwd = input('请输入密码:')
user_all[name] = pwd
self.edit('users.txt',user_all)
self.changes(name,15000.00)
self.record('record','新建账号,信用卡额度初始化为15000')
self.record('opsition',15000)
print('注册成功!')
else:
print('该账号已存在!')
def getCash(self):
'''
取现
:param num:
:return:
'''
isNot = self.isForzeNot()
if not isNot:
num = input('请输入金额:')
num = self.check_nums(num)
if num:
acount = self.query(self.name)
if acount > num:
now_cash = round(acount - num*1.05,2)
self.changes(self.name,now_cash)
print('成功取现:¥',num)
self.record('record','取现¥{}'.format(num))
print('你的最新余额为:',now_cash)
else:
self.getCash()
def check_nums(self,num):
'''
核对金额
:param num:
:return:
'''
if str(num).isdigit():
return int(str(num))
else:
print('请输入正确的金额,金额必须是整数!')
return False
def check_user(self,name):
'''
检查账户
:param name:
:return:
'''
user_all = self.opens('users.txt')
if name in user_all:
return True
else:
return False
def transfer(self):
'''
转账
:param user:
:param num:
:return:
'''
isNot = self.isForzeNot()
if not isNot:
user = input('请输入转账账户:')
if self.check_user(user):
num = input('请输入转账金额:')
num = self.check_nums(num)
now_money = self.query(self.name)
if num and num<=now_money:
self.changes(self.name,now_money-num)
self.record('record','向账号{}转账:¥{}'.format(user,num))
now_money2 = self.query(user)
self.changes(user,now_money2+num)
self.recorded('record','账号{}转账转入:¥{}'.format(self.name, num),user)
now = self.query(self.name)
print('转账成功,您的最新余额为:¥',now)
elif num:
print('对不起,您的余额不足!')
else:
print('对不起您输入的账户不存在!')
def repay(self):
'''
还款
:return:
'''
now_money = self.query(self.name)
print('您当前的账户余额为:¥',now_money)
num = input('请输入您要充值的金额(整数):')
num = self.check_nums(num)
self.changes(self.name,now_money+num)
self.record('record','账号充值:¥{}'.format(num))
now = self.query(self.name)
print('充值成功,你当前余额为:¥',now)
def record(self,types,commnet):
'''
记录流水
:param types:
:return:
'''
detail = self.opens('acount_detail.txt')
time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
if self.name in detail:
if types == 'record':
detail[self.name][types].update({time_now:commnet})
else:
detail[self.name].update({'opsition': commnet})
else:
detail[self.name] = {types:{time_now:commnet},'opsition':15000}
self.edit('acount_detail.txt',detail)
def recorded(self,types,comment,name):
'''
记录被转账
:param types:
:param comment:
:return:
'''
detail = self.opens('acount_detail.txt')
time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
if name in detail:
if types == 'record':
detail[name][types].update({time_now: comment})
else:
detail[name].update({'opsition': comment})
else:
detail[name] = {types: {time_now: comment}, 'opsition': 15000}
self.edit('acount_detail.txt',detail)
def readRecord(self):
'''
读取流水
:return:
'''
with open('acount_detail.txt','rb') as f:
user_detail = pickle.load(f)
return user_detail
def readDetails(self):
'''
查询流水
:return:
'''
details = self.opens('acount_detail.txt')[self.name]['record']
print('您的信用卡使用记录:')
for key,value in details.items():
print('{}:{}'.format(key,value))
def writeOff(self):
'''
注销信用卡
:return:
'''
name_now = self.opens('acount_detail.txt')[self.name]['opsition']
now_num = self.query(self.name)
if name_now > now_num:
print('对不起,你的账号尚有欠款未还,不能注销,请还款后再进行操作!')
else:
self.delUser('users.txt',self.name)
self.delUser('acount.txt',self.name)
self.delUser('acount_detail.txt',self.name)
print('注销成功!')
def delUser(self,files,user):
'''
删除用户信息
:param files:
:param user:
:return:
'''
fs = self.opens(files)
del fs[user]
self.edit(files,fs)
def forzes(self):
'''
冻结/解冻操作
:return:
'''
alls = self.opens('forze.txt')
if self.name in alls and alls[self.name] == 'Y':
self.unForze()
print('账号解冻成功!')
else:
self.forze()
print('账号冻结成功!')
def forze(self):
'''
冻结账号
:return:
'''
alls = self.opens('forze.txt')
alls[self.name] = 'Y'
self.edit('forze.txt',alls)
def unForze(self):
'''
解冻
:return:
'''
alls = self.opens('forze.txt')
del alls[self.name]
self.edit('forze.txt', alls)
def position(self):
'''
额度
:return:
'''
print()
while 1:
yes = input('您确定要申请提升额度吗?\n1.Yes\n2.No\n请选择:')
if yes == '1':
print('请稍等..')
lists = [1,0.2,0.3,0.2,0.2,0.5,0.3,0.1]
some = random.sample(lists,1)[0]
num = some*2000
now = self.query(self.name)
self.changes(self.name,now+num)
now_po = self.readRecord()[self.name]['opsition']
self.record('opsition',now_po+num)
print('根据您的最近表现,银行特为您提升了{}的额度,您的当前额度是{},祝您使用愉快!'.format(num,now_po+num))
time.sleep(.3)
break
elif yes == '2':
print('放弃额度申请!')
break
else:
print('错误的指令!')
continue
def readShopList(self):
'''
查询购物明细
:return:
'''
alls = self.opens('userShopList.txt')
if self.name in alls:
for date,detail in alls[self.name].items():
print(date,detail)
else:
print('暂时没有购物记录!')
def deal(self,shopLists,bill):
'''
结账
:param shopLists:
:param bill:
:return:
'''
login = self.login()
if login:
now_cash = self.query(self.name)
if now_cash >= bill:
time_now = time.strftime('%Y-%m-%d', time.localtime())
lists = OrderedDict()
lists[time_now] = []
for name, num in shopLists.items():
lists[time_now].append('购买{}数量{}'.format(name, num))
users = self.opens('userShopList.txt')
if self.name in users:
if time_now in users[self.name]:
users[self.name][time_now].extend(lists[time_now])
else:
users[self.name].update(lists)
else:
users[self.name] = lists
self.edit('userShopList.txt', users)
self.changes(self.name,now_cash-bill)
self.record('record','购物商城消费¥{}'.format(bill))
return True
else:
print('对不起,您的余额不足,请及时充值!')
return False
else:
print('交易失败!')
return False
shopping.py
#-*-coding:utf-8-*-
import time
from collections import OrderedDict
import sys
import os
import atm
shoplist = OrderedDict()
bill = 0
atm_now = atm.ATM()
def shops():
'''
购物模块
:return:
'''
print()
while 1:
alls = {1:shoppings,2:shopCar,3:'退出'}
order = input('欢迎进入网上商城!\n1.购物\n2.购物车\n3.退出\n请选择您的操作:')
order = checkOrder(order,len(alls))
if order == 3:
break
if order:
alls[order]()
time.sleep(.3)
print()
else:
continue
def shopCar():
'''
购物车
:return:
'''
while 1:
print()
alls = {1:checkList,2:deal,3:'返回'}
order = input('欢迎进入购物车!\n1.查看清单\n2.结账\n3.返回\n请选择您的操作:')
order = checkOrder(order,len(alls))
if order == 3:
break
if order == 1:
checkList()
time.sleep(.3)
print()
elif order == 2:
ok = deal()
if ok:
print('交易成功!')
global shoplist,bill
shoplist = OrderedDict()
bill = 0
break
else:
continue
def checkList():
'''
查看清单
:return:
'''
global shoplist,bill
if shoplist and bill:
for name,num in shoplist.items():
print('商品:{} × {}'.format(name,num))
print('总金额为:¥',bill)
else:
print('您的购物车尚未添加商品!')
def deal():
'''
结账
:return:
'''
global shoplist,bill
if bill:
ok = atm_now.deal(shoplist,bill)
return ok
else:
print('购物车无商品,请添加后结账!')
return False
def dealNot():
while 1:
print()
global shoplist,bill
if shoplist and bill:
doNot = input('请问您是否结账?\n1.结账\n2.否\n请选择:')
doNot = checkOrder(doNot, 2)
if doNot == 1:
return True
elif doNot == 2:
return False
else:
continue
def shoppings():
'''
购物
:return:
'''
while 1:
print()
alls = {1:vegetables,2:clothing,3:appliances,4:steam,5:'返回'}
order = input('欢迎进入购物商城!\n1.蔬菜\n2.服装\n3.家电\n4.steam\n5.返回\n请选择您的品类:')
order = checkOrder(order,len(alls))
if order == 5:
do = dealNot()
if do:
ok = deal()
if ok:
print('交易成功!')
global shoplist, bill
shoplist = OrderedDict()
bill = 0
else:
print('交易失败!')
break
if order:
print()
alls[order]()
time.sleep(.3)
else:
continue
def centers(name):
'''
居中打印
:param name:
:param num:
:return:
'''
result = name.center(10,' ')
return result
def checkOrder(order,len):
'''
检查指令
:param order:
:param len:
:return:
'''
if str(order).isdigit() and int(order) <= len:
return int(str(order))
else:
print('请输入有效的指令!')
return False
def please():
'''
询问
:return:
'''
while 1:
print()
order = input('请问您是否要继续?\n1.是\n2.否\n请选择:')
order = checkOrder(order,2)
if order==1:
return True
elif order == 2:
return False
else:
continue
def sum(name,values):
'''
统计
:param values:
:param num:
:return:
'''
while 1:
num = input('请输入数量(整数):')
if num.isdigit() and int(num) > 0:
num = int(num)
money = values * num
global bill,shoplist
bill += money
if name in shoplist:
shoplist[name] += num
else:
shoplist[name] = num
break
else:
print('请输入正确的数量!')
print()
def buy(alls,values):
'''
购买
:return:
'''
for i in range(0, len(alls)):
print(centers(str(i + 1)), centers(alls[i]), centers(str(values[i])))
order = input('请输入您的选择:')
order = checkOrder(order, len(alls))
if order:
order -= 1
sum(alls[order], values[order])
isNot = please()
if isNot:
return True
else:
return False
else:
return True
def vegetables():
'''
蔬菜
:return:
'''
print('欢迎进入生鲜购物区!')
while 1:
print()
values = [1.0,0.6,1.1,0.8,1.3,0.7]
alls = ['白菜','萝卜','番茄','大葱','黄瓜','洋葱' ]
print(centers('序号'),centers('名称'),centers('价格/500g'))
isNot = buy(alls,values)
if isNot:
continue
else:
break
def clothing():
'''
服装
:return:
'''
print('欢迎进入服装购物区!')
while 1:
print()
values = [1000.0,120.0,500.0,320.0,200.0,120.0]
alls = ['西装','T恤','羽绒服','卫衣','牛仔裤','短袖' ]
print(centers('序号'),centers('名称'),centers('价格'))
isNot = buy(alls,values)
if isNot:
continue
else:
break
def appliances():
'''
家电
:return:
'''
print('欢迎进入家电购物区!')
while 1:
print()
values = [1500.0,2000.0,3000.0,500.0,500.0,5000.0]
alls = ['洗衣机','冰箱','空调','微波炉','面包机','电视' ]
print(centers('序号'),centers('名称'),centers('价格'))
isNot = buy(alls,values)
if isNot:
continue
else:
break
def steam():
'''
游戏
:return:
'''
print('欢迎进入喜加一购物区!')
while 1:
print()
values = [94.0,180.0,160.0,220.0,90.0,300.0]
alls = ['绝地求生','GTA5','辐射4','刺客信条','巫师3','孤岛惊魂5' ]
print(centers('序号'),centers('名称'),centers('价格'))
isNot = buy(alls,values)
if isNot:
continue
else:
break
home.py
# -*-coding:utf-8-*-
'''
模拟实现一个ATM+购物商城的程序
1.额度15000
2.实现购物商城,买东西加入购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额的万分之5每日计息
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户,用户额度,冻结账户
'''
import time
import os
import atm
import shopping
def check(order,len):
'''
检查指令
:param order:
:param len:
:return:
'''
if str(order).isdigit() and int(order) <= len:
return int(str(order))
else:
print('请输入有效的指令!\n')
return False
def bank():
while 1:
print()
banks = {1:atm_now.getCash,2:atm_now.querys,3:atm_now.transfer,4:atm_now.repay,5:'返回'}
order = input('欢迎进入ATM-信用卡业务:\n1.提现\n2.查询\n3.转账\n4.还款\n5.返回\n请选择业务:')
order = check(order,5)
if order:
if order != 5:
banks[order]()
time.sleep(.3)
print()
else:
break
else:
continue
def manager():
while 1:
print()
banks = {1:atm_now.readDetails,2:atm_now.writeOff,3:atm_now.forzes,4:atm_now.position,5:atm_now.readShopList,6:'返回'}
order = input('欢迎进入ATM-信用卡管理业务:\n1.查询信用卡记录\n2.注销\n3.冻结/解冻\n4.申请额度\n5.商城购物记录\n6.返回\n请选择业务:')
order = check(order,len(banks))
if order == 6:
break
if order and order not in [2,6]:
banks[order]()
time.sleep(.3)
print()
elif order == 2:
banks[order]()
time.sleep(.3)
break
else:
continue
def home():
print()
print('请先登录!')
logins = atm_now.login()
while logins:
print()
alls = {1: bank, 2: atm_now.register, 3: shopping.shops, 4: manager, 5: '返回'}
order = input('欢迎进入ATM业务:\n1.信用卡业务\n2.注册账号\n3.信用卡商城\n4.信用卡管理\n5.返回\n请选择业务:')
order = check(order, 5)
if order == 5:
break
if order and order not in [2,5]:
alls[order]()
time.sleep(.3)
print()
elif order == 2:
alls[order]()
time.sleep(.3)
print()
break
else:
continue
if __name__ == '__main__':
atm_now = atm.ATM()
while 1:
print()
fail_login = {1: home, 2: atm_now.register, 3: '退出'}
order = input('欢迎光临:\n1.登录\n2.注册\n3.退出\n请选择您的业务:')
order = check(order, 3)
if not str(order).isdigit():
continue
if int(order) != 3:
fail_login[int(order)]()
time.sleep(.3)
else:
break
目前代码耦合度较高,有时间再优化下。自己测试了下,目前没发现有重大bug。