购物车


# 文件中用户信息
# "abc|123|0 , qwe|123|1000"
# 将文件信息读取到内存中,以变量存储,后期需要大量与这些信息交互
# 如何设计存储用户信息的集合变量
# 以用户名为key的dict,value可以为[] \ {}

users_dic = {}      #从文件中读取来

'''
{
'abc' : {'ps' : '123', ' money' : 0},
'qwe' : {'ps' : '000', 'money' : 0}
}
'''

# 存储当前登录成功的用户的信息

user = {}

# {'usr': 'abc', 'ps': '123', 'money': 0}

# 获取所有已注册的用户,存放到user_dic
# 获取文件中用户信息

def get_users():
    # **如果用户集合已经有值,待变用户信息已经读取过了,不需要重复读取**
    if users_dic:
        return users_dic
    # 读文件,存用户们信息
    with open('usr.info','rt', encoding = 'utf-8') as f:
        # "abc|123|0,qwu|123|1000" or "abc|123|0" or none
        data = f.read()
        if not data:
            # 文件中并没有用户信息,那么用户集合也不需要存储,可以直接返回
            return users_dic
        # ['abc|123|0', 'qwe|123|1000'] or ['abc|123|0']
        data_list = data.spliy(',')
        for d in data_list:
            # ['abc','123','0']
            user_info = d.split('|')
            usr = user_info[0]
            ps = user_info[1]
            # 文件中读取的money位字符串,将money以数字储存在内存,分别购物等的运算
            money = int(user_info[2])
            # 按照'abc':{'ps':'123','money':0} 存储到useras_dic
            users_dic[usr] = {'ps':ps,'money':money}
        return users_dic


