简单购物车程序
1、功能:登录、注册、购物、支付、充值、退出
2、注:
1)有账户就登录,没有则注册后登录
2)可随时退出
3)登录成功后显示用户余额,这时提示是否充值
4)选择商品时检测余额是否够用,够了就支付扣款,不够就提醒充值
5)重新登录后余额是上次更改后的金额
一个系统需要一个入口, 告诉用户有哪些功能:
注册/登录/充值/账户/购物/支付/购物车/注销/退出
登录:
判断是否存在这个用户
存在: 登录, 输密码
密码正确: 记录状态, 避免重复登录
密码错误: 重新输入密码
不存在: 重新输入, 一直没有就退出; 或者提示注册
注册:
输入账号, 可以设置用户名规范, 判断账号是否存在
存在: 提示已注册, 可以登录该账号
不存在: 输入密码注册, 可以设置密码规范, 注册成功, 注册信息写入文件, 永久保存
登录成功后:
可以查看余额, 余额不足提示充值
可以购物, 添加到购物车, 添加多个相同商品
商品有编号, 对应商品名和价格
购物完成有一个结束购物的标志, 当余额充足直接支付扣款
余额不足提示充值, 商品存放于购物车, 来到充值功能
充值完成主动支付
支付:
1) 购物车没有商品, 提示去购物再付款
2) 由于购物余额不足充值完成去支付, 支付成功, 并清空购物车
注: 充值/支付都需要更新的余额信息, 可以使用函数去调用
如果登录失败, 后面的功能不让查看
# -*- coding: utf-8 -*-
import time
# 文件用户信息
# "abc|123|0,qwe|123|1000"
# 将文件信息读取到内存中, 以变量存储, 后期需要与这些信息交互
# 设计存储用户总信息的变量
# 以用户名为key的字典, value也可以为字典, 存储密码和余额
users_dic = {}
# 从文件中读取
'''
{
'abc': {'pwd': '123', 'money': 0},
'qwe': {'pwd': '000', 'money': 1000}
}
'''
# 存储当前登录成功的用户信息
user = {}
# {'name': 'abc', 'pwd': '123', 'money': 0}
# 获取所有已注册的用户, 存放到user_dic
# 获取文件中用户信息
def get_users():
# 如果用户总信息有值, 代表用户信息已经读取过了, 不需要重复读取
if users_dic:
return users_dic
# 如果用户总信息没有值, 读文件, 存用户
with open("user.txt", "rt", encoding="utf-8") as f:
# data里面可能有一个用户/多个用户/没有用户, 即
# "abc|123|0,qwe|123|1000" 或 "abc|123|0" 或 None
data = f.read()
if not data: # 没有用户
return users_dic
# data_list里面 ['abc|123|0', 'qwe|123|1000'] 或 ['abc|123|0']
data_list = data.split(",")
for d in data_list:
# user_info里面['abc', '123', '0']
user_info = d.split("|")
usr = user_info[0]
pwd = user_info[1]
# 文件中读取的money为字符串, 将money以数字存储在内存, 方便后面的运算
money = float(user_info[2])
# 按照 'abc': {'pwd': '123', 'money': 0} 存储到 user_dic
users_dic[usr] = {'pwd': pwd, 'money': money}
return users_dic
# 注册
def register():
print("\033[32m注册界面...\033[0m")
# 获取所有用户信息
users = get_users()
# 账号输入操作
temp_info = "请"
while True:
usr = input(temp_info + "输入账号: ").strip()
# 输入的用户名有格式错误
if not usr: # 用户名为空
print("\033[31m账号不能为空!\033[0m")
temp_info = "请重新"
continue
# 用户已存在
if usr in users:
print("\033[31m用户已存在, 请更换用户名!\033[0m")
temp_info = "请重新"
continue
# 用户不存在, 可以进入输入密码阶段
break
# 密码输入操作
temp_info = "请"
while True:
pwd = input(temp_info + "输入密码: ").strip()
# 输入的密码有格式错误
if len(pwd) < 3:
print("\033[31m密码长度过短!\033[0m")
temp_info = "请重新"
continue
# ... 可以添加其它密码需求
break
# 账号密码均满足条件, 可以注册(注册就是写入信息到文件)
with open("user.txt", "at", encoding="utf-8") as f:
# 文件是否为空
# 如果为空, 写入 abc|123|0
# 如果不为空, 写入 ,qwe|123|0
# users是否为空可以直接反映文件是否为空
if users:
user_info = ',%s|%s|%s' % (usr, pwd, 0)
else:
user_info = '%s|%s|%s' % (usr, pwd, 0)
f.write(user_info)
# 文件操作完代表信息更新到文件中, 还需要将信息更新到内存字典中
users[usr] = {'pwd': pwd, 'money': 0}
print("\033[32m注册成功!\033[0m")
# 登录
def login():
global user
print("\033[32m登录界面...\033[0m")
# 获取所有用户信息
users = get_users()
# 当前是否为登录状态
# 可以通过user(存储已登录账户来反应是否为登录状态)
if user:
print("\033[31m系统已处于登录状态!\033[0m")
return
# 如果处于未登录状态
# 用户名输入
temp_info = "请"
while True:
usr = input(temp_info + "输入账号: ").strip()
# 账号不能为空
if not usr:
print("\033[31m账号不能为空!\033[0m")
temp_info = "请重新"
continue
# 账户不存在
if usr not in users:
print("\033[31m输入的账号不存在\033[0m")
# 文件为空, 不能进行下一步操作, 否则永远是账号不存在
# 文件不为空, 可以让用户重新输入
if users:
temp_info = "请重新"
continue
return
break
# 输入密码操作
temp_info = "请"
count = 0
while count < 3:
pwd = input(temp_info + "输入密码: ").strip()
if users[usr]['pwd'] == pwd:
print("\033[32m登录成功!\033[0m")
# money在二次登录以后操作文件可能已经拥有金额
money = users[usr]['money']
# 直接赋值代表覆盖, 但函数内不能直接覆盖全局变量, 需要做global处理
user = {'usr': usr, "pwd": pwd, 'money': money}
break
print('\033[31m密码输入错误!\033[0m')
temp_info = "请重新"
count += 1
else:
print("\033[31m密码错误三次, 请等待5秒...\033[0m")
time.sleep(5)
# 账户
def account():
if not user:
print("\033[31m系统未登录, 无法查看用户信息!\033[0m")
return
user_info = '账户: %s | 密码: %s | 金额: %s ' % (user['usr'], user['pwd'], user['money'])
print(user_info)
# 注销
def logout():
if not user:
print("\033[31m系统未登录, 无需注销!\033[0m")
return
user.clear()
print("\033[32m注销成功!\033[0m")
# 登录成功后, 对于商品的一系列操作
# 商品列表
goods_dic = {'1': 'iPhone', '2': 'Mac', '3': 'iPad', '4': 'iWatch', '5': 'girlfriend'}
price_dic = {'iPhone': 6688, 'Mac': 13800, 'iPad': 5888, 'iWatch': 3199, 'girlfriend': 1}
# 购物车: 商品与对应的购买个数
shop_car = {} # {'iPhone': 3, 'iPad': 1}
goods_msg = '''
请添加商品到购物车:
1. iPhone 6688元
2. Mac 13800元
3. iPad 5888元
4. iWatch 3199元
0. 退出购买
'''
# 充值
def top_up():
if not user:
print("\033[31m系统未登录, 不能充值!\033[0m")
return
temp_info = "请"
while True:
money = input(temp_info + "输入充值金额: ").strip()
if not money.isdigit():
print("\033[31m输入金额有误!\033[0m")
temp_info = "请重新"
continue
money = float(money)
break
# 更新金额
update_info('money', money)
print("\033[32m充值完毕\033[0m")
# 对密码或金额进行修改
def update_info(k, v):
# 需要更新的内容有:
# 1. 当前登录状态下的用户
# 2. 内存中的用户
# 3. 文件中的用户信息
# 首先更新1
if k == 'money':
user[k] += v
else:
user[k] = v
# 通过1更新2
users = get_users()
users[user['usr']][k] = user[k]
# 通过2更新3
# 将{'abc': {'ps': '123', 'money': 0},'qwe': {'ps': '000', 'money': 1000}}
# 转换为 "abc|123|0,qwe|123|1000" 写入文件
# dict 转换为 str
users_info = ''
for k, v in users.items():
usr = k
pwd = v['pwd']
money = str(v['money'])
if not users_info:
users_info += '|'.join((usr, pwd, money))
else:
users_info += ',' + '|'.join((usr, pwd, money))
# 转换完毕后便可以写入文件
with open('user.txt', 'wt', encoding='utf-8') as f:
f.write(users_info)
# 购物
def shopping():
if not user:
print('\033[31m系统未登录, 无法购物!\033[0m')
return
print(goods_msg)
while True:
# 商品编号
goods_num = input("商品编号: ").strip()
if goods_num == '0':
print('\033[32m退出购买!\033[0m')
break
if not goods_num in goods_dic:
print('\033[31m商品不存在!\033[0m')
continue
while True:
# 商品数
count = input('商品个数: ').strip()
if not count.isdigit():
print('\033[31m个数有误!\033[0m')
continue
count = int(count)
# 编号与个数均正确
# 加入购物车:{商品名: 个数}
goods = goods_dic[goods_num]
# 通过商品与购物车进行匹配,判断商品个数是累加还是赋值
if not goods in shop_car:
shop_car[goods] = count
else:
shop_car[goods] += count
# 更新完购物车后代表一次购物车添加完毕
# 查看一下当前购物车信息
shop_cart_info()
break
# 进入支付:余额充足直接付款,不足充值
pay_money()
# 购物车
def shop_cart_info():
if not shop_car:
print("\033[32m购物车为空, 可前往购物\033[0m")
return
print("购物车: ", shop_car)
# 支付
def pay_money():
if not user:
print('\033[31m系统未登录, 不能支付!\033[0m')
return
# 由购物来到支付,也可能主动调用支付
if not shop_car:
print("\033[31m购物车为空, 请前往购物!\033[0m")
return
# 计算购物车内商品总价
total = 0
for goods in shop_car:
total += price_dic[goods] * shop_car[goods]
# 判断余额与商品总价大小
if user['money'] >= total:
print('\033[32m余额充足, 购买成功!\033[0m')
# 更新信息
reduce = 0 - total
update_info('money', reduce)
# 支付成功后,需要清空购物车
shop_car.clear()
else:
print('\033[31m余额不足, 请充值!\033[0m')
top_up()
# 系统功能提示信息
sys_msg = '''
欢迎使用购物车简单系统,请选择:
1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 8.注销 | 0.退出
>>>'''
# 功能字典(编号与功能对应)
method_dic = {
'1': register,
'2': login,
'3': account,
'4': top_up,
'5': shopping,
'6': pay_money,
'7': shop_cart_info,
'8': logout,
}
# 系统入口
def system():
while True:
choice = input(sys_msg).strip()
# 退出选项
if choice == '0':
print("退出系统")
break
# 错误选项
if choice not in method_dic:
print("功能输入有误, 请重新输入")
continue
# 正确选项
method_dic[choice]()
system()