Python-簡單購物

模擬簡單購物程序:
主要功能:
       (1) 打印商品列表,通過選擇商品編號選擇商品
       (2) 選擇商品進行購物、加入到購物車,最後統一結算
       (3) 查看購物車
       (4) 賬戶充值
       (5) 查看賬戶餘額


設計思路:
       首先定義2個全局的變量,分別保存用戶的賬戶金額、購物車列表
       用戶選擇商品的編號,如果編號存在就將商品加入到購物車的變量列表中,繼續添加。不在購買後提示結算,調用驗證裝飾器登陸
       扣款時先判斷選擇商品的價格是否小於用戶的賬戶金額
       在需要涉及到金額的操作,比如 購物車扣款、查詢餘額、充值等操作時必須先登陸,從文件中獲取餘額信息,此操作使用裝飾器來做




流程圖:



程序源碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import os
import json

# 保存用戶金額變量
USER_ACCOUNT = 0
# 保存用戶購物車商品
USER_SHOPPING_CART = []
# 用戶登陸標識
USER_LOGIN_STATUS = False
USER_NAME = ''
# 用戶賬戶信息數據庫
USER_INFO = os.path.join(os.path.dirname(os.path.abspath(__file__)),'userinfo.txt')


# 歡迎信息
def print_welcome_menu():
    menu_list = "=====================================================\n" \
                "=                                                   =\n" \
                "=              WELCOME TO SHOPPING MARKET           =\n" \
                "=                                                   =\n" \
                "====================================================="
    return menu_list


def print_choose_menu():
    choose_menu = "\n1. 進入購物商城\n" \
                  "2. 查看賬戶餘額\n" \
                  "3. 查看購物車\n"\
                  "4. 給賬戶充值\n" \
                  "5. 退出系統"
    return choose_menu


# 商品信息
def goods_list():
    goodslist = (
        {'no': '001', 'name': '聯想筆記本電腦', 'price': 5000},
        {'no': '002', 'name': '手機Iphone 6S', 'price': 3000},
        {'no': '003', 'name': '耐克籃球鞋', 'price': 700},
        {'no': '004', 'name': 'Python源碼分析', 'price': 80},
        {'no': '005', 'name': '三星固態硬盤', 'price': 1000},
    )
    return goodslist


# 獲取漢字個數
def get_chinese_num(uchar):
    i = 0
    for utext in uchar:
        if u'\u4e00' <= utext <= u'\u9fa5':
            i += 1
    return i


# 打印商品信息
def print_goods_list(lists):
    """
    此功能模塊用來打印商品信息,包括打印商場的所有商品信息、用戶的購物車中的商品信息
    :param lists: 保存商品的變量(list類型) goodslist
    :return: 返回格式化後的菜單
    """
    _goodlist = lists
    a=('\n|' + '商品編號'.center(16) + '|' + '商品名稱'.center(23) + '|' + '商品價格(RMB)'.center(22) + '|')
    print(a)
    print('%s' % '-' * 77)
    for goods in _goodlist:
        chinese_num = get_chinese_num(goods['name'])
        space_str = (27  - chinese_num)
        print('|%s|%s|%s|' % (goods['no'].center(20), goods['name'].center(space_str), str(goods['price']).center(26-get_chinese_num(str(goods['price'])))))


# 登陸認證裝飾器
def user_auth(func_name):
    def login(*args):
        global USER_ACCOUNT, USER_LOGIN_STATUS, USER_NAME
        if not USER_LOGIN_STATUS:
            print('請先登陸賬號!')
            with open(USER_INFO,'r') as f:
                user_Info = json.loads(f.read())
                user_list = user_Info.keys()
            while not USER_LOGIN_STATUS:
                user_name = input('請輸入賬戶用戶名:').strip().lower()
                user_passwd = input('請輸入賬戶密碼:')

                if user_name in user_list:
                    if user_passwd == user_Info[user_name]['password']:
                        USER_ACCOUNT = user_Info[user_name]['balance']
                        USER_NAME = user_name
                        USER_LOGIN_STATUS = True
                        print('\n登陸成功!\n')
                    else:
                        print('\n賬號密碼不正確,請重新輸入!')
                        continue
                else:
                    print('\n賬號不存在!')

        func_name(*args)
    return login


# 保存賬戶餘額到文件
def update_user_info():
    global USER_NAME
    with open(USER_INFO,'r') as fr:
        user_info = json.loads(fr.read())
    user_info[USER_NAME]['balance'] = USER_ACCOUNT
    with open(USER_INFO,'w+') as fw:
        fw.write(json.dumps(user_info))


# 根據商品編號判斷商品是否存在
def check_goods_id_exist(gid):
    """
    檢測輸入的商品編號是否存在
    :param gid: 用戶輸入的商品編號
    :return: 存在狀態:True/False
    """
    is_exist_flag = False
    for goods in goods_list():
        if goods['no'] == gid:
            is_exist_flag = True
    return is_exist_flag


# 根據商品編號獲取商品
def get_goods_by_gid(gid):
    """
    獲取商品信息模塊:根據用戶輸入商品編號獲取商品信息
    :param gid: 商品編號
    :return: 商品信息字典 {'no': '004', 'name': 'Python源碼分析', 'price': 80}
    """
    _good_list = goods_list()
    for goods in _good_list:
        if goods['no'] == gid:
            return goods


