最近无聊又写了一个信用卡业务的练习。基于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 = Nonelists = ['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 Trueelse:return Falsedef 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 acountdef 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] = nowself.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 = namereturn Trueelse:print('用户名或密码错误!')return Falsedef register(self):'''注册账号:param name::param pwd::return:'''print('注册账号!')name = input('请输入新用户名:')user_all = self.opens('users.txt')if name not in user_all:self.name = namepwd = input('请输入密码:')user_all[name] = pwdself.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 Falsedef check_user(self,name):'''检查账户:param name::return:'''user_all = self.opens('users.txt')if name in user_all:return Trueelse:return Falsedef 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_detaildef 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*2000now = 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)breakelif yes == '2':print('放弃额度申请!')breakelse:print('错误的指令!')continuedef 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] = listsself.edit('userShopList.txt', users)self.changes(self.name,now_cash-bill)self.record('record','购物商城消费¥{}'.format(bill))return Trueelse:print('对不起,您的余额不足,请及时充值!')return Falseelse:print('交易失败!')return False

shopping.py

#-*-coding:utf-8-*-
import time
from collections import OrderedDict
import sys
import os
import atm
shoplist = OrderedDict()
bill = 0atm_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:breakif order:alls[order]()time.sleep(.3)print()else:continuedef 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:breakif order == 1:checkList()time.sleep(.3)print()elif order == 2:ok = deal()if ok:print('交易成功!')global shoplist,billshoplist = OrderedDict()bill = 0breakelse:continuedef checkList():'''查看清单:return:'''global shoplist,billif shoplist and bill:for name,num in shoplist.items():print('商品:{} × {}'.format(name,num))print('总金额为:¥',bill)else:print('您的购物车尚未添加商品!')def deal():'''结账:return:'''global shoplist,billif bill:ok = atm_now.deal(shoplist,bill)return okelse:print('购物车无商品,请添加后结账!')return Falsedef dealNot():while 1:print()global shoplist,billif shoplist and bill:doNot = input('请问您是否结账?\n1.结账\n2.否\n请选择:')doNot = checkOrder(doNot, 2)if doNot == 1:return Trueelif doNot == 2:return Falseelse:continuedef 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, billshoplist = OrderedDict()bill = 0else:print('交易失败!')breakif order:print()alls[order]()time.sleep(.3)else:continuedef centers(name):'''居中打印:param name::param num::return:'''result = name.center(10,' ')return resultdef checkOrder(order,len):'''检查指令:param order::param len::return:'''if str(order).isdigit() and int(order) <= len:return int(str(order))else:print('请输入有效的指令!')return Falsedef please():'''询问:return:'''while 1:print()order = input('请问您是否要继续?\n1.是\n2.否\n请选择:')order = checkOrder(order,2)if order==1:return Trueelif order == 2:return Falseelse:continuedef sum(name,values):'''统计:param values::param num::return:'''while 1:num = input('请输入数量(整数):')if num.isdigit() and int(num) > 0:num = int(num)money = values * numglobal  bill,shoplistbill += moneyif name in shoplist:shoplist[name] += numelse:shoplist[name] = numbreakelse: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 -= 1sum(alls[order], values[order])isNot = please()if isNot:return Trueelse:return Falseelse:return Truedef 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:continueelse:breakdef 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:continueelse: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:continueelse:breakdef 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:continueelse: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 shoppingdef check(order,len):'''检查指令:param order::param len::return:'''if str(order).isdigit() and int(order) <= len:return int(str(order))else:print('请输入有效的指令!\n')return Falsedef 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:breakelse:continuedef 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:breakif order and order not in [2,6]:banks[order]()time.sleep(.3)print()elif order == 2:banks[order]()time.sleep(.3)breakelse:continuedef 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:breakif order and order not in [2,5]:alls[order]()time.sleep(.3)print()elif order == 2:alls[order]()time.sleep(.3)print()breakelse:continueif __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():continueif int(order) != 3:fail_login[int(order)]()time.sleep(.3)else:break

目前代码耦合度较高,有时间再优化下。自己测试了下,目前没发现有重大bug。

信用卡+购物商城+ATM管理练习相关推荐

  1. Python__模拟实现一个ATM+购物商城程序

    需求:模拟实现一个ATM+购物商城程序1.额度1500或者自定义2.实现购物商城,买东西加入购物车,调用信用卡接口3.可以提现,手续费5%4.支持账户登录5.支持账户间转账6.记录每日日常消费流水7. ...

  2. python模拟砍价代码_Python__模拟实现一个ATM+购物商城程序

    1 #Author wangmengzhu 2 ''' 3 用户认证,确认是用户登录,判断用户登录的用户名和密码是否正确,判断用户认证的长度是否为0,使用装饰器4 用户登录认证,信用卡登录认证,管理员 ...

  3. python项目实战(一):购物商城(采用面向过程思想开发)

    文章目录 一.项目开发架构图 1.用户视图层 2.逻辑接口层 3.数据处理层 二.项目目录展示 三.项目源码展示 1.readme.md 2.settings.py 3.src.py 4.admin. ...

  4. 购物商城框架java_基于jsp的购物商城-JavaEE实现购物商城 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的购物商城, 该项目可用各类java课程设计大作业中, 购物商城的系统架构分为前后台两部分, 最终实现在线上进行购物 ...

  5. 【计算机毕业文章】网上购物商城

    毕业论文(设计) 题 目: 网上购物商城 院 别: XXXXXXXX 班 级: XXXXXXXX 学 号: XXXXXXXX 姓 名: ※※※ 指导教师: ※※※ 职 称 ※※※ 完成日期: 网上购物 ...

  6. Python学习day5作业-ATM和购物商城

    Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆, ...

  7. python模拟ATM + 购物商城

    模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 ...

  8. ATM + 购物商城程序

    模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 ...

  9. python atm作业详解_Python学习day5作业-ATM和购物商城

    Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM:指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用 ...

  10. Day5作业,商城+ATM机+后台管理

    晚来了....东西太多,需要写的blog内容太多,re讲的渣渣,不明白为什么oldboy经常换老师,吐槽下吧,真心不爱了.... github地址在这:https://github.com/ccorz ...

最新文章

  1. Vue实例里this的使用
  2. mysql 事务 数量_如何知道数据库创建以来并发事务的最大数量
  3. 网络文学平台如何借力智能推荐,实现阅读体验全面提升?
  4. linux下ioctl遇到的坑
  5. 算法 - 贪心算法(集合覆盖问题求解)
  6. 计算机丢失winmm.dll,winmm.dll
  7. 除了写代码,还能如何晋升为高级工程师?
  8. 【NetApp】可以使用查设备备件型号的链接
  9. (四)洞悉linux下的Netfilteramp;iptables:包过滤子系统iptable_filter
  10. junit学习笔记(二):hamcrest和TestSuit
  11. 最小树——迪杰斯特拉算法
  12. IEEE 浮点数编码规则
  13. 八爪鱼数据采集教程(一)
  14. 计算机逻辑与 或 非的表达式,计算机算数和,逻辑与,逻辑或,逻辑非分别是什么意思...
  15. 为web-polygraph添加user_agent和add_headers配置变量
  16. 【得之我幸,失之我命】分享下研究生阶段, IEEE论文投稿的心态和心路历程
  17. 音视频技术开发周刊 | 251
  18. LiveNVR监控摄像头Onvif/RTSP视频流媒体服务平台概览负载信息实时展示取流中、播放中、录像中等使用数目说明
  19. 计算机系统结构复习(六):Limits to ILP and SMT指令级并行的限制和同时多线程
  20. j - 分组(动态规划)

热门文章

  1. 《中文版PHOTOSHOP.CS3完全自学教程》李金明.李金荣.彩色扫描版.pdf
  2. 希捷“固件门”,影响深远啊
  3. 高德地图通过经纬度获取地区城市
  4. TCPMP播放器UI的修改方法
  5. 谷歌应用程序无法启动,因为应用程序的并行配置不正确的问题解决方案
  6. Python实现支持人机对战的五子棋软件(超详细)
  7. ali p3c规则扩展-集成sonar
  8. 不想做外包,当不了药神,AI公司如何才能走通制药这条路?
  9. 从已知身份证号码中提取生日和性别
  10. git创建本地版本仓库