第一个 购物车程序

import json
import os
import re
# 数据结构:
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]


# 功能要求:
# 基础要求:
# 1、启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表
# 2、允许用户根据商品编号购买商品
# 3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
# 4、可随时退出,退出时,打印已购买商品和余额
# 5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显.

# 扩展需求:
# 1、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
# # 2、允许查询之前的消费记录

#查询
def query(name,pwd,shopping_list=None,balance=None):
with open("user_name", "r", encoding='utf_8') as read_f:
name_list = []
for readline in read_f:
load_list = json.loads(readline)
user_name_str = load_list[0]['name']
user_pwd_str = load_list[0]['pwd']
if name == user_name_str and pwd == user_pwd_str:
return load_list, []
if name != user_name_str or pwd != user_pwd_str:
name_list.append(user_name_str)
return [{}], name_list

# 用来向文件 添加用户
def add(name, pwd):
with open('user_name', 'a', encoding='utf_8') as add_f:
# initial_list = [{"flag": "true"}, {"balance": 0}, {"con_record": []}]
initial_list = [0, {"flag": "true"}, {"balance": 0}, {"con_record": []}]
add_dic = {'name': name, 'pwd': pwd}
initial_list[0] = add_dic
add_f.write(json.dumps(initial_list))
add_f.write(' ')

# 这个是注册用户的函数
def reg_user_name(args):
print('该账户不存在 是否注册')
tag = False
while not tag:
choice = input('Y是N否:').upper()
if choice == 'Y':
reg_username = input('请输入您的用户名(只能用字母或者数字):')
reg_pwd = input('请输入您的密码(只能用字母或者数字):')
if reg_username in args:
print('该用户已存在,请重新输入')
continue
if reg_username.isalnum() and reg_pwd.isalnum(): #
add(reg_username, reg_pwd)
print('注册成功')
break
else:
print('输入的可能有非法字符,是否重新输入')
continue
if choice == 'N': # 不注册就直接退出
return

# 这个是购物车函数
def shopping(balance):
shopping_cart = [] #定义购物车列表
exit_flag = False
while not exit_flag:
print('--------商品列表--------')
for index, i in enumerate(goods):
print(index, i['name'], i['price'])
choice = input('请输入想要购买的商品编号(Q退出):').upper()
if choice != 'Q' and not choice.isdigit():
print('输入错误')
if choice.isdigit():
if 0 <= int(choice) < len(goods): #判断输入的数字是否商品编号范围内
if balance - goods[int(choice)]['price'] >= 0: #判断是否买的起
balance -= goods[int(choice)]['price'] #买的起自动结算
shopping_cart.append(goods[int(choice)])
print('33[1;32;40m已经将%s加入购物车,余额还有%d33[0m' % (goods[int(choice)]['name'],balance))
if balance - goods[int(choice)]['price'] < 0:
print('33[1;31;40m您现在有 %d 元,还差 %d 元,余额不足33[0m:'%(balance,abs(balance - goods[int(choice)]['price'])))
break
if int(choice) >= len(goods) or int(choice) < 0:
print('暂时没有这个商品')
if choice == 'Q':
for index, i in enumerate(shopping_cart):
print('33[1;33;40m您已经加入购物车的商品有 %s 价格为 $%s33[0m' % (i['name'], i['price']))
exit_flag = True
return shopping_cart

#单单用来更改用户余额。
def change_balance(name):
new_balance = 0 #将更改之后的 金额返回出去
while True:
money = input('请输入充值金额:')
if money.isdecimal():
with open('user_name', 'r', encoding='utf_8') as read_f, open('user_name_new', 'w', encoding='utf_8') as write_f:
for readline in read_f:
user_info = json.loads(readline)
use_name = user_info[0]['name'] # 用户名
new_balance = int(user_info[2]['balance']) + int(money) #金额 每次都在 上一次的基础上相加
if name == use_name:
user_info[2]['balance'] = new_balance
write_f.write(json.dumps(user_info))
write_f.write(' ')
else:
print('请不要输入,除数字以外的乱七八糟')
continue
os.rename('user_name', 'user_name.bak')
os.rename('user_name_new', 'user_name')
os.remove('user_name.bak')
return new_balance

