Python小练习二

题目:购物车

这个小练习是综合上一个联系的基础上再添加一个购物车的功能,我主要实现了下面的几个功能:

  • 用户登录(三次登录失败锁定账户)
  • 三级菜单(商品的目录)
  • 向购物车添加商品与移除商品
  • 购物车结算功能,结算后自动清除购物车
  • 付款功能,余额不足的情况会提示用户充值

流程图

流程图我也是才刚刚开始画,可能画的不标准,现在只能是表达我的一个思路,如果规范的画流程图我会在以后抽出时间来学习。
这里写图片描述

目录结构

主文件是gou_wu_che.py(博主英文太差啊。。先用拼音凑合来吧),还有一个初始化数据的文件edit_shop_menu.py,剩下的都是文本文件,其中只有blackname和userlist需要手动创建,其他的文件会自行生成

  • gou_wu_che.py
  • edit_shop_menu.py
  • blackname
  • userlist
  • menu_list
  • now_user
  • shoping_car
  • user_money

代码

关于代码,由于博主现在刚刚写完,已经很晚了,明天还要上班,所有暂时先没有注释。大家也许会看着有些费劲,注释我在之后会抽空加上。ps:请大家相信我,我一定会加上的。

gou_wu_che.py

#!/usr/bin/env python
import pickle

user_list_file = "userlist"
black_name_file = "blackname"
menu_file = "menu_list"
now_user = "now_user"
shoping_car_list = "shoping_car"
user_money = 'user_money'

#检查用户输入的文件名是否与userlist文件匹配
def check_user(file, user, password):
    with open(file) as f:
        for i in f.readlines():
            f_user,f_passwoed = i.strip().split()
            #print(f_user, f_passwoed)
            if f_user == user and f_passwoed == password:
                return True
        else:
            return False

#黑名单验证
def check_blackname(file, user):
    with open(file) as f:
        for i in f.readlines():
            if user == i.strip():       #readlines()读取的变量会有一个回车,需要把空白去掉
                return True

#把当前用户添加到黑名单
def add_black_name(file, user, userlist):
    if userlist.count(user) < 3:
        return False
    else:
        with open(file,'a') as f:
            f.write("\n%s" % user)
        return True

#获取商品列表
def get_menu():
    with open(menu_file, 'rb') as f:
        menu = pickle.load(f)
    return menu

#读取用户余额
def get_user_money():
    with open(user_money, 'rb') as f:
        user_money_list = pickle.load(f)
    return user_money_list

#更新用户余额
def update_user_monef(user_money_list):
    with open(user_money, 'wb') as f:
        pickle.dump(user_money_list, f)

#获取购物车内容
def get_shop_car():
    with open(shoping_car_list, 'rb') as f:
        shoping_car = pickle.load(f)
    return shoping_car

#获取当前登录的用户名
def get_user():
    with open(now_user, 'r') as f:
        user = f.read()
    return user

为该用户充值
def add_money(now_money):
    user = get_user()
    user_money_list = get_user_money()
    want = input("是否充值(y/n)")
    while 1:
        if want == 'y':
            money = input("输入金额")
            while 1:
                if money.isdigit():
                    now_money += int(money)
                    break
                else:
                    print("请输入数字")
            user_money_list[user] = now_money
            update_user_monef(user_money_list)
            break
        elif want == 'n':
            break
        else:
            print('输入有误')
            break

#用户支付
def user_pay(all_money):
    user = get_user()
    user_money_list = get_user_money()
    if user_money_list[user] < all_money:
        print("余额不足")
        add_money(user_money_list[user])
    else:
        user_money_list[user] -= all_money
        update_user_monef(user_money_list)
        print("付款成功")
        shoping_car = get_shop_car()
        shoping_car[user].clear()
        update_shop_car(shoping_car)

#更新购物车
def update_shop_car(shoping_car):
    with open(shoping_car_list, 'wb') as f:
        pickle.dump(shoping_car, f)

#添加购物车
def add_shop_car(shoping):
    user = get_user()
    shoping_name,shoping_cost = shoping
    shoping_car = get_shop_car()
    shoping_car[user].update({shoping_name:shoping_cost})
    update_shop_car(shoping_car)
    print(shoping_car)

#清空购物车
def del_shop_car():
    user = get_user()
    shoping_list = []
    while 1:
        shoping_car = get_shop_car()
        all_money = 0
        for i in shoping_car[user].values():
            all_money += i
        menu_list = 1
        for i in shoping_car[user].keys():
            print(menu_list, i)
            shoping_list.append(i)
            menu_list += 1
        print("需付款:%s" % all_money)
        user_money_list = get_user_money()
        print('用户余额:',user_money_list[user])
        num = input("输入数字可移除商品(q:退出,s:结算):")
        if num == 'q':
            break
        elif num == 's':
            user_pay(all_money)
        elif num.isdigit() and int(num) <= len(shoping_list):
            shoping_car[user].pop(shoping_list[int(num)-1])
            shoping_list.pop(int(num)-1)
            update_shop_car(shoping_car)
        else:
            print("输入有误")

