作业 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第二十四天-----作业终于完成啦的更多相关文章

  1. Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...

  2. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  3. 软工实践 - 第二十四次作业 Beta 冲刺(2/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10105380.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  4. python第二十四课——set中的函数

    集合中常用的一些函数: 1.add(obj):追加一个obj元素到集合中 pop():从集合中随机弹出一个元素 remove(obj):删除集合中和obj匹配的元素 clear():清空集合 s1={ ...

  5. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  6. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  7. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

  8. 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  9. NeHe OpenGL教程 第二十四课:扩展

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 【sping揭秘】23、Spring框架内的JNDI支持

    JndiTemplate 经过jdbctemplate,transactionTemplate...的洗礼,想必大家看到template就知道是个什么尿性了吧 一样的,我们只需要调用jnditempl ...

  2. python 输出“Hello, world”

    目的:制作第一个项目,输出“Hello, world” 首先查看自己电脑上的python版本号,方法打开cmd输入python 如果提示:不是内部或外部命令,也不是可运行的程序或批处理文件.那么需要设 ...

  3. Log4Net使用详解1

    log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQL Server, Access, Oracle ...

  4. ionic的学习-01搭建App的起步准备

    Part1  搭建App的起步准备(建立项目文件夹,配置开发环境) 第一步 初始化npm npm init 文件夹变化 第二步 使用npm安装git npm install git --save 文件 ...

  5. BGP笔记

    BGP:用于AS与AS之间的路由,但现在也越来越多的用在IDC内部了 BGP是应用层协议,应用TCP协议(唯一一个运用TCP的路由协议) IGP和EGP的区别:IGP运行在一个AS之内,EGP运行在A ...

  6. 微服务学习二:springboot与swagger2的集成

    现在测试都提倡自动化测试,那我们作为后台的开发人员,也得进步下啊,以前用postman来测试后台接口,那个麻烦啊,一个字母输错就导致测试失败,现在swagger的出现可谓是拯救了这些开发人员,便捷之处 ...

  7. LeetCode链表相加-Python<二>

    上一篇:LeetCode两数之和-Python<一> 题目:https://leetcode-cn.com/problems/add-two-numbers/description/ 给定 ...

  8. 转STM32官方固件库简介

    ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库.固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API) .固件库将这些寄 ...

  9. 每个JavaScript工程师都应懂的33个概念

    摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:s ...

  10. 在EXT框架中,使用JS文件设置UEditor文本框,出现新增内容很多,页面变型,不出现滚动条,导致无法进行操作。

    找到UEditor的配置文件:ueditor.config.js(这是我的项目的UEditor的配置文件名) 找到参数设置 autoHeightEnabled 是否自动增长参数,默认为TRUE 当默认 ...