模拟实现ATM+购物商城程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟实现ATM+购物商城程序相关的知识,希望对你有一定的参考价值。
流程图:
需求:
ATM:模拟实现一个ATM + 购物商城程序
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
程序目录结构
../module2-ATM ├── ATM流程图.png #流畅图 ├── bin #atm执行程序目录 │ ├── ATM_start.py │ └── __init__.py ├── db #数据库目录 │ ├── __init__.py │ ├── shopping_car #购物车文件 │ ├── shopping_data #信用卡信息文件 │ └── user_data #管理后台用户密码 ├── __init__.py ├── log #日志目录 │ ├── __init__.py │ └── record.log ├── main #主要目录,相关模块功能都在这里 │ ├── admin.py #管理后台模块 │ ├── core.py #调用各个模块的主模块 │ ├── credictcard.py #信用卡模块 │ ├── __init__.py │ ├── log.py #日志模块 │ └── shopping_mall.py #商城模块 └── README
bin目录
atm_start.py执行程序
#coding:utf-8 #Author:支文伟 ‘‘‘执行ATM程序‘‘‘ import os,sys core_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ‘/main‘ sys.path.append(core_path) #把该路径加到环境变量 from core import * if __name__ == ‘__main__‘: core()
db目录
{"66661111": {"locked": "False", "password": 666666, "totalbill": 998, "credictcard": 66661111, "deflimit": 15000, "personinfo": "zhiww", "limitcash": 6502, "limit": 14002}, "66668888": {"credictcard": 66668888, "password": 123456, "totalbill": 0, "locked": "False", "deflimit": 15000, "personinfo": "alex", "limitcash": 7500, "limit": 15000}}
[["shoes", "998"]]
oppoR9s 2500 ipad 5000 book 350 bike 1999 clothes 1600 shoes 998
{"admin": "123"}
log目录
2017-09-02 22:17:56,156 --- 购物---oppoR9s---价格---2500 2017-09-02 22:17:59,843 --- 购物---ipad---价格---5000 2017-09-02 22:19:27,083 --- 购物---oppoR9s---价格---2500 2017-09-02 22:19:27,667 --- 购物---ipad---价格---5000 2017-09-02 22:20:41,450 --- 购物---oppoR9s---价格---2500 2017-09-02 22:20:42,227 --- 购物---ipad---价格---5000 2017-09-02 22:21:03,874 --- 购物---oppoR9s---价格---2500 2017-09-02 22:21:04,307 --- 购物---ipad---价格---5000 2017-09-02 22:21:15,297 --- 购物---oppoR9s---价格---2500 2017-09-02 22:21:15,707 --- 购物---ipad---价格---5000 2017-09-02 22:21:43,529 --- 购物---oppoR9s---价格---2500 2017-09-02 22:21:43,778 --- 购物---ipad---价格---5000 2017-09-02 22:21:44,138 --- 购物---oppoR9s---价格---2500 2017-09-02 22:23:12,962 --- 购物---oppoR9s---价格---2500 2017-09-02 22:23:40,754 --- 购物---oppoR9s---价格---2500 2017-09-02 22:24:31,233 --- 购物---oppoR9s---价格---2500 2017-09-02 22:24:52,283 --- 购物---oppoR9s---价格---2500 2017-09-02 22:36:49,801 --- 购物---oppoR9s---价格---2500 2017-09-02 22:36:50,240 --- 购物---ipad---价格---5000 2017-09-02 22:37:14,768 --- 购物---oppoR9s---价格---2500 2017-09-02 22:37:15,385 --- 购物---ipad---价格---5000 2017-09-02 22:38:20,097 --- 购物---oppoR9s---价格---2500 2017-09-02 22:38:20,586 --- 购物---ipad---价格---5000 2017-09-02 22:39:09,520 --- 购物---oppoR9s---价格---2500 2017-09-02 22:39:09,841 --- 购物---ipad---价格---5000 2017-09-02 22:39:10,584 --- 购物---oppoR9s---价格---2500 2017-09-02 22:39:45,185 --- 购物---oppoR9s---价格---2500 2017-09-02 22:39:46,233 --- 购物---ipad---价格---5000 2017-09-02 22:39:59,344 --- 购物---bike---价格---1999 2017-09-02 22:40:16,728 --- 购物---oppoR9s---价格---2500 2017-09-02 22:41:28,536 --- 购物---oppoR9s---价格---2500 2017-09-02 22:44:09,529 --- 购物---oppoR9s---价格---2500 2017-09-02 22:44:10,210 --- 购物---ipad---价格---5000 2017-09-02 22:45:01,121 --- 购物---oppoR9s---价格---2500 2017-09-02 22:45:41,448 --- 购物---oppoR9s---价格---2500 2017-09-02 22:50:57,263 --- 购物---oppoR9s---价格---2500 2017-09-02 22:51:27,760 --- 购物---oppoR9s---价格---2500 2017-09-02 22:54:17,922 --- 购物---oppoR9s---价格---2500 2017-09-02 22:54:54,464 --- 购物---oppoR9s---价格---2500 2017-09-02 22:54:55,879 --- 购物---ipad---价格---5000 2017-09-02 22:54:57,209 --- 购物---book---价格---350 2017-09-02 22:55:36,530 --- 购物---shoes---价格---998 2017-09-02 22:55:37,552 --- 购物---book---价格---350 2017-09-02 22:55:38,208 --- 购物---bike---价格---1999 2017-09-02 22:55:38,680 --- 购物---oppoR9s---价格---2500 2017-09-06 14:37:00,639 --- 购物---oppoR9s---价格---2500 2017-09-06 14:37:01,162 --- 购物---book---价格---350 2017-09-06 14:37:01,570 --- 购物---clothes---价格---1600 2017-09-07 10:16:24,277 --- 12345678--信用卡商城结账--4450 2017-09-07 10:18:59,989 --- 12345678--信用卡商城结账--4450¥ 2017-09-10 15:00:49,031 --- 购物---oppoR9s---价格---2500 2017-09-10 15:00:49,031 --- 购物---oppoR9s---价格---2500 2017-09-10 15:00:50,222 --- 购物---ipad---价格---5000 2017-09-10 15:00:50,222 --- 购物---ipad---价格---5000 2017-09-10 15:04:51,710 --- 购物---ipad---价格---5000 2017-09-10 15:04:51,710 --- 购物---ipad---价格---5000 2017-09-10 15:04:53,343 --- 购物---oppoR9s---价格---2500 2017-09-10 15:04:53,343 --- 购物---oppoR9s---价格---2500 2017-09-10 15:05:53,751 --- 购物---ipad---价格---5000 2017-09-10 15:05:53,751 --- 购物---ipad---价格---5000 2017-09-10 15:05:54,527 --- 购物---book---价格---350 2017-09-10 15:05:54,527 --- 购物---book---价格---350 2017-09-10 15:06:27,303 --- 购物---book---价格---350 2017-09-10 15:06:27,303 --- 购物---book---价格---350 2017-09-11 10:16:57,211 --- 购物---oppoR9s---价格---2500 2017-09-11 10:16:57,211 --- 购物---oppoR9s---价格---2500 2017-09-11 10:16:57,930 --- 购物---ipad---价格---5000 2017-09-11 10:16:57,930 --- 购物---ipad---价格---5000 2017-09-11 10:17:28,513 --- 购物---oppoR9s---价格---2500 2017-09-11 10:17:28,513 --- 购物---oppoR9s---价格---2500 2017-09-11 10:17:32,387 --- 购物---oppoR9s---价格---2500 2017-09-11 10:17:32,387 --- 购物---oppoR9s---价格---2500 2017-09-11 10:17:34,916 --- 购物---book---价格---350 2017-09-11 10:17:34,916 --- 购物---book---价格---350 2017-09-11 10:44:51,037 --- 购物---oppoR9s---价格---2500 2017-09-11 10:44:51,037 --- 购物---oppoR9s---价格---2500 2017-09-11 10:44:52,299 --- 购物---ipad---价格---5000 2017-09-11 10:44:52,299 --- 购物---ipad---价格---5000 2017-09-11 11:55:00,038 --- 购物---shoes---价格---998 2017-09-11 11:55:00,038 --- 购物---shoes---价格---998 2017-09-11 11:55:30,671 --- 66661111--信用卡商城结账--998¥ 2017-09-11 11:55:30,671 --- 66661111--信用卡商城结账--998¥
main目录
#coding:utf-8 #Author:zhiwenwei import os,json base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ‘‘‘数据库文件的绝对路径‘‘‘ creditcard_data = base_dir + ‘/db/creditcard_data‘ user_dir = base_dir + ‘/db/user_data‘ ‘‘‘管理员用户认证装饰器‘‘‘ def auth_admin(func): def wrapper(*args,**kwargs): while True: check = input("是否确认认证用户?y确认q退出认证") if check == "y": print("管理员用户认证".center(60,‘-‘)) username = input("请输入管理员账户:").strip() passwd = input("请输入管理员密码:").strip() with open(user_dir, ‘r‘, encoding=‘utf-8‘) as f: _user_data = json.loads(f.read()) if username in _user_data.keys() and int(passwd) == int(_user_data[username]): print("用户%s认证成功"%(username)) else: print("用户名或密码有误") continue else: print("已退出管理用户认证") break func(*args,**kwargs) return wrapper ‘‘‘申请信用卡‘‘‘ @auth_admin def apply(): while True: print("申请信用卡".center(40,‘-‘)) with open(creditcard_data,‘r+‘,encoding=‘utf-8‘) as f: _credictcard_data = json.loads(f.read()) credictcard_id = input("请输入你要申请的信用卡号(八位数字):") if credictcard_id.isdigit() and len(credictcard_id) == 8: if credictcard_id not in _credictcard_data.keys(): apply_user = input("请输入信用卡申请人:").strip() apply_passwd = input("请输入信用卡密码(六位数):").strip() if len(apply_user) > 0: if apply_passwd.isdigit() and len(apply_passwd) == 6: _credictcard_data[credictcard_id] = {"limitcash": 7500, "password":int(apply_passwd), "personinfo": apply_user,"locked": "False", "deflimit": 15000, "credictcard": int(credictcard_id), "limit": 15000, "totalbill": 0} dict = json.dumps(_credictcard_data) f.seek(0) f.truncate(0) f.write(dict) f.flush() print("申请信用卡成功!\\n卡号:%s\\t持卡人:%s\\n额度:15000\\t取现额度:7500"%(credictcard_id,apply_user)) break else: print("输入密码有误!") continue else: print("申请人不能为空") else: print("改信用卡已存在") continue else: print("输入信用卡有误!") ‘‘‘修改信用卡密码‘‘‘ @auth_admin def alter_pw(): while True: print("修改信用卡密码".center(40,‘-‘)) with open(creditcard_data,‘r+‘,encoding=‘-utf8‘) as f: _creditcard_data = json.loads(f.read()) creditcard_id = input("请输入你要修改的信用卡:").strip() if creditcard_id.isdigit() and len(creditcard_id) ==8: if creditcard_id in _creditcard_data.keys(): passwd = _creditcard_data[creditcard_id]["password"] _passwd = input("请输入信用卡原密码:").strip() if int(_passwd) == passwd: passwd_new = input("请输入你要设置的信用卡密码:").strip() _creditcard_data[creditcard_id]["password"] = int(passwd_new) dict = json.dumps(_creditcard_data) f.seek(0) f.truncate(0) f.write(dict) f.flush() print("密码修改成功!") break else: print("你输入的原密码有误!") else: print("你输入的信用卡不存在") else: print("你输入的信用卡有误") ‘‘‘添加管理员账户‘‘‘ @auth_admin def alter_admin(): while True: print("添加管理员账户".center(50,‘-‘)) username = input("请设置管理员账户名:").strip() passwd = input("请设置账户密码:").strip() with open(user_dir,‘r+‘,encoding=‘utf-8‘) as f: user_data = json.loads(f.read()) if username not in user_data.keys(): if len(username) >= 0 and len(passwd) >= 0: user_data[username] = passwd user_data = json.dumps(user_data) f.seek(0) f.truncate(0) f.write(user_data) f.flush() print("成功添加[%s]管理员"%(username)) break else: print("账户或密码不能为空") else: print("该管理账户名[%s]已存在!请换一个用户名!"%(username)) continue
#coding:utf-8 #Author:zhiwenwei import os,sys # base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # core_path = base_dir + ‘main‘ # sys.path.insert(0,core_path) from admin import * from credictcard import * from shopping_mall import * ‘‘‘主页面列表‘‘‘ def core_list(): list = [" ATM ", "购物商城", "后台管理", "退出程序"] index = 0 for i in list: print(index+1,i) index +=1 ‘‘‘ATM页面列表‘‘‘ def atm_list(): list = ["信用卡信息", "信用卡转账", "信用卡取现", "信用卡还款", ] index = 0 for i in list: print(index+1,i) index += 1 ‘‘‘后台管理列表‘‘‘ def admin_list(): list = [" 申请信用卡 ", "添加管理员账户", "修改信用卡密码" ] index = 0 for i in list: print(index +1,i) index += 1 ‘‘‘购物商城列表‘‘‘ def shopping_list(): list = ["购物商城", "购物结算", "清空购物车", "查看购物车" ] index = 0 for i in list: print(index+1,i) index += 1 ‘‘‘主函数‘‘‘ def core(): print("欢迎来到购物商城ATM系统".center(30,‘-‘)) while True: core_list() choice = input("请选择ID:").strip() if choice == "q": print("已退出,欢迎下次使用!".center(40,‘-‘)) exit() if choice.isdigit(): choice = int(choice) if 1 <= choice <= 4: while True: if choice == 1: print("欢迎来到信用中心".center(40,‘-‘)) atm_list() atm_choice = input("请选择ATM操作id:").strip() if atm_choice == "q":break if atm_choice == "exit":exit("已退出程序,欢迎下次使用!") if atm_choice.isdigit(): atm_choice = int(atm_choice) if 1 <= atm_choice <= 4: while True: if atm_choice == 1: creditcard_info() break elif atm_choice == 2: transfer() break elif atm_choice == 3: takecash() break elif atm_choice == 4: repayment() break else: print("请输入正确的id") elif choice ==2: print("欢迎来到购物商城".center(40,‘-‘)) shopping_list() shop_choice = input("请选择id:").strip() if shop_choice == "q":break if shop_choice == "exit":exit("已退出程序,欢迎下次使用!") if shop_choice.isdigit(): shop_choice = int(shop_choice) if 1 <= shop_choice <= 4: while True: if shop_choice == 1: mall() break elif shop_choice == 2: shopping_pay() break elif shop_choice == 3: del_shoppingcar() break elif shop_choice == 4: search_shopppingcar() break else: print("请输入正确的id") else: print("请输入正确的id") elif choice == 3: print("欢迎来到管理后台中心".center(50,‘-‘)) admin_list() admin_choice = input("请选择id(q返回exit退出)").strip() if admin_choice == "q":break if admin_choice == "exit":exit("已退出程序,欢迎下次使用!") if admin_choice.isdigit(): admin_choice = int(admin_choice) if 1 <= admin_choice <= 3: while True: if admin_choice == 1: apply() break elif admin_choice == 2: alter_admin() break elif admin_choice == 3: alter_pw() break else: print("请输入正确的id") elif choice == 4: exit("已退出程序,欢迎下次使用!") else: print("请输入正确的id") else: print("你输入有误!")
#coding:utf-8 #Author:支文伟 """信用卡中心""" import os import json import sys from log import get_logger #导入日志模块 ‘‘‘获取数据文件的绝对路径‘‘‘ base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取当前目录的上级目录绝对路径 creditcard_path = base_dir + ‘/db/creditcard_data‘ user_path = base_dir + ‘/db/user_data‘ recordlog_path = base_dir + ‘/log/record.log‘ logger = get_logger() #日志实例化对象 ‘‘‘个人信用卡信息‘‘‘ def creditcard_info(): while True: with open(creditcard_path,‘r‘,encoding=‘utf8‘) as f: creditcard_data = json.loads(f.read()) choice = input("请输入你要查询的信用卡卡号(8位数字)(退出输入q):").strip() if choice in creditcard_data.keys(): print("我的信用卡信息:".center(50,‘-‘)) print("持卡人:[ %s ]\\n卡号:[ %s ]\\n额度:[ %s ]\\n可用额度:[ %s ]\\n提现额度:[ %s ]" % (creditcard_data[choice]["personinfo"],choice,creditcard_data[choice]["deflimit"], creditcard_data[choice]["limit"],creditcard_data[choice]["limitcash"])) elif choice == "q": break else: print("你输入的信用卡不存在!") ‘‘‘信用卡转账‘‘‘ def transfer(): while True: print("信用卡转账".center(50, ‘-‘)) with open(creditcard_path,‘r+‘,encoding=‘utf8‘) as f: creditcard_data = json.loads(f.read()) choice = input("请输入你的信用卡账号(‘q‘返回):").strip() if choice == ‘q‘: break if choice in creditcard_data.keys(): now_limit = creditcard_data[choice]["limit"] transfer_card = input("请输入你要转账的账户:").strip() if transfer_card.isdigit() and transfer_card in creditcard_data.keys() and len(transfer_card) == 8: transfer_money = input("请输入转账金额:").strip() if transfer_money.isdigit(): transfer_money = int(transfer_money) creditcard_passwd = input("请输入信用卡密码:").strip() creditcard_passwd = int(creditcard_passwd) if creditcard_passwd == creditcard_data[choice]["password"]: if transfer_money <= int(now_limit): creditcard_data[choice]["limit"] -= transfer_money creditcard_data[choice]["limitcash"] -= transfer_money creditcard_data[transfer_card]["limit"] += transfer_money creditcard_data[transfer_card]["limitcash"] += transfer_money print("转账成功".center(50,‘-‘)) print("转账金额:[ %s ]\\n信用卡可用额度:[ %s ]" % (transfer_money,creditcard_data[choice]["limit"])) ‘‘‘转账信息记录到日志‘‘‘ transfer_info = ["信用卡转账",str(choice),str(transfer_money)] transfer_info = ‘---‘.join(transfer_info) logger.debug(transfer_info) f.seek(0) #f.truncate(0) creditcard_data_dumps = json.dumps(creditcard_data) f.write(creditcard_data_dumps) else: print("转账额度不能大于信用额度") else: print("输入密码有误") else: print("请输入数字格式的金额!") else: print("你输入的账户不存在") else: print("你输入的信用卡账号不存在!") ‘‘‘信用卡取现‘‘‘ def takecash(): while True: print("信用卡取现".center(50,‘-‘)) with open(creditcard_path,‘r+‘,encoding=‘utf-8‘) as f: creditcard_data = json.loads(f.read()) creditcard = input("请输入你的信用卡账号(q返回):").strip() if creditcard == ‘q‘:break if creditcard in creditcard_data.keys(): limit = creditcard_data[creditcard]["limit"] limitcash = creditcard_data[creditcard]["limitcash"] totalbill = creditcard_data[creditcard]["totalbill"] print("信用卡额度:[ %d ]\\n信用卡账单:[ %d ]\\n单信用卡可取现额度:[ %d ]" %(limit,totalbill,limitcash,)) cash = input("请输入你要取现的额度,手续费%5:").strip() if cash.isdigit() and 0 < int(cash) <= limitcash: passwd = input("请输入信用卡:%s的密码:" %(creditcard)).strip() if int(passwd) == creditcard_data[creditcard]["password"]: cash = int(cash) fee = cash * 0.05 # 手续费 total_cash = cash + fee totalbill += cash creditcard_data[creditcard]["limitcash"] -= total_cash creditcard_data[creditcard]["limit"] -= total_cash creditcard_data[creditcard]["totalbill"] = totalbill print("成功取现:[%d]\\n收取手续费:[%d]" %(cash,fee)) ‘‘‘取现信息记录到日志‘‘‘ takecash_info = ["信用卡取现",creditcard,str(cash)] takecash_info = ‘---‘.join(takecash_info) logger.debug(takecash_info) ‘‘‘永久保存数据库‘‘‘ f.seek(0) creditcard_data = json.dumps(creditcard_data) f.write(creditcard_data) f.flush() else: print("信用卡密码有误!") else: print("你输入额度含有非数字或超过可取现额度") else: print("你输入的信用卡账号不存在") ‘‘‘信用卡还款‘‘‘ def repayment(): while True: print("信用卡还款".center(50,‘-‘)) creditcard = input("请输入信用卡账号:").strip() with open(creditcard_path,‘r+‘,encoding=‘utf8‘) as f: creditcard_data = json.loads(f.read()) print(creditcard_data) if creditcard in creditcard_data.keys(): totalbill = creditcard_data[creditcard]["totalbill"] print("你的信用卡[%s]总账单:[%d]"%(creditcard,totalbill)) repayments = input("请输入你要还款的额度:").strip() if repayments.isdigit() and 0 < int(repayments) <= totalbill: passwd = input("请输入信用卡:[%s]的密码:"%(creditcard)).strip() if int(passwd) == creditcard_data[creditcard]["password"]: repayments = int(repayments) creditcard_data[creditcard]["totalbill"] -= repayments creditcard_data[creditcard]["limit"] += repayments creditcard_data[creditcard]["limitcash"] += repayments totalbill -= repayments ‘‘‘记录还款信息到日志‘‘‘ repayment_info = ["信用卡还款",creditcard,str(repayments)] repayment_info = ‘---‘.join(repayment_info) logger.debug(repayment_info) ‘‘‘写到文件‘‘‘ f.seek(0) creditcard_data = json.dumps(creditcard_data) f.write(creditcard_data) f.flush() print("成功还款:[%d]\\n剩下总账单:[%d]"%(repayments,totalbill)) else: print("你输入的密码有误") else: print("你输入的额度非数字或超过还款额度!") else: print("你输入的信用卡账号不存在!")
#coding:utf-8 #Author:Mr Zhi import logging,os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取上级目录的绝对路径 log_dir = BASE_DIR + ‘/log/record.log‘ def get_logger(): fh = logging.FileHandler(log_dir,encoding=‘utf-8‘) #创建一个文件流并设置编码utf8 logger = logging.getLogger() #获得一个logger对象,默认是root logger.setLevel(logging.DEBUG) #设置最低等级debug fm = logging.Formatter("%(asctime)s --- %(message)s") #设置日志格式 logger.addHandler(fh) #把文件流添加进来,流向写入到文件 fh.setFormatter(fm) #把文件流添加写入格式 return logger
#coding:utf-8 #Author:支文伟 import os,json from log import get_logger logger = get_logger() #日志模块实例化对象 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ‘‘‘数据库文件的绝对路径‘‘‘ shopping_data = base_dir + ‘/db/shopping_data‘ shopping_car = base_dir + ‘/db/shopping_car‘ creditcard_data = base_dir + ‘/db/creditcard_data‘ ‘‘‘购物商城‘‘‘ def mall(): product_list = [] product_list2 = [] with open(shopping_data,‘r‘,encoding=‘utf8‘) as f: for i in f: product_list.append(i.strip("\\n").split(‘ ‘)) #拆分为列表并添加到product_list def product_info(): for index,item in enumerate(product_list): print(index +1,item[0],item[1]) while True: print("欢迎来到购物商城".center(30, ‘-‘)) product_info() choice_id = input("请输入商品编号(q返回):").strip() if choice_id.isdigit(): choice_id = int(choice_id) if 0 <= choice_id <= len(product_list): product_item = product_list[choice_id-1] #获取选择的商店 print("商品 %s 加入购物车,价格 %s " % (product_item[0],product_item[1])) product_list2.append(product_item) ‘‘‘购物信息记录到日志模块‘‘‘ shopping_info = ["购物",str(product_item[0]),"价格",product_item[1]] shopping_info = "---".join(shopping_info) logger.debug(shopping_info) else: print("没有对应的商品编号,请重新输入!") elif choice_id == "q": with open(shopping_car,‘r+‘,encoding=‘utf-8‘) as f: list = json.loads(f.read()) list.extend(product_list2) f.seek(0) list = json.dumps(list) f.write(list) f.flush() break else: print("没有对应的商品编号,请重新输入!") ‘‘‘清空购物车‘‘‘ def del_shoppingcar(): while True: choice = input("是否清空购物车?(‘y‘确认‘q‘退出):").strip() if choice == ‘q‘:break if choice == ‘y‘: with open(shopping_car,"r+",encoding=‘utf-8‘) as f: res = json.loads(f.read()) print(type(res)) if res != []: f.seek(0) f.truncate(0) #截断后面所有的字符也就是清空 list = json.dumps([]) f.write(list) f.flush() print("购物车已经清空!") break else: print("你还没有消费,购物车为空!") else: print("你输入指令有误!") break ‘‘‘购物结算‘‘‘ def shopping_pay(): while True: print("购物结算".center(50,‘-‘)) with open(shopping_car,‘r+‘,encoding=‘utf-8‘) as f: data = json.loads(f.read()) if data != []: print("\\t商品\\t价格") for index,item in enumerate(data): print(index +1,item[0],item[1]) money = sum([int(i[1]) for i in data]) else: print("你还没消费,快去花钱吧!") break choice = input("商品总额:%s (y)确认支付,(q)返回:" %(money)) if choice == ‘q‘:break if choice == ‘y‘: creditcard_id = input("请输入结算的信用卡账号:").strip() with open(creditcard_data,‘r+‘,encoding=‘utf-8‘) as f2: _creditcard_data = json.loads(f2.read()) if creditcard_id in _creditcard_data.keys(): passwd = input("请输入信用卡 %s 支付密码:" % (_creditcard_data[creditcard_id]["credictcard"])).strip() if int(passwd) == _creditcard_data[creditcard_id]["password"]: limit = _creditcard_data[creditcard_id]["limit"] limitcash = _creditcard_data[creditcard_id]["limitcash"] if _creditcard_data[creditcard_id]["limit"] >= money: _creditcard_data[creditcard_id]["limit"] -= money _creditcard_data[creditcard_id]["limitcash"] -= money _creditcard_data[creditcard_id]["totalbill"] += money #账单 ‘‘‘写入日志‘‘‘ shopping_info = [creditcard_id,"信用卡商城结账",str(money)+"¥"] shopping_info = ‘--‘.join(shopping_info) logger.debug(shopping_info) ‘‘‘写入数据‘‘‘ dict = json.dumps(_creditcard_data) f2.seek(0) f2.truncate(0) f2.write(dict) print("支付成功:%s¥"%(money)) break else: print("当前信用卡额度%s不足支付!"%(limit)) else: print("密码有误,请重新输入!") else: print("你输入的信用卡不存在!") ‘‘‘查看购物车‘‘‘ def search_shopppingcar(): print("购物车".center(60,‘-‘)) with open(shopping_car,‘r‘,encoding=‘utf-8‘) as f: shopping_car_info = json.loads(f.read()) if shopping_car_info != []: print("\\t商品\\t价格") for i in shopping_car_info: print(i) else: print("购物车为空,请去商城看看!!!")
以上是关于模拟实现ATM+购物商城程序的主要内容,如果未能解决你的问题,请参考以下文章