[ python ] 購物系統


作業需求

1. 購物系統,能夠注冊登錄,用戶第一次登錄后,讓用戶輸入金額,然后打印商品列表
2. 允許用戶根據商品編號購買商品
3. 用戶選擇商品后,檢測余額是否夠,夠就直接扣款,不夠就提醒
4. 購買完一件商品后打印購物清單及余額
5. 可隨時查看購物清單和退出
6. 如果用戶多次購買同一商品,必須合並商品數量和價格信息
7. 用戶下次登錄時,可查看之前的消費記錄

 

流程圖

 

README

1. 通過分析需求,使用面向過程和函數式編程的方式更好;
2. 文件序列化通過 pickle實現永久存儲;
3. 每個用戶信息用獨立的數據文件來存儲;
4. 要求輸入數字的地方只能輸入正整數;
5. 第二次購買的商品如果同第一次購買的相同,則在第一次商品信息上進行疊加。

 

程序代碼

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey

import os, pickle


def file_oper(file, mode, *args):
    '''
    通過pickle序列化持久存儲數據信息
    :param file: 不同的用戶生成不同的數據文件,文件名+'.db'
    :param mode: 對數據文件的操作,讀取還是寫入
    :param args: 需要寫入的數據信息
    :return: 返回讀取數據文件的信息
    '''
    if mode == 'wb':
        data = args[0]
        with open(file, mode) as f:
            pickle.dump(data, f)
    elif mode == 'rb':
        with open(file, mode) as f:
            data = pickle.load(f)
            return data


def user(user, pwd, mode):
    '''
    用戶注冊及登錄
    :param user: 用戶輸入的用戶名
    :param pwd:  用戶輸入的密碼
    :param mode: 注冊還是登錄
    :return: 登錄成功,返回用戶信息;登錄失敗,返回 None
    '''
    db_file = user + '.db'
    # 用戶注冊
    if mode == 'regist':
        if not os.path.isfile(db_file):
            user_info = {'name': user, 'passwd': pwd, 'stat': 0}
            file_oper(db_file, 'wb', user_info)
            print('\033[32;1m注冊成功.\033[0m')
        else:
            print('\033[31;1m錯誤:該用戶已存在.\033[0m')
    # 用戶登錄
    elif mode == 'login':
        if os.path.isfile(db_file):
            dict_user = file_oper(db_file, 'rb')
            if dict_user['name'] == user and dict_user['passwd'] == pwd:
                print('\033[32;1m登錄成功.\033[0m')
                return dict_user
            else:
                print('\033[31;1m錯誤:用戶名密碼錯誤。\033[0m')
        else:
            print('\033[31;1m錯誤:該用戶不存在.\033[0m')