# 这个是更改文件购物车和余额的函数
def change(name,shopping_list):
total_cost = 0
total_dict = {} #{'电脑': ['Number', 2], '鼠标': ['Number', 2]}
for i in shopping_list:
total_cost += i['price'] #把所有商品的价格 总和一下
if i['name'] in total_dict: # 判断购买的商品是否在购物车里
total_dict[i['name']][1] += 1 # 在购物车里,则商品对应的数量+1
else:
total_dict[i['name']] = ['Number',1] #不在购物车里,则将商品信息数量加入购物车内
# print(total_cost,total_dict)
with open('user_name','r',encoding='utf_8') as read_f,open('user_name_new','w',encoding='utf_8') as write_f:
for readline in read_f:
user_info1 = json.loads(readline)
curbalance = user_info1[2]['balance']
if name == user_info1[0]['name']:
money = curbalance - total_cost
user_info1[2]['balance'] = money
user_info1[3]['shopping_card'].append(total_dict)
write_f.write(json.dumps(user_info1))
write_f.write(' ')
os.rename('user_name', 'user_name.bak')
os.rename('user_name_new', 'user_name')
os.remove('user_name.bak')



if __name__ == '__main__':
msg = '''
1:购买商品
2:查询账户余额
3:历史查询消费记录
4:退出'''
name = None
pwd = None
user_info = []
# [{"name": "qichen", "pwd": "456"}, {"flag": "true"}, {"balance": 0}, {"shopping_card": []}] []
while True:
name = input('请重新输入用户名:').strip()
pwd = input('请输入密码:').strip()
user_info = query(name, pwd)
if not user_info[0][0]:
if name in user_info[1]:
print('账户名或密码错误,重新输入')
continue
else:
reg_user_name(user_info[1])
exit('请重新登陆')
cur_balance = user_info[0][2]['balance'] # 当前余额
if user_info[0][0] and user_info[0][0]['name'] == name and user_info[0][0]['pwd'] == pwd:
choice = input('33[1;35;40m您的当前余额为 %d元 是否充值,Y是N否33[0m:'%cur_balance).upper()
if choice == "Y":
cur_balance = change_balance(name)
print('33[1;34;40m您的当前余额为 %d元33[0m'%cur_balance)
break
else:
break
# user_info = query(name, pwd)
while True:
print(msg)
cur_balance = user_info[0][2]['balance'] # 当前余额
choice_num = input('请选择您要做的事情:').strip()
if choice_num.isdecimal():
if choice_num == '1':
shop_info = shopping(cur_balance)
# print(shop_info)
change(name,shop_info)
if choice_num == '2':
balance_info = query(name,pwd)
print('33[1;32;40m当前余额:%s33[0m'%balance_info[0][2]['balance'])
if choice_num == '3':
new_user_info = query(name,pwd)
print(new_user_info[0][3]['shopping_card'])
if choice_num == '4':
exit('谢谢使用')


[{"name": "qichen", "pwd": "456"}, {"flag": "true"}, {"balance": 0}, {"shopping_card": []}]
[{"name": "yuanhao", "pwd": "789"}, {"flag": "true"}, {"balance": 0}, {"shopping_card": []}]
[{"name": "peiqi", "pwd": "789"}, {"flag": "true"}, {"balance": 0}, {"shopping_card": []}]
[{"name": "xiaoya", "pwd": "789"}, {"flag": "true"}, {"balance": 0}, {"shopping_card": []}]
[{"name": "alex", "pwd": "123"}, {"flag": "false"}, {"balance": 40}, {"shopping_card": [{"u9f20u6807": ["Number", 2]}]}]


学业不精!加倍努力!


原文地址:https://www.cnblogs.com/chengege/p/10211873.html