作业 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. 【xsy1503】 fountain DP

    题目大意:给你$D$个格子,有$n$个喷水器,每个喷水器有一个喷水距离$r_i$. 现在你需要在这$D$个格子中选择$n$个位置按照任意顺序安装这$n$个喷水器,需要满足$n$个喷水器互相喷不到对方. ...

  2. vertical-align_CSS参考手册_web前端开发参考手册系列

    该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐.允许指定负长度值和百分比值.这会使元素降低而不是升高.在表单元格中,这个属性会设置单元格框中的单元格内容的对齐方式. <!DOCTYP ...

  3. 离不开的微服务架构,脱不开的RPC细节

    服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...

  4. Postgresql操作json格式数据

    1.select array_to_json('{{1,5},{99,100}}'::int[])

  5. Linux编程 1 (文件系统路径说明, 目录结构说明)

    一. Linux文件系统路径说明 熟悉windows系统的,都知道文件路径表示,如C:\User\rich\Documnets\test.doc. 在linux中目录称为虚拟目录(virtual di ...

  6. Android_如何将.9的图片转换成bitmap

    //这里也可以是从sd卡上面加载.9图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launc ...

  7. 【随笔】nginx add_header指令的使用

    nginx配置文件通过使用add_header指令来设置response header. 具体方法如下: add_header key value add_header Cache-Control n ...

  8. Java 面试基础总结(一)

    1.九种基本数据类型的大小以及它们的封装类 java提供的九种基本数据类型:boolean.byte(1).char(2).short(2).int(4).long(8).float(4).doubl ...

  9. C语言第八讲,指针*

    C语言第八讲,指针* 一丶简单理解指针 说到指针,很多人都说是C语言的重点. 也说是C语言的难点. 其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型. 为什么这样说. 假设有两个变量,如下 ...

  10. SQL Case when 的使用

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...