def shopping(user_dict, list_goods):
    '''
    用戶購物信息
    :param user_dict: 用戶信息
    :param list_goods: 商品列表
    '''

    # 判斷購物車內是否有商品
    if user_dict['shopping_car']:
        list_shopping = user_dict['shopping_car']
    else:
        list_shopping = []
    while True:
        print('\033[32;1m商品列表\033[0m'.center(50, '#'))
        for i, k in enumerate(list_goods):
            print('序號:%s\t商品名:%s\t\t價格:%s' % (i, k['name'], k['price']))
        choice = input('\033[34;1m購買請輸入商品序號[t 查看購物清單 q 退出]:\033[0m').strip()
        if not choice: continue
        # 用戶輸入大小寫 'q' 都是退出
        if choice.upper() == 'Q':
            break
        # 購買商品必須輸入商品范圍類的數字
        if choice.isdigit() and 0 <= int(choice) < len(list_goods):
            num = input('\033[34;1m輸入購買的數量:\033[0m').strip()
            if num.isdigit():
                num = int(num)
            else:
                print('\033[31;1m錯誤:數量必須是正整數.\033[0m')

            # 獲取用戶輸入的商品信息,並生成商品字典
            good = {'name': list_goods[int(choice)]['name'], 'num': num,
                    'total_prices': list_goods[int(choice)]['price'] * num}
            # 獲取用戶的余額
            money = user_dict['money']
            # 用戶的余額 - 商品的總價
            res_money = money - good['total_prices']
            if res_money >= 0:
                # 這里目前沒有想到好的處理辦法,只能使用標記來做判斷
                # 默認 flag 為 True,因為用戶一次只能購買一件商品,如果用戶購買的是重復的商品,就將購買過的商品信息合並,
                # 然后將 flag 設置為 False
                flag = True
                for i in list_shopping:
                    if good['name'] == i['name']:
                        i['num'] += good['num']
                        i['total_prices'] += good['total_prices']
                        flag = False
                # 當flag = True 說明用戶沒有購買重復的商品,添加新商品到購物清單;反之則購買了重復的商品 flag = False
                if flag:
                    list_shopping.append(good)
                print('\033[32;1m購買成功!\033[0m\n')
                print('\033[32;1m購物清單\033[0m'.center(50, '#'))
                for i in list_shopping:
                    print('商品名:%s\t數量:%s\t總價:%d元' % (i['name'], i['num'], i['total_prices']))
                print('\033[33;1m您的余額為:%d元\033[0m' % res_money)
                print('##########################################\n')
                # 修改購物后的用戶余額信息
                user_dict['money'] = res_money
                # 修改購物清單信息
                user_dict['shopping_car'] = list_shopping
                # 將修改后的數據寫入數據文件
                file_oper(user_dict['name'] + '.db', 'wb', user_dict)
            else:
                print('\033[31;1m錯誤:商品總價為:%d元,您的余額為:%d元,購物失敗.\033[0m' % (good['total_prices'], money))

        elif choice.upper() == 'T':
            print('\033[32;1m購物清單\033[0m'.center(50, '#'))
            for i in list_shopping:
                print('商品名:%s\t數量:%s\t總價:%d元' % (i['name'], i['num'], i['total_prices']))
            print('\033[33;1m您的余額為:%d元\033[0m' % user_dict['money'])
            print('##########################################\n')
            any = input('\033[34;1m任意鍵返回商品列表\033[0m').strip()
            continue
        else:
            print('\033[31;1m錯誤:輸入商品序號錯誤。\033[0m')


def start(list_goods):
    while True:
        print('1. 注冊\n'
              '2. 登錄\n'
              '3. 退出')
        choice = input('>>>').strip()
        if not choice: continue
        if choice.isdigit() and 0 < int(choice) < 4:
            if choice == '1':
                username = input('\033[34;1m輸入用戶名:\033[0m').strip()
                password = input('\033[34;1m輸入密碼:\033[0m').strip()
                user(username, password, 'regist')

            elif choice == '2':
                username = input('\033[34;1m輸入用戶名:\033[0m').strip()
                password = input('\033[34;1m輸入密碼:\033[0m').strip()
                user_dict = user(username, password, 'login')
                # 當 user(username, password, 'login') 返回 None表示登錄失敗
                if user_dict is None:
                    continue
                # user_dict['stat'] = 0 表示用戶第一次登錄,user_dict['stat'] 非零則表示用戶多次登錄
                if user_dict['stat'] == 0:
                    money = input('\033[34;1m首次登錄,請輸入充值金額:\033[0m').strip()
                    if money.isdigit():  # 這里無法判斷小數類型
                        user_dict['money'] = int(money)
                        # 第一次登錄設置成功金額后,將 stat 設置為非零
                        user_dict['stat'] = 1
                        user_dict['shopping_car'] = []
                        print('\033[32;1m恭喜:充值成功!\033[0m')
                        shopping(user_dict, list_goods)

                    else:
                        print('\033[31;1m錯誤:金額只能是正整數!\033[0m')
                # user_dict['stat'] = 0 表示用戶第一次登錄,user_dict['stat'] 非零則表示用戶多次登錄
                else:
                    shopping(user_dict, list_goods)
            elif choice == '3':
                break
        else:
            print('\033[31;1m錯誤:序號輸入錯誤.\033[0m')


if __name__ == '__main__':
    # 商品列表
    list_goods = [
        {'name': '蘋果', 'price': 10},
        {'name': '鴨梨', 'price': 20},
        {'name': '芒果', 'price': 30},
    ]

    start(list_goods)
shopping.py

 

 

部分運行截圖:

 

圖1:

 

圖2:

 

 

 

圖3:

 

圖4:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM