标签:dir 注意 import 选择 abs 指定 序号 enc range
写了一天,感觉人要渣。。收获蛮多,但也有不少BUG,先放上来,日后继续学习完善。。。。
"""
功能:
1.用户注册,提示用户输入用户名和密码,然后获取当前注册时间,最后将用户名、密码、注册时间写入到文件。
2.用户登录,只有三次错误机会,一旦错误则冻结账户(下次启动也无法登录,提示:用户已经冻结)。
3.商品浏览,分页显示商品(小文件); 用户可以选择商品且可以选择数量然后加入购物车(在全局变量操作),
不再购买之后,需要讲购物车信息写入到文件,文件要写入到指定目录:
shopping_car(文件夹)
- 用户名A(文件夹)
2019-11-11-09-59.txt
2019-11-12-11-56.txt
2019-12-11-11-47.txt
- 用户B(文件夹)
2019-11-11-11-11.txt
2019-11-12-11-15.txt
2019-12-11-11-22.txt
注意:重复购买同一件商品时,只更改购物车中的数量。
4.我的购物车,查看用户所有的购物车记录,即:找到shopping_car目录下当前用户所有的购买信息,并显示:
2019-11-11-09-59
飞机|1000|10个
大炮|2000|3个
2019-11-12-11-56.txt
迫击炮|10000|10个
手枪|123|3个
5.用户未登录的情况下,如果访问 商品流程 、我的购物车 时,提示登录之后才能访问,让用户先去选择登录(装饰器实现)。
"""
from datetime import datetime
import os,sys
def shoop_warp(func):
def inner(*args,**kwargs):
if not SUSS_USER:
print(‘请先登陆‘)
return
func(*args,**kwargs)
return inner
#装饰器判断用户登陆
def user_on_warp(func):
def inner(*args,**kwargs):
if ERR_USER.get(args[0],0) >=3:
print(‘账户已被冻结‘)
write_err_user()
return
elif args[0] in SUSS_USER:
print(‘登陆重复‘)
return
elif len(SUSS_USER) > 0:
print(‘已有账号登陆,请注销再登陆,当前账号为%s‘%(SUSS_USER[0]))
return
func(*args,**kwargs)
return inner
# 装饰器:判断注册用户是否已被注册
def user_warp(func):
‘‘‘
1.加载用户文件,返回用户列表
2.判断用户名是否跟用户列表重名,返回False 则退出 return
3.判断用户必须为字母,返回False 则退出 return
4.满足以上条件后,则执行user_log函数
‘‘‘
def inner(*args,**kwargs):
ls = read_user()
if ls.count(args[0]):
print(‘用户已存在‘)
return
if args[0].isdigit():
print(‘必须字母‘)
return
func(*args,**kwargs)
return inner
#用户注册写入文件
@user_warp #user_log = user_wap(user_log)
def user_log(user_name,pwd):
‘‘‘
1.获取当前注册时间
2.把用户名、密码、时间,拼接起来,用逗号分隔
3.获取文件user.txt文件路径
4.写入user.txt文件
5.执行建立用户的文件夹
‘‘‘
date = datetime.now().strftime(r‘%Y-%m-%d‘)
s = ‘%s,%s,%s\n‘%(user_name,pwd,date)
path = os.path.join(os.path.dirname(__file__),‘user.txt‘)
with open(path,mode=‘a‘,encoding=‘utf-8‘) as f:
f.write(s)
create_user_dir(user_name)
print(‘创建成功重新执行程序‘)
sys.exit()
#读取注册用户
def read_user():
‘‘‘
1.生成列表
2.读取user.txt文件内容
3.加入列表
4.返回列表
‘‘‘
ls = []
path = os.path.join(os.path.dirname(__file__),‘user.txt‘)
with open(path,mode=‘r‘,encoding=‘utf-8‘) as f:
for line in f:
l = line.split(‘,‘)
ls.append(l[0])
return ls
#读取注册用户密码
def read_pwd():
‘‘‘
1.生成列表
2.读取user.txt文件内容
3.加入列表
4.返回列表
‘‘‘
ls = []
path = os.path.join(os.path.dirname(__file__),‘user.txt‘)
with open(path,mode=‘r‘,encoding=‘utf-8‘) as f:
for line in f:
l = line.split(‘,‘)
ls.append(l[1])
return ls
#创建文件目录
def create_user_dir(user_name):
‘‘‘
1.获取文件夹绝对路径
2.创建目录名
3.创建目录绝对路径 + 文件名目录
‘‘‘
path = os.path.join(r‘G:\PT_pro\day16\shopping_car‘,user_name)
os.mkdir(path)
#用户登陆
@user_on_warp
def user_on(user_name,pwd):
user_ls = read_user()
pwd_ls = read_pwd()
for u,p in zip(user_ls,pwd_ls):
if user_name == u and pwd == p:
print(‘登陆成功‘)
SUSS_USER.append(u)
return
elif user_name == u and pwd != p:
print(‘密码错误‘)
ERR_USER.setdefault(u,0)
ERR_USER[u] +=1
return
print(‘用户或密码错误‘)
return
#写入锁定用户
def write_err_user():
with open(‘err.txt‘,mode=‘w‘,encoding=‘utf-8‘) as f:
for k,v in ERR_USER.items():
f.write(‘%s:%s\n‘%(k,v))
f.close()
#初始化读取锁定用户
def read_err_user():
with open(‘err.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f:
dic = {}
for line in f:
ls = line.strip().split(‘:‘)
dic[ls[0]] = int(ls[1])
return dic
def show_menu():
print(‘‘‘
1.用户注册
2.用户登陆
3.退出当前账户
4.商品游览
5.我的购物车
‘‘‘)
#退出当前用户
def log_out_user():
SUSS_USER.clear()
def read_goods():
with open(‘goods‘,mode=‘r‘,encoding=‘utf-8‘) as f:
data = f.readlines()
return data
@shoop_warp
def show_shopping():
count = 5
while True:
page = int(input(‘请输入页码‘))
start = (page-1)*count
end = (page*count)+1
date = GOODS_LIST[start:end]
# if not date:
# print(‘超出范围‘)
# continue
for i in date:
print(i)
seq = input(‘请输入需要购买的商品序号,输入q进行下一次输入,或输入N退出购买界面:‘)
if seq.lower() == ‘q‘:
continue
elif seq.lower() ==‘n‘:
return
num = int(input(‘请输入购买的数量:‘))
d=buy_good(seq,num)
if d:
print(‘购买成功‘)
write_good_file(SUSS_USER[0])
def buy_good(seq,num):
dic = {}
for good in GOODS_LIST:
good = ‘|‘.join(good.split(‘.‘)).strip().split(‘|‘)
if seq == good[0]:
dic[seq] = good[1]
dic[‘price‘] = good[2]
dic[‘num‘] = num
add_goods(dic,seq,num)
return True
else:
print(‘没有此商品‘)
return
def add_goods(dic,seq,num):
if not BUY_GOODS:
BUY_GOODS.append(dic)
return
for i in range(len(BUY_GOODS)):
if seq in BUY_GOODS[i].keys():
BUY_GOODS[i][‘num‘] += num
return
BUY_GOODS.append(dic)
def write_good_file(username):
dir_path =os.path.join( r‘G:\PT_pro\day16\shopping_car‘,username)
date = datetime.now().strftime(‘%Y-%m-%d‘)
path = os.path.join(dir_path,date)+‘.txt‘
with open(path,mode=‘w‘,encoding=‘utf-8‘) as f:
for good in BUY_GOODS:
f.write(str(good)+‘\n‘)
@shoop_warp
def my_shop_list(username):
abs = os.path.join(‘G:\PT_pro\day16\shopping_car‘,username[0])
re = os.listdir(abs)
for i in range(len(re)):
path = os.path.join(abs,re[i])
with open(path,mode=‘r‘,encoding=‘utf-8‘) as f:
print(re[i])
for line in f:
print(line.strip())
#登陆成功的用户
SUSS_USER = []
#锁定用户字典
ERR_USER = read_err_user()
#初始化商品
GOODS_LIST = read_goods()
#购物车
BUY_GOODS = []
fucn_list = {"1":user_log,"2":user_on,"3":log_out_user,"4":show_shopping,"5":my_shop_list}
while True:
show_menu()
num = input(‘请输入序号‘)
if num == ‘1‘:
username = input(‘请输入注册用户‘)
pwd = input(‘请输入密码‘)
fucn_list[num](username,pwd)
elif num == ‘2‘:
username = input(‘请输入账号‘)
pwd = input(‘请输入密码‘)
fucn_list[num](username,pwd)
elif num ==‘3‘:
fucn_list[num]()
elif num ==‘4‘:
fucn_list[num]()
GOODS_LIST.clear()
elif num ==‘5‘:
fucn_list[num](SUSS_USER)
标签:dir 注意 import 选择 abs 指定 序号 enc range
原文地址:https://www.cnblogs.com/jinyan-huang/p/11438317.html