模拟实现一个ATM + 购物商城程序:
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
完成时间:2018、12、14
项目名称:
ATM + 购物商城程序v1.0版
工程文件目录:
start.py文件:
import sys import os start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(start_path) from conf.config import * from core.src import * from core.atm import * if __name__ == '__main__': while True: user = json.load(open('../db/admin_info', 'r')) print('欢迎来到ATM+完美购物商城'.center(100,'-')) in_user = input('请输入您的账号:\n>>>') if in_user == 'q': # 退出 Flog['exit_flog'] = True exit('您已经退出'.center(100,'-')) in_password = input('请输入您的密码:\n>>>') if in_password == 'q': # 退出 Flog['exit_flog'] = True exit('您已经退出'.center(100,'-')) for i in user: if in_user == i.get('username') and in_password == i.get('password'): Flog['login_flog'] = True print('登录成功'.center(50,'-')) logging.debug('debug') logging.info('--------<{}>成功登录--------'.format(i['username'])) Flog['tamp_item'] = i # tamp_item存放登录账户的所有信息字典 Flog['tamp_item']['wares'] = {} # 拿购物车 Flog['tamp_item']['total_price'] = 0 # 单次购买商品总价 Flog['tamp_item']['this_buy'] = {} # 清空本次购买(上次购买) break if Flog['login_flog']: Flog['login_flog'] = False while True: print('请输入您的选择:\n1.ATM账户\n2.购物商城\n3.ATM管理(管理员账户可用)') select = input('请输入您的选择序号(q.退出登录):>>>') if select == 'q': print('退出成功'.center(50,'-')) logging.debug('debug') logging.info('--------<{}>退出成功--------'.format(Flog['tamp_item']['username'])) break if int(select) in range(1,4): if select == '1': Atm_System(user,Flog['tamp_item']['username']) # 进入ATM账户 if select == '2': Shopping_Mall(user) # 进入网上商城 if Flog['exit_flog']: break if select == '3': # 进入ATM管理(新增账户、提高额度、冻结账户) if not Flog['tamp_item']['manager']: print('请使用管理员账户登录'.center(50,'-')) break ATM_manage(user) # 只限管理员账户使用 if Flog['restart_system']: Flog['restart_system'] = False break else: print('您的输入有误,请重新输入'.center(50,'-')) else: print('您的账户或密码输入错误,请重新输入'.center(50,'-'))
atm.py文件:
#author: guogangzhi import json from conf.config import * start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(start_path) def find_atminfo(): # 查询信用卡信息 print('登录的信用卡信息'.center(100,'-')) print('账户名称 信用卡可用额度 还款时间') print('{} {} {}'.format(Flog['atm_tamp_item']['atm_user'], Flog['atm_tamp_item']['remainder'], Flog['atm_tamp_item']['repayment_time'])) print('这个月的消费流水'.center(80,'-')) print('序号 购买时间 数量 价格 商品名称') Flog['atm_tamp_item']['consume_water'] = Flog['tamp_item']['Records_of_consumption'] for buytime, item in Flog['atm_tamp_item']['consume_water'].items(): print('---------------------------{}---------------------------'.format(buytime)) for num, (x, i) in enumerate(item.items()): print('{: <3} {: <20} {: <3} {} {}'.format(num + 1, x, i[0], i[1], i[2])) def withdraw_deposit(): # 提现 while True: out_money = input('请输入你要提现的金额(手续费:5%)(q.退出提现):>>>') if out_money == 'q': print('退出提现'.center(50,'-')) break if out_money.isdigit(): out_money = int(out_money) if Flog['atm_tamp_item']['remainder'] >= out_money*(1+0.05): Flog['atm_tamp_item']['remainder'] -= out_money*(1+0.05) print('提现成功'.center(50,'-')) logging.debug('debug') logging.info('{}账户提现成功'.format(Flog['atm_tamp_item']['atm_user'])) break else: print('您的额度不够,请减少提现金额'.center(50,'-')) else: print('您的输入有误,请重新输入'.center(50,'-')) def transfer_accounts(a): # 转账 while True: transfer_user = input('请输入您要转账账户的用户名(q.退出转账):>>>') if transfer_user == 'q': print('您已经退出转账'.center(50,'-')) break transfer_password = input('请输入您要转账账户的密码(q.退出转账):>>>') if transfer_password == 'q': print('您已经退出转账'.center(50,'-')) break for keys in a: for i in a[keys]: if transfer_user == i['atm_user'] and transfer_password == i['atm_password']: print('账户存在'.center(50,'-')) Flog['transfer_user_exist'] = True Flog['atm_transfer_item'] = i if Flog['transfer_user_exist']: # 账户存在可以转账 Flog['transfer_user_exist'] = False transfer_mormy = input('请输入转账金额:>>>') if transfer_mormy.isdigit(): transfer_mormy = int(transfer_mormy) if Flog['atm_tamp_item']['remainder'] >= transfer_mormy: Flog['atm_transfer_item']['remainder'] += transfer_mormy # 转入账户+ Flog['atm_tamp_item']['remainder'] -= transfer_mormy # 转出账户- print('转账成功'.center(50,'-')) logging.debug('debug') logging.info('{}账户提现成功'.format(Flog['atm_tamp_item']['atm_user'])) Flog['atm_transfer_item'] = None break else: print('额度不够'.center(50,'-')) else: print('输入错误'.center(50,'-')) else: for keys in a: for i in a[keys]: if transfer_user == i['atm_user'] and '_' + transfer_password == i['atm_password']: Flog['freeze_flog'] = True # 判断账户是否冻结 break if Flog['freeze_flog']: Flog['freeze_flog'] = False print('您的账户已经被冻结'.center(50,'-')) else: print('您输入的账户不存在,请重新输入'.center(50,'-')) def repayment(): # 还款 while True: in_repayment = input('请输入还款金额(q.退出还款):>>>') if in_repayment == 'q': print('您现在已经退出还款'.center(50,'-')) break if in_repayment.isdigit(): in_repayment = int(in_repayment) if in_repayment>0: Flog['atm_tamp_item']['remainder'] += in_repayment print('还款成功'.center(50,'-')) logging.debug('debug') logging.info('{}账户还款成功'.format(Flog['atm_tamp_item']['atm_user'])) break else: print('您的输入有误,请重新输入'.center(50,'-')) def change_loginuser(u,a,n): # 更改绑定ATM账户 ''' :param u: user :param n: 绑定商城的帐号名 :return: ''' while True: in_username = input('请输入您新绑定账户的用户名(q.退出绑定账户):>>>') if in_username == 'q': print('您已经退出绑定账户'.center(50,'-')) break in_userpassword = input('请输入您新绑定账户的密码(q.退出绑定账户):>>>') if in_username == 'q': print('您已经退出绑定账户'.center(50,'-')) break for i in a[n]: if in_username == i['atm_user'] and in_userpassword == i['atm_password']: print('账户存在'.center(50, '-')) Flog['transfer_user_exist'] = True Flog['atm_transfer_item'] = i if Flog['transfer_user_exist']: Flog['tamp_item']['username'] = Flog['atm_transfer_item']['atm_user'] a[Flog['tamp_item']['username']] = a[n] # 在atm中将绑定商城的帐号修改 del(a[n]) # 用的方法是删除原来的新建一个键值对 json.dump(u,open('../db/admin_info','w')) json.dump(a,open('../db/atm_admin_info','w')) print('绑定账户成功'.center(50,'-')) logging.debug('debug') logging.info('{}绑定账户成功'.format(Flog['tamp_item']['username'])) Flog['transfer_user_exist'] = False Flog['atm_transfer_item'] = None Flog['restart_system'] = True # 重启系统 print('请重新登录系统'.center(100,'-')) break else: for i in a[n]: if in_username == i['atm_user'] and '_' + in_userpassword == i['atm_password']: Flog['freeze_flog'] = True # 判断账户是否冻结 break if Flog['freeze_flog']: Flog['freeze_flog'] = False print('您的账户已经被冻结'.center(50,'-')) else: print('您输入的账户/密码错误,请重新输入'.center(50,'-')) def login_elseuser(a,n): # 登录其他账户(商城账户的用户的其他atm账户) while True: in_atmusername = input('请输入您其他账户的用户名(q.退出绑定账户):>>>') if in_atmusername == 'q': # 退出 print('退出登录其他用户'.center(50,'-')) break in_atmpassword = input('请输入您其他账户的密码(q.退出绑定账户):>>>') if in_atmpassword.startswith('_'): print('这个账户已被冻结,请使用其他账户'.center(50,'-')) break if in_atmpassword == 'q': # 退出 print('退出登录其他用户'.center(50, '-')) break for i in a[n]: if in_atmusername == i.get('atm_user') and in_atmpassword == i.get('atm_password'): Flog['atm_login_flog'] = True # 置位登录成功标志 Flog['atm_tamp_item'] = i # tamp_item登录账户的所有信息字典 break if Flog['atm_login_flog']: Flog['atm_login_flog'] = False print('账户切换成功'.center(50, '-')) break else: for i in atm[login_goods_user]: if in_atmusername == i.get('atm_user') and '_' + in_atmpassword == i.get('atm_password'): Flog['freeze_flog'] = True # 判断账户是否冻结 break if Flog['freeze_flog']: Flog['freeze_flog'] = False print('您的账户已经被冻结'.center(50,'-')) else: print('您输入的帐号、密码有误,请重新输入'.center(50,'-')) def Atm_System(u,login_goods_user): ''' :param u: admin_info中的所有数据 :param login_goods_user: 商城的登录帐号名 :return: ''' while True: atm = json.load(open('../db/atm_admin_info', 'r')) in_atmpassword = input('请输入您绑定商城的账户密码(q.退出登录ATM):>>>') if in_atmpassword == 'q': # 退出 Flog['quit_atm'] = True break for i in atm[login_goods_user]: if login_goods_user == i.get('atm_user') and in_atmpassword == i.get('atm_password'): Flog['atm_login_flog'] = True # 置位登录成功标志 print('登录ATM成功'.center(50, '-')) logging.debug('debug') logging.info('{}登录ATM成功'.format(i['atm_user'])) Flog['atm_tamp_item'] = i # tamp_item登录账户的信用卡密码对应的信息字典 break if Flog['atm_login_flog']: Flog['atm_login_flog'] = False # 复位登录成功标志 while True: print('【{}】请选择您需要的服务项目:\n1.查询信用卡信息\n2.提现\n3.转账\n4.还款\n5.更改绑定ATM账户\n6.登录其他账户\n'.format(Flog['atm_tamp_item']['atm_user'])) in_select = input('请输入您的选择(q.退出ATM、z.重启系统):>>>') if in_select == 'q': # 退出ATM Flog['quit_atm'] = True break if in_select == 'z': # 退出整个系统 Flog['restart_system'] = True break if int(in_select) in range(1,7): if in_select == '1': # 1.查询信用卡信息 find_atminfo() if in_select == '2': # 2.提现 withdraw_deposit() if in_select == '3': # 3.转账 transfer_accounts(atm) if in_select == '4': # 4.还款 repayment() if in_select == '5': # 5.更改绑定ATM账户 change_loginuser(u,atm,login_goods_user) if in_select == '6': # 6.登录其他账户(商城账户的用户的其他atm账户) login_elseuser(atm,login_goods_user) else: print('输入错误,请重新输入'.center(50,'-')) if Flog['restart_system']: # 重新启动系统 break else: for i in atm[login_goods_user]: if login_goods_user == i.get('atm_user') and '_' + in_atmpassword == i.get('atm_password'): Flog['freeze_flog'] = True # 判断账户是否冻结 break if Flog['freeze_flog']: Flog['freeze_flog'] = False print('您的账户已经被冻结'.center(50,'-')) else: print('密码输入有误,请重新输入'.center(50,'-')) if Flog['restart_system']: # 重新启动系统 break if Flog['quit_atm']: # 退出ATM break if Flog['restart_system'] or Flog['quit_atm']: # 判断是否已经退出ATM json.dump(atm,open('../db/atm_admin_info','w')) # 将数据保存到文件 Flog['quit_atm'] = False print('您已经退出ATM'.center(100, '-')) logging.debug('debug') logging.info('{}登录ATM成功'.format(Flog['atm_tamp_item']['atm_user'])) def new_atm_user(u,a): # 新增账户 while True: goods_user = input('请输入您已经绑定的购物商城帐号:>>>') goods_password = input('请输入您已经绑定的购物商城密码:>>>') for i in u: if goods_user == i['username'] and goods_password == i['password']: Flog['goods_user_yes'] = True break if Flog['goods_user_yes']: # 购物商城账户确认(表示在这个商城账户下创建ATM账户) in_user = input('请输入您要在【{}】帐号下创建账户的用户名>>>'.format(goods_user)) in_password = input('请输入您要在【{}】帐号下创建账户的密码:>>>'.format(goods_user)) new_user = { 'atm_user': in_user, # atm账户 'atm_password': in_password, # atm密码 'remainder': 15000, # 信用卡额度 'consume_water': {}, # 每月消费流水 'repayment_time': '每个月10号', # 还款时间str } a[goods_user].append(new_user) # 创建ATM账户完成 # print(a[goods_user]) json.dump(a, open('../db/atm_admin_info', 'w')) # 将数据保存到文件 print('ATM用户创建完成'.center(50,'-')) logging.debug('debug') logging.info('{}ATM账户创建完成'.format(goods_user)) break else: print('没有这个绑定商城的帐号'.center(50,'-')) def up_atm_remainder(a): # 提高ATM账户额度 while True: in_user = input('请输入要提高额度ATM账户的用户名:>>>') in_password = input('请输入要提高额度ATM账户的密码:>>>') for value in a.values(): for i in value: if in_user == i['atm_user'] and in_password == i['atm_password']: Flog['tamp_flog_yes'] = True Flog['atm_manage_item'] = i print('已经确认账户'.center(50,'-')) break if Flog['tamp_flog_yes']: break if Flog['tamp_flog_yes']: Flog['tamp_flog_yes'] = False in_mormy = input('额度提升到多少:>>>') if in_mormy.isdigit() and int(in_mormy)>15000: in_mormy = int(in_mormy)-15000 Flog['atm_manage_item']['remainder'] += in_mormy json.dump(a, open('../db/atm_admin_info', 'w')) # 将数据保存到文件 print('ATM账户额度以提高'.center(50,'-')) logging.debug('debug') logging.info('{}账户额度以提高'.format(Flog['atm_manage_item']['atm_user'])) break else: print('您的输入有错误,请重新输入'.center(50,'-')) else: print('没有找到对应账户'.center(50,'-')) def freeze_atm(a): # 冻结账户 在账户的密码前面加‘_’,在登录时做判断是否冻结。 while True: in_user = input('请输入要冻结的ATM账户的用户名:>>>') in_password = input('请输入要冻结的ATM账户的密码:>>>') for value in a.values(): for i in value: if in_user == i['atm_user'] and in_password == i['atm_password']: Flog['tamp_flog_yes'] = True Flog['atm_manage_item'] = i print('已经确认账户'.center(50,'-')) break if Flog['tamp_flog_yes']: break if Flog['tamp_flog_yes']: Flog['tamp_flog_yes'] = False Flog['atm_manage_item']['atm_password'] = '_'+Flog['atm_manage_item']['atm_password'] json.dump(a, open('../db/atm_admin_info', 'w')) # 将数据保存到文件 print('ATM账户以冻结'.center(50,'-')) logging.debug('debug') logging.info('{}账户已被冻结'.format(Flog['atm_manage_item']['atm_user'])) break else: print('没有找到对应账户'.center(50,'-')) def ATM_manage(u): # 进入ATM管理(新增账户、提高额度、冻结账户) while True: atm = json.load(open('../db/atm_admin_info', 'r')) print('ATM管理'.center(100,'-')) logging.debug('debug') logging.info('登录ATM管理') print('请选择您的操作:\n1.新增ATM账户\n2.提高账户额度\n3.冻结账户\n') in_select= input('请输入您的选择(q.退出ATM管理、z.重启系统):>>>') if in_select == 'q': Flog['quit_atm_manage'] = True # 退出ATM管理标志置位 break if in_select == 'z': Flog['restart_system'] = True # 重启系统 break if int(in_select) in range(1,4): if in_select == '1': # 1.新增ATM账户 new_atm_user(u,atm) if in_select == '2': # 2.提高账户额度 up_atm_remainder(atm) if in_select == '3': # 3.冻结账户 freeze_atm(atm) else: print('您的输入有误请重新输入'.center(50,'-')) if Flog['restart_system'] or Flog['quit_atm_manage']: Flog['quit_atm_manage'] = False json.dump(atm, open('../db/atm_admin_info', 'w')) # 将数据保存到文件 print('您已经退出ATM管理'.center(100,'-')) logging.debug('debug') logging.info('退出ATM管理')
src.py文件:
import json import time from conf.config import * from bin.start import * start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(start_path) def add_gocar(goods_key,unit_price,num): # 将商品加入购物车(商品名称、单价、数量) time_obj = time.localtime() # 加入购物车时间戳 time_str = '{}-{}-{} {}:{}:{}'.format( time_obj.tm_year, time_obj.tm_mon, time_obj.tm_mday, time_obj.tm_hour, time_obj.tm_min, time_obj.tm_sec) if goods_key in Flog['tamp_item']['wares'].keys(): select_value_num = Flog['tamp_item']['wares'][goods_key][0] + num # 如果有同样的商品和之前的购买数量相加 else: select_value_num = num Flog['tamp_item']['wares'][goods_key] = [select_value_num,select_value_num*unit_price,time_str] # 存入用户商品名称、数量、价格、时间戳到用户账户 def display_gocar(): print('您现在购物车中的商品有'.center(80,'-')) print('序号 名称 数量 价格') Flog['tamp_tamp'] = Flog['tamp_item'].get('wares') Flog['tamp_item']['total_price'] = 0 for num, i in enumerate(Flog['tamp_tamp'].items()): Flog['tamp_item']['total_price'] += i[1][1] print('{: <3} {: <15}{: <3} {}'.format(num + 1, i[0], i[1][0], i[1][1])) print('-'*60) print('总价:{: >50}'.format(Flog['tamp_item']['total_price'])) print('-' * 90) def credit_card_interface(): # 结账 if Flog['tamp_item']['total_price']: # 购物车不为空 if Flog['tamp_item']['remainder'] >= Flog['tamp_item']['total_price']: # 判断是否买得起 Flog['tamp_item']['remainder'] -= Flog['tamp_item']['total_price'] # 从信用卡额度扣除 print('购买成功'.center(50, '-')) time_obj = time.localtime() # 下单时间戳 time_str = '{}-{}-{} {}:{}:{}'.format( time_obj.tm_year, time_obj.tm_mon, time_obj.tm_mday, time_obj.tm_hour, time_obj.tm_min, time_obj.tm_sec) Flog['tamp_item']['Records_of_consumption'][time_str] = {} for w_name, w_value in Flog['tamp_item']['wares'].items(): # 购买时间/购买商品名称 在字典中的位置互换 Flog['tamp_item']['Records_of_consumption'][time_str].update( {w_value[2]: [w_value[0], w_value[1], w_name]}) # 保存到《购买记录》 Flog['tamp_item']['this_buy'].update(Flog['tamp_item']['wares']) # 保存到《本次购买记录》 Flog['tamp_item']['wares'] = {} # 清空购物车 else: print('您的信用卡额度不足,请及时还款'.center(50, '-')) else: print('您的购物车为空'.center(50,'-')) def Shopping_Mall(u): print('购物车网上商城'.center(100, '-')) while True: goods_list = [goods] while True: print('请选择您需要的商品序号:') type_value = [*goods_list[-1].values()][0] if type(type_value) == int: # 判断是商品列表中是最后一层 加¥价格 for index,i in enumerate(goods_list[-1]): print('{}.{: <10} ¥{}'.format(str(index+1),i,[*goods_list[-1].values()][index])) else: # 不是最后一层 for index,key in enumerate(goods_list[-1]): print('{}.{}'.format(str(index+1),key)) in_goods_class = input('你选择的商品序号是(b.用户信息查询、c.充值、j.进入购物车、q.退出商城、z.返回上一级):>>>') if in_goods_class =='q': # 退出 Flog['exit_flog'] = True break if in_goods_class == 'b': # 停止购买 Flog['stop_flog'] = True break if in_goods_class == 'c': # 充值 money = input('请输入您要充值的金额:>>>') if money.isdigit(): Flog['tamp_item']['remainder'] += int(money) print('钱已到账,您现在的信用卡账户余额是:【{}】'.format(Flog['tamp_item']['remainder'])) break else: print('输入错误,请重新选择购买商品或充值!'.center(40,'-')) break if in_goods_class == 'j': # 进入购物车 display_gocar() isnot_account = input('是否结账(y.是、n.清空购物车、任意键.还要买东西):>>>') if isnot_account == 'y': credit_card_interface() # 结算 break if isnot_account == 'n': Flog['tamp_item']['wares'] = {} # 清空购物车 print('购物车已经清空'.center(50,'-')) break else: break if in_goods_class == 'z': goods_list.pop() continue if in_goods_class.isdigit(): in_goods_class=int(in_goods_class) else: print('输入错误,请重新输入您要的商品序号!'.center(20,'-')) if in_goods_class in range(1,len(goods_list[-1])+1): # 是否有这个商品类 select_goods_class = [*goods_list[-1].values()][in_goods_class-1] # select_goods_class是所选择的字典的值 select_goods_keys = [*goods_list[-1].keys()][in_goods_class-1] # select_goods_key是所选择的字典的键 goods_list.append(select_goods_class) # 压栈 if (type(select_goods_class) == int): # 值是数字,说明是(最后层) in_num = input('请输入购买数量(b.用户信息查询、j.购物车、q.退出商城、z.返回上一级):>>>') if in_num == 'q': # 退出 Flog['exit_flog'] = True break if in_num == 'b': # 停止购买 Flog['stop_flog'] = True break if in_num == 'c': # 充值 money = input('请输入您要充值的金额:>>>') if money.isdigit(): Flog['tamp_item']['remainder'] += int(money) print('钱已到账,您现在的账户余额是:【{}】'.format(Flog['tamp_item']['remainder'])) break else: print('输入错误,请重新选择购买商品或充值!'.center(40,'-')) break if in_num == 'j': # 进入购物车 display_gocar() isnot_account = input('是否结账(y.是、任意键.还要买东西):>>>') if isnot_account == 'y': credit_card_interface() # 结算 break else: break if in_num == 'z': # 返回上一级 goods_list.pop() continue in_num = int(in_num) add_gocar(select_goods_keys,select_goods_class,in_num) # 加入购物车 break if Flog['exit_flog']: break while Flog['stop_flog']: # 查询模式 print('请选择你要查询的内容:\n1.您当前的余额\n2.您的购物车(已付款)\n3.您的购买记录') in_find_num = input('请输入你要查询的内容(b.采购商品、c.充值、q.退出):>>>') if in_find_num == '1': # 查看当前用户余额 while True: is_not_money = input('您当前的余额为:【{}】,是否充值(c.充值、任意键.退出):>>>'.format(Flog['tamp_item']['remainder'])) if is_not_money == 'c': money = input('请输入您要充值的金额:>>>') if money.isdigit(): Flog['tamp_item']['remainder'] += int(money) print('钱已到账,您现在的账户余额是:【{}】'.format(Flog['tamp_item']['remainder'])) break else: print('输入错误,请重新选择购买商品或充值:') break else: print('已退出充值'.center(50,'-')) break elif in_find_num == '2': # 查看你本次购买的商品 print('您的购买清单'.center(100, '-')) print('序号 名称 数量 价格 日期') tamp_tamp = Flog['tamp_item']['this_buy'] for num, i in enumerate(tamp_tamp.items()): print('{: <3} {: <15}{: <3} {} {}'.format(num + 1, i[0], i[1][0], i[1][1],i[1][2])) print('-' * 106) elif in_find_num == '3': # 查看登录账户所有的购买记录 print('您的购买记录'.center(100, '-')) print('序号 购买时间 数量 价格 商品名称') for buytime, item in Flog['tamp_item']['Records_of_consumption'].items(): print('---------------------------{}---------------------------'.format(buytime)) for num,(x,i) in enumerate(item.items()): print('{: <3} {: <20} {: <3} {} {}'.format(num + 1, x,i[0], i[1], i[2])) print('-' * 106) elif in_find_num == 'b': # 退出查询模式,进入购买模式 Flog['stop_flog'] = False break elif in_find_num == 'q': # 退出购物车 Flog['stop_flog'] = False Flog['exit_flog'] = True break elif in_find_num == 'c': # 充值 money = input('请输入您要充值的金额:>>>') if money.isdigit(): Flog['tamp_item']['remainder'] += int(money) print('钱已到账,您现在的账户余额是:【{}】'.format(Flog['tamp_item']['remainder'])) break else: print('输入错误,请重新选择购买商品或充值:'.center(40, '-')) break else: print('您的输入有误,请重新输入'.center(40,'-')) json.dump(u, open('../db/admin_info', 'w')) # 将用户数据保存到user_info文件(为什么可以保存?) print('您已经退出网上商城了'.center(100, '-')) # 退出商城 print('您本次的购买清单'.center(100, '-')) # 打印清单 print('序号 名称 数量 价格') Flog['tamp_tamp'] = Flog['tamp_item'].get('wares') for num, i in enumerate(Flog['tamp_tamp'].items()): print('{: <3} {: <15}{: <3} {}'.format(num + 1, i[0], i[1][0], i[1][1])) print('-' * 106)
admin_info文件:
[{"username": "nb", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": true}, {"username": "ggz", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": false}]
atm_admin_info文件:
[{"username": "nb", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": true}, {"username": "ggz", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": false}]
common.py文件:
import os import sys start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(start_path) goods = { #所有货物分级 '家电类':{ '海尔':{ '海尔最新款电视':2200, '海尔最新款冰箱':5200, '海尔最新款洗衣机':3600 }, '美的':{ '美的最新款电视': 2100, '美的最新款冰箱': 5100, '美的最新款洗衣机': 3200 } }, '衣服类':{ '优衣库':{ '优衣库最新款外衣':380, '优衣库最新款裤子':450, '优衣库最新款鞋子':500 }, '七匹狼':{ '七匹狼最新款外衣': 390, '七匹狼最新款裤子': 420, '七匹狼最新款鞋子': 400 } }, '手机类':{ '魅族 ΜⅢ':3000, '小米 ΧⅤ':2999, '华为 ΗⅥ':4000, '中兴 ΖⅣ':2600 }, '车类':{ '宝马 Χ叁':300000, '奔驰 Β陆':150000, '特斯拉 ВЕ':130000 } }
config文件:
import os import sys start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(start_path) from lib.common import * import logging logging.basicConfig(filename='../log/log.log', level = logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p') Flog = { #-----------购物商城---------- 'login_flog' : False, # 登录标志 'exit_flog' : False, # 用户按q键退出购物车标志 'stop_flog' : False, # 用户按b键停止购买标志 'tamp_item' : None, # 存放单个用户性息 'goods_list' : [goods], # 数组的最末尾元素存放当前层级商品类 'goods_tamp' : None, # 存放单个字典 #-----------ATM账户----------- 'atm_login_flog': False, # atm登录成功 'atm_tamp_item': None, # atm用户信息 'transfer_user_exist': False, # 转出账户是否存在 'atm_transfer_item': None, # 转账用户信息 'restart_system' : False, # 重启系统 'quit_atm' : False, # 退出ATM标志 #-----------ATM管理----------- 'quit_atm_manage': False, # ATM管理退出标志 'goods_user_yes': False, # 购物商城账户确认 'atm_manage_item': None, # atm用户信息 'tamp_flog_yes': False, #ATM帐号确认标志 'freeze_flog' : False, # 冻结标志 }
log文件:
2018-12-14 16:05:33 PM - root - INFO -start: nb成功登录 2018-12-14 16:30:35 PM - root - INFO -start: nb成功登录 2018-12-14 16:31:44 PM - root - INFO -atm: nb登录ATM成功 2018-12-14 16:31:51 PM - root - INFO -atm: nb账户提现成功 2018-12-14 16:33:02 PM - root - INFO -atm: nb1账户提现成功 2018-12-14 16:33:52 PM - root - INFO -atm: nb登录ATM成功 2018-12-14 16:41:48 PM - root - INFO -start: nb成功登录 2018-12-14 16:48:27 PM - root - INFO -start: --------<nb>成功登录-------- 2018-12-14 16:48:33 PM - root - INFO -start: --------nb退出成功-------- 2018-12-14 18:45:12 PM - root - INFO -start: --------<nb>成功登录-------- 2018-12-14 19:18:02 PM - root - INFO -start: --------<nb>成功登录-------- 2018-12-14 19:31:50 PM - root - INFO -start: --------<nb>成功登录-------- 2018-12-14 19:32:27 PM - root - INFO -atm: 登录ATM管理 2018-12-14 19:32:41 PM - root - INFO -atm: 退出ATM管理 2018-12-14 19:38:30 PM - root - INFO -start: --------<nb>退出成功-------- 2018-12-14 19:38:44 PM - root - INFO -start: --------<ggz>成功登录-------- 2018-12-14 19:39:09 PM - root - INFO -start: --------<nb>成功登录-------- 2018-12-14 19:39:18 PM - root - INFO -atm: 登录ATM管理 2018-12-14 19:39:41 PM - root - INFO -atm: 退出ATM管理 2018-12-14 19:39:46 PM - root - INFO -start: --------<ggz>成功登录-------- 2018-12-14 19:39:52 PM - root - INFO -start: --------<ggz>退出成功-------- 2018-12-14 19:40:26 PM - root - INFO -start: --------<nb>成功登录-------- 2018-12-14 19:40:31 PM - root - INFO -atm: 登录ATM管理
debug文件:
#author: guogangzhi import json user = [ # 所有用户 { 'username': 'nb', # 用户名 'password': '123', # 密码 'atm_user': 'nb', # 绑定信用卡用户名 'remainder': 15000, # 信用卡额度 'wares': { # 购物车 # 'wares_name':['num','price','time'] # 名称:[数量,价格,购买时间] }, 'this_buy':{ # 本次购买的商品 # 'wares_name':['num','price','time'] # 名称:[数量,价格,购买时间] }, 'total_price': 0, # 本次购买的商品的总价 'Records_of_consumption':{ # 消费记录 # 'buy_time':{ # 购买时间 # 'time':['num','price','wares_name'] # 加入购物车时间:[数量,价格,名称] # 'time':['num','price','wares_name'] # 加入购物车时间:[数量,价格,名称] # 'time':['num','price','wares_name'] # 加入购物车时间:[数量,价格,名称] # } }, 'manager': True }, { 'username': 'ggz', # 用户名 'password': '123', # 密码 'atm_user': 'nb', # 绑定信用卡用户名 'remainder': 15000, # 信用卡额度 'wares': { # 购物车 # 'wares_name':['num','price','time'] # 名称:[数量,价格,购买时间] }, 'this_buy': { # 本次购买的商品 # 'wares_name':['num','price','time'] # 名称:[数量,价格,购买时间] }, 'total_price': 0, # 本次购买的商品的总价 'Records_of_consumption': { # 消费记录 # 'buy_time':{ # 购买时间 # 'time':['num','price','wares_name'] # 加入购物车时间:[数量,价格,名称] # 'time':['num','price','wares_name'] # 加入购物车时间:[数量,价格,名称] # 'time':['num','price','wares_name'] # 加入购物车时间:[数量,价格,名称] # } }, 'manager': False }, ] atm = { 'nb': # 绑定的商城帐号 [ # 对应于‘nb’这个人有三个ATM账户 { 'atm_user': 'nb', # atm账户 'atm_password': '456', # atm密码 'remainder': 15000, # 信用卡额度 'consume_water':{}, # 每月消费流水 'repayment_time':'每个月10号', # 还款时间戳 }, { 'atm_user': 'nb1', # atm账户 'atm_password': '456', # atm密码 'remainder': 15000, # 信用卡额度 'consume_water': {}, # 每月消费流水 'repayment_time': '每个月10号', # 还款时间str }, { 'atm_user': 'nb2', # atm账户 'atm_password': '456', # atm密码 'remainder': 15000, # 信用卡额度 'consume_water': {}, # 每月消费流水 'repayment_time': '每个月10号', # 还款时间戳 } ], 'ggz': [ { 'atm_user': 'ggz', # atm账户 'atm_password': '456', # atm密码 'remainder': 15000, # 信用卡额度 'consume_water': {}, # 每月消费流水 'repayment_time': '每个月10号', # 还款时间戳 }, { 'atm_user': 'ggz1', # atm账户 'atm_password': '456', # atm密码 'remainder': 15000, # 信用卡额度 'consume_water': {}, # 每月消费流水 'repayment_time': '每个月10号', # 还款时间戳 }, { 'atm_user': 'nb2', # atm账户 'atm_password': '456', # atm密码 'remainder': 15000, # 信用卡额度 'consume_water': {}, # 每月消费流水 'repayment_time': '每个月10号', # 还款时间戳 } ], } json.dump(user, open('db/admin_info', 'w'))