题目:购物车
这个小练习是综合上一个联系的基础上再添加一个购物车的功能,我主要实现了下面的几个功能:
- 用户登录(三次登录失败锁定账户)
- 三级菜单(商品的目录)
- 向购物车添加商品与移除商品
- 购物车结算功能,结算后自动清除购物车
- 付款功能,余额不足的情况会提示用户充值
流程图
流程图我也是才刚刚开始画,可能画的不标准,现在只能是表达我的一个思路,如果规范的画流程图我会在以后抽出时间来学习。
目录结构
主文件是gou_wu_che.py(博主英文太差啊。。先用拼音凑合来吧),还有一个初始化数据的文件edit_shop_menu.py,剩下的都是文本文件,其中只有blackname和userlist需要手动创建,其他的文件会自行生成
- gou_wu_che.py
- edit_shop_menu.py
- blackname
- userlist
- menu_list
- now_user
- shoping_car
- user_money
代码
关于代码,由于博主现在刚刚写完,已经很晚了,明天还要上班,所有暂时先没有注释。大家也许会看着有些费劲,注释我在之后会抽空加上。ps:请大家相信我,我一定会加上的。
gou_wu_che.py
#!/usr/bin/env python
import pickle
user_list_file = "userlist"
black_name_file = "blackname"
menu_file = "menu_list"
now_user = "now_user"
shoping_car_list = "shoping_car"
user_money = 'user_money'
#检查用户输入的文件名是否与userlist文件匹配
def check_user(file, user, password):
with open(file) as f:
for i in f.readlines():
f_user,f_passwoed = i.strip().split()
#print(f_user, f_passwoed)
if f_user == user and f_passwoed == password:
return True
else:
return False
#黑名单验证
def check_blackname(file, user):
with open(file) as f:
for i in f.readlines():
if user == i.strip(): #readlines()读取的变量会有一个回车,需要把空白去掉
return True
#把当前用户添加到黑名单
def add_black_name(file, user, userlist):
if userlist.count(user) < 3:
return False
else:
with open(file,'a') as f:
f.write("\n%s" % user)
return True
#获取商品列表
def get_menu():
with open(menu_file, 'rb') as f:
menu = pickle.load(f)
return menu
#读取用户余额
def get_user_money():
with open(user_money, 'rb') as f:
user_money_list = pickle.load(f)
return user_money_list
#更新用户余额
def update_user_monef(user_money_list):
with open(user_money, 'wb') as f:
pickle.dump(user_money_list, f)
#获取购物车内容
def get_shop_car():
with open(shoping_car_list, 'rb') as f:
shoping_car = pickle.load(f)
return shoping_car
#获取当前登录的用户名
def get_user():
with open(now_user, 'r') as f:
user = f.read()
return user
为该用户充值
def add_money(now_money):
user = get_user()
user_money_list = get_user_money()
want = input("是否充值(y/n)")
while 1:
if want == 'y':
money = input("输入金额")
while 1:
if money.isdigit():
now_money += int(money)
break
else:
print("请输入数字")
user_money_list[user] = now_money
update_user_monef(user_money_list)
break
elif want == 'n':
break
else:
print('输入有误')
break
#用户支付
def user_pay(all_money):
user = get_user()
user_money_list = get_user_money()
if user_money_list[user] < all_money:
print("余额不足")
add_money(user_money_list[user])
else:
user_money_list[user] -= all_money
update_user_monef(user_money_list)
print("付款成功")
shoping_car = get_shop_car()
shoping_car[user].clear()
update_shop_car(shoping_car)
#更新购物车
def update_shop_car(shoping_car):
with open(shoping_car_list, 'wb') as f:
pickle.dump(shoping_car, f)
#添加购物车
def add_shop_car(shoping):
user = get_user()
shoping_name,shoping_cost = shoping
shoping_car = get_shop_car()
shoping_car[user].update({shoping_name:shoping_cost})
update_shop_car(shoping_car)
print(shoping_car)
#清空购物车
def del_shop_car():
user = get_user()
shoping_list = []
while 1:
shoping_car = get_shop_car()
all_money = 0
for i in shoping_car[user].values():
all_money += i
menu_list = 1
for i in shoping_car[user].keys():
print(menu_list, i)
shoping_list.append(i)
menu_list += 1
print("需付款:%s" % all_money)
user_money_list = get_user_money()
print('用户余额:',user_money_list[user])
num = input("输入数字可移除商品(q:退出,s:结算):")
if num == 'q':
break
elif num == 's':
user_pay(all_money)
elif num.isdigit() and int(num) <= len(shoping_list):
shoping_car[user].pop(shoping_list[int(num)-1])
shoping_list.pop(int(num)-1)
update_shop_car(shoping_car)
else:
print("输入有误")
#显示列表
def return_menu(f_menu):
menu_num = 1
menu_list = []
for i in f_menu.keys():
print(menu_num, i)
menu_list.append(i)
menu_num += 1
return menu_list
#显示三级菜单
def third_menu_display(f_menu):
while 1:
shop_num = 1
for i,j in f_menu:
print("%s 名称:%s\n价格:%s\n\n" % (shop_num,i,j))
shop_num += 1
num = input("请输入购入物品的序号(q:退出,b:返回上一级):")
if num == 'q':
exit("欢迎下次光临")
elif num == 'b':
return True
elif num.isdigit() and int(num) <= shop_num:
add_shop_car(f_menu[int(num)-1])
else:
continue
#显示二级菜单
def secend_menu_display(f_menu):
while 1:
menu_list =return_menu(f_menu)
num = input("请输入(q:退出,b:返回上一级):")
if num == 'q':
exit("欢迎下次光临")
elif num == 'b':
return True
elif num.isdigit() and int(num) <= len(menu_list):
num = int(num) - 1
if third_menu_display(f_menu[menu_list[num]]):
continue
else:
continue
#显示一级菜单
def display_first_menu(f_menu):
while 1:
menu_list = return_menu(f_menu)
num = input("请输入(q:退出,e:编辑购物车):")
if num == 'q':
exit("欢迎下次光临")
elif num == 'e':
del_shop_car()
elif num.isdigit() and int(num) <= len(menu_list):
num = int(num)-1
if secend_menu_display(f_menu[menu_list[num]]):
continue
else:
continue
#登录
def login():
user_list = []
while 1:
user = input("请输入用户名")
password = input("请输入密码")
add_black_name(black_name_file, user, user_list)
if check_blackname(black_name_file, user):
print("用户被锁定")
return False
if check_user(user_list_file, user, password):
print("登录成功")
with open(now_user, 'w') as f:
f.write(user)
return True
else:
print("用户名或密码错误")
user_list.append(user)
if __name__ == "__main__":
if login():
menu = get_menu()
display_first_menu(menu)
edit_shop_menu.py
#!/usr/bin/env python3
import pickle
shoping_car = {
'xiaoming':{},
'xiaoli':{},
'xiaofang':{}
}
user_money = {
'xiaoming':10000,
'xiaoli':10000,
'xiaofang':10000,
}
menu_list = {
'电子通讯': {
'手机': [
('iphone12', 6500),
('samsunsS33', 7800),
('xiaomiMIX8', 4500),
],
'手机配件': [
('耳机', 250),
('保护壳', 50),
('手机膜', 25),
],
},
'电脑': {
'联想': [
('小新700', 5700),
('Y560', 4200),
('T567', 8520),
],
'apple': [
('mac book', 8890),
('mac pro', 12500),
('mac air', 12400),
],
'dell': [
('MX004', 6500),
('laji009', 7800),
('sb512', 4512),
],
},
'成人用品': {
'避孕': [
('duleisi', 40),
('gangben', 35),
('di6gan', 44)
],
'男用': [
('feijibei', 450),
('wawa', 1520),
('runhuaye', 35),
],
'女用': [
("dabangbang", 480),
('zhendonghuan', 250),
('diwenla', 25)
],
},
}
def define_user_money():
with open('user_money', 'wb') as f:
pickle.dump(user_money, f)
def define_shoping_car():
with open('shoping_car', 'wb') as f:
pickle.dump(shoping_car, f)
def define_menu():
with open('menu_list','wb') as f:
pickle.dump(menu_list,f)
def read_menu():
with open('menu_list', 'rb') as f:
dic = pickle.load(f)
print(dic)
if __name__ == "__main__":
define_menu()
define_shoping_car()
define_user_money()
blackname
xiaoming
userlist
xiaoli 123456
xiaoming asdfgh
xiaofang qwerty
我分享的目的就是大家一起学习。如果对代码有疑问,或者是发现bug,代码还有需要优化的地方,欢迎大家随时给我留言,我会第一时间回复~~