第二周作业 - 简单购物车

简单购物车程序

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()
View Code

猜你喜欢

转载自www.cnblogs.com/qiuxirufeng/p/9690371.html