7.11 练习6-简单实现购物系统(300行代码)

7.11 练习6-简单实现购物系统(300行代码)

实现功能:0:注册;1:登录;2:购物;3:购物车;4:结账;q:退出

user_info_dict=dict() #记录用户登录信息:用户名:name,密码:password,余额:15000,锁定状态:0

shopping_car_dict=dict()  #购物车字典:{商品名称:[价格,购买数量]}

#以下为辅助函数

def input_username_pwd():
    '''
    输入用户名密码
    :return:
    '''
    username = input("username>>").strip()
    password = input("password>>").strip()
    return username,password

def save_file_a(filename,content):
    '''
    a模式文件
    :param filename: 文件名
    :param content: 写入内容
    :return:
    '''
    with open(filename, 'a', encoding='utf-8') as f_a:
        f_a.write(content)

def save_file_w(filename,content):
    '''
    w模式保存文件
    :return:
    '''
    with open(filename, 'w', encoding='utf-8') as f_w:
        f_w.write(content)

    return True

def read_file(filename):
    '''
    r模式读取文件
    :return:
    '''
    with open(filename, 'r', encoding='utf-8') as f_r:
        data_list=f_r.readlines()#每一行作为列表元素
    return data_list

def total_price():
    '''
    打印购物车内商品清单,计算购物车内商品总金额
    :return: 总金额
    '''
    goods_price_total = 0
    print('您的购物车有如下产品')

    # shopping_goods:产品名称,goods_price_num:(价格,购买数量)
    for shopping_goods in shopping_car_dict:
        print(f'{shopping_goods}数量为{shopping_car_dict[shopping_goods][1]}')

        num = shopping_car_dict[shopping_goods][1]
        price = shopping_car_dict[shopping_goods][0]
        goods_price_total += num * price  # 总价格
    return goods_price_total

def login_deco(func):
    def wrapper(*args, **kwargs):
        if not user_info_dict:

            login_res=login()
            if login_res==True:
                res=func(*args, **kwargs)
                return res
            else:
                print('登录失败!!')
        res=func(*args, **kwargs)
        return res
    return wrapper


#以下为主要功能函数
def register():
    '''
    注册
    :return:
    '''
    print('\033[1;31;40m欢迎使用注册功能!!\033[0m'.center(50,'-'))

    while True:
        username, pwd = input_username_pwd()

        # 判断用户名是否存在
        user_info_data_list = read_file('7.11userinfo.txt')

        for user_info in user_info_data_list:
            user_list=user_info.strip().split(':')
            username_file = user_list[0]
            if username_file == username:
                print('用户名已存在,请重新注册!!')
                break

        else:
            save_file_a('7.11userinfo.txt', f'{username}:{pwd}:15000:0\n')
            print('注册成功!!')
            break


def login():

    '''
    登录三次不成功后退出
    :return:
    '''
    print('\033[1;31;40m欢迎使用登录功能!!\033[0m'.center(50,'-'))
    count=0
    while count<3:
        username, pwd = input_username_pwd()

        user_info_data_list = read_file('7.11userinfo.txt')
        for user_info in user_info_data_list:
            #姓名,密码,余额,锁定状态
            user_list = user_info.strip().split(':')
            username_file = user_list[0]
            pwd_file = user_list[1]
            extra=int(user_list[2]) #余额
            lock_num=user_list[3] #注意转换为整型判断
            lock_num_int=int(lock_num)

            if username_file == username and pwd_file == pwd:
                if lock_num_int == 0:
                    print('登陆成功!')
                    user_info_dict['username']=username_file
                    user_info_dict['pwd']=pwd_file
                    user_info_dict['extra']=extra
                    user_info_dict['lock_num']=lock_num

                    return True
                else:
                    print('账户已冻结!')
                    return False
        else: #for 循环没有被break/return 时执行
            count += 1
            if count==3:
                return False
            print('账号密码错误,请重新输入')




