Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序

作业要求

1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表

2、允许用户根据商品编号购买商品

3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒

4、可随时退出,退出时,打印已购买商品和余额

5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示

6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买

7、允许查询之前的消费记录

 

知识点解析

  • 函数式编程的逻辑和过程: 将项目的要求步骤化,并赋予不同的函数名。主程序调用这些函数。
def init():                             # 系统初始化(读取所有商品并保存为全局变量)
    return True


def login():                            # 登录认证
    pass


def register():                         # 新用户注册,第一次登录,输入salary
    pass


def show_products():                    # 展示所有商品的序号/名称/单价
    pass


def user_choice():                      # 让用户输入选择的商品序号或者'q', 'q'返回就调用shwo_current_shopping_log
    pass


def show_current_shopping_log():        # 显示本次购物日志
    pass


def balance_enough():                   # 检验余额是否足够
    pass


def add_cart():                         # 放入购物车,高亮显示,扣费。并调用日志信息shopping_log()和 show_user_balance()
    pass


def shopping_log():                     # 添加到本次消费日志和用户信息的日志中
    pass


def save_user():                        # 将用户信息存入文件中去
    pass


def show_user_balance():                # 显示当前用户的历史购物日志
    pass


def show_shopping_log():                # 显示用户所有历史的消费记录
    pass
View Code
  • 函数的返回值 return True: 用来检验函数执行是否成功
  • 函数嵌套函数:常用于装饰器。我们知道,函数内定义的变量是局部变量。但是,如果函数内有函数,函数参数值在函数内的有效的。
  • 尽量详细的拆分
  • 调用文件全路径的方法: - OS 模块见笔记: http://www.cnblogs.com/lg100lg100/p/7158222.html 
import os

BASE_DIR = os.path.dirname(__file__)
DB_DIR = os.path.join(BASE_DIR,'db') 
# print(BASE_DIR)
# print(DB_DIR)

os.path.exist()
  • JSON 模块见笔记: http://www.cnblogs.com/lg100lg100/p/7160951.html 
  • 作业中出现的错误:字段名的命名还是用英语比较好,中文出现错别字,就无法执行程序。

作业代码:

#!usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Jane Yue

import sys
import json

open_line = '''
       有机生鲜 多*快*好*省
----------------------------------
a键: 新用户注册
b键:登陆账户
q键:退出
----------------------------------
'''

user_menu = ['退出', '购物', '充值', '查询']


def save_into_file(db_dict, filename='user_data.json'):
    # 辅助函数:将信息存入文件,默认文件为 user_status.json
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(db_dict, f)


def load_from_file(filename='user_data.json'):
    # 辅助函数:读取文件信息,默认文件为 user_status.json
    with open(filename, 'r', encoding="utf-8") as f:
        db_dict = json.load(f)
    return db_dict


def openline():
    # 程序开始
    while True:
        print(open_line)
        open_choice = input('请根据菜单选择:').strip()
        if open_choice == "a":
            username = input("用户名:")
            register(username)
        elif open_choice == "b":
            login()
        elif open_choice == "q":
            sys.exit()
        else:
            print("错误信息,重新输入")
            continue


def login():
    # 登录认证
    db_dict = load_from_file()                  # python字典格式:{"username":{"密码": "password","历史记录":["商品"], "余额": 000}}
    count = 0
    while count < 3:
        username = input('用户名: ')
        if username in db_dict:
            password = input('密码: ')
            if password == db_dict[username]["密码"]:
                print("小主,欢迎回来买买买!")
                core_menu(username)
            else:
                count += 1
                print("密码错误,您还有%d机会。" % (3 - count))
                continue
        else:
            print("用户名不存在,请注册新账户")
            register(username)
            return True


def register(username):
    # 注册新账户并存入文件
    db_dict = load_from_file()

    while True:
        print("用户名:%s" % username)
        password = input("密码:")
        if len(password.strip()) > 0:
            db_dict[username] = {
                "密码": "password",
                "历史纪录": ["商品"],
                "余额": 000}
            ini_balance = int(input("首次充值额:"))
            db_dict[username]["余额"] = ini_balance
            save_into_file(db_dict)
            print("欢迎第一次登陆,%s" % username)
            core_menu(username)
        else:
            print("请输入密码")
            continue


def core_menu(username):
    # 用户登陆后,显示选项及菜单
    print('用户菜单'.center(25, "="))
    for i in user_menu:
        print(user_menu.index(i), i)

    while True:
        choice = input('亲,请选择 >>> ')
        if choice == "1":
            shopping(username)
        elif choice == "2":
            topup(username)
        elif choice == "3":
            show_user_balance(username)
        elif choice == "q":
            print('88,亲')
            sys.exit()
        else:
            print('错误信息,请重新选择')
            continue


def shopping(username):
    # 购物
    menu_dict = load_from_file("menu.json")
    db_dict = load_from_file()

    while True:
        for i in sorted(menu_dict):
            print(i)
        option1 = input('请选择\033[001m产品分类\033[0m 【b】返回 【任意键】退出').strip()            # 001加粗
        if option1 in menu_dict:
            print('{}清单如下:'.format(option1).rjust(25, '-'))
            for k in menu_dict[option1]:
                print(k, menu_dict[option1][k])

            while True:
                option2 = input('请选择 \033[001m商品\033[0m 加入购物车【b】返回 【q键】退出 ').strip()
                if option2 in menu_dict[option1]:
                    option3_num = input('请输入购买数量').strip()
                    if option3_num.isdigit() and int(option3_num) <= menu_dict[option1][option2]['数量']:
                        num = int(option3_num)
                        price = menu_dict[option1][option2]['单价']
                        cost = num*price
                        balance = db_dict[username]['余额']
                        if cost<=balance:
                            db_dict[username]['余额'] -= cost
                            db_dict[username]['历史记录'].append(option2)                  # 添加字典value值数据???
                            save_into_file(db_dict)
                            menu_dict[option1][option2]['数量'] -= num
                            save_into_file(menu_dict, "menu.json")
                            print("商品已购,您的最新余额为\033[34m%d\033[0m" % (db_dict[username]['余额']))
                            break
                        else:
                            print('账户余额不足,请充值')
                            core_menu(username)
                    else:
                        print("抱歉,商品数目不足")
                        continue
                elif option2 == 'b':
                    break
                elif option2 == 'q':
                    sys.exit()
                else:
                    print('错误信息,请重新选择')
                    continue

        elif option1 == 'b':
            core_menu(username)
        else:
            sys.exit()


def topup(username):
    # 充值
    db_dict = load_from_file()

    top_up = input('请填写充值金额')
    if top_up.isdigit():
        db_dict[username]["余额"] += int(top_up)
        save_into_file(db_dict)
        show_user_balance(username)
    else:
        print('错误信息,请重新选择')
        core_menu(username)


def show_user_balance(username):
    # 显示用户余额
    db_dict = load_from_file()
    print('{},您的当前余额为\033[34m{}\033[0m'.format(username,
                                                db_dict[username]['余额']))
    show_shopping_log(username)


def show_shopping_log(username):
    # 显示用户所有历史的消费记录
    db_dict = load_from_file()
    shopping_log = db_dict[username]['历史记录']
    if shopping_log == '':
        print("您在本小店没有消费记录")
        core_menu(username)
    else:
        print('历史消费如下:',shopping_log)


    choice = input('【b键】返回主菜单 【q键】退出')
    if choice == 'q':
        sys.exit()
    else:
        core_menu(username)


if __name__ == '__main__':
    openline()
View Code

 

转载于:https://www.cnblogs.com/lg100lg100/p/7123722.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值