#显示列表
def return_menu(f_menu):
    menu_num = 1
    menu_list = []
    for i in f_menu.keys():
        print(menu_num, i)
        menu_list.append(i)
        menu_num += 1
    return menu_list

#显示三级菜单
def third_menu_display(f_menu):
    while 1:
        shop_num = 1
        for i,j in f_menu:
            print("%s 名称:%s\n价格:%s\n\n" % (shop_num,i,j))
            shop_num += 1
        num = input("请输入购入物品的序号(q:退出,b:返回上一级):")
        if num == 'q':
            exit("欢迎下次光临")
        elif num == 'b':
            return True
        elif num.isdigit() and int(num) <= shop_num:
            add_shop_car(f_menu[int(num)-1])
        else:
            continue

#显示二级菜单
def secend_menu_display(f_menu):
    while 1:
        menu_list =return_menu(f_menu)
        num = input("请输入(q:退出,b:返回上一级):")
        if num == 'q':
            exit("欢迎下次光临")
        elif num == 'b':
            return True
        elif num.isdigit() and int(num) <= len(menu_list):
            num = int(num) - 1
            if third_menu_display(f_menu[menu_list[num]]):
                continue
        else:
            continue

#显示一级菜单
def display_first_menu(f_menu):
    while 1:
        menu_list = return_menu(f_menu)
        num = input("请输入(q:退出,e:编辑购物车):")
        if num == 'q':
            exit("欢迎下次光临")
        elif num == 'e':
            del_shop_car()
        elif num.isdigit() and int(num) <= len(menu_list):
            num = int(num)-1
            if secend_menu_display(f_menu[menu_list[num]]):
                continue
        else:
            continue

#登录
def login():
    user_list = []
    while 1:
        user = input("请输入用户名")
        password = input("请输入密码")
        add_black_name(black_name_file, user, user_list)
        if check_blackname(black_name_file, user):
            print("用户被锁定")
            return False
        if check_user(user_list_file, user, password):
            print("登录成功")
            with open(now_user, 'w') as f:
                f.write(user)
            return True
        else:
            print("用户名或密码错误")
            user_list.append(user)

if __name__ == "__main__":
    if login():
        menu = get_menu()
        display_first_menu(menu)
edit_shop_menu.py
#!/usr/bin/env python3
import pickle

shoping_car = {
    'xiaoming':{},
    'xiaoli':{},
    'xiaofang':{}
}

user_money = {
    'xiaoming':10000,
    'xiaoli':10000,
    'xiaofang':10000,
}

menu_list = {
    '电子通讯': {
        '手机': [
            ('iphone12', 6500),
            ('samsunsS33', 7800),
            ('xiaomiMIX8', 4500),
        ],
        '手机配件': [
            ('耳机', 250),
            ('保护壳', 50),
            ('手机膜', 25),
        ],
    },
    '电脑': {
        '联想': [
            ('小新700', 5700),
            ('Y560', 4200),
            ('T567', 8520),
        ],
        'apple': [
            ('mac book', 8890),
            ('mac pro', 12500),
            ('mac air', 12400),
        ],
        'dell': [
            ('MX004', 6500),
            ('laji009', 7800),
            ('sb512', 4512),
        ],
    },
    '成人用品': {
        '避孕': [
            ('duleisi', 40),
            ('gangben', 35),
            ('di6gan', 44)
        ],
        '男用': [
            ('feijibei', 450),
            ('wawa', 1520),
            ('runhuaye', 35),
        ],
        '女用': [
            ("dabangbang", 480),
            ('zhendonghuan', 250),
            ('diwenla', 25)
        ],
    },
}

def define_user_money():
    with open('user_money', 'wb') as f:
        pickle.dump(user_money, f)

def define_shoping_car():
    with open('shoping_car', 'wb') as f:
        pickle.dump(shoping_car, f)

def define_menu():
    with open('menu_list','wb') as f:
        pickle.dump(menu_list,f)

def read_menu():
    with open('menu_list', 'rb') as f:
        dic = pickle.load(f)
    print(dic)

if __name__ == "__main__":
    define_menu()
    define_shoping_car()
    define_user_money()

blackname

xiaoming

userlist

xiaoli 123456
xiaoming asdfgh
xiaofang qwerty

我分享的目的就是大家一起学习。如果对代码有疑问,或者是发现bug,代码还有需要优化的地方,欢迎大家随时给我留言,我会第一时间回复~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值