# 給賬戶充值
@user_auth
def count_add_momey():
    """
    賬戶充值模塊:默認賬戶餘額爲0,USER_ACCOUNT 全局變量
    :return:
    """
    global USER_ACCOUNT
    add_money = input('請輸入您要充值的金額:').strip()

    # 輸入必須爲數字,檢查是否合法
    while len(re.findall('[^0-9]', add_money)) > 0:
        print('\n\033[1;31m輸入的金額不合法,必須爲數字,請重新輸入\033[0m!\n')
        add_money = input('請輸入您要充值的金額:').strip()

    USER_ACCOUNT += int(add_money)
    # 更新賬戶餘額
    update_user_info()
    print('\n\033[1;32m充值成功! 您當前的賬戶餘額爲: %d 元 \033[0m\n' % USER_ACCOUNT)


# 購物車結算
@user_auth
def pay_for_shopping_cart(list_goods):
    """
    對購物車的商品進行結算,如果結算成功返回True,否則返回False
    :param list_goods: 購物車列表
    :return: True / False
    """
    global USER_ACCOUNT,USER_SHOPPING_CART
    total_fee = 0
    return_flag = False

    if not list_goods:
        print('\n\033[1;31m您當前的購物車無任何商品信息!\033[0m\n')
    else:
        # 開始對購物車的商品計算總費用
        for goods in list_goods:
            total_fee += goods['price']
        # 賬戶金額夠的話開始扣費
        if USER_ACCOUNT >= total_fee:
            USER_ACCOUNT -= total_fee

            # 更新文件中的賬戶餘額信息
            update_user_info()
            print('\n\033[1;32m商品結算成功!,共消費 %d 元,賬戶餘額 %d 元\033[0m\n' % (total_fee,USER_ACCOUNT))

            # 結算成功後本次的購物車將清空,可以寫入日誌文件做歷史記錄,此功能沒做
            USER_SHOPPING_CART = []
            return_flag = True
        else:
            print('\n\033[1;31m餘額不足!您當前賬戶餘額爲 %d,無法結算,請先充值!\033[0m\n' % USER_ACCOUNT)

    return return_flag


@user_auth
def get_user_account():
    global USER_ACCOUNT
    print('\n\033[1;32m您當前的賬戶餘額爲 %d 元.\033[0m\n' % USER_ACCOUNT)


# 購物模塊
def do_shopping():
    """
    商品購物模塊,將選擇的商品加入到購物車,並進行商品結算
    :return:
    """
    global USER_ACCOUNT
    # 是否繼續購買商品標示
    choose_loop_flag = True

    while choose_loop_flag:
        # 打印商品菜單列表
        print_goods_list(goods_list())
        goods_no = input('\n請選擇要購買的商品編號(quit 返回主菜單): ').strip().lower()

        # 退出購物菜單,返回主功能菜單
        if goods_no == "quit":
            choose_loop_flag = False
            continue

        # 如果輸入的商品編號不存在
        if not check_goods_id_exist(goods_no):
            print('\n\033[1;31m您輸入的商品編號不存在,請重新選擇\033[0m\n')
            continue
        else:
            # 獲得商品信息
            choose_goods = get_goods_by_gid(goods_no)

            # 將商品保存到購物車
            USER_SHOPPING_CART.append(choose_goods)
            goods_count_in_cart = len(USER_SHOPPING_CART)
            # 打印購物車信息
            print_goods_list(USER_SHOPPING_CART)

            goon_shop_flag = input(
                '\n已加入購物車,當前共%d件商品,是否繼續購買[y/n]:' % goods_count_in_cart).strip().lower()
            if goon_shop_flag == 'n':
                choose_loop_flag = False
                continue
    # 如果購物車不爲空
    if USER_SHOPPING_CART:
        pay_or_quit_flag = input('\n 現在結算商品嗎(y/n)?不結算將返回功能菜單!')
        if pay_or_quit_flag == "y":
            pay_for_shopping_cart(USER_SHOPPING_CART)


# 開始主程序
if __name__ == "__main__":
    # 用戶退出系統標識
    exit_sys_flag = True
    print(print_welcome_menu())

    while exit_sys_flag:
        # 顯示功能主菜單
        print(print_choose_menu())
        choose = input('\n請選擇功能編號[1-5]:')

        # 選擇退出系統? 退出循環
        if choose == "5":
            exit_sys_flag = False
            break

        # 不在選擇的菜單中,重新選擇
        if choose not in ('1', '2', '3', '4','5'):
            print('\n您選擇的功能編號不存在,請重新選擇!\n')
            continue

        # 選擇購物菜單
        if choose == "1":
            do_shopping()
            continue

        # 選擇查看賬戶餘額
        if choose == "2":
            get_user_account()
            continue

        # 查看購物車
        if choose == "3":
            if len(USER_SHOPPING_CART) > 0:
                print_goods_list(USER_SHOPPING_CART)
                pay_flag = input('\n現在要結算嗎?(y/n):').strip().lower()
                if pay_flag == 'y':
                    pay_for_shopping_cart(USER_SHOPPING_CART)
            else:
                print('\n\033[1;31m您當前的購物車無任何商品信息!\033[0m\n')
            continue

        # 賬戶充值
        if choose == "4":
            count_add_momey()
            continue

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章