主要功能:
(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