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 #管理员登陆执行文件
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
#管理员登陆
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
#from conf import settings
from core import admin_log#包含目录下的文件脚本
if __name__ == '__main__':
try:
admin_log.loging()#运行主程序
except Exception as e:#出错可返回操作
print("\033[31;1m系统异常,请与管理员联系!\033[0m")
pass
| | |- - -atm.py #用户登陆执行执行文件
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
#from conf import settings
from core import main#包含目录下的文件脚本
if __name__ == '__main__':
try:
main.login()#运行主程序
except Exception as e:#出错可返回操作
print("\033[31;1m系统异常,请与管理员联系!\033[0m")
pass
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -confing.py#配置文件
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
USER_FILE=BASE_DIR+'\db\\user_file.txt'#定义用户列表文件变量
LOCK_NAME=BASE_DIR+'\db\\lock_name.txt'#定义锁定用户列表文件变量 ADMIN_USER=BASE_DIR+'\db\\admin_list'#定义管理员列表文件变量
ADMIN_LOCK=BASE_DIR+'\db\\admin_lock'#定义管理员列表文件变量 DB_CARD=BASE_DIR+'\db\\card'#卡号数据文件
DATA=BASE_DIR+'\db\\db\\'#用户信息文件路径 USER_LOG=BASE_DIR+'\logs\\user_log.log'#用户登陆日志文件
USER_ERRO=BASE_DIR+'\logs\\user_erro.log'#用户错误日志文件
USER_OPERT=BASE_DIR+'\logs\\user_operation.log'#用户操作日志文件 ADMIN_LOG=BASE_DIR+'\logs\\admin_log.log'#管理员登陆日志文件
ADMIN_ERRO=BASE_DIR+'\logs\\admin_erro.log'#管理员错误日志文件
ADMIN_OPERT=BASE_DIR+'\logs\\admin_operation.log'#管理员操作日志文件 #手续费设置
#repay 还款 cash 提现 transfe 转帐 consume 消费
POUNDAGE={
'repay':{'action':'plus', 'interest':0},
'cash':{'action':'minus', 'interest':0.05},
'transfer':{'action':'minus', 'interest':0.05},
'consume':{'action':'minus', 'interest':0},
}
PASSWORD=8888#卡初始密码
PASSWORD_USER='abc'#用户初始密码
#还款日 帐单周期,日配置
TIME_DATA={
'data_all':50,
'data_n':20 }
| |- - -core #主逻辑程序目录 | | |- - -admin_log.py#管理员登陆主要程序
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from core import transaction #包含记账\还钱\取现等所有的与账户金额相关的操作
from core import user_pass #用户名检测相关
from core import log_file #日志检测相关
from core import opertion_admin#管理员操作相关
def loging():#管理员登陆函数
print("Welcome to ATM Management background".center(60,'*'))
admin_name=user_pass.admin_pass()#将通过验证的用户名赋于变量
while True:
print(''' 欢迎使用ATM管理系统
1 >>> 添加帐户. 2 >>> 帐户额度调整.
3 >>> 帐户冻结解冻. 4 >>> 查看用户日志.
5 >>> 退出.
''')
options=input('请按提示操作:')
if options=='':
while True:
card_id=input('按\033[31;1mb/B\033[0m返回<<<< 请输入要发行的卡号:')
if card_id=='b' or card_id=='B':
break
if not transaction.card_list(card_id):#查询卡号函数
print('id:\033[32;1m%s\033[0m.可以发行!'%card_id)
# new_user=input('请输入要添加的帐名:')
opertion_admin.add_user(card_id,admin_name)#添加帐户
else:
print('id:\033[41;1m%s\033[0m.已经发行,请更换其它卡号!'%card_id)
continue elif options=='':
while True:
user_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入调整额度的帐户:')
if user_name=='b' or user_name=='B':
break
if user_name in opertion_admin.user_in():#查看用户列表函数如果存
opertion_admin.Adjust(user_name,admin_name)#调整帐户额度
continue
else:
print('帐户不存在,请重新输入!')
continue
elif options=='':
while True:
print('''操作提示:
1 >>>> 冻结帐户
2 >>>> 帐户解冻
''')
js=input('按\033[31;1mb/B\033[0m返回<<<< 请按操作提示选择:')
if js=='b' or js=='B':
break
if js=='':
user_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入要操作的帐户:')
if user_name=='b' or user_name=='B':
break
if user_name in opertion_admin.user_in():#查看用户列表函数如果存
opertion_admin.freeze(user_name,admin_name)#冻结帐户
continue
elif js=='':
user_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入要操作的帐户:')
if user_name=='b' or user_name=='B':
break
if user_name in opertion_admin.user_in():#查看用户列表函数如果存
opertion_admin.free_(user_name,admin_name)#冻结帐户
continue
else:
continue if user_name in opertion_admin.user_in():#查看用户列表函数如果存
opertion_admin.freeze(user_name,admin_name)#冻结帐户
continue
else:
print('帐户不存在,请重新输入!')
continue
elif options=='':
while True:
print('''输入提示:
用户登陆日志: USER_LOG
用户错误日志: USER_ERRO
用户操作日志: USER_OPERT
''')
log_name=input('按\033[31;1mb/B\033[0m返回<<<< 请输入您要查看的日志:')
if log_name=='b' or log_name=='B':
break
if log_name=='USER_LOG' or log_name=='USER_ERRO'or log_name=='USER_OPERT':
opertion_admin.log_cat(log_name,admin_name)
else:
print('输入有误,请重新输入!')
continue
elif options=='':
exit()
else:
pass
| | |- - -log_file.py#日志相关函数
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
#日志记录相关函数
import os,logging,time
from conf import config def log_file_():#检测文件是否存在
if os.path.exists(config.USER_ERRO):#确认用户错误日志文件是否存在
with open(config.USER_ERRO,'w',encoding='utf-8') as user_history:#创建一个用户错误日志文件
user_history.write('')#写入空值
pass
if os.path.exists(config.USER_OPERT):#确认用户操作日志文件是否存在
with open(config.USER_OPERT,'w',encoding='utf-8') as user_infor:#创建一个用户操作日志文件
user_infor.write('')#写入空值
if os.path.exists(config.USER_LOG):#确认用户登陆日志文件是否存在
with open(config.USER_LOG,'w',encoding='utf-8') as user_infor:#创建一个用户登陆日志文件
user_infor.write('')#写入空值 if os.path.exists(config.ADMIN_ERRO):#确认管理员错误日志文件是否存在
with open(config.ADMIN_ERRO,'w',encoding='utf-8') as user_infor:#创建一个管理员错误日志文件
user_infor.write('')#写入空值
pass
if os.path.exists(config.ADMIN_LOG):#确认管理员登陆日志文件是否存在
with open(config.ADMIN_LOG,'w',encoding='utf-8') as user_infor:#创建一个管理员登陆日志文件
user_infor.write('')#写入空值
pass
if os.path.exists(config.ADMIN_OPERT):#确认管理员操作日志文件是否存在
with open(config.ADMIN_OPERT,'w',encoding='utf-8') as user_infor:#创建一个管理员操作日志文件
user_infor.write('')#写入空值
pass
else: pass def log_err(info_str):#错误日志,传入的错误内容
logger=logging.getLogger('用户登陆错误日志')#设置日志模块
logger.setLevel(logging.DEBUG)
fh=logging.FileHandler(config.USER_ERRO,encoding='utf-8')#写入文件
fh.setLevel(logging.DEBUG)#写入信息的级别
fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
fh.setFormatter(fh_format)#关联格式
logger.addHandler(fh)#添加日志输出模式
logger.warning(info_str)
return 0 def log_log(info_str):#登陆日志,传入内容
logger=logging.getLogger('用户成功登陆日志')#设置日志模块
logger.setLevel(logging.DEBUG)
fh=logging.FileHandler(config.USER_LOG,encoding='utf-8')#写入文件
fh.setLevel(logging.DEBUG)#写入信息的级别
fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
fh.setFormatter(fh_format)#关联格式
logger.addHandler(fh)#添加日志输出模式
logger.warning(info_str)
return 0 def user_opert(info_str):#用户操作日志,传入内容
logger=logging.getLogger('用户操作日志')#设置日志模块
logger.setLevel(logging.CRITICAL)
fh=logging.FileHandler(config.USER_OPERT,encoding='utf-8')#写入文件
fh.setLevel(logging.CRITICAL)#写入信息的级别
fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
fh.setFormatter(fh_format)#关联格式
logger.addHandler(fh)#添加日志输出模式
logger.critical(info_str)
return 0 def admin_log(info_str):#管理员登陆日志,传入内容
logger=logging.getLogger('管理员成功登陆日志')#设置日志模块
logger.setLevel(logging.DEBUG)
fh=logging.FileHandler(config.ADMIN_LOG,encoding='utf-8')#写入文件
fh.setLevel(logging.DEBUG)#写入信息的级别
fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
fh.setFormatter(fh_format)#关联格式
logger.addHandler(fh)#添加日志输出模式
logger.warning(info_str)
return 0 def admin_err(info_str):#管理员错误日志,传入的错误内容
logger=logging.getLogger('管理员登陆错误日志')#设置日志模块
logger.setLevel(logging.DEBUG)
fh=logging.FileHandler(config.ADMIN_ERRO,encoding='utf-8')#写入文件
fh.setLevel(logging.DEBUG)#写入信息的级别
fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
fh.setFormatter(fh_format)#关联格式
logger.addHandler(fh)#添加日志输出模式
logger.warning(info_str)
return 0 def admin_opert(info_str):#管理员操作日志,传入内容
logger=logging.getLogger('管理员操作日志')#设置日志模块
logger.setLevel(logging.CRITICAL)
fh=logging.FileHandler(config.ADMIN_OPERT,encoding='utf-8')#写入文件
fh.setLevel(logging.CRITICAL)#写入信息的级别
fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
fh.setFormatter(fh_format)#关联格式
logger.addHandler(fh)#添加日志输出模式
logger.critical(info_str)
return 0
| | |- - -main.py#用户登陆主要程序
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import os ,sys,time from core import transaction #包含记账\还钱\取现等所有的与账户金额相关的操作
from core import user_pass #用户名检测相关
from core import log_file #日志相关 def login():#开始函数
# time_format='%y-%m-%d %X'#定义时间格式
# times=time.strftime(time_format)#定义时间
print("Welcome to python ATM".center(60,'*'))
while True:
print('''================================================
1 >>>> 用户登陆.
2 >>>> 直接退出.
================================================
''') foo=input('请选择您要的操作:')
if foo=='':
_user_name= user_pass.user_pass()#将通过验证的用户名赋于变量
data=transaction.user_info(_user_name)#调用帐户查询函数
if data['状态']:
print('\033[31;1m对不起您的帐户被冻结,不能进行相关操作,请与客服联系!\033[0m')
continue
print('尊敬的:\033[32;1m%s\033[0m 欢迎登陆'.center(50,'=')%_user_name)
while True:
print(''' 欢迎使用自动ATM柜员机
1 >>> 帐户信息查询. 2 >>> 帐户转帐.
3 >>> 现金提取. 4 >>> 还款.
5 >>> 退出.
''')
options=input('请按提示操作:')
if options=='':
while True:
transaction.info_user(_user_name)##调用帐户查询函数用户操作日志,传入内容
break
elif options=='':
data=transaction.user_info(_user_name)#调用帐户查询函数
print(transaction.info_format(data))#用户信息输出格式化函数
print('欢迎使用自助转帐'.center(60,'='))
card=input('按\033[31;1mq/Q\033[0m返回 输入对方的卡号:')
if card=='q' or card=='Q':
continue
if card.isdigit():#检测输入是否为整数
card=int(card)#转为int
if card==data['id']:
print('\033[41;1m您所输入的卡号是自己卡号,请重新输入!\033[0m')
transaction.transfer(card,_user_name)##调用转帐的函数
continue
else:
print('您的输入不正确,请重新输入!')
pass elif options=='':
while True:
data=transaction.user_info(_user_name)#调用帐户查询函数
print(transaction.info_format(data))#用户信息输出格式化函数
mony=input('按\033[31;1mq/Q\033[0m返回 请输入要提现的金额:')
if mony=='q' or mony=='Q':
break
if mony.isdigit():#检测输入是否为整数
mony=int(mony)#转为int
transaction.cash(mony,_user_name)##调用取现的函数
continue
else:
print('您的输入不正确,请重新输入!')
pass
elif options=='':
while True:
data=transaction.user_info(_user_name)#调用帐户查询函数
print(transaction.info_format(data))#用户信息输出格式化函数
s_mony=data["最高额度"]-data["帐户信用余额"]
print('本期总共需要还款:要\033[31;1m%s\033[0m'%s_mony)
mony=input('按\033[31;1mq/Q\033[0m返回,请输入要还款的金额:')
if mony=='q' or mony=='Q':
break
if mony.isdigit():#检测输入是否为整数
mony=int(mony)#转为int
transaction.also_money(mony,s_mony,_user_name,data)#还款函数
pass
else:
print('您的输入不正确,请重新输入!')
pass elif options=='':
exit()
else:
continue elif foo=='':
exit()
else:
print('请按提示操作!')
pass
| | |- - -opertion_admin.py#用户登陆操作相关函数
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
#管理员操作相关函数
import json,time
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from core import transaction#包含记账\还钱\取现等所有的与账户金额相关的操作
from conf import config#配置文件
from core import log_file#日志文件
time_format='%d'#定义时间格式
time_format2='%Y-%m-%d'#定义时间格式
times=time.strftime(time_format)#定义时间
#查看用户列表函数
def user_in():#查看用户列表函数
with open(config.USER_FILE,'r',encoding='utf-8') as f:
user_l=eval(f.readline())
return user_l
#各种日期计算函数
def data_l(yesr_):#各种日期计算函数
data1=time.time()#当前日期开卡日
data2=data1+config.TIME_DATA['data_all']*3600*24#帐单日 开卡日加上帐单周期
data3=data2+config.TIME_DATA['data_n']*3600*24#还款日
data4=data1+yesr_*3600*24*365#有效期
data_1=time.strftime(time_format2,time.gmtime(data1))#开卡日
data_2=time.strftime(time_format,time.gmtime(data2))#帐单日
data_3=time.strftime(time_format,time.gmtime(data3))#还款日
data_4=time.strftime(time_format2,time.gmtime(data4))#有效期
return data_1,int(data_2),int(data_3),data_4 #添加帐户
def add_user(card_id,admin_name):#添加帐户
while True:
new_user=input('请输入要添加的帐名:')
if new_user in user_in():#如果用户名存在
print('帐户已经存在,请重新输入!')
continue
h_=input('请输入最高额度:')
yesr_=input('请输入年限')
data_list=data_l(int(yesr_))#计算各种日期
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}
info_=transaction.info_format_adm(user_info_l,new_user,config.PASSWORD_USER)#用户信息输出格式化函数
print(info_)
q=input('是否确定添加帐户: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
transaction.accounting(new_user,user_info_l)#记账函数,写入数据
with open(config.USER_FILE,'r+',encoding='utf-8') as f:
user_list=eval(f.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表
user_list[new_user]=config.PASSWORD_USER#增加注册用户到字典中
f.seek(0)#称到最前
f.write(str(user_list))#写入文件f
f.flush()#即可保存
info_str='管理员:%s.进行了帐户添加,帐户名:%s.'%(admin_name,new_user)
log_file.admin_opert(info_str)#管理员操作日志,传入内容
return 0
else:
pass #冻结帐户
def freeze(_user_name,admin_name):#冻结帐户
data=transaction.user_info(_user_name)#帐户信息函数
if data["状态"]==1:
print('当前帐户已经冻结!')
return
info_=transaction.info_format(data)#用户信息输出格式化函数
print(info_)
q=input('是否确定冻结帐户: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
data["状态"]=1
transaction.accounting(_user_name,data,)#记账函数,写入数据
print('帐户冻结完成!')
info_str='管理员:%s.对帐户:%s.进行了冻结!'%(admin_name,_user_name)
log_file.admin_opert(info_str)#管理员操作日志,传入内容
return
else:
return pass #解冻帐户
def free_(_user_name,admin_name):#冻结帐户
data=transaction.user_info(_user_name)#帐户信息函数
if data["状态"]==0:
print('当前帐户已经解冻!')
return
info_=transaction.info_format(data)#用户信息输出格式化函数
print(info_)
q=input('是否确定解冻帐户: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
data["状态"]=0
transaction.accounting(_user_name,data,)#记账函数,写入数据
print('帐户解冻完成!')
info_str='管理员:%s.对帐户:%s.进行了解冻!'%(admin_name,_user_name)
log_file.admin_opert(info_str)#管理员操作日志,传入内容
return
else:
return pass #调整帐户额度
def Adjust(_user_name,admin_name):#调整帐户额度
data=transaction.user_info(_user_name)#帐户信息函数
info_=transaction.info_format(data)#用户信息输出格式化函数
print(info_)
mony=input('请输入调整的额度:') if mony.isdigit():#检测输入是否为整数
mony=int(mony)#转为int
while True:
upd=input('请确定调整方向: u/U 向上, d/D 向下:')
if upd=='u' or upd=='U':
monyall=data["最高额度"]+mony
mony_r=data["帐户信用余额"]+mony
pass
elif upd=='d' or upd=='D':
monyall=data["最高额度"]-mony
mony_r=data["帐户信用余额"]-mony
pass
else:
print('输入有误,请重新输入!')
continue
data["最高额度"]=monyall
data["帐户信用余额"]=mony_r
print('调整后的帐户信息')
info_l=transaction.info_format(data)#用户信息输出格式化函数
print(info_l)
q=input('是否确定调整额度: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
transaction.accounting(_user_name,data,)#记账函数,写入数据
print('帐户调整额度成功!')
info_str='管理员:%s.对帐户:%s.进行了额度调整!'%(admin_name,_user_name)
log_file.admin_opert(info_str)#管理员操作日志,传入内容
return
else:
return else:
print('输入有误,请重新输入!')
pass #管理员查看用户日志 # USER_LOG=BASE_DIR+'\logs\\user_log.log'#用户登陆日志文件
# USER_ERRO=BASE_DIR+'\logs\\user_erro.log'#用户错误日志文件
# USER_OPERT=BASE_DIR+'\logs\\user_operation.log'#用户操作日志文件 def log_cat(log_name,admin_name):#管理员查看用户日志
if log_name=='USER_LOG':
with open(config.USER_LOG,'r',encoding='utf-8') as f:
for line in f :
print(line)
info_str='管理员:%s.查看了用户登陆日志!'%admin_name
log_file.admin_opert(info_str)#管理员操作日志,传入内容
elif log_name=='USER_ERRO':
with open(config.USER_ERRO,'r',encoding='utf-8') as f:
for line in f :
print(line)
info_str='管理员:%s.查看了用户错误日志!'%admin_name
log_file.admin_opert(info_str)#管理员操作日志,传入内容
elif log_name=='USER_OPERT':
with open(config.USER_OPERT,'r',encoding='utf-8') as f:
for line in f :
print(line)
info_str='管理员:%s.查看了用户操作日志!'%admin_name
log_file.admin_opert(info_str)#管理员操作日志,传入内容
else:
return
| | |- - -transaction.py#用户操作相关函数
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
#记账\还钱\取现等所有的与账户金额相关的操作
import json,time
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from conf import config# 引入配置文件
from core import user_pass# 引入检测文件
from core import log_file
time_format='%y-%m-%d %X'#定义时间格式
times=time.strftime(time_format)#定义时间
#记账函数,写入数据
def accounting(_user_name,data,**kwargs):#记账函数,写入数据
#db['帐户信用余额']=db['帐户信用余额']-monyall
name_file=config.DATA+_user_name+'.json'#格式化拼接文件名
with open(name_file,'w',encoding='utf-8') as f:
json.dump(data,f)#写入文件
f.flush()
pass
#还款函数
def also_money(mony,s_mony,_user_name,data):#还款函数
data=user_info(_user_name)#调用帐户信息查询函数
print('''您的帐户目前余额:{mony_old}
本期应还金额:{s_mony}
还款现金:{mony}
还款后帐户余额:{mony_new}
'''.format(mony_old=data['帐户信用余额'],s_mony=s_mony,mony=mony,mony_new=data['帐户信用余额']+mony))
q=input('是否确定还款:\033[32;1m%s\033[0m元: \033[31;1mY/y\033[0m 确定! 其它键返回:'%mony)
if q=='y' or q=='Y':
data['帐户信用余额']=data['帐户信用余额']+mony#计算信用余额
accounting(_user_name,data)#调用记帐函数
info_str='%s进行还款操作,还款金额:%s!'%(_user_name,mony)
log_file.user_opert(info_str)#用户操作日志,传入内容
print('成功还款:\033[32;1m%s\033[0m元.'%mony)
else:
pass #取现函数
def cash(mony,_user_name):#取现函数
data=user_info(_user_name)#调用帐户信息查询函数
mony_f=mony*config.POUNDAGE['cash'][ 'interest']#手续费
monyall=mony+mony_f#金额加上手续费
if monyall>data['帐户信用余额']/2:
print('对不起你的余额不足')
pass
else:
print('''您的帐户目前余额:{mony_old}
您提取的现金:{mony}
手续费用:{mony_f}
总共需消费额度:{monyall}
取现后帐户余额:{mony_new}
'''.format(mony_old=data['帐户信用余额'],mony=mony,mony_f=mony_f,monyall=monyall,mony_new=data['帐户信用余额']-monyall))
q=input('是否确定提取现金: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
data['帐户信用余额']=data['帐户信用余额']-monyall#计算信用余额
accounting(_user_name,data)#调用记帐函数
info_str='%s进行提现操作,提现金额:%s,手续费:%s,总共消费%s!'%(_user_name,mony,mony_f,monyall)
log_file.user_opert(info_str)#用户操作日志,传入内容
print('请拿好您的现金!')
return
else:
pass #转帐函数
def transfer(card,_user_name):#转帐函数
data=user_info(_user_name)#调用帐户信息查询函数
if card_list(str(card)):#查询卡号函数
user_card=card_list(str(card))
print('您输入要转帐的卡号:\033[32;1m%s\033[0m. 帐户名:\033[32;1m%s\033[0m'%(card,user_card))
while True:
mony=input('按\033[31;1mB/b\033[0m退回主界面<<<< 请输入要转帐的金额:')
if mony=='b' or mony=='B':
break
elif mony.isdigit():#检测输入是否为整数
mony=int(mony)#转为int
mony_f=mony*config.POUNDAGE['transfer'][ 'interest']#手续费
monyall=mony+mony_f#金额加上手续费
print('''您的帐户目前余额:{mony_old}
您要转帐的金额:{mony}
手续费用:{mony_f}
总共需消费额度:{monyall}
转帐后帐户余额:{mony_new}
'''.format(mony_old=data['帐户信用余额'],mony=mony,mony_f=mony_f,monyall=monyall,mony_new=data['帐户信用余额']-monyall))
q=input('是否确定转帐: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
data['帐户信用余额']=data['帐户信用余额']-monyall#计算信用余额
accounting(_user_name,data)#调用记帐函数,写入数据
data_u=user_info(user_card)#帐户信息查询函数 ,对方帐户
data_u['帐户信用余额']=data_u['帐户信用余额']+mony#计算信用余额
accounting(user_card,data_u)#调用记帐函数,写入对方帐户数据
info_str='%s进行转帐操作,转帐金额:%s,手续费:%s,总共消费%s;对方卡号:%s,帐户名:%s'%(_user_name,mony,mony_f,monyall,card,user_card)
log_file.user_opert(info_str)#用户操作日志,传入内容
print('\033[31;1m转帐成功!\033[0m'.center(50,'='))
return
else:
print('您的输入不正确,请重新输入!')
pass
else:
pass
else:
print('\033[41;1m您所输入的卡号不存在!请重新输入!\033[0m') #商城接口函数
def interface(card_id,paswd,mony):#商城接口函数
card_name=card_list(card_id)#返回卡号所对应的用户
data=user_info(card_name)#帐户信息函数
if data["状态"]==1:
print('当前帐户被冻结!请更换帐户!')
return 0
if paswd==data["password"]:
print('卡号和密码均通过验证!')
#mony=int(mony)#转为int
mony_f=mony*config.POUNDAGE['consume'][ 'interest']#手续费
monyall=mony+mony_f#金额加上手续费
print('本次消费总金额:%s元.'%monyall)
q=input('是否确定支付: \033[31;1mY/y\033[0m 确定! 其它键返回')
if q=='y' or q=='Y':
data["帐户信用余额"]-monyall
accounting(card_name,data)#调用记帐函数,写入数据
info_str='卡号:%s,帐户名:%s,通过商城消费金额:%s元.'%(card_id,card_name,monyall)
log_file.user_opert(info_str)#用户操作日志,传入内容
return 1
else:
return 0
else:
print('密码错误,请重新输入!')
return 0 #帐户信息函数
def user_info(_user_name):#帐户信息函数
name_file=config.DATA+_user_name+'.json'#格式化拼接文件名
with open(name_file,'r',encoding='utf-8') as f:
data=json.load(f)
return data
#帐户信息查询函数,日志记录
def info_user(_user_name):#帐户信息查询函数,日志记录
data=user_info(_user_name)
print(info_format(data))#用户信息输出格式化函数
info_str='%s进行查询操作!'%(_user_name)
log_file.user_opert(info_str)#用户操作日志,传入内容
return 0
#用户信息输出格式化函数
def info_format(data):#用户信息输出格式化函数
data_format='''============帐户信息===========
信用余额:{mony_old}
开卡日期:{date_r}
有效期限:{date_l}
最高额度:{mony_h}
还款日期:{day_n}
帐单日:{day_m}
'''.format(mony_old=data["帐户信用余额"],date_r=data["开卡日期"],date_l=data["有效期限"],mony_h=data['最高额度'],day_n=data["还款日期"],day_m=data["帐单日"])
return data_format
#查询卡号函数
def card_list(card):#查询卡号函数
with open(config.DB_CARD,'r',encoding='utf-8') as f:
card_l=eval(f.readline())#读取卡列表
if card in card_l:
return card_l[card]#返回卡号所对应的用户
else:
#print('您所输入的卡号不存在')
return False #管理员信息提示输出格式化函数
def info_format_adm(data,name,PASSWORD_USER):#管理员信息提示输出格式化函数
data_format='''======您要添加帐户信息
帐户名:{name}
信用余额:{mony_old}
开卡日期:{date_r}
有效期限:{date_l}
最高额度:{mony_h}
还款日期:{day_n}
帐单日:{day_m}
卡初始密码:{pas}
用户初始密码:{password}
'''.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)
return data_format
| | |- - -user_pass.py#用户\用户登陆登陆相关函数
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
#用户名检测相关
from conf import config# 引入配置文件
from core import log_file#引入日志相关函数 #装饰器
def certi(model):#装饰器
def outr(fun):#装饰器加参数需要多加一层嵌套
def login(*args,**kwargs):#为了兼容各类函数参数,添加 *args,**kwargs 不固定参数
if model=='password':
print('正在通过password认证')
#user_name = input('用户名:').strip()
# paswd=input('密码:').strip()
# if user_name==name and paswd==password:
# print('通过认证')
return fun(*args,**kwargs)
# else:
# print('用户或密码错误 ,退出')
exit()
elif model=='lamp':
print('正在通过lamp认证')
return fun(*args,**kwargs)
else:
print('认证出错')
return login
return outr #检测用户名的函数
def userchar(_user_name,user_list,lock_list,user_file):#检测用户名的函数
while True:
if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
return True#存在返回真
elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定
print('您的用户已经被锁定,请联系管理员解锁!')
reg=input('按\033[31;1m Q/q\033[0m 直接退出,其它键返回!')
if reg=='q' or reg=='Q':
print("您已经退出!" )
exit()
else:
break
else:
reg=input('您输入用户不存在,请先联系银行注册!按\033[31;1m Q/q\033[0m 直接退出 ,其它键返回!')
if reg=='q' or reg=='Q':
print("您已经退出!" )
exit()
else :
break #退出确认函数
def confirm():#退出确认函数
qu=input("是否退出!按\033[31;1mY/y\033[0m退出? 按其它键返回<<<")
if qu=='Y'or qu=='y':
print("您已经退出!" )
exit()#退出程序
else :
pass
#用户名输入函数
@certi(model='password')
def user_pass():#用户名输入函数
user_file=open(config.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件
user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表
lock_name=open(config.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件
lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
bool=True#定义退出循环条件变量
while bool:
print("用户登陆".center(30,'-'))
_user_name=(input('请输入用户名:'))
if userchar(_user_name.strip(),user_list,lock_list,user_file):#运行检测用户名的函数判断,去除两边空格
count=3#定义锁次数
while count>0 :#如果密码错误次数超过退出密码输入
#password=getpass.getpass('请输入密码:')
password=input('请输入密码:')
if password==user_list[_user_name]:#密码通过验证结束循环
print("密码通过验证")
bool=False
#print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name)
info_str='用户:%s,登陆成功!'%_user_name
log_file.log_log(info_str)#调用用户登陆日志
return _user_name#返回用户名
else:
count -=1#次数减少 print("密码错误请重试,剩余:\033[31;1m%s\033[0m次! "% count)
info_str="用户:%s,密码错误剩余:%s"%(_user_name,count)
log_file.log_err(info_str)#调用用户错误日志
pass
else:
print("\033[31;1m超出所试次数,账户已锁定!请联系商家!\033[0m")
lock_list.append(_user_name)#将用户名加出锁定列表
lock_name.seek(0)#指针移动到开头,以免产生多个元组
lock_name.write(str(lock_list))#写入锁定用户文件
lock_name.tell()#获取当前指针,以免产生多个元组
lock_name.close()#关闭锁定用户文件
confirm()#退出确认函数
else:#如果用户名出错新来过
pass #检测管理员用户名的函数
def admin_char(_user_name,user_list,lock_list,user_file):#检测管理员用户名的函数
while True:
if _user_name in user_list and _user_name not in lock_list :#判断用户是否存在并正常
return True#存在返回真
elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定
print('该管理员已经被锁定,请联系其上级!')
reg=input('按\033[31;1m Q/q\033[0m 直接退出,其它键返回!')
if reg=='q' or reg=='Q':
print("您已经退出!" )
exit()
else:
return 100
else:
return False #管理员输入函数
@certi(model='lamp')
def admin_pass():#管理员输入函数
user_file=open(config.ADMIN_USER,'r+',encoding='utf-8')#打开用户列表文件
user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表
lock_name=open(config.ADMIN_LOCK,'r+',encoding='utf-8')#打开锁定用户列表文件
lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
bool=True#定义退出循环条件变量
count=0
while bool:
print("管理员登陆".center(30,'-'))
_user_name=(input('请输入管理员用户名:'))
int_s=admin_char(_user_name.strip(),user_list,lock_list,user_file)#运行检测用户名的函数判断,去除两边空格
if int_s==100:
continue
if int_s:
while count<=5:
password=input('请输入密码:')
if password==user_list[_user_name]:#密码通过验证结束循环
print("密码通过验证")
bool=False
#print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name)
info_str='管理员:%s,登陆成功!'%_user_name
log_file.admin_log(info_str)#调用管理员登陆日志
return _user_name#返回用户名
else:
count+=1
print("\033[31;1m密码错误请重试,错误次数:%s\033[0m!"%count)
info_str="用户:%s,密码错误剩余:%s"%(_user_name,count)
log_file.admin_err(info_str)#调用管理员错误日志
if count==5:
print("\033[31;1m超出最大密码错误请重试次数!当前管理员用户已被锁定\033[0m! ")
lock_list.append(_user_name)#将用户名加出锁定列表
lock_name.seek(0)#指针移动到开头,以免产生多个元组
lock_name.write(str(lock_list))#写入锁定用户文件
lock_name.tell()#获取当前指针,以免产生多个元组
lock_name.close()#关闭锁定用户文件
confirm()#退出确认函数
break else:#如果用户名出错重新来过
print("您输入管理员不存在!请重新输入!")
| |- - -db/#用户数据目录
|- - -shopping/#商城程序目录
| |- - -__init__.py
| |- - -README
| |- - -bin/#执行目录
| | |- - -__init__.py
| | |- - -shop.py#商城用户登陆执行执行文件
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan # import time,sys,os
# BASE_DIR1=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
# sys.path.append(BASE_DIR1)#增加环境变量 import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
#print(BASE_DIR)
# print(os.path.exists(BASE_DIR+'\shopping\\core'))
# BASE_DIR_S=BASE_DIR+'\shopping\\core\\'
# print(BASE_DIR_S)
# #from conf import settings
# print(os.path.dirname('shopping'))
from shopping.core import shopping#包含目录下的文件脚本 if __name__ == '__main__':
#程序开始:
shopping.main()
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -config.py#配置文件
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
#print(BASE_DIR) #print(DB)
USER_FILE=BASE_DIR+'\shopping\\db\\user_file.txt'#定义用户列表文件变量 FILE_CORE=BASE_DIR+'\atm\\core'#接口函数
LOCK_NAME=BASE_DIR+'\shopping\\db\\lock_name.txt'#定义锁定用户列表文件变量 USER_INFOR=BASE_DIR+'\shopping\\db\\user_infor'#定义用户信息文件变量
HISTORY=BASE_DIR+'\shopping\\db\\history'#定义用户消费记文件变量 GOODSLIST=BASE_DIR+'\shopping\\db\\goodslist.txt'#定义用户消费记文件变量
| |- - -core/##主逻辑程序目录
| | |- - -opert.py#主逻辑函数相关
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
#相关函数
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from shopping.conf import config
from atm.core import transaction #结算函数
def shop(shoplist,shop_count,history_user,_user_name,times,infor_list,name_char):#结算函数
shoplist.append(('总额:',shop_count))#列表加入总额
history_list=history_user()#用户消费记录函数
history_list[_user_name][times+'购物清单:']=shoplist#添加时间:清单
with open(config.USER_INFOR,'w',encoding="utf-8") as user_infor:#写入文件用户信息
user_infor.seek(0)#移到最前
user_infor.write(str(infor_list))#写入
with open(config.HISTORY,'r+',encoding='utf-8') as user_history:#购物信息写入文件
user_history.seek(0)#移到最前
user_history.write(str(history_list))#写入
print("你的购物金额余: \033[31;1m%s\033[0m 元!" % name_char)
exit(print("谢谢!\033[31;1mpython\033[0m 商城欢迎您再次光临!")) def regis(user_list,user_file):#用户注册函数
while True:
name=input("按\033[31;1mb/B返回\033[0m \033[31;1mq/Q\033[0m直接退出 请输入您要注册的用户名:")
if name=='b' or name=='B':
break
elif name=='q' or name=='Q':
confirm()
elif name not in user_list:
print("恭喜!该用户名可以被注册!>>>")
password=input('请输入密码:')
password2=input('请再次确认密码:')
if password==password2:
name_infor='''恭喜您用户注册成功!
用户名:{name}
密 码:{password}
请牢记您的用户名与密码
'''
print(name_infor.format(name=name,password=password2))
user_list[name]=password2#增加注册用户到字典中
user_file.seek(0)#称到最前
user_file.write(str(user_list))#写入文件
user_file.flush()#即可保存
#break
continue
else:
print("该用户名已经被注册啦!请重新来过<<<")
confirm()#是否退出
continue def userchar(_user_name,user_list,lock_list,user_file):#检测用户名的函数
while True:
if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
return True#存在返回真
elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定
print('您的用户已经被锁定,请联系商家解锁!')
reg=input('按\033[31;1m Q/q\033[0m 直接退出,其它键返回!')
if reg=='q' or reg=='Q':
print("您已经退出!" )
exit()
else:
break
else:
reg=input('您输入用户不存在,请先注册!按\033[31;1m Q/q\033[0m 直接退出 \033[31;1m Y/y\033[0m 确定注册,其它键返回!')
if reg=='y' or reg=='Y':
regis(user_list,user_file)#用户注册函数
#print('是否直接退出商城?')
break
elif reg=='q' or reg=='Q':
print("您已经退出!" )
exit()
else :
break def confirm():#退出确认函数
qu=input("是否退出!按\033[31;1mY/y\033[0m退出? 按其它键返回<<<")
if qu=='Y'or qu=='y':
print("您已经退出!" )
exit()#退出程序
else :
pass def user_pass(user_list,lock_list,lock_name,user_file):
bool=True#定义退出循环条件变量
while bool:
print("用户登陆".center(30,'-'))
_user_name=(input('请输入用户名:'))
if userchar(_user_name.strip(),user_list,lock_list,user_file):#运行检测用户名的函数判断,去除两边空格
count=3#定义锁次数
while count>0 :#如果密码错误次数超过退出密码输入
#password=getpass.getpass('请输入密码:')
password=input('请输入密码:')
if password==user_list[_user_name]:#密码通过验证结束循环
print("密码通过验证")
bool=False
print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name)
return _user_name#返回用户名
else:
count -=1#次数减少
print("密码错误请重试,剩余:\033[31;1m%s\033[0m次! "% count)
pass
else:
print("\033[31;1m超出所试次数,账户已锁定!请联系商家!\033[0m")
lock_list.append(_user_name)#将用户名加出锁定列表
lock_name.seek(0)#指针移动到开头,以免产生多个元组
lock_name.write(str(lock_list))#写入锁定用户文件
lock_name.tell()#获取当前指针,以免产生多个元组
lock_name.close()#关闭锁定用户文件
confirm()#退出确认函数
else:#如果用户名出错新来过
pass def infor():#打开用户信息函数
with open(config.USER_INFOR,'r+',encoding='utf-8') as user_infor:#打开用户购物信息文件
infor_list=eval(user_infor.readline())#转换文件的字符串
return infor_list def history_user():#用户购物历史记录函数
with open(config.HISTORY,'r',encoding="utf-8") as user_history:#读取用户文件
history_list=eval(user_history.readline())#用户购物信息
return history_list def history(_user_name):#用户消费记录函数
history_list=history_user()#用户购物历史记录
history=history_list[_user_name]#用户购物记录信息
print('您的购物记录如下:')
for k,v in history.items():#转为列表进行输出
print(k,v)#输出购物记录
choose_index=input("请选择您想要的操作:按\033[32;1mq/Q\033[0m直接退出商城!其它键返回!")
if choose_index=='Q' or choose_index=='q' :
choo=input('''>>>>>\033[42;1m您确定出退商城吗?\033[0m
如果您已经添加商品,此操作将不进行结算,
您就无法将心爱的东东买回家了,按\033[31;1my/Y\033[0m确定直接退出!''')
if choo=='y'or choo=='Y':
print("您已经出退商城!")
exit()
else:
pass
else:
pass
| | |- - -shopping.py#商城主程序
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan
import time,sys,os
import os ,sys
# BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
# sys.path.append(BASE_DIR)#增加环境变量
# print(BASE_DIR)
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from shopping.conf import config
from shopping.core import opert
from atm.core import transaction # user_file=open(cfg1.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件
# #with open('user_file.txt','r+',encoding='utf-8') as user_file:
# admin_user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表
# lock_name=open(cfg1.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件
# lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 # #程序开始:
def main():
user_file=open(config.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件
#with open('user_file.txt','r+',encoding='utf-8') as user_file:
user_list=eval(user_file.readline())#转换用户文件中的字符串 admin_user_list:注册用户列表
lock_name=open(config.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件
lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 if os.path.exists(config.HISTORY):#确认文件是否存在
pass
else:
with open(config.HISTORY,'w',encoding='utf-8') as user_history:#创建一个用户帐户购物记录文件
user_history.write('{}')#写入空值
pass
if os.path.exists(config.USER_INFOR):#确认文件是否存在
pass
else:
with open(config.USER_INFOR,'w',encoding='utf-8') as user_infor:#创建一个用户帐户信息记录文件
user_infor.write('{}')#写入空值
pass print("欢迎来到\033[31;1mpython\033[0m购物商城!") time_format='%y-%m-%d %X'#定义时间格式
times=time.strftime(time_format)#定义时间
_user_name= opert.user_pass(user_list,lock_list,lock_name,user_file)#将通过验证的用户名赋于变量 if _user_name in opert.infor():#如果用户信息存在记录就跳过
pass
else:
while True:
name_char=input("首次登陆,请输入工资(购物资金):")#用户输入工资(购物资金)
if name_char.isdigit():#检测输入是否为整数
name_char=int(name_char)#转为int
with open(config.HISTORY,'r+',encoding='utf-8') as user_history:#打开用户帐户购物记录文件
history_list=eval(user_history.readline())#将文本读为字典
history_list[_user_name]={}#创建用户购物记录
user_history.seek(0)#移到开头
user_history.write(str(history_list))#写入文件
with open(config.USER_INFOR,'r+',encoding='utf-8') as user_infor:
infor_list=eval(user_infor.readline())#转换首登用户文件中的字符串
infor_list[_user_name]={"金额":name_char}
user_infor.seek(0)
user_infor.write(str(infor_list))#写入用户信息
print("充值成功,充值金额:\033[32;1m%s\033[0m元."% name_char)
break
else:
print('金额不能为0或负数请正确输入金额!')
continue
#再次登陆直接显示用户信息
infor_list=opert.infor()#使用用户信息函数 获取用户信息字典
name_char=int(infor_list[_user_name]['金额'])#获取余额
print("\n您的帐户信息:")
print('用户名:\033[32;1m%s\033[0m:'%_user_name)#输出用户信息
print('您的余额:\033[31;1m%s\033[0m元.:'%name_char) while True:
print('''您可以进行以下相关操作:\n
按 1 >>>查询购物记录。
按 2 >>>显示商品列表开始购物!
按 3 >>>直接出退商城!
''')
choose=input("请选择您所要的功能:")#请用户可以查询
if choose=='':
opert.history(_user_name)#查询消费记录
elif choose=='':
###进入商品列表###
shoplist=[]#购物车列表
shop_count=0#购物金额统计
goodsname=[]#定义商品列表
print('加载商品列表:')
for i in range(40):#加载动画
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.05)
print('\n')
with open(config.GOODSLIST,'r',encoding='utf-8') as f:#打开商品列表文件
for line in f:
a=line.find(',')#定位分割符的索引进行分割
goodsname.append((line[0:a],int(line[a+1:])))#元组模式追加到列表,价格转为整数
while True:
print("商品列表".center(50,'='))
for index,p_item in enumerate(goodsname):#取出下标输出 商品列表
print(index,p_item)#输出商品列表
print("列表底部".center(50,'='))
user_index=input('请输入商品编号添加你所在购买的商品,按\033[31;1mc/C\033[0m>> 查看当前购物清单, \033[31;1mh/H\033[0m查看消费记录 \033[31;1mq/Q\033[0m结算商品退出>>>:')
if user_index.isdigit():#判断是否为整数
user_index=int(user_index)#转为数字
if user_index < len(goodsname) and user_index>=0:#判断所选商品编号在在列表
p_item=goodsname[user_index]#读取下标所在(元素)商品
if p_item[1]<=name_char:#余额是否足够
shoplist.append(p_item)#添加到购物车
name_char-=p_item[1]#扣除金额
shop_count+=p_item[1]#累加购物金额
print("添加 \033[32;1m%s\033[0m 到购物车,价格: \033[32;1m%s\033[0m 元"% p_item)
print("你的购物金额余: \033[31;1m%s\033[0m 元"% name_char)
else:
print("你的购物金额余: \033[41;1m%s\033[0m 元,无法购买该商品!" % name_char)
else:
print('输入错误,该编号 \033[41;1m%s\033[0m 的商品不存在!'%user_index)
elif user_index=='q'or user_index=='Q':
print('你的购物清单:')
for up in shoplist:#打印购物清单
print(up)
print("你的购物总金额为:\033[32;1m%s\033[0m 元!"% shop_count)
#print("你的购物金额余: \033[31;1m%s\033[0m 元!" % name_char)
while True:
confirm=input("你是否确定结算商品并退出商城?\033[31;1m Y/y\033[0m是, \033[31;1mN/n\033[0m否:")
if confirm== 'Y'or confirm== 'y' :
print('''请选择结算方式:
1 >>> 帐户余额结算.
2 >>> 信用卡结算. ''')
foo=input('请选择结:')
if foo=='':
infor_list[_user_name]['金额']=name_char#修改用户金额(购物后)
opert.shop(shoplist,shop_count,opert.history_user,_user_name,times,infor_list,name_char)#结算函数 elif foo=='':
while True:
card_id=input('请输入卡号:')
if transaction.card_list(card_id):#查询卡号函数\
paswd=input('请输入密码:')
if transaction.interface(card_id,int(paswd),shop_count):#商城接口函数
opert.shop(shoplist,shop_count,opert.history_user,_user_name,times,infor_list,name_char)#结算函数
break
else:
print('卡号不存!请重新输入!')
pass
else:
pass
else:
print('选择有误!请重新选择')
continue elif confirm=='N'or confirm== 'n' :
break
else:
print("输入错误!请按提示输入!")
continue
elif user_index=='h'or user_index=='H':
opert.history()#查消费记录
elif user_index=='c'or user_index=='C':
print("当前购物清单:")
for up in shoplist:#打印购物清单
print(up)
print("总金额:\033[32;1m%s\033[0m"%shop_count)
continue
else:
print('\033[41;1m输入商品编号错误,请重新输入!\033[0m')
elif choose=='':
print("您已经出退商城!")
exit()#退出商城
else:
print("\033[31;1m输入有误,请重新输入!\033[0m")
continue
python第二十四天-----作业终于完成啦的更多相关文章
- Python第二十四天 binascii模块
Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...
- 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘
孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...
- 软工实践 - 第二十四次作业 Beta 冲刺(2/7)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10105380.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...
- python第二十四课——set中的函数
集合中常用的一些函数: 1.add(obj):追加一个obj元素到集合中 pop():从集合中随机弹出一个元素 remove(obj):删除集合中和obj匹配的元素 clear():清空集合 s1={ ...
- 初学 Python(十四)——生成器
初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...
- 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式
孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...
- NeHe OpenGL教程 第二十四课:扩展
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- 【xsy1503】 fountain DP
题目大意:给你$D$个格子,有$n$个喷水器,每个喷水器有一个喷水距离$r_i$. 现在你需要在这$D$个格子中选择$n$个位置按照任意顺序安装这$n$个喷水器,需要满足$n$个喷水器互相喷不到对方. ...
- vertical-align_CSS参考手册_web前端开发参考手册系列
该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐.允许指定负长度值和百分比值.这会使元素降低而不是升高.在表单元格中,这个属性会设置单元格框中的单元格内容的对齐方式. <!DOCTYP ...
- 离不开的微服务架构,脱不开的RPC细节
服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...
- Postgresql操作json格式数据
1.select array_to_json('{{1,5},{99,100}}'::int[])
- Linux编程 1 (文件系统路径说明, 目录结构说明)
一. Linux文件系统路径说明 熟悉windows系统的,都知道文件路径表示,如C:\User\rich\Documnets\test.doc. 在linux中目录称为虚拟目录(virtual di ...
- Android_如何将.9的图片转换成bitmap
//这里也可以是从sd卡上面加载.9图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launc ...
- 【随笔】nginx add_header指令的使用
nginx配置文件通过使用add_header指令来设置response header. 具体方法如下: add_header key value add_header Cache-Control n ...
- Java 面试基础总结(一)
1.九种基本数据类型的大小以及它们的封装类 java提供的九种基本数据类型:boolean.byte(1).char(2).short(2).int(4).long(8).float(4).doubl ...
- C语言第八讲,指针*
C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型. 为什么这样说. 假设有两个变量,如下 ...
- SQL Case when 的使用
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...