#注册
def regist():
    print("注册界面...")
    #获取多有用户信息
    users = get_users()
    #账号输入操作
    temp_info = '请'
    while True:
        usr = input(temp_info + "输入账号:").strip()
        #输入的用户名有格式问题
        if not usr:    #用户名为空
            print("账号不能为空")
            temp_info = "请重新"
            continue
        # 用户已存在 
        if usr in users:
            print("用户已存在,请更换用户名!")
            temp_info = '请重新'
            continue
        # 用户不存在,可以进入输入密码阶段
        break
    # 密码输入操作
    temp_info = '请'
    while True:
        ps = input(temp_info + "输入密码:").strip()
        # 输入的密码有格式问题
        if len(ps) < 3:
            print('密码过短!')
            temp_info = '请重新'
            continue
        # 。。。可以添加其他密码安全判段
        break
    # 账号密码均满足条件,可以注册(写入文件)
    with open('usr.info','at',encoding = 'utf-8') as f:
        # 文件是否为空
        # 为空abc|123|0 不为空 ,qwe|123|0
        # users是否为空可以直接反映文件是否为空
        if users:
            user_info = ',%s|%s|%s' %(usr,ps,0)
        else:
            user_info = '%s|%s|%s' %(usr,ps,0'
        f.write(user_info)
    # 文件操作完代表信息更新到文件中了
    # 还需要将信息更新到内存字典中
    users[usr] = {'ps':ps,'money':0}
    print('注册成功')


# 登录
def login():
    global user
    print('登录界面。。。')
    # 获取所有用户信息
    users = get_users()
    # 当前是否为登录状态
    # 可以通过user(存储已登录账号)来反映是否为登录状态
    if user:
        print("系统已经处于登录状态!")
        return
    # 用户名输入
    temp_info = "请"
    while True:
        usr = input(temp_info + '输入账号:').strip()
        # 账号不能为空
        if not usr:
            print('账号不能为空!')
            temp_info = '请重新'
            continue
        #账号不存在
        if not usr in users:
            print('输入用户名不存在')
            # 文件为空,没有必要继续,不为空,可以让用户重新输入
            if users:
                temp_indo = '请重新'
                continue
            return
        break
    # 输入密码操作
    temp_info = '请'
    count = 0
    while count < 3:
        ps = input(temp_info + '输入密码:').strip()
        if users[usr]['ps'] == ps:
            print('登录成功!')
            # money 在二次以后操作文件可能已经拥有金额
            money = users[usr]['money']
            # 直接赋值代表覆盖,方法内不能直接覆盖全局变量,需要做global处理
            user = {'usr':usr,'ps':ps,'money':money}
            break
        print('密码输入错误!')
        temp_info = '请重新'
        count += 1

# 登录状态验证
def not_logon():
    if not user:
        print('系统未登录!')
        return True

#账户
def account():
    if not not_login():
        user_info = '账号:%s | 密码:%s | 金额:%d ' %(user['usr'], user['ps'], user['money'])
        print(user_info)

#注销
def logout():
    if not user:
        print('系统未登录')
        return
    user.clear()
    print('注销成功')

# 登录成功后,对于商品的一系列操作
# 商品列表
goods_dic = {'1': 'iPhone', '2': 'Mac', '3': 'iPad'}
price_dic = {'iPhone': 100, 'Mac': 200, 'iPad': 50}
# 购物车
shop_car = {}
# {'iPhone': 3, 'iPad': 1}
goods_msg = '''
请添加商品到购物车:
1.iPhone | 2.Mac | 3.iPad | 0.退出购买'''

# 充值
def top_up():
    if not user:
        print('系统未登录!')
        return
    temp_info = "请"
    while True:
        money = input(temp_info + '输入充值金额:').strip()
        if not money.isdigit():
            print('输入金额有误!')
            temp_info = "请重新"
            continue
        money = int(money)
        break
    # 更新金额
    update_info('money', money)
    print("充值完毕!")

# 对密码或金额进行修改
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
        ps = v['ps']
        money = str(v['money'])
        if not users_info:
            users_info += '|'.join((usr, ps, money))
        else:
            users_info += ',' + '|'.join((usr, ps, money))
    # 转换完毕后便可以写入文件
    with open('usr.info', 'wt', encoding='utf-8') as f:
        f.write(users_info)
    
    # 购物
def shopping():
    if not user:
        print('系统未登录!')
        return
    print(goods_msg)
    while True:
        # 商品编号
        goods_num = input("商品编号:").strip()
        if goods_num == '0':
            print('退出购买!')
            break
        if not goods_num in goods_dic:
            print('商品不存在!')
            continue

        while True:
            # 商品数
            count = input('商品个数:').strip()
            if not count.isdigit():
                print('个数有误!')
                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("购物车为空,可前往购物!!!")
        return
    print("购物车: ", shop_car)


# 支付
def pay_money():
    if not user:
        print('系统未登录!')
        return
    # 由购物来到支付,也可能主动调用支付
    if not shop_car:
        print("购物车为空,请前往购物!")
        return
    # 计算购物车内商品总价
    total = 0
    for goods in shop_car:
        total += price_dic[goods] * shop_car[goods]
    # 判断余额与商品总价大小
    if user['money'] >= total:
        print('余额充足,购买成功!')
        # 更新信息
        reduce = 0 - total
        update_info('money', reduce)
        # 支付成功后,需要清空购物车
        shop_car.clear()
    else:
        print('余额不足,请充值!')
        top_up()


# 系统功能提示信息
sys_msg = '''
欢迎使用购物车简单系统,请选择:
1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 10.注销 | 0.退出
>>>'''
# 功能字典
method_dic = {
    '1': regist,
    '2': login,
    '3': account,
    '4': top_up,
    '5': shopping,
    '6': pay_money,
    '7': shop_cart_info,
    '10': logout
}


def system():
    while True:
        choice = input(sys_msg).strip()
        # 退出选项
        if choice == '0':
            print("退出系统!")
            return
        # 错误选项
        if not choice in method_dic:
            print("功能输入有误,请重新输入")
            continue
        # 正确选项: eg: '1'-> regist
        method_dic[choice]()


system()
        

            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值