python第二十四天-----作业终于完成啦
作业 1, ATM:模拟实现一个ATM + 购物商城程序
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
README
作业 1, ATM:模拟实现一个ATM + 购物商城程序
额度 自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
程序结构:
ATM/#综合目录
|- - -atm/#atm程序主目录
| |- - -README
| |- - -__init__.py
| |- - -bin/#执行程目录
| | |- - -__init__.py
| | |- - -atm.py #用户登陆执行执行文件
| | |- - -admin.py #管理员登陆执行文件
| |
| |
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -confing.py#配置文件
| |
| |- - -core #主逻辑程序目录
| | |- - -main.py#用户登陆主要程序
| | |- - -admin_log.py#管理员登陆主要程序
| | |- - -log_file.py#日志相关函数
| | |- - -opertion_admin.py#用户登陆操作相关函数
| | |- - -transaction.py#用户操作相关函数
| | |- - -user_pass.py#用户\用户登陆登陆相关函数
| |
| |
| |
| |
| |- - -db/#用户数据目录
| | |- - -__init__.py
| | |- - -admin_list#管理员列表
| | |- - -admin_lock#管理员锁定列表
| | |- - -user_file.txt#用户列表
| | |- - -lock_name.txt#用户锁定列表
| | |- - -data/#用户帐户存取目录
| | |- - -abc.json #独立用户数据
| |
| |- - -log/#日志目录
| |- - -admin_erro.log#管理员错误日志
| |- - -admin_log.log#管理员登陆日志
| |- - -admin_operation.log#管理员操作日志
| |- - -user_erro.log#用户错误日志
| |- - -user_log.log#用户登陆日志
| |- - -user_operation.log#用户操作日志
|
|- - -shopping/#商城程序目录
| |- - -__init__.py
| |- - -README
| |- - -bin/#执行目录
| | |- - -__init__.py
| | |- - -shop.py#商城用户登陆执行执行文件
| |
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -config.py#配置文件
| |
| |- - -core/##主逻辑程序目录
| | |- - -opert.py#主逻辑函数相关
| | |- - -shopping.py#商城主程序
| |
| |
| |- - -db/#数据目录
| | |- - -lock_name.txt#用户帐户
| | |- - -goodslist.txt#商品列表文件
| | |- - -lock_name.txt#用户消费记录文件
| | |- - -user_file.txt#用户帐户文件
| | |- - -ueer_infor#用户帐户信息文件
ATM/#综合目录
|- - -atm/#atm程序主目录
| |- - -README
| |- - -__init__.py
| |- - -bin/#执行程目录
| | |- - -__init__.py
| | |- - -admin.py #管理员登陆执行文件
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #管理员登陆 5 import os ,sys 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 7 sys.path.append(BASE_DIR)#增加环境变量 8 #from conf import settings 9 from core import admin_log#包含目录下的文件脚本 10 if __name__ == '__main__': 11 try: 12 admin_log.loging()#运行主程序 13 except Exception as e:#出错可返回操作 14 print("\033[31;1m系统异常,请与管理员联系!\033[0m") 15 pass
| | |- - -atm.py #用户登陆执行执行文件
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import os ,sys 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 6 sys.path.append(BASE_DIR)#增加环境变量 7 #from conf import settings 8 from core import main#包含目录下的文件脚本 9 if __name__ == '__main__': 10 try: 11 main.login()#运行主程序 12 except Exception as e:#出错可返回操作 13 print("\033[31;1m系统异常,请与管理员联系!\033[0m") 14 pass
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -confing.py#配置文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import os ,sys 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 6 sys.path.append(BASE_DIR)#增加环境变量 7 USER_FILE=BASE_DIR+'\db\\user_file.txt'#定义用户列表文件变量 8 LOCK_NAME=BASE_DIR+'\db\\lock_name.txt'#定义锁定用户列表文件变量 9 10 11 ADMIN_USER=BASE_DIR+'\db\\admin_list'#定义管理员列表文件变量 12 ADMIN_LOCK=BASE_DIR+'\db\\admin_lock'#定义管理员列表文件变量 13 14 DB_CARD=BASE_DIR+'\db\\card'#卡号数据文件 15 DATA=BASE_DIR+'\db\\db\\'#用户信息文件路径 16 17 USER_LOG=BASE_DIR+'\logs\\user_log.log'#用户登陆日志文件 18 USER_ERRO=BASE_DIR+'\logs\\user_erro.log'#用户错误日志文件 19 USER_OPERT=BASE_DIR+'\logs\\user_operation.log'#用户操作日志文件 20 21 ADMIN_LOG=BASE_DIR+'\logs\\admin_log.log'#管理员登陆日志文件 22 ADMIN_ERRO=BASE_DIR+'\logs\\admin_erro.log'#管理员错误日志文件 23 ADMIN_OPERT=BASE_DIR+'\logs\\admin_operation.log'#管理员操作日志文件 24 25 26 #手续费设置 27 #repay 还款 cash 提现 transfe 转帐 consume 消费 28 POUNDAGE={ 29 'repay':{'action':'plus', 'interest':0}, 30 'cash':{'action':'minus', 'interest':0.05}, 31 'transfer':{'action':'minus', 'interest':0.05}, 32 'consume':{'action':'minus', 'interest':0}, 33 } 34 PASSWORD=8888#卡初始密码 35 PASSWORD_USER='abc'#用户初始密码 36 #还款日 帐单周期,日配置 37 TIME_DATA={ 38 'data_all':50, 39 'data_n':20 40 41 }
| |- - -core #主逻辑程序目录
| | |- - -admin_log.py#管理员登陆主要程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import os ,sys 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 6 sys.path.append(BASE_DIR)#增加环境变量 7 from core import transaction #包含记账\还钱\取现等所有的与账户金额相关的操作 8 from core import user_pass #用户名检测相关 9 from core import log_file #日志检测相关 10 from core import opertion_admin#管理员操作相关 11 def loging():#管理员登陆函数 12 print("Welcome to ATM Management background".center(60,'*')) 13 admin_name=user_pass.admin_pass()#将通过验证的用户名赋于变量 14 while True: 15 print(''' 欢迎使用ATM管理系统 16 1 >>> 添加帐户. 2 >>> 帐户额度调整. 17 3 >>> 帐户冻结解冻. 4 >>> 查看用户日志. 18 5 >>> 退出. 19 ''') 20 options=input('请按提示操作:') 21 if options=='1': 22 while True: 23 card_id=input('按\033[31;1mb/B\033[0m返回<<<< 请输入要发行的卡号:') 24 if card_id=='b' or card_id=='B': 25 break 26 if not transaction.card_list(card_id):#查询卡号函数 27 print('id:\033[32;1m%s\033[0m.可以发行!'%card_id) 28 # new_user=input('请输入要添加的帐名:') 29 opertion_admin.add_user(card_id,admin_name)#添加帐户 30 else: 31 print('id:\033[41;1m%s\033[0m.已经发行,请更换其它卡号!'%card_id) 32 continue 33 34 elif options=='2': 35 while True: 36 user_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入调整额度的帐户:') 37 if user_name=='b' or user_name=='B': 38 break 39 if user_name in opertion_admin.user_in():#查看用户列表函数如果存 40 opertion_admin.Adjust(user_name,admin_name)#调整帐户额度 41 continue 42 else: 43 print('帐户不存在,请重新输入!') 44 continue 45 elif options=='3': 46 while True: 47 print('''操作提示: 48 1 >>>> 冻结帐户 49 2 >>>> 帐户解冻 50 ''') 51 js=input('按\033[31;1mb/B\033[0m返回<<<< 请按操作提示选择:') 52 if js=='b' or js=='B': 53 break 54 if js=='1': 55 user_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入要操作的帐户:') 56 if user_name=='b' or user_name=='B': 57 break 58 if user_name in opertion_admin.user_in():#查看用户列表函数如果存 59 opertion_admin.freeze(user_name,admin_name)#冻结帐户 60 continue 61 elif js=='2': 62 user_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入要操作的帐户:') 63 if user_name=='b' or user_name=='B': 64 break 65 if user_name in opertion_admin.user_in():#查看用户列表函数如果存 66 opertion_admin.free_(user_name,admin_name)#冻结帐户 67 continue 68 else: 69 continue 70 71 if user_name in opertion_admin.user_in():#查看用户列表函数如果存 72 opertion_admin.freeze(user_name,admin_name)#冻结帐户 73 continue 74 else: 75 print('帐户不存在,请重新输入!') 76 continue 77 elif options=='4': 78 while True: 79 print('''输入提示: 80 用户登陆日志: USER_LOG 81 用户错误日志: USER_ERRO 82 用户操作日志: USER_OPERT 83 ''') 84 log_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入您要查看的日志:') 85 if log_name=='b' or log_name=='B': 86 break 87 if log_name=='USER_LOG' or log_name=='USER_ERRO'or log_name=='USER_OPERT': 88 opertion_admin.log_cat(log_name,admin_name) 89 else: 90 print('输入有误,请重新输入!') 91 continue 92 elif options=='5': 93 exit() 94 else: 95 pass
| | |- - -log_file.py#日志相关函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #日志记录相关函数 5 import os,logging,time 6 from conf import config 7 8 def log_file_():#检测文件是否存在 9 if os.path.exists(config.USER_ERRO):#确认用户错误日志文件是否存在 10 with open(config.USER_ERRO,'w',encoding='utf-8') as user_history:#创建一个用户错误日志文件 11 user_history.write('')#写入空值 12 pass 13 if os.path.exists(config.USER_OPERT):#确认用户操作日志文件是否存在 14 with open(config.USER_OPERT,'w',encoding='utf-8') as user_infor:#创建一个用户操作日志文件 15 user_infor.write('')#写入空值 16 if os.path.exists(config.USER_LOG):#确认用户登陆日志文件是否存在 17 with open(config.USER_LOG,'w',encoding='utf-8') as user_infor:#创建一个用户登陆日志文件 18 user_infor.write('')#写入空值 19 20 if os.path.exists(config.ADMIN_ERRO):#确认管理员错误日志文件是否存在 21 with open(config.ADMIN_ERRO,'w',encoding='utf-8') as user_infor:#创建一个管理员错误日志文件 22 user_infor.write('')#写入空值 23 pass 24 if os.path.exists(config.ADMIN_LOG):#确认管理员登陆日志文件是否存在 25 with open(config.ADMIN_LOG,'w',encoding='utf-8') as user_infor:#创建一个管理员登陆日志文件 26 user_infor.write('')#写入空值 27 pass 28 if os.path.exists(config.ADMIN_OPERT):#确认管理员操作日志文件是否存在 29 with open(config.ADMIN_OPERT,'w',encoding='utf-8') as user_infor:#创建一个管理员操作日志文件 30 user_infor.write('')#写入空值 31 pass 32 else: 33 34 pass 35 36 def log_err(info_str):#错误日志,传入的错误内容 37 logger=logging.getLogger('用户登陆错误日志')#设置日志模块 38 logger.setLevel(logging.DEBUG) 39 fh=logging.FileHandler(config.USER_ERRO,encoding='utf-8')#写入文件 40 fh.setLevel(logging.DEBUG)#写入信息的级别 41 fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式 42 fh.setFormatter(fh_format)#关联格式 43 logger.addHandler(fh)#添加日志输出模式 44 logger.warning(info_str) 45 return 0 46 47 def log_log(info_str):#登陆日志,传入内容 48 logger=logging.getLogger('用户成功登陆日志')#设置日志模块 49 logger.setLevel(logging.DEBUG) 50 fh=logging.FileHandler(config.USER_LOG,encoding='utf-8')#写入文件 51 fh.setLevel(logging.DEBUG)#写入信息的级别 52 fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式 53 fh.setFormatter(fh_format)#关联格式 54 logger.addHandler(fh)#添加日志输出模式 55 logger.warning(info_str) 56 return 0 57 58 def user_opert(info_str):#用户操作日志,传入内容 59 logger=logging.getLogger('用户操作日志')#设置日志模块 60 logger.setLevel(logging.CRITICAL) 61 fh=logging.FileHandler(config.USER_OPERT,encoding='utf-8')#写入文件 62 fh.setLevel(logging.CRITICAL)#写入信息的级别 63 fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式 64 fh.setFormatter(fh_format)#关联格式 65 logger.addHandler(fh)#添加日志输出模式 66 logger.critical(info_str) 67 return 0 68 69 70 71 def admin_log(info_str):#管理员登陆日志,传入内容 72 logger=logging.getLogger('管理员成功登陆日志')#设置日志模块 73 logger.setLevel(logging.DEBUG) 74 fh=logging.FileHandler(config.ADMIN_LOG,encoding='utf-8')#写入文件 75 fh.setLevel(logging.DEBUG)#写入信息的级别 76 fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式 77 fh.setFormatter(fh_format)#关联格式 78 logger.addHandler(fh)#添加日志输出模式 79 logger.warning(info_str) 80 return 0 81 82 def admin_err(info_str):#管理员错误日志,传入的错误内容 83 logger=logging.getLogger('管理员登陆错误日志')#设置日志模块 84 logger.setLevel(logging.DEBUG) 85 fh=logging.FileHandler(config.ADMIN_ERRO,encoding='utf-8')#写入文件 86 fh.setLevel(logging.DEBUG)#写入信息的级别 87 fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式 88 fh.setFormatter(fh_format)#关联格式 89 logger.addHandler(fh)#添加日志输出模式 90 logger.warning(info_str) 91 return 0 92 93 def admin_opert(info_str):#管理员操作日志,传入内容 94 logger=logging.getLogger('管理员操作日志')#设置日志模块 95 logger.setLevel(logging.CRITICAL) 96 fh=logging.FileHandler(config.ADMIN_OPERT,encoding='utf-8')#写入文件 97 fh.setLevel(logging.CRITICAL)#写入信息的级别 98 fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式 99 fh.setFormatter(fh_format)#关联格式 100 logger.addHandler(fh)#添加日志输出模式 101 logger.critical(info_str) 102 return 0
| | |- - -main.py#用户登陆主要程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import os ,sys,time 5 6 from core import transaction #包含记账\还钱\取现等所有的与账户金额相关的操作 7 from core import user_pass #用户名检测相关 8 from core import log_file #日志相关 9 10 11 def login():#开始函数 12 # time_format='%y-%m-%d %X'#定义时间格式 13 # times=time.strftime(time_format)#定义时间 14 print("Welcome to python ATM".center(60,'*')) 15 while True: 16 print('''================================================ 17 1 >>>> 用户登陆. 18 2 >>>> 直接退出. 19 ================================================ 20 ''') 21 22 foo=input('请选择您要的操作:') 23 if foo=='1': 24 _user_name= user_pass.user_pass()#将通过验证的用户名赋于变量 25 data=transaction.user_info(_user_name)#调用帐户查询函数 26 if data['状态']: 27 print('\033[31;1m对不起您的帐户被冻结,不能进行相关操作,请与客服联系!\033[0m') 28 continue 29 print('尊敬的:\033[32;1m%s\033[0m 欢迎登陆'.center(50,'=')%_user_name) 30 while True: 31 print(''' 欢迎使用自动ATM柜员机 32 1 >>> 帐户信息查询. 2 >>> 帐户转帐. 33 3 >>> 现金提取. 4 >>> 还款. 34 5 >>> 退出. 35 ''') 36 options=input('请按提示操作:') 37 if options=='1': 38 while True: 39 transaction.info_user(_user_name)##调用帐户查询函数用户操作日志,传入内容 40 break 41 elif options=='2': 42 data=transaction.user_info(_user_name)#调用帐户查询函数 43 print(transaction.info_format(data))#用户信息输出格式化函数 44 print('欢迎使用自助转帐'.center(60,'=')) 45 card=input('按\033[31;1mq/Q\033[0m返回 输入对方的卡号:') 46 if card=='q' or card=='Q': 47 continue 48 if card.isdigit():#检测输入是否为整数 49 card=int(card)#转为int 50 if card==data['id']: 51 print('\033[41;1m您所输入的卡号是自己卡号,请重新输入!\033[0m') 52 transaction.transfer(card,_user_name)##调用转帐的函数 53 continue 54 else: 55 print('您的输入不正确,请重新输入!') 56 pass 57 58 59 elif options=='3': 60 while True: 61 data=transaction.user_info(_user_name)#调用帐户查询函数 62 print(transaction.info_format(data))#用户信息输出格式化函数 63 mony=input('按\033[31;1mq/Q\033[0m返回 请输入要提现的金额:') 64 if mony=='q' or mony=='Q': 65 break 66 if mony.isdigit():#检测输入是否为整数 67 mony=int(mony)#转为int 68 transaction.cash(mony,_user_name)##调用取现的函数 69 continue 70 else: 71 print('您的输入不正确,请重新输入!') 72 pass 73 elif options=='4': 74 while True: 75 data=transaction.user_info(_user_name)#调用帐户查询函数 76 print(transaction.info_format(data))#用户信息输出格式化函数 77 s_mony=data["最高额度"]-data["帐户信用余额"] 78 print('本期总共需要还款:要\033[31;1m%s\033[0m'%s_mony) 79 mony=input('按\033[31;1mq/Q\033[0m返回,请输入要还款的金额:') 80 if mony=='q' or mony=='Q': 81 break 82 if mony.isdigit():#检测输入是否为整数 83 mony=int(mony)#转为int 84 transaction.also_money(mony,s_mony,_user_name,data)#还款函数 85 pass 86 else: 87 print('您的输入不正确,请重新输入!') 88 pass 89 90 elif options=='5': 91 exit() 92 else: 93 continue 94 95 elif foo=='2': 96 exit() 97 else: 98 print('请按提示操作!') 99 pass
| | |- - -opertion_admin.py#用户登陆操作相关函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #管理员操作相关函数 5 import json,time 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 from core import transaction#包含记账\还钱\取现等所有的与账户金额相关的操作 10 from conf import config#配置文件 11 from core import log_file#日志文件 12 time_format='%d'#定义时间格式 13 time_format2='%Y-%m-%d'#定义时间格式 14 times=time.strftime(time_format)#定义时间 15 #查看用户列表函数 16 def user_in():#查看用户列表函数 17 with open(config.USER_FILE,'r',encoding='utf-8') as f: 18 user_l=eval(f.readline()) 19 return user_l 20 #各种日期计算函数 21 def data_l(yesr_):#各种日期计算函数 22 data1=time.time()#当前日期开卡日 23 data2=data1+config.TIME_DATA['data_all']*3600*24#帐单日 开卡日加上帐单周期 24 data3=data2+config.TIME_DATA['data_n']*3600*24#还款日 25 data4=data1+yesr_*3600*24*365#有效期 26 data_1=time.strftime(time_format2,time.gmtime(data1))#开卡日 27 data_2=time.strftime(time_format,time.gmtime(data2))#帐单日 28 data_3=time.strftime(time_format,time.gmtime(data3))#还款日 29 data_4=time.strftime(time_format2,time.gmtime(data4))#有效期 30 return data_1,int(data_2),int(data_3),data_4 31 32 #添加帐户 33 def add_user(card_id,admin_name):#添加帐户 34 while True: 35 new_user=input('请输入要添加的帐名:') 36 if new_user in user_in():#如果用户名存在 37 print('帐户已经存在,请重新输入!') 38 continue 39 h_=input('请输入最高额度:') 40 yesr_=input('请输入年限') 41 data_list=data_l(int(yesr_))#计算各种日期 42 user_info_l={"帐户信用余额":int(h_),"有效期限":data_list[3],"开卡日期":data_list[0],"最高额度":int(h_),"id":int(card_id),"状态":0,"还款日期":data_list[2],"帐单日":data_list[1],"password":config.PASSWORD} 43 info_=transaction.info_format_adm(user_info_l,new_user,config.PASSWORD_USER)#用户信息输出格式化函数 44 print(info_) 45 q=input('是否确定添加帐户: \033[31;1mY/y\033[0m 确定! 其它键返回') 46 if q=='y' or q=='Y': 47 transaction.accounting(new_user,user_info_l)#记账函数,写入数据 48 with open(config.USER_FILE,'r+',encoding='utf-8') as f: 49 user_list=eval(f.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表 50 user_list[new_user]=config.PASSWORD_USER#增加注册用户到字典中 51 f.seek(0)#称到最前 52 f.write(str(user_list))#写入文件f 53 f.flush()#即可保存 54 info_str='管理员:%s.进行了帐户添加,帐户名:%s.'%(admin_name,new_user) 55 log_file.admin_opert(info_str)#管理员操作日志,传入内容 56 return 0 57 else: 58 pass 59 60 61 #冻结帐户 62 def freeze(_user_name,admin_name):#冻结帐户 63 data=transaction.user_info(_user_name)#帐户信息函数 64 if data["状态"]==1: 65 print('当前帐户已经冻结!') 66 return 67 info_=transaction.info_format(data)#用户信息输出格式化函数 68 print(info_) 69 q=input('是否确定冻结帐户: \033[31;1mY/y\033[0m 确定! 其它键返回') 70 if q=='y' or q=='Y': 71 data["状态"]=1 72 transaction.accounting(_user_name,data,)#记账函数,写入数据 73 print('帐户冻结完成!') 74 info_str='管理员:%s.对帐户:%s.进行了冻结!'%(admin_name,_user_name) 75 log_file.admin_opert(info_str)#管理员操作日志,传入内容 76 return 77 else: 78 return 79 80 81 82 pass 83 84 #解冻帐户 85 def free_(_user_name,admin_name):#冻结帐户 86 data=transaction.user_info(_user_name)#帐户信息函数 87 if data["状态"]==0: 88 print('当前帐户已经解冻!') 89 return 90 info_=transaction.info_format(data)#用户信息输出格式化函数 91 print(info_) 92 q=input('是否确定解冻帐户: \033[31;1mY/y\033[0m 确定! 其它键返回') 93 if q=='y' or q=='Y': 94 data["状态"]=0 95 transaction.accounting(_user_name,data,)#记账函数,写入数据 96 print('帐户解冻完成!') 97 info_str='管理员:%s.对帐户:%s.进行了解冻!'%(admin_name,_user_name) 98 log_file.admin_opert(info_str)#管理员操作日志,传入内容 99 return 100 else: 101 return 102 103 104 105 pass 106 107 #调整帐户额度 108 def Adjust(_user_name,admin_name):#调整帐户额度 109 data=transaction.user_info(_user_name)#帐户信息函数 110 info_=transaction.info_format(data)#用户信息输出格式化函数 111 print(info_) 112 mony=input('请输入调整的额度:') 113 114 if mony.isdigit():#检测输入是否为整数 115 mony=int(mony)#转为int 116 while True: 117 upd=input('请确定调整方向: u/U 向上, d/D 向下:') 118 if upd=='u' or upd=='U': 119 monyall=data["最高额度"]+mony 120 mony_r=data["帐户信用余额"]+mony 121 pass 122 elif upd=='d' or upd=='D': 123 monyall=data["最高额度"]-mony 124 mony_r=data["帐户信用余额"]-mony 125 pass 126 else: 127 print('输入有误,请重新输入!') 128 continue 129 data["最高额度"]=monyall 130 data["帐户信用余额"]=mony_r 131 print('调整后的帐户信息') 132 info_l=transaction.info_format(data)#用户信息输出格式化函数 133 print(info_l) 134 q=input('是否确定调整额度: \033[31;1mY/y\033[0m 确定! 其它键返回') 135 if q=='y' or q=='Y': 136 transaction.accounting(_user_name,data,)#记账函数,写入数据 137 print('帐户调整额度成功!') 138 info_str='管理员:%s.对帐户:%s.进行了额度调整!'%(admin_name,_user_name) 139 log_file.admin_opert(info_str)#管理员操作日志,传入内容 140 return 141 else: 142 return 143 144 else: 145 print('输入有误,请重新输入!') 146 pass 147 148 #管理员查看用户日志 149 150 # USER_LOG=BASE_DIR+'\logs\\user_log.log'#用户登陆日志文件 151 # USER_ERRO=BASE_DIR+'\logs\\user_erro.log'#用户错误日志文件 152 # USER_OPERT=BASE_DIR+'\logs\\user_operation.log'#用户操作日志文件 153 154 def log_cat(log_name,admin_name):#管理员查看用户日志 155 if log_name=='USER_LOG': 156 with open(config.USER_LOG,'r',encoding='utf-8') as f: 157 for line in f : 158 print(line) 159 info_str='管理员:%s.查看了用户登陆日志!'%admin_name 160 log_file.admin_opert(info_str)#管理员操作日志,传入内容 161 elif log_name=='USER_ERRO': 162 with open(config.USER_ERRO,'r',encoding='utf-8') as f: 163 for line in f : 164 print(line) 165 info_str='管理员:%s.查看了用户错误日志!'%admin_name 166 log_file.admin_opert(info_str)#管理员操作日志,传入内容 167 elif log_name=='USER_OPERT': 168 with open(config.USER_OPERT,'r',encoding='utf-8') as f: 169 for line in f : 170 print(line) 171 info_str='管理员:%s.查看了用户操作日志!'%admin_name 172 log_file.admin_opert(info_str)#管理员操作日志,传入内容 173 else: 174 return
| | |- - -transaction.py#用户操作相关函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #记账\还钱\取现等所有的与账户金额相关的操作 5 import json,time 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 8 sys.path.append(BASE_DIR)#增加环境变量 9 from conf import config# 引入配置文件 10 from core import user_pass# 引入检测文件 11 from core import log_file 12 time_format='%y-%m-%d %X'#定义时间格式 13 times=time.strftime(time_format)#定义时间 14 #记账函数,写入数据 15 def accounting(_user_name,data,**kwargs):#记账函数,写入数据 16 #db['帐户信用余额']=db['帐户信用余额']-monyall 17 name_file=config.DATA+_user_name+'.json'#格式化拼接文件名 18 with open(name_file,'w',encoding='utf-8') as f: 19 json.dump(data,f)#写入文件 20 f.flush() 21 pass 22 #还款函数 23 def also_money(mony,s_mony,_user_name,data):#还款函数 24 data=user_info(_user_name)#调用帐户信息查询函数 25 print('''您的帐户目前余额:{mony_old} 26 本期应还金额:{s_mony} 27 还款现金:{mony} 28 还款后帐户余额:{mony_new} 29 '''.format(mony_old=data['帐户信用余额'],s_mony=s_mony,mony=mony,mony_new=data['帐户信用余额']+mony)) 30 q=input('是否确定还款:\033[32;1m%s\033[0m元: \033[31;1mY/y\033[0m 确定! 其它键返回:'%mony) 31 if q=='y' or q=='Y': 32 data['帐户信用余额']=data['帐户信用余额']+mony#计算信用余额 33 accounting(_user_name,data)#调用记帐函数 34 info_str='%s进行还款操作,还款金额:%s!'%(_user_name,mony) 35 log_file.user_opert(info_str)#用户操作日志,传入内容 36 print('成功还款:\033[32;1m%s\033[0m元.'%mony) 37 else: 38 pass 39 40 #取现函数 41 def cash(mony,_user_name):#取现函数 42 data=user_info(_user_name)#调用帐户信息查询函数 43 mony_f=mony*config.POUNDAGE['cash'][ 'interest']#手续费 44 monyall=mony+mony_f#金额加上手续费 45 if monyall>data['帐户信用余额']/2: 46 print('对不起你的余额不足') 47 pass 48 else: 49 print('''您的帐户目前余额:{mony_old} 50 您提取的现金:{mony} 51 手续费用:{mony_f} 52 总共需消费额度:{monyall} 53 取现后帐户余额:{mony_new} 54 '''.format(mony_old=data['帐户信用余额'],mony=mony,mony_f=mony_f,monyall=monyall,mony_new=data['帐户信用余额']-monyall)) 55 q=input('是否确定提取现金: \033[31;1mY/y\033[0m 确定! 其它键返回') 56 if q=='y' or q=='Y': 57 data['帐户信用余额']=data['帐户信用余额']-monyall#计算信用余额 58 accounting(_user_name,data)#调用记帐函数 59 info_str='%s进行提现操作,提现金额:%s,手续费:%s,总共消费%s!'%(_user_name,mony,mony_f,monyall) 60 log_file.user_opert(info_str)#用户操作日志,传入内容 61 print('请拿好您的现金!') 62 return 63 else: 64 pass 65 66 #转帐函数 67 def transfer(card,_user_name):#转帐函数 68 data=user_info(_user_name)#调用帐户信息查询函数 69 if card_list(str(card)):#查询卡号函数 70 user_card=card_list(str(card)) 71 print('您输入要转帐的卡号:\033[32;1m%s\033[0m. 帐户名:\033[32;1m%s\033[0m'%(card,user_card)) 72 while True: 73 mony=input('按\033[31;1mB/b\033[0m退回主界面<<<< 请输入要转帐的金额:') 74 if mony=='b' or mony=='B': 75 break 76 elif mony.isdigit():#检测输入是否为整数 77 mony=int(mony)#转为int 78 mony_f=mony*config.POUNDAGE['transfer'][ 'interest']#手续费 79 monyall=mony+mony_f#金额加上手续费 80 print('''您的帐户目前余额:{mony_old} 81 您要转帐的金额:{mony} 82 手续费用:{mony_f} 83 总共需消费额度:{monyall} 84 转帐后帐户余额:{mony_new} 85 '''.format(mony_old=data['帐户信用余额'],mony=mony,mony_f=mony_f,monyall=monyall,mony_new=data['帐户信用余额']-monyall)) 86 q=input('是否确定转帐: \033[31;1mY/y\033[0m 确定! 其它键返回') 87 if q=='y' or q=='Y': 88 data['帐户信用余额']=data['帐户信用余额']-monyall#计算信用余额 89 accounting(_user_name,data)#调用记帐函数,写入数据 90 data_u=user_info(user_card)#帐户信息查询函数 ,对方帐户 91 data_u['帐户信用余额']=data_u['帐户信用余额']+mony#计算信用余额 92 accounting(user_card,data_u)#调用记帐函数,写入对方帐户数据 93 info_str='%s进行转帐操作,转帐金额:%s,手续费:%s,总共消费%s;对方卡号:%s,帐户名:%s'%(_user_name,mony,mony_f,monyall,card,user_card) 94 log_file.user_opert(info_str)#用户操作日志,传入内容 95 print('\033[31;1m转帐成功!\033[0m'.center(50,'=')) 96 return 97 else: 98 print('您的输入不正确,请重新输入!') 99 pass 100 else: 101 pass 102 else: 103 print('\033[41;1m您所输入的卡号不存在!请重新输入!\033[0m') 104 105 #商城接口函数 106 def interface(card_id,paswd,mony):#商城接口函数 107 card_name=card_list(card_id)#返回卡号所对应的用户 108 data=user_info(card_name)#帐户信息函数 109 if data["状态"]==1: 110 print('当前帐户被冻结!请更换帐户!') 111 return 0 112 if paswd==data["password"]: 113 print('卡号和密码均通过验证!') 114 #mony=int(mony)#转为int 115 mony_f=mony*config.POUNDAGE['consume'][ 'interest']#手续费 116 monyall=mony+mony_f#金额加上手续费 117 print('本次消费总金额:%s元.'%monyall) 118 q=input('是否确定支付: \033[31;1mY/y\033[0m 确定! 其它键返回') 119 if q=='y' or q=='Y': 120 data["帐户信用余额"]-monyall 121 accounting(card_name,data)#调用记帐函数,写入数据 122 info_str='卡号:%s,帐户名:%s,通过商城消费金额:%s元.'%(card_id,card_name,monyall) 123 log_file.user_opert(info_str)#用户操作日志,传入内容 124 return 1 125 else: 126 return 0 127 else: 128 print('密码错误,请重新输入!') 129 return 0 130 131 132 133 134 135 #帐户信息函数 136 def user_info(_user_name):#帐户信息函数 137 name_file=config.DATA+_user_name+'.json'#格式化拼接文件名 138 with open(name_file,'r',encoding='utf-8') as f: 139 data=json.load(f) 140 return data 141 #帐户信息查询函数,日志记录 142 def info_user(_user_name):#帐户信息查询函数,日志记录 143 data=user_info(_user_name) 144 print(info_format(data))#用户信息输出格式化函数 145 info_str='%s进行查询操作!'%(_user_name) 146 log_file.user_opert(info_str)#用户操作日志,传入内容 147 return 0 148 #用户信息输出格式化函数 149 def info_format(data):#用户信息输出格式化函数 150 data_format='''============帐户信息=========== 151 信用余额:{mony_old} 152 开卡日期:{date_r} 153 有效期限:{date_l} 154 最高额度:{mony_h} 155 还款日期:{day_n} 156 帐单日:{day_m} 157 '''.format(mony_old=data["帐户信用余额"],date_r=data["开卡日期"],date_l=data["有效期限"],mony_h=data['最高额度'],day_n=data["还款日期"],day_m=data["帐单日"]) 158 return data_format 159 #查询卡号函数 160 def card_list(card):#查询卡号函数 161 with open(config.DB_CARD,'r',encoding='utf-8') as f: 162 card_l=eval(f.readline())#读取卡列表 163 if card in card_l: 164 return card_l[card]#返回卡号所对应的用户 165 else: 166 #print('您所输入的卡号不存在') 167 return False 168 169 170 #管理员信息提示输出格式化函数 171 def info_format_adm(data,name,PASSWORD_USER):#管理员信息提示输出格式化函数 172 data_format='''======您要添加帐户信息 173 帐户名:{name} 174 信用余额:{mony_old} 175 开卡日期:{date_r} 176 有效期限:{date_l} 177 最高额度:{mony_h} 178 还款日期:{day_n} 179 帐单日:{day_m} 180 卡初始密码:{pas} 181 用户初始密码:{password} 182 '''.format(name=name,mony_old=data["帐户信用余额"],date_r=data["开卡日期"],date_l=data["有效期限"],mony_h=data['最高额度'],day_n=data["还款日期"],day_m=data["帐单日"],pas=data["password"],password=PASSWORD_USER) 183 return data_format
| | |- - -user_pass.py#用户\用户登陆登陆相关函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #用户名检测相关 5 from conf import config# 引入配置文件 6 from core import log_file#引入日志相关函数 7 8 #装饰器 9 def certi(model):#装饰器 10 def outr(fun):#装饰器加参数需要多加一层嵌套 11 def login(*args,**kwargs):#为了兼容各类函数参数,添加 *args,**kwargs 不固定参数 12 if model=='password': 13 print('正在通过password认证') 14 #user_name = input('用户名:').strip() 15 # paswd=input('密码:').strip() 16 # if user_name==name and paswd==password: 17 # print('通过认证') 18 return fun(*args,**kwargs) 19 # else: 20 # print('用户或密码错误 ,退出') 21 exit() 22 elif model=='lamp': 23 print('正在通过lamp认证') 24 return fun(*args,**kwargs) 25 else: 26 print('认证出错') 27 return login 28 return outr 29 30 31 32 #检测用户名的函数 33 def userchar(_user_name,user_list,lock_list,user_file):#检测用户名的函数 34 while True: 35 if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常 36 return True#存在返回真 37 elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定 38 print('您的用户已经被锁定,请联系管理员解锁!') 39 reg=input('按\033[31;1m Q/q\033[0m 直接退出,其它键返回!') 40 if reg=='q' or reg=='Q': 41 print("您已经退出!" ) 42 exit() 43 else: 44 break 45 else: 46 reg=input('您输入用户不存在,请先联系银行注册!按\033[31;1m Q/q\033[0m 直接退出 ,其它键返回!') 47 if reg=='q' or reg=='Q': 48 print("您已经退出!" ) 49 exit() 50 else : 51 break 52 53 #退出确认函数 54 def confirm():#退出确认函数 55 qu=input("是否退出!按\033[31;1mY/y\033[0m退出? 按其它键返回<<<") 56 if qu=='Y'or qu=='y': 57 print("您已经退出!" ) 58 exit()#退出程序 59 else : 60 pass 61 #用户名输入函数 62 @certi(model='password') 63 def user_pass():#用户名输入函数 64 user_file=open(config.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件 65 user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表 66 lock_name=open(config.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件 67 lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 68 bool=True#定义退出循环条件变量 69 while bool: 70 print("用户登陆".center(30,'-')) 71 _user_name=(input('请输入用户名:')) 72 if userchar(_user_name.strip(),user_list,lock_list,user_file):#运行检测用户名的函数判断,去除两边空格 73 count=3#定义锁次数 74 while count>0 :#如果密码错误次数超过退出密码输入 75 #password=getpass.getpass('请输入密码:') 76 password=input('请输入密码:') 77 if password==user_list[_user_name]:#密码通过验证结束循环 78 print("密码通过验证") 79 bool=False 80 #print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name) 81 info_str='用户:%s,登陆成功!'%_user_name 82 log_file.log_log(info_str)#调用用户登陆日志 83 return _user_name#返回用户名 84 else: 85 count -=1#次数减少 86 87 print("密码错误请重试,剩余:\033[31;1m%s\033[0m次! "% count) 88 info_str="用户:%s,密码错误剩余:%s"%(_user_name,count) 89 log_file.log_err(info_str)#调用用户错误日志 90 pass 91 else: 92 print("\033[31;1m超出所试次数,账户已锁定!请联系商家!\033[0m") 93 lock_list.append(_user_name)#将用户名加出锁定列表 94 lock_name.seek(0)#指针移动到开头,以免产生多个元组 95 lock_name.write(str(lock_list))#写入锁定用户文件 96 lock_name.tell()#获取当前指针,以免产生多个元组 97 lock_name.close()#关闭锁定用户文件 98 confirm()#退出确认函数 99 else:#如果用户名出错新来过 100 pass 101 102 103 104 #检测管理员用户名的函数 105 def admin_char(_user_name,user_list,lock_list,user_file):#检测管理员用户名的函数 106 while True: 107 if _user_name in user_list and _user_name not in lock_list :#判断用户是否存在并正常 108 return True#存在返回真 109 elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定 110 print('该管理员已经被锁定,请联系其上级!') 111 reg=input('按\033[31;1m Q/q\033[0m 直接退出,其它键返回!') 112 if reg=='q' or reg=='Q': 113 print("您已经退出!" ) 114 exit() 115 else: 116 return 100 117 else: 118 return False 119 120 121 #管理员输入函数 122 @certi(model='lamp') 123 def admin_pass():#管理员输入函数 124 user_file=open(config.ADMIN_USER,'r+',encoding='utf-8')#打开用户列表文件 125 user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表 126 lock_name=open(config.ADMIN_LOCK,'r+',encoding='utf-8')#打开锁定用户列表文件 127 lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 128 bool=True#定义退出循环条件变量 129 count=0 130 while bool: 131 print("管理员登陆".center(30,'-')) 132 _user_name=(input('请输入管理员用户名:')) 133 int_s=admin_char(_user_name.strip(),user_list,lock_list,user_file)#运行检测用户名的函数判断,去除两边空格 134 if int_s==100: 135 continue 136 if int_s: 137 while count<=5: 138 password=input('请输入密码:') 139 if password==user_list[_user_name]:#密码通过验证结束循环 140 print("密码通过验证") 141 bool=False 142 #print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name) 143 info_str='管理员:%s,登陆成功!'%_user_name 144 log_file.admin_log(info_str)#调用管理员登陆日志 145 return _user_name#返回用户名 146 else: 147 count+=1 148 print("\033[31;1m密码错误请重试,错误次数:%s\033[0m!"%count) 149 info_str="用户:%s,密码错误剩余:%s"%(_user_name,count) 150 log_file.admin_err(info_str)#调用管理员错误日志 151 if count==5: 152 print("\033[31;1m超出最大密码错误请重试次数!当前管理员用户已被锁定\033[0m! ") 153 lock_list.append(_user_name)#将用户名加出锁定列表 154 lock_name.seek(0)#指针移动到开头,以免产生多个元组 155 lock_name.write(str(lock_list))#写入锁定用户文件 156 lock_name.tell()#获取当前指针,以免产生多个元组 157 lock_name.close()#关闭锁定用户文件 158 confirm()#退出确认函数 159 break 160 161 else:#如果用户名出错重新来过 162 print("您输入管理员不存在!请重新输入!")
| |- - -db/#用户数据目录
|- - -shopping/#商城程序目录
| |- - -__init__.py
| |- - -README
| |- - -bin/#执行目录
| | |- - -__init__.py
| | |- - -shop.py#商城用户登陆执行执行文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 # import time,sys,os 6 # BASE_DIR1=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 7 # sys.path.append(BASE_DIR1)#增加环境变量 8 9 import os ,sys 10 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量 11 sys.path.append(BASE_DIR)#增加环境变量 12 #print(BASE_DIR) 13 # print(os.path.exists(BASE_DIR+'\shopping\\core')) 14 # BASE_DIR_S=BASE_DIR+'\shopping\\core\\' 15 # print(BASE_DIR_S) 16 # #from conf import settings 17 # print(os.path.dirname('shopping')) 18 from shopping.core import shopping#包含目录下的文件脚本 19 20 21 if __name__ == '__main__': 22 #程序开始: 23 shopping.main()
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -config.py#配置文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import os ,sys 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量 6 sys.path.append(BASE_DIR)#增加环境变量 7 #print(BASE_DIR) 8 9 #print(DB) 10 USER_FILE=BASE_DIR+'\shopping\\db\\user_file.txt'#定义用户列表文件变量 11 12 FILE_CORE=BASE_DIR+'\atm\\core'#接口函数 13 LOCK_NAME=BASE_DIR+'\shopping\\db\\lock_name.txt'#定义锁定用户列表文件变量 14 15 USER_INFOR=BASE_DIR+'\shopping\\db\\user_infor'#定义用户信息文件变量 16 HISTORY=BASE_DIR+'\shopping\\db\\history'#定义用户消费记文件变量 17 18 GOODSLIST=BASE_DIR+'\shopping\\db\\goodslist.txt'#定义用户消费记文件变量
| |- - -core/##主逻辑程序目录
| | |- - -opert.py#主逻辑函数相关
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #相关函数 5 import os ,sys 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量 7 sys.path.append(BASE_DIR)#增加环境变量 8 from shopping.conf import config 9 from atm.core import transaction 10 11 12 #结算函数 13 def shop(shoplist,shop_count,history_user,_user_name,times,infor_list,name_char):#结算函数 14 shoplist.append(('总额:',shop_count))#列表加入总额 15 history_list=history_user()#用户消费记录函数 16 history_list[_user_name][times+'购物清单:']=shoplist#添加时间:清单 17 with open(config.USER_INFOR,'w',encoding="utf-8") as user_infor:#写入文件用户信息 18 user_infor.seek(0)#移到最前 19 user_infor.write(str(infor_list))#写入 20 with open(config.HISTORY,'r+',encoding='utf-8') as user_history:#购物信息写入文件 21 user_history.seek(0)#移到最前 22 user_history.write(str(history_list))#写入 23 print("你的购物金额余: \033[31;1m%s\033[0m 元!" % name_char) 24 exit(print("谢谢!\033[31;1mpython\033[0m 商城欢迎您再次光临!")) 25 26 27 def regis(user_list,user_file):#用户注册函数 28 while True: 29 name=input("按\033[31;1mb/B返回\033[0m \033[31;1mq/Q\033[0m直接退出 请输入您要注册的用户名:") 30 if name=='b' or name=='B': 31 break 32 elif name=='q' or name=='Q': 33 confirm() 34 elif name not in user_list: 35 print("恭喜!该用户名可以被注册!>>>") 36 password=input('请输入密码:') 37 password2=input('请再次确认密码:') 38 if password==password2: 39 name_infor='''恭喜您用户注册成功! 40 用户名:{name} 41 密 码:{password} 42 请牢记您的用户名与密码 43 ''' 44 print(name_infor.format(name=name,password=password2)) 45 user_list[name]=password2#增加注册用户到字典中 46 user_file.seek(0)#称到最前 47 user_file.write(str(user_list))#写入文件 48 user_file.flush()#即可保存 49 #break 50 continue 51 else: 52 print("该用户名已经被注册啦!请重新来过<<<") 53 confirm()#是否退出 54 continue 55 56 def userchar(_user_name,user_list,lock_list,user_file):#检测用户名的函数 57 while True: 58 if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常 59 return True#存在返回真 60 elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定 61 print('您的用户已经被锁定,请联系商家解锁!') 62 reg=input('按\033[31;1m Q/q\033[0m 直接退出,其它键返回!') 63 if reg=='q' or reg=='Q': 64 print("您已经退出!" ) 65 exit() 66 else: 67 break 68 else: 69 reg=input('您输入用户不存在,请先注册!按\033[31;1m Q/q\033[0m 直接退出 \033[31;1m Y/y\033[0m 确定注册,其它键返回!') 70 if reg=='y' or reg=='Y': 71 regis(user_list,user_file)#用户注册函数 72 #print('是否直接退出商城?') 73 break 74 elif reg=='q' or reg=='Q': 75 print("您已经退出!" ) 76 exit() 77 else : 78 break 79 80 def confirm():#退出确认函数 81 qu=input("是否退出!按\033[31;1mY/y\033[0m退出? 按其它键返回<<<") 82 if qu=='Y'or qu=='y': 83 print("您已经退出!" ) 84 exit()#退出程序 85 else : 86 pass 87 88 def user_pass(user_list,lock_list,lock_name,user_file): 89 bool=True#定义退出循环条件变量 90 while bool: 91 print("用户登陆".center(30,'-')) 92 _user_name=(input('请输入用户名:')) 93 if userchar(_user_name.strip(),user_list,lock_list,user_file):#运行检测用户名的函数判断,去除两边空格 94 count=3#定义锁次数 95 while count>0 :#如果密码错误次数超过退出密码输入 96 #password=getpass.getpass('请输入密码:') 97 password=input('请输入密码:') 98 if password==user_list[_user_name]:#密码通过验证结束循环 99 print("密码通过验证") 100 bool=False 101 print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name) 102 return _user_name#返回用户名 103 else: 104 count -=1#次数减少 105 print("密码错误请重试,剩余:\033[31;1m%s\033[0m次! "% count) 106 pass 107 else: 108 print("\033[31;1m超出所试次数,账户已锁定!请联系商家!\033[0m") 109 lock_list.append(_user_name)#将用户名加出锁定列表 110 lock_name.seek(0)#指针移动到开头,以免产生多个元组 111 lock_name.write(str(lock_list))#写入锁定用户文件 112 lock_name.tell()#获取当前指针,以免产生多个元组 113 lock_name.close()#关闭锁定用户文件 114 confirm()#退出确认函数 115 else:#如果用户名出错新来过 116 pass 117 118 def infor():#打开用户信息函数 119 with open(config.USER_INFOR,'r+',encoding='utf-8') as user_infor:#打开用户购物信息文件 120 infor_list=eval(user_infor.readline())#转换文件的字符串 121 return infor_list 122 123 def history_user():#用户购物历史记录函数 124 with open(config.HISTORY,'r',encoding="utf-8") as user_history:#读取用户文件 125 history_list=eval(user_history.readline())#用户购物信息 126 return history_list 127 128 def history(_user_name):#用户消费记录函数 129 history_list=history_user()#用户购物历史记录 130 history=history_list[_user_name]#用户购物记录信息 131 print('您的购物记录如下:') 132 for k,v in history.items():#转为列表进行输出 133 print(k,v)#输出购物记录 134 choose_index=input("请选择您想要的操作:按\033[32;1mq/Q\033[0m直接退出商城!其它键返回!") 135 if choose_index=='Q' or choose_index=='q' : 136 choo=input('''>>>>>\033[42;1m您确定出退商城吗?\033[0m 137 如果您已经添加商品,此操作将不进行结算, 138 您就无法将心爱的东东买回家了,按\033[31;1my/Y\033[0m确定直接退出!''') 139 if choo=='y'or choo=='Y': 140 print("您已经出退商城!") 141 exit() 142 else: 143 pass 144 else: 145 pass
| | |- - -shopping.py#商城主程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import time,sys,os 5 import os ,sys 6 # BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 7 # sys.path.append(BASE_DIR)#增加环境变量 8 # print(BASE_DIR) 9 import os ,sys 10 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量 11 sys.path.append(BASE_DIR)#增加环境变量 12 from shopping.conf import config 13 from shopping.core import opert 14 from atm.core import transaction 15 16 # user_file=open(cfg1.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件 17 # #with open('user_file.txt','r+',encoding='utf-8') as user_file: 18 # admin_user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表 19 # lock_name=open(cfg1.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件 20 # lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 21 22 23 24 # #程序开始: 25 def main(): 26 user_file=open(config.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件 27 #with open('user_file.txt','r+',encoding='utf-8') as user_file: 28 user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表 29 lock_name=open(config.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件 30 lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 31 32 if os.path.exists(config.HISTORY):#确认文件是否存在 33 pass 34 else: 35 with open(config.HISTORY,'w',encoding='utf-8') as user_history:#创建一个用户帐户购物记录文件 36 user_history.write('{}')#写入空值 37 pass 38 if os.path.exists(config.USER_INFOR):#确认文件是否存在 39 pass 40 else: 41 with open(config.USER_INFOR,'w',encoding='utf-8') as user_infor:#创建一个用户帐户信息记录文件 42 user_infor.write('{}')#写入空值 43 pass 44 45 print("欢迎来到\033[31;1mpython\033[0m购物商城!") 46 47 time_format='%y-%m-%d %X'#定义时间格式 48 times=time.strftime(time_format)#定义时间 49 _user_name= opert.user_pass(user_list,lock_list,lock_name,user_file)#将通过验证的用户名赋于变量 50 51 if _user_name in opert.infor():#如果用户信息存在记录就跳过 52 pass 53 else: 54 while True: 55 name_char=input("首次登陆,请输入工资(购物资金):")#用户输入工资(购物资金) 56 if name_char.isdigit():#检测输入是否为整数 57 name_char=int(name_char)#转为int 58 with open(config.HISTORY,'r+',encoding='utf-8') as user_history:#打开用户帐户购物记录文件 59 history_list=eval(user_history.readline())#将文本读为字典 60 history_list[_user_name]={}#创建用户购物记录 61 user_history.seek(0)#移到开头 62 user_history.write(str(history_list))#写入文件 63 with open(config.USER_INFOR,'r+',encoding='utf-8') as user_infor: 64 infor_list=eval(user_infor.readline())#转换首登用户文件中的字符串 65 infor_list[_user_name]={"金额":name_char} 66 user_infor.seek(0) 67 user_infor.write(str(infor_list))#写入用户信息 68 print("充值成功,充值金额:\033[32;1m%s\033[0m元."% name_char) 69 break 70 else: 71 print('金额不能为0或负数请正确输入金额!') 72 continue 73 #再次登陆直接显示用户信息 74 infor_list=opert.infor()#使用用户信息函数 获取用户信息字典 75 name_char=int(infor_list[_user_name]['金额'])#获取余额 76 print("\n您的帐户信息:") 77 print('用户名:\033[32;1m%s\033[0m:'%_user_name)#输出用户信息 78 print('您的余额:\033[31;1m%s\033[0m元.:'%name_char) 79 80 81 while True: 82 print('''您可以进行以下相关操作:\n 83 按 1 >>>查询购物记录。 84 按 2 >>>显示商品列表开始购物! 85 按 3 >>>直接出退商城! 86 ''') 87 choose=input("请选择您所要的功能:")#请用户可以查询 88 if choose=='1': 89 opert.history(_user_name)#查询消费记录 90 elif choose=='2': 91 ###进入商品列表### 92 shoplist=[]#购物车列表 93 shop_count=0#购物金额统计 94 goodsname=[]#定义商品列表 95 print('加载商品列表:') 96 for i in range(40):#加载动画 97 sys.stdout.write('#') 98 sys.stdout.flush() 99 time.sleep(0.05) 100 print('\n') 101 with open(config.GOODSLIST,'r',encoding='utf-8') as f:#打开商品列表文件 102 for line in f: 103 a=line.find(',')#定位分割符的索引进行分割 104 goodsname.append((line[0:a],int(line[a+1:])))#元组模式追加到列表,价格转为整数 105 while True: 106 print("商品列表".center(50,'=')) 107 for index,p_item in enumerate(goodsname):#取出下标输出 商品列表 108 print(index,p_item)#输出商品列表 109 print("列表底部".center(50,'=')) 110 user_index=input('请输入商品编号添加你所在购买的商品,按\033[31;1mc/C\033[0m>> 查看当前购物清单, \033[31;1mh/H\033[0m查看消费记录 \033[31;1mq/Q\033[0m结算商品退出>>>:') 111 if user_index.isdigit():#判断是否为整数 112 user_index=int(user_index)#转为数字 113 if user_index < len(goodsname) and user_index>=0:#判断所选商品编号在在列表 114 p_item=goodsname[user_index]#读取下标所在(元素)商品 115 if p_item[1]<=name_char:#余额是否足够 116 shoplist.append(p_item)#添加到购物车 117 name_char-=p_item[1]#扣除金额 118 shop_count+=p_item[1]#累加购物金额 119 print("添加 \033[32;1m%s\033[0m 到购物车,价格: \033[32;1m%s\033[0m 元"% p_item) 120 print("你的购物金额余: \033[31;1m%s\033[0m 元"% name_char) 121 else: 122 print("你的购物金额余: \033[41;1m%s\033[0m 元,无法购买该商品!" % name_char) 123 else: 124 print('输入错误,该编号 \033[41;1m%s\033[0m 的商品不存在!'%user_index) 125 elif user_index=='q'or user_index=='Q': 126 print('你的购物清单:') 127 for up in shoplist:#打印购物清单 128 print(up) 129 print("你的购物总金额为:\033[32;1m%s\033[0m 元!"% shop_count) 130 #print("你的购物金额余: \033[31;1m%s\033[0m 元!" % name_char) 131 while True: 132 confirm=input("你是否确定结算商品并退出商城?\033[31;1m Y/y\033[0m是, \033[31;1mN/n\033[0m否:") 133 if confirm== 'Y'or confirm== 'y' : 134 print('''请选择结算方式: 135 1 >>> 帐户余额结算. 136 2 >>> 信用卡结算. 137 138 ''') 139 foo=input('请选择结:') 140 if foo=='1': 141 infor_list[_user_name]['金额']=name_char#修改用户金额(购物后) 142 opert.shop(shoplist,shop_count,opert.history_user,_user_name,times,infor_list,name_char)#结算函数 143 144 elif foo=='2': 145 while True: 146 card_id=input('请输入卡号:') 147 if transaction.card_list(card_id):#查询卡号函数\ 148 paswd=input('请输入密码:') 149 if transaction.interface(card_id,int(paswd),shop_count):#商城接口函数 150 opert.shop(shoplist,shop_count,opert.history_user,_user_name,times,infor_list,name_char)#结算函数 151 break 152 else: 153 print('卡号不存!请重新输入!') 154 pass 155 else: 156 pass 157 else: 158 print('选择有误!请重新选择') 159 continue 160 161 elif confirm=='N'or confirm== 'n' : 162 break 163 else: 164 print("输入错误!请按提示输入!") 165 continue 166 elif user_index=='h'or user_index=='H': 167 opert.history()#查消费记录 168 elif user_index=='c'or user_index=='C': 169 print("当前购物清单:") 170 for up in shoplist:#打印购物清单 171 print(up) 172 print("总金额:\033[32;1m%s\033[0m"%shop_count) 173 continue 174 else: 175 print('\033[41;1m输入商品编号错误,请重新输入!\033[0m') 176 elif choose=='3': 177 print("您已经出退商城!") 178 exit()#退出商城 179 else: 180 print("\033[31;1m输入有误,请重新输入!\033[0m") 181 continue
![](https://files.cnblogs.com/files/uge3/%E5%BE%AE%E4%BF%A1.bmp)
您的资助是我最大的动力!
金额随意,欢迎来赏!
![](https://files.cnblogs.com/files/uge3/%E6%94%AF%E4%BB%98%E5%AE%9D.bmp)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!
联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/