@login_deco
def shopping():
    '''
    购物
    :return:
    '''
  
    print('\033[1;31m欢迎使用购物功能!!\033[0m'.center(50,'-'))

    goods_dict={
        '0': ('book',100),
        '1': ('cup', 1000),
        '2': ('car', 100000),
        '3': ('watch', 50000),
        '4': ('iphone', 10),
        '5': ('apple', 15),
        'q': '退出'

    }
    while True:
        print('商品清单如下:')
        for ind,goods in goods_dict.items():
            print(ind,goods)

        #商品序号
        goods_choice = input('请选择你要加购的商品序号(q退出)>>').strip()
        if goods_choice == 'q': break
        if goods_choice not in goods_dict:
            print('输入错误,请重新输入!!')
            continue

        #goods_num_choice:商品数量
        goods_num_choice=input(f'请输入你要加购商品的数量(q退出)>>').strip()
        if goods_num_choice == 'q': break
        if not goods_num_choice.isdigit():
            print('数量输入错误,请重新输入')
            continue
        goods_num_choice_int=int(goods_num_choice)

        #shopping_goods:购买的商品名称
        shopping_goods=goods_dict[goods_choice][0]
        print(f'你购买的{goods_num_choice_int}件{shopping_goods}已经加入购物车,请前往购物车查看。')
        #记录购买商品和数量
        if not shopping_car_dict.get(shopping_goods):
            shopping_car_dict[shopping_goods]=[goods_dict[goods_choice][1],goods_num_choice_int]
        else:
            shopping_car_dict[shopping_goods][1]+=goods_num_choice_int
        print(shopping_car_dict)



@login_deco
def shopping_car():
    '''
    购物车
    :return:
    '''
    

    if len(shopping_car_dict)==0:
        print('购物车为空,请去商城添加需要购买商品!!')
        return

    #记录已加入购物车商品名称列表,方便用户选择
    # [('cup', 1000)]
    shopping_goods_list = []
    for goods in shopping_car_dict:
        # goods:(商品名,价格)
        shopping_goods_list.append(goods)
    print('\033[1;34m欢迎使用购物车功能!!\033[0m'.center(50, '-'))

    # 打印购物车信息,计算总价
    while True:
        goods_price_total = total_price()

        if goods_price_total <= user_info_dict['extra']:
            print('请前往结账功能买单!!')
            break
        if goods_price_total > user_info_dict['extra']:

            print('余额不足,无法购买,平台无法充值,请修改购物数量。')

            while True:

                print('您的购物车有如下产品')

                for ind, goods in enumerate(shopping_goods_list):
                    print(f'{ind}:{goods}-{shopping_car_dict[goods][1]}件')

                modify_ind = input('请选择你要修改的产品编号(q退出)>>').strip()

                if modify_ind == 'q': break

                modify_ind = int(modify_ind)

                modify_num = input('请选择你要修改的商品数量(q退出)').strip()

                if modify_num == 'q': break

                modify_num = int(modify_num)

                shopping_car_dict[shopping_goods_list[modify_ind]][1] = modify_num


@login_deco
def chek():
    '''
    结账
    :return:
    '''
    print('\033[1;32m欢迎使用结账功能!!\033[0m'.center(50,'-'))
    shopping_goods_list = []


    for goods in shopping_car_dict:
        # goods:(商品名,价格)
        shopping_goods_list.append(goods)
    goods_price_total=total_price()

    if goods_price_total<=user_info_dict['extra']:
        print('结账中')
        print(f'您的余额为{user_info_dict["extra"]},商品总价为{goods_price_total}')
        Confirm=input('是否确认支付:y/n (n退出系统)>>')
        if Confirm == 'y':
            user_info_dict['extra'] -= goods_price_total
            print(f'结账成功!!\n您的余额为{user_info_dict["extra"]}\n祝您购物愉快!!')


            #清空购物车
            shopping_car_dict.clear()
        else:
            print('您已取消支付!!')
            return

#功能字典
func_dict={
    0:register,
    1:login,
    2:shopping,
    3:shopping_car,
    4:chek,
    'q':quit
}

func_msg='''
0:注册;1:登录;2:购物;3:购物车;4:结账;q:退出
'''

while True:
    print(func_msg)

    func_choice=input('请输入你想要使用的功能>>').strip()

    #退出
    if func_choice=='q':
        print('您已退出系统')
        break
    #判断非法输入
    if not func_choice.isdigit():
        print('非法输入,请重新选择')
        continue


    func_choice_int=int(func_choice)
    if func_choice_int not in func_dict:
        print('非法输入,请重新选择')
        continue

    # 正常输入
    func_dict[func_choice_int]()

posted @ 2025-08-28 21:04  bokebanla  阅读(8)  评论(0)    收藏  举报