Day02 - 作业

作业:购物车

一、作业要求

  1. 优化购物程序,购买时允许用户选择购买多少件
  2. 允许多用户登录,下一次登录后,继续按上次的余额继续购买(可以充值)
  3. 允许用户查看之前的购买记录(记录要显示商品购买时间)
  4. 商品列表分级展示。
  5. 显示已购买商品时,如果有重复的商品,不打印多行,而是在一行展示。

二、简单思路

  1. 将Day01的两个作业融合进来,完成登录验证和商品列表。
  2. 记录用户的剩余金额以及累计充值金额,并保存至对应的金额文件。
  3. 用户的购买行为信息存为列表,并保存至对应的购买记录文件。
  4. 多次购买的商品信息存为字典,并保存至对应的已购清单文件。

三、流程图

Day02 - 购物车

四、新知识点自学

  1. Python 日期和时间
  2. 序列化
  3. 读写JSON数据

五、代码

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# Author: Will

import os
import getpass
import time
import json

# 黑名单
if not os.path.exists('blacklist.txt'):
    with open('blacklist.txt', 'a+') as f:
        f.read()

# 账户登录
print("""
********************************************
**                                        **
**                                        **
**          欢迎来到账户登录界面          **
**                                        **
**                                        **
**                                        **
********************************************
""")
true_username = 'will'
true_password = '1234'
for i in range(3):
    with open('blacklist.txt', 'r') as f:
        blacklist = f.read().split()
    # print(blacklist)
    username = input("请输入您的用户名:")
    if username in blacklist:
        print("您的账户: %s 已经被锁定。请联系管理员解锁,或者更换登录账户。" % username)
        continue
    else:
        password = getpass.getpass("请输入您的密码:")
    if true_username == username and true_password == password:
        print("""
********************************************
**                                        **
**      这里是“没什么东西可买商城”      **
**                                        **
**           欢迎您的光临,%s           **
**                                        **
**                                        **
********************************************
        """ % username)
        break
    elif i == 2:
        with open('blacklist.txt', 'a+') as f:
            f.write('%s\n' % username)
        exit("您已尝试登录3次,您的账户 %s 已被锁定。" % username)
    else:
        print("用户名或密码错误,请重试。")

# 资金余额和已购清单文件读取
if os.path.exists('purchased_list.txt'):
    with open('purchased_list.txt', 'r') as f:
        purchased_list = json.load(f)
    with open('salary.txt', 'r') as f:
        salary = json.load(f)
    # salary = purchased_list.get('Salary')
    # print(purchased_list)
else:
    purchased_list = {}
    salary_flag = False
    while not salary_flag:
        salary = input("请输入您要充值的金额('q':退出):")
        if salary.isdigit():
            salary = int(salary)
            salary_flag = True
        elif salary == 'q':
            exit()
        else:
            print("输入格式不正确,请输入数字。")
print("您现在的资金余额为:%d元\n" % salary)

# 商品字典
goods = {
    '图书类': [
        ('魔鬼经济学', 135), ('权力的游戏', 285), ('莎士比亚悲剧喜剧全集', 109)
    ],
    '3C类': [
        ('iPhone7 Plus', 5000), ('Macbook Pro', 20000), ('Dell XPS15', 12000)
    ],
    '家电类': [
        ('电视机', 5000), ('电冰箱', 7000), ('空调', 4000)
    ],
    '服装类': [
        ('羽绒服', 1200), ('牛仔裤', 500), ('毛呢大衣', 1800)
    ]
}

# 根据当前目录是否有purchased_info文件来判断是读取文件信息还是赋空值
if os.path.exists('purchased_info.txt'):
    with open('purchased_info.txt', 'r') as f:
        purchased_info = json.load(f)
else:
    purchased_info = []

