模拟实现一个ATM + 购物商城程序
- 额度 15000或自定义
- 实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 支持多账户登录
- 支持账户间转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
- 用户认证用装饰器
readme:
程序总入口是start.py
bank下是关于ATM相关的内容
shopping_mall下购物商城相关内容
logs下是存储的日志
database下是商城和ATM的相关数据,两者中分别有“初始数据.py”将原始数据存入
start
from bank import ATM from shopping_mall import mall def destination(): choice = input("请选择前往地: " "1、购物商城 " "2、银行 " "请选择要执行的编号:" ) if choice == "1": mall.shopping() if choice == "2": ATM.opt() destination()
bank_>ATM
from bank import confirm_a from bank import main from bank import manage def atm(user_status): """ 在atm中选择要执行的内容 :param user_status: :return: """ atm_exit = True while atm_exit: choice =input( " 33[32;1m ---------------Welcome %s--------------- 33[0m " "1. 查看账户信息 " "2. 存款 " "3. 取款 " "4. 转账 " "5. 还款 " "6. 查看账单 " "q. 退出 " "请选择要执行的编号:" %user_status["id"]) menu = { "1": main.check_note, "2": main.deposit, "3": main.withdraw, "4": main.transfer, "5": main.repayment, "6": main.bill, "q": main.end } if choice in menu: # operate = menu[choice].__name__ menu[choice](user_status) def enter(): """ 将用户名和密码进行验证,并且存到user_status中,方便后续调用 :return: """ user_status= {"state":False, "id":None, "usermsg":None} while user_status["state"] is False: acc_name = input("请输入账户名称:").strip() acc_msg = confirm_a.confirm(acc_name) if acc_msg: user_status["state"] = True user_status["id"] = acc_name user_status["usermsg"] = acc_msg atm(user_status) def opt(): """ 选择进入管理员入口还是atm入口 :return: """ opt_exit = True while opt_exit: choice = input("1、用户入口 " "2、管理员入口 " "q、退出 " "请选择要执行的编号:") if choice == "1": enter() elif choice == "2": manage.admin() elif choice == "q": opt_exit = False
bank->centre
import time from conf import settings from bank import logger,db_handle_a def center(account,tran_type,amount,user_status): # account,"deposit",amount,user_status """ 根据不同的交易类型对不同类型的银行卡进行金额的加减 :param account: 具体银行卡,以及对应的编码 :param tran_type: 交易类型 :param amount: 交易金额 :param user_status: 包含登录状态、账户名、账户信息的变量 :return: """ if tran_type in settings.TRANS_TYPE_S: if account[1]["classify"] == "信用卡": interest = amount * settings.TRANS_TYPE_CRED[tran_type]["interest"] # 利息 old_debt = account[1]["debt"] old_balance = account[1]["balance"] if settings.TRANS_TYPE_CRED[tran_type]["mode"] == "plus": new_balance = old_balance + amount - interest new_debt = old_debt - amount elif settings.TRANS_TYPE_CRED[tran_type]["mode"] == "subtract": new_balance = old_balance - amount - interest new_debt = old_debt + amount if new_balance < 0: print("余额不足,当前余额为%s" % old_balance) else: print("交易成功") account[1]["balance"] = new_balance account[1]["debt"] = new_debt user_status["usermsg"]["data"][account[0] - 1] = account[1] account_num = str(account[0]) account_name = account[1][account_num] r_key = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) record_msg = "num:%s account:%s mode:%s amount:%s interest:%s balance:%s debt:%s"% (account[0], account_name, tran_type, amount, interest, new_balance,new_debt) user_status["usermsg"]["record"][account_name][r_key] = record_msg logger.logger_bk(user_status["id"], tran_type) logger.logger_month(user_status["id"], record_msg) elif account[1]["classify"] == "储蓄卡": interest = amount * settings.TRANS_TYPE_S[tran_type]["interest"] # 利息 old_balance = account[1]["balance"] if settings.TRANS_TYPE_S[tran_type]["mode"] == "plus": new_balance = old_balance + amount + interest elif settings.TRANS_TYPE_S[tran_type]["mode"] == "subtract": new_balance = old_balance - amount - interest if new_balance < 0: print("余额不足,当前余额为%s"%old_balance) else: print("交易成功") account[1]["balance"] = new_balance # account = (2, {'2': '银行卡1', 'balance': 10000, 'classify': '储蓄卡', 'expiry': '2025-11-10'}) user_status["usermsg"]["data"][account[0]-1] = account[1] account_num = str(account[0]) account_name = account[1][account_num] r_key = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) record_msg = "num:%s account:%s mode:%s amount:%s interest:%s balance:%s"% (account[0],account_name,tran_type,amount,interest,new_balance) user_status["usermsg"]["record"][account_name][r_key] = record_msg logger.logger_bk(user_status["id"], tran_type) logger.logger_month(user_status["id"], record_msg) db_handle_a.json_stroage(user_status["id"],user_status["usermsg"]) return else: print("该交易类型不存在") return
bank->confirm_a
import hashlib from bank import db_handle_a def confirm(username): """ 验证输入的用户名和密码是否正确,正确读取文件内容 :param username: :return: 读取的文件内容 """ usermsg = db_handle_a.json_read(username) count = 0 while count < 3: passwd = input("请输入密码:").strip() m = hashlib.md5() m.update(passwd.encode("utf-8")) passwd = m.hexdigest() if passwd == usermsg["password"]: count = 3 if usermsg["status"]: return usermsg # print(" 33[32;1m Welcome 33[0m", name) else: print(" 33[35;1m 用户名已被锁定 33[0m") else: count += 1 if not count == 3: print(" 33[35;1m 密码错误,还有%s次机会! 33[0m" %(3 - count)) else: print(" 33[35;1m 密码错误,帐号被锁定 33[0m") usermsg["status"] = 0 db_handle_a.json_stroage(username,usermsg) def verify(func): def inner(user_status,*args,**kwargs): if user_status["state"] == False: acc_name = input("请输入账户名称:").strip() acc_msg = confirm(acc_name) user_status["state"] = True user_status["id"] = acc_name user_status["usermsg"] = acc_msg else: func(user_status) return inner
bank->db_handler-a
import os,json from conf import settings def json_read(username): """ 读取用户名对应文件内容 :param username: 用户名 :return: 文件内容 """ filename = os.path.join(settings.BANK_PATH,username +".json") if os.path.isfile(filename): data = json.load(open(filename, "r", encoding="utf-8")) return data else: print(" 33[37;1m用户名无效 33[0m") exit() def json_stroage(username,msg): """ 将内存中的内容存储到文件中 :param username: 文件名 :param msg: 将要存储的内容 :return: """ filename = os.path.join(settings.BANK_PATH, username + ".json") if os.path.isfile(filename): f = open(filename+ ".new", "w", encoding="utf-8") json.dump(msg,f) f.close() os.replace(filename + ".new",filename) return msg else: f = open(filename, "w", encoding="utf-8") json.dump(msg, f) exit()
bank->logger
import os,logging from logging import handlers from conf import settings def logger_bk(name,message): """ ATM操作日志,文档记录 :param name: 记录执行操作的用户名 :param message: 记录执行的操作 :return: """ logger_path = os.path.join(settings.LOGGER_PATH,"atm_logger.log") fomatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s') fh = logging.FileHandler(logger_path,encoding='utf-8') fh.setLevel(settings.LOGGER_LEVEL) fh.setFormatter(fomatter) logger = logging.getLogger(name) logger.setLevel(settings.LOGGER_LEVEL) logger.addHandler(fh) logger.info(message) print(id(logger)) print(logger.handlers) def logger_month(name,message): """ 间隔30天记录用户在ATM机上的消费记录 :param name: 记录执行操作的用户名 :param message: 记录执行的操作 :return: """ logger_path = os.path.join(settings.LOGGER_PATH, name+".log") fh = handlers.TimedRotatingFileHandler(filename=logger_path,when ="D",interval=30,backupCount=30,encoding='utf-8') fomatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s') fh.setLevel(settings.LOGGER_LEVEL) fh.setFormatter(fomatter) logger = logging.getLogger(name) logger.setLevel(settings.LOGGER_LEVEL) logger.addHandler(fh) logger.info(message) print(id(logger)) print(logger.handlers)
bank-main
import os,sys,time from bank import logger,confirm_a,db_handle_a,centre from shopping_mall import db_handle_s @confirm_a.verify def check_note(user_status,acc_type="check_note"): """ ATM 中打印账户信息,并在日志中记录 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :return: """ user_msg = user_status["usermsg"]["data"] print(" 33[32;1m ---------------账户信息--------------- 33[0m" ) for i in user_msg: print(i) logger.logger_bk(user_status["id"], acc_type) logger.logger_month(user_status["id"], acc_type) def print_acc(user_msg): """ ATM 中打印账户信息 :param usermsg: 该账户的所有信息 :return: """ print(" 33[32;1m ---------------账户信息--------------- 33[0m" ) for i in user_msg: print(i) def choice_acc(msg_list,mode): """ 同一账户名下有多张银行卡,选择其中的银行卡,进行之后需求 :param msg_list: 所有卡信息以列表形式传入 :param mode: 后续需求的目的 :return:返回所选银行卡信息及编号 """ while True: num = input("请选择%s账户:" %mode) if num.isdigit: if int(num) <= len(msg_list): for i in msg_list: if num in i: num = int(num) msg = msg_list[num-1] timer = time.strftime("%Y-%m-%d", time.localtime(time.time())) if msg["expiry"] > timer: return num,msg else: print(" 33[31;1m该银行卡已到期!无法正常使用 33[0m") elif num == "q": return else: print("输入错误,请重新输入") @confirm_a.verify def deposit(user_status,acc_type = "deposit"): """ 存款 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :return: """ user_msg = user_status["usermsg"]["data"] print_acc(user_msg) mode = "存款" account = choice_acc(user_msg,mode) deposit_exit = True while deposit_exit: amount = input("请输入存款金额:") if len(amount) > 0 and amount.isdigit(): amount = int(amount) centre.center(account, acc_type, amount, user_status) if amount == "q": deposit_exit = False @confirm_a.verify def withdraw(user_status,acc_type = "withdraw"): """ 取款 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :return: """ user_msg = user_status["usermsg"]["data"] print_acc(user_msg) mode = "取款" account = choice_acc(user_msg,mode) withdraw_exit = True while withdraw_exit: amount = input("请输入取现金额:").strip() if len(amount) > 0 and amount.isdigit(): amount = int(amount) if amount <= account[1]["balance"]: centre.center(account, acc_type, amount, user_status) else: print("余额不足,可提现%s"%account[1]["balance"]) if amount == "q": withdraw_exit = False @confirm_a.verify def bill(user_status,acc_type = "bill"): """ 查看账单 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :return: """ user_msg=user_status["usermsg"]["data"] mode = "查看账单" print_acc(user_msg) account = choice_acc(user_msg, mode) acc_msg = account[1] num = str(account[0]) for i in user_status["usermsg"]["record"][acc_msg[num]]: print(i,user_status["usermsg"]["record"][acc_msg[num]][i]) logger.logger_bk(user_status["id"], acc_type) logger.logger_month(user_status["id"], acc_type) @confirm_a.verify def trans_same(user_status,acc_type = "transfer_out"): """ 同行转账 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :return: """ user_msg = user_status["usermsg"]["data"] print_acc(user_msg) mode = "转出" account_out = choice_acc(user_msg, mode) mode = "转入" account_into = choice_acc(user_msg, mode) trans_same_exit = True while trans_same_exit: amount = input("请输入转出金额:").strip() if len(amount) > 0 and amount.isdigit(): amount = int(amount) if amount <= account_out[1]["balance"]: centre.center(account_out, acc_type, amount, user_status) centre.center(account_into, "transfer_into", amount, user_status) else: print("余额不足,可提现%s" % account_out[1]["balance"]) if amount == "q": trans_same_exit = False def trans_differ(user_status,acc_type = "transfer_out",*args): # account_outter,amount """ 跨行转账 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :param args: 外部连接时,传入账户名和转账金额 :return: """ user_msg = user_status["usermsg"]["data"] print_acc(user_msg) mode = "转出" account_out = choice_acc(user_msg, mode) mode = "转入" if len(args) != 0: account_into_name = args[0]["id"] account_into = args[0]["data"] amount = str(args[1]) ask = "2" elif len(args) == 0: ask_exit = True while ask_exit: ask = input("1、内部账号转账 " "2、外部账号转账 " "请选择要执行的编号:") if ask == "1": account_into = choice_acc(user_msg, mode) elif ask == "2": account_into_name = input("请输入转入账户").strip() # "account_mall" account_into = db_handle_s.json_read(account_into_name, "mall_db") ask_exit = False else: print("输入无效,请重新输入") amount = input("请输入转出金额:").strip() trans_differ_exit = True while trans_differ_exit: if len(amount) > 0 and amount.isdigit(): amount = int(amount) if amount <= account_out[1]["balance"]: centre.center(account_out, acc_type, amount, user_status) if ask == "1": centre.center(account_into, "transfer_into", amount, user_status) elif ask == "2": account_into["balance"] = account_into["balance"] + amount db_handle_s.json_stroage(account_into_name, "mall_db", account_into) print("交易成功") return else: print("余额不足,可提现%s" % account_out[1]["balance"]) if amount == "q": trans_differ_exit = False def external(aouncc_outer,amount): """ 连接商城支付 :param aouncc_outer: 商城账户 :param amount: 消费金额 :return: """ user_status= {"state":False, "id":None, "usermsg":None} acc_name = input("请输入账户名称:").strip() acc_msg = confirm_a.confirm(acc_name) if acc_msg: user_status["state"] = True user_status["id"] = acc_name user_status["usermsg"] = acc_msg trans_differ(user_status,"transfer_out",*(aouncc_outer,amount)) @confirm_a.verify def transfer(user_status,acc_type = "transfer"): """ 转账总入口 :param user_status: ATM.enter函数中包含登录状态、账户名、账户信息的变量 :param acc_type: 交易类型 :return: """ mode = "转账" way = input("请选择转账方式: " "1.同行转账 " "2.跨行转账 " "请选择要执行的编号:") menu = {"1": trans_same, "2": trans_differ} if way in menu: menu[way](user_status,acc_type = "transfer_out") @confirm_a.verify def repayment(user_status,acc_type = "repayment"): """ 还款总入口 :param user_status: :param acc_type: :return: """ mode = "还款" way = input("请选择还款方式: " "1、转账 " "2、存款 " "请选择要执行的编号:") menu = {"1":transfer, "2":deposit} if way in menu: menu[way](user_status,acc_type = "repayment") def end(user_status,acc_type = "end"): exit()
bank->manager
import os,sys,time,json,hashlib,datetime from bank import db_handle_a,logger def common(usermsg,name): """ 增加银行卡中的具体内容 :param usermsg: 账户所有信息 :param name: 账户名 :return: """ user_msg = usermsg["data"] num = len(user_msg) num = str(num+1) new_data = {num: "", "balance": "", "classify": ""} card = True while card: ask = input("信用卡(c)还是储蓄卡(d)?") if ask == "c": new_data["classify"] = "信用卡" new_data["balance"] = int(input("请输入用户额度")) card = False elif ask == "d": new_data["classify"] = "储蓄卡" new_data["balance"] = int(input("请输入存入金额:")) card = False elif ask == "q": card = False else: print("无效输入,请重新输入") card_name = input("请输入银行卡名:") new_data[num] = card_name new_data["expiry"] = (datetime.datetime.now()+datetime.timedelta(days=3650)).strftime("%Y-%m-%d") r_key = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) new_msg = "创建新卡" usermsg["record"][card_name] = {} usermsg["record"][card_name][r_key] = new_msg user_msg.append(new_data) return usermsg def add_new_card(): """ 为已存在的账户添加银行卡 :return: """ name = input("请输入账户名:").strip() usermsg = db_handle_a.json_read(name) usermsg = common(usermsg,name) record_msg = "添加新银行卡" + name logger.logger_bk(name, record_msg) logger.logger_month(name, record_msg) db_handle_a.json_stroage(name,usermsg) manage_exit = False def add_new_acc(): """ 创建新的账户 :return: """ name = input("请输入账户名:").strip() password = input("请输入密码:") m = hashlib.md5 m.update(password.encode("utf-8")) password = m.hexdigest() usermsg = {"password": password, "status": 1, "data": [], "record": {} } usermsg = common(usermsg,name) timmer = time.strftime('%Y-%m-%d', time.localtime(time.time())) record_msg = "建立账户" + name + timmer logger.logger_bk(name, record_msg) logger.logger_month(name, record_msg) db_handle_a.json_stroage(name,usermsg) manage_exit = False def frozen(): """ 冻结或解锁账户 :return: """ name = input("请输入账户名:").strip() usermsg = db_handle_a.json_read(name) frozen_exit = True while frozen_exit: if usermsg["status"] == 1: ask = input("是否冻结账户?") if ask == "y": usermsg["status"] = 0 logger.logger_bk(name, "冻结账户") logger.logger_month(name, "冻结账户") frozen_exit = False elif ask == "n" or ask == "q": frozen_exit = False else: print("输入错误!") elif usermsg["status"] == 0: ask = input("是否解锁账户?") if ask == "y": usermsg["status"] = 1 logger.logger_bk(name, "解锁账户") logger.logger_month(name, "解锁账户") frozen_exit = False elif ask == "n" or ask == "q": frozen_exit = False else: print("输入错误!") db_handle_a.json_stroage(name,usermsg) def modify(): """ 修改账户用户额度 :return: """ name = input("请输入账户名:").strip() usermsg = db_handle_a.json_read(name) user_msg = usermsg["data"] mode = "修改用户额度" print(" 33[32;1m ---------------账户信息--------------- 33[0m") for i in user_msg: print(i) modify_exit = True while modify_exit: num = input("请选择%s账户:" %mode) if num.isdigit: if int(num) <= len(user_msg): for i in user_msg: if num in i: num = int(num) msg = user_msg[num-1] modify_exit = False elif num == "q": modify_exit = False else: print("输入错误,请重新输入") new_balance = int(input("请输入修改额度:")) msg["balance"] = new_balance usermsg["data"][num-1]["balance"] = new_balance record_msg = "修改额度:%s"%new_balance db_handle_a.json_stroage(name,usermsg) logger.logger_bk(name, mode) logger.logger_month(name, record_msg) def end(): """ 退出程序 :return: """ exit() def admin(): """ 管理员总入口,选择具体执行模块 :return: """ manage_exit = True while manage_exit: print("请选择所需服务:".center(50,"-")) msg = "1、添加账户 " "2、添加银行卡 " "ATM与购物商城、冻结解锁账户 " "4、修改用户额度 " "q、退出 " ">>:" menu = { "1": add_new_acc, "2": add_new_card, "ATM与购物商城": frozen, "4": modify, "q": end } choice = input(msg) if choice in menu: menu[choice]()
conf->settings
import os,logging BASE_DIR =os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DB_PATH = os.path.join(BASE_DIR,"database") BANK_PATH = os.path.join(DB_PATH,"database_bank") MALL_PATH = os.path.join(DB_PATH,"database_mall") MALL_PATH_C = os.path.join(MALL_PATH,"customer") MALL_PATH_M = os.path.join(MALL_PATH,"mall_db") LOGGER_PATH = os.path.join(BASE_DIR,"logs") LOGGER_LEVEL = logging.INFO TRANS_TYPE_CRED = {"deposit":{"mode":"plus","interest":0}, "withdraw":{"mode":"subtract","interest":0.05}, "transfer_out":{"mode":"subtract","interest":0.05}, "transfer_into":{"mode":"plus","interest":0}, "repayment": {"mode": "plus", "interest": 0}} TRANS_TYPE_S = {"deposit":{"mode":"plus","interest":0}, "withdraw":{"mode":"subtract","interest":0}, "transfer_out":{"mode":"subtract","interest":0}, "transfer_into":{"mode":"plus","interest":0}, "repayment": {"mode": "plus", "interest":0}} MALL_PATH_M = os.path.join(MALL_PATH,"mall_db") GOODS = [{"1": "电脑", "price": 1999}, {"2": "鼠标", "price": 10}, {"ATM与购物商城": "游艇", "price": 20}, {"4": "美女", "price": 998}, {"5": "iphone", "price": 7000}]
database->database_bank->初始化数据.py
import json,hashlib data = {"password":"abc123", "status":1, "data" : [{"1":"信用卡","balance":15000,"debt":0,"classify":"信用卡","expiry":"2022-12-21"}, {"2":"银行卡1","balance":10000,"classify":"储蓄卡","expiry":"2025-11-10"}], "record":{"信用卡":{},"银行卡1":{}} } m = hashlib.md5() m.update(data["password"].encode("utf-8")) data["password"] = m.hexdigest() json.dump(data,open("alex.json","w",encoding="utf_8")) data = {"password":"def456", "status":1, "data" : [{"1":"信用卡","balance":15000,"debt":0,"classify":"信用卡","expiry":"2023-11-1"}, {"2":"银行卡1","balance":2000,"classify":"储蓄卡","expiry":"2020-12-15"}, {"ATM与购物商城":"银行卡2","balance":5000,"classify":"储蓄卡","expiry":"2022-10-1"}], "record": {"信用卡": {}, "银行卡1": {},"银行卡2": {}} } m = hashlib.md5() m.update(data["password"].encode("utf-8")) data["password"] = m.hexdigest() json.dump(data,open("rain.json","w",encoding="utf_8")) data = {"password":"hij789", "status":1, "data" : [{"1":"信用卡","balance":15000,"debt":0,"classify":"信用卡","expiry":"2022-ATM与购物商城-17"}, {"2":"银行卡","balance":4000,"classify":"储蓄卡","expiry":"2025-11-18"}, {"ATM与购物商城":"银行卡","balance":6000,"classify":"储蓄卡","expiry":"2021-10-17"}], "record": {"信用卡": {}, "银行卡1": {}} } m = hashlib.md5() m.update(data["password"].encode("utf-8")) data["password"] = m.hexdigest() json.dump(data,open("jack.json","w",encoding="utf_8"))
database->database_mall->customer->初始化数据.py
import json data = {"password":"123", "shopping_chart":[], "record":[]} json.dump(data,open("alex.json","w",encoding="utf_8")) data = {"password":"456", "shopping_chart":[], "record":[]} json.dump(data,open("rain.json","w",encoding="utf_8")) data = {"password":"789", "shopping_chart":[], "record": []} json.dump(data,open("jack.json","w",encoding="utf_8"))
database->database_mall->mall_db->初始化数据
import json goods = [ {"1": "电脑", "price": 1999}, {"2": "鼠标", "price": 10}, {"ATM与购物商城": "游艇", "price": 20}, {"4": "美女", "price": 998}, {"5": "iphone", "price": 7000} ] json.dump(goods,open("shopping_goods.json","w",encoding="utf-8")) account_mall = {"balance":0} json.dump(account_mall,open("account_mall.json","w",encoding="utf-8"))
shopping_mall->confirm_s
from shopping_mall import db_handle_s def confirm(username): """ 商城验证用户名密码是否正确 :param username: 用户名 :return: 用户名 """ usermsg = db_handle_s.json_read(username,"customer") comfirm_exit = True while comfirm_exit: passwd = input("请输入密码:") if passwd == usermsg["password"]: return usermsg else: print(" 33[35;1m 密码错误,请重新输入! 33[0m")
shopping_mall->db_handle_s
import os,json from conf import settings def json_read(username,parent): """ 读取购物商城文件内容 :param username: 文件名 :param parent: 文件父级目录名 :return: 文件内容 """ if parent == "customer": filename = os.path.join(settings.MALL_PATH_C, username + ".json") elif parent == "mall_db": filename = os.path.join(settings.MALL_PATH_M, username + ".json") if os.path.isfile(filename): data = json.load(open(filename, "r", encoding="utf-8")) return data else: print(" 33[37;1m用户名无效 33[0m") exit() def json_stroage(username,parent,msg): """ 存储商城文件内容 :param username:文件名 :param parent: 文件父级目录 :param msg: 存储内容 :return: """ if parent == "customer": filename = os.path.join(settings.MALL_PATH_C, username + ".json") elif parent == "mall_db": filename = os.path.join(settings.MALL_PATH_M, username + ".json") if os.path.isfile(filename): f = open(filename + ".new", "w", encoding="utf-8") json.dump(msg,f) f.close() os.replace(filename+".new",filename) return msg else: print(" 33[37;1m用户名无效 33[0m") exit()
shopping_mall->mall
import os,sys,json,time from conf import settings from shopping_mall import confirm_s,db_handle_s from bank import main def flush_goods(): """ 在conf.settings中的商品列表刷新 :return: """ json.dump(settings.GOODS, open(os.path.join(settings.MALL_PATH_M,"shopping_goods.json"), "w", encoding="utf-8")) def pay(name,usermsg): """ 完成购物车结算,与银行相连接 :param name: 消费者用户名 :param usermsg: 该消费者对应文件中的信息 :return: """ count = check(name,usermsg) # 结算前打印购物车中信息,并得到总结 if count: question = input("是否提交订单(y/n):") if question == "y": account_mall = db_handle_s.json_read("account_mall", "mall_db") account_mall = {"id":"account_mall","data":account_mall} main.external(account_mall,count) # 与银行相连接 timer = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) # 写入购物记录 usermsg["shopping_chart"].insert(0,timer) usermsg["shopping_chart"].append("count:%s"%count) usermsg["record"] = [] usermsg["record"].append(usermsg["shopping_chart"]) usermsg["shopping_chart"] = [] db_handle_s.json_stroage(name,"customer",usermsg) elif question == "n" or question == "q": return else: print("输入错误!") else: return def check(name,usermsg): """ 查看购物车以及购物车中商品的总价 :param name: 消费者用户名 :param usermsg: 该消费者对应文件中信息 :return: 返回总价 """ shopping_cart = usermsg["shopping_chart"] print(' 33[36;1m %s 33[0m' %"购物车".center(50, "-")) if len(shopping_cart) == 0: print(" 33[36;1m 购物车为空 33[0m") else: for i in shopping_cart: print(i) count = 0 for i in shopping_cart: count = count + i["price"] print("合计价格:",count) return count def trade(name,usermsg): """商城购物 :param name: 消费者用户名 :param usermsg: 该消费者文件中的信息 :return: """ trade_exit = True while trade_exit: shopping_cart = usermsg["shopping_chart"] goods = db_handle_s.json_read("shopping_goods", "mall_db") # 从文件中读取商品列表 print(" 33[32;1m %s 33[0m" %"商品列表".center(50, "-")) for i in goods: print(i) print(" 33[32;1m %s 33[0m" % "end".center(50, "-")) num = input("输入商品编码,加入购物车:").strip() add_exit = True while add_exit: if num.isdigit(): if int(num) <= len(goods): for i in goods: if num in i: num = int(num) shopping_cart.append(goods[num - 1]) db_handle_s.json_stroage(name,"customer",usermsg) add_exit = False else: print("输入商品编码有误,请重新输入!") elif num == "q": return usermsg check(name,usermsg) return usermsg def end(usermsg,name): exit() def search(name,usermsg): """ 查看购物历史记录 :param name: 消费者用户名 :param usermsg: 该消费者对应文件中的所有信息 :return: """ print(" 33[33;1m %s 33[0m" % "历史记录".center(50, "-")) record = usermsg["record"] if len(record) == 0: print(" 33[33;1m 历史记录为空 33[0m") else: for i in record: print(i) print(" 33[33;1m %s 33[0m" % "end".center(50, "-")) def shopping(): """ 购物商城的总入口 :return: """ flush_goods() name = input("请输入商场用户名:").strip() usermsg = confirm_s.confirm(name) # 读取消费者文件内容{"password": "123", "shopping_chart": [], "record": []} shopping_exit = True if usermsg: while shopping_exit: choice =input( " 33[32;1m %s 33[0m " "1. 购物 " "2. 查看购物车 " "3. 结算 " "4. 记录查询 " "q. 退出 " " 33[32;1m %s 33[0m " "请选择要执行的操作: " %("welcome %s".center(50,"-")%name,"end".center(50,"-"))) menu = { "1":trade, "2":check, "3":pay, "4":search, "q":end } if choice in menu: menu[choice](name,usermsg)