# 购物车
shopping_flag = False
while not shopping_flag:
    print("“没什么东西可买商城”商品目录:")
    for menu1 in enumerate(goods):
        print(menu1[0], menu1[1])
    catagory = input("\n请选择您想浏览的商品目录编号('r':查看购买记录,'c':查看已购清单,'q':退出):")
    if catagory.isdigit():
        catagory = int(catagory)
        if catagory < len(goods):
            key = list(goods)[catagory]
        else:
            print("请输入正确的商品编号。")
        while catagory < len(goods):
            print("\n“没什么东西可买商城” %s商品列表:" % key)
            for menu2 in enumerate(goods[key]):
                print(menu2[0], menu2[1][0], menu2[1][1])
            user_choice = input("\n请输入您想购买的商品编号('r':查看购买记录,'c':查看已购清单,'b':返回,'q':退出):")
            if user_choice.isdigit():       # 如果用户选择输入的是数字
                user_choice = int(user_choice)
                if user_choice < len(goods[key]):
                    purchased_amount = input("请输入你要购买的数量:")
                    if purchased_amount.isdigit():
                        purchased_amount = int(purchased_amount)
                        purchased_item = goods[key][user_choice]        # 将选择的商品赋值给purchased_item
                        if purchased_item[1] * purchased_amount <= salary:      # 商品总价小于等于资金余额
                            salary -= purchased_item[1] * purchased_amount
                            purchased_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())   # 将购买时间记录下来赋值给purchased_time
                            purchased_record = [purchased_item[0], purchased_item[1], purchased_amount, purchased_time]     # 将商品名,商品价格,购买数量,购买时间以列表计入purchased_record
                            purchased_info.append(purchased_record)     # 将本条购买记录添加进purchased_info
                            # print(purchased_info)
                            with open('purchased_info.txt', 'w') as f:  # 将当前的购买记录写入文件purchased_info.txt
                                json.dump(purchased_info, f)
                            with open('salary.txt', 'w') as f:          # 将当前资金余额写入资金文件salary.txt
                                json.dump(salary, f)
                            # 根据已购清单中是否有商品信息判断
                            if purchased_item[0] in purchased_list:         # 如果已购清单中已有商品信息,最新已购数量 = 此次购买数 + 已购买数
                                purchased_amount_new = purchased_amount + purchased_list.get(purchased_item[0])
                            else:
                                purchased_amount_new = purchased_amount     # 如果已购清单中没有商品信息,最新已购数量 = 此次购买数
                            purchased_list[purchased_item[0]] = purchased_amount_new    # 修改已购清单字典purchased_list中对应商品的最新已购数量
                            with open('purchased_list.txt', 'w') as f:      # 将已购清单字典purchased_list写入已购清单文件purchased_list
                                json.dump(purchased_list, f)
                            # print(purchased_list)
                            print("\n您购买了 “%s” ,数量:%d,共计 %d元" % (purchased_item[0], purchased_amount,
                                                              purchased_item[1] * purchased_amount))
                            print("您现在的资金余额为:%d元\n" % salary)
                        else:
                            recharge = input("\n您的资金余额不足,请输入您要充值的金额(输入'n'退出):")
                            if recharge.isdigit():
                                recharge = int(recharge)
                                salary += recharge          # 充值
                                print("您现在的资金余额为:%d元\n" % salary)
                            elif recharge == 'n':
                                exit("感谢您的光临,祝你本次购物愉快,再见。")
                            else:
                                print("请正确输入您想要充值的金额。\n")
                    else:
                        print("正确购买的数量应该为数字。\n")
                else:
                    print("请您输入正确的商品编号。\n")
            elif user_choice == 'b':
                break
            elif user_choice == 'r':
                for items in purchased_info:  # 循环购买记录列表
                    print("您在 %s 购买了 “%s” ,单价:%d元,数量:%d ,共计:%d元" % (
                        items[3], items[0], items[1], items[2], items[1] * items[2]))
                print("您现在的资金余额为:%d元\n" % salary)
            elif user_choice == 'c':
                for items in purchased_list:  # 循环已购清单字典
                    print("您目前已购买了 “%s” ,数量:%d" % (items, purchased_list[items]))
                print("您现在的资金余额为:%d元\n" % salary)
            elif user_choice == 'q':
                for items in purchased_list:  # 循环已购清单字典
                    print("您目前已购买了 “%s” ,数量:%d" % (items, purchased_list[items]))
                exit("您现在的资金余额为:%d元\n" % salary)
            else:
                print("您输入了非法字符,请输入数字。\n")
    elif catagory == 'r':
        for items in purchased_info:    # 循环购买记录列表
            print("您在 %s 购买了 “%s” ,单价:%d元,数量:%d ,共计:%d元" % (
                items[3], items[0], items[1], items[2], items[1] * items[2]))
        print("您现在的资金余额为:%d元\n" % salary)
    elif catagory == 'c':
        for items in purchased_list:    # 循环已购清单字典
            print("您目前已购买了 “%s” ,数量:%d" % (items, purchased_list[items]))
        print("您现在的资金余额为:%d元\n" % salary)
    elif catagory == 'q':
        for items in purchased_list:    # 循环已购清单字典
            print("您目前已购买了 “%s” ,数量:%d" % (items, purchased_list[items]))
        exit("您现在的资金余额为:%d元\n" % salary)
    else:
        print("您输入了非法字符,请您输入数字。\n")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容