#功能:1.可註冊賬號2.登錄買家賬號3.可查詢編輯購物車裡商品4.可以餘額充值5.可提示餘額不足6.購物車結算#使用:1.第一次使用先註冊賬號填寫賬號金額2.賬號金額信息保存在buyer_account.txt (預設為空)3.只針對帳號文件里的用戶進行判斷並鎖定,針對用戶和密碼各有三次錯誤重試機...
#功能:
1.可註冊賬號
2.登錄買家賬號
3.可查詢編輯購物車裡商品
4.可以餘額充值
5.可提示餘額不足
6.購物車結算
#使用:
1.第一次使用先註冊賬號填寫賬號金額
2.賬號金額信息保存在buyer_account.txt (預設為空)
3.只針對帳號文件里的用戶進行判斷並鎖定,針對用戶和密碼各有三次錯誤重試機會。
流程圖:
代碼:
#!/usr/bin/env python3 #antuor:Alan from prettytable import PrettyTable import sys,os import getpass,time #用戶註冊函數# def register(): new_username = input('請輸入註冊用戶名:') new_password = input('請輸入新用戶密碼:') bank_money = 0 while True: new_password_again = input('請再次確認新用戶密碼:') ###再次確認密碼 if new_password_again != new_password: ###密碼錯誤則迴圈 continue else: break ###正確則跳出迴圈執行下一個迴圈 while True: bank_money = input('請輸入你要充值的金額:') ###輸入金額數字 if bank_money.isdigit(): ###判斷金額是否為數字 bank_money = int(bank_money) ###金額數字整數化 break else: ###如果金額非數字則不斷迴圈 print('請輸入正確的金額') user_account = "%s %s %d" % (new_username,new_password,bank_money) # file = open('login_account.txt','a+') # save_file = file.write(user_account) # file.close() # print (("++++++++++恭喜你註冊成功:%s++++++++++++") % (user_account)) with open('login_account.txt','a+') as file: ###把用戶信息存入文檔,a+為讀寫追加模式 file.write(user_account+'\n') ###寫入並換行 print (("==============恭喜你註冊成功:%s==============") % (user_account)) print("================請重新登錄你的賬號======================") ############################################################################ def digit_input(s): if str.isdigit(s): #對輸入是否是數字進行判斷 s = int(s) #如果輸出的是個數字,則轉化為整數類型 return s #返回輸入字元 #用戶信息函數# def shopping_func(user='',init_money='',now_money='',recharge_money='',value=''): os.system('clear') #清屏### init_money = int(init_money) #初始總金額數字化 now_money= int(now_money) #當前餘額數字化 recharge_money = int(recharge_money) #充值金額數字化 ###########################通過prettytable模塊將輸出內容如表格方式整齊######### product_page = PrettyTable(['用戶名','金額','當前餘額','充值餘額','購物車']) product_page.align['用戶名'] = '1' #對齊 product_page.add_row([user,init_money,now_money,recharge_money,value]) print(product_page) #商品頁面展示函數# def products_page(my_dict): items_dict = {} #定義函數內部字典 ############對商品列表進行遍歷並加上數字編號########################### i = 1 print('商品列表 : ') print(30*'===') print('%-5s \t %-20s \t%s \t%-10s \t %s' % ('編號','商品名稱','商品價格(元)','商品總數量(個)','商品剩餘數量(個)')) for k in my_dict: v = my_dict[k] if type(v) is dict: print('%-5d %-30s %-10d %-10d %-40d' % (i,k,v['price'],v['sum'],v['num'])) items_dict[i] = [k,v['price'],v['num'],v['sum']] #將商品列表賦值到items_dict i += 1 print(30*'===') return items_dict #返回格式化後的字典 ########################顯示購物車商品列表函數############################# def shopping_cart(show_dict): show_all_sum = 0 #初始化購物車商品總價 show_all_num = 0 #初始化購物車商品數量 ############對商品列表進行遍歷並加上數字編號########################### print('%s ,%s ,%-10s,%s,%s,%s' % ('編號','商品名稱','商品價格(元)','商品總數量(個)','購買數量(個)','購買金額(元)')) for k in show_dict: v = show_dict[k] if type(v) is list: print('%-5s \t %-20s \t %-10d \t %-10d \t %-10d \t %-10d' % (k,v[0],v[1],v[2],v[3],v[4])) show_all_sum += v[4] #商品總價累計 show_all_num += 1 #商品個數累計 print('請確認您購買商品,總金額:%d(元)'.center(84,'#') % show_all_sum) return (show_all_sum,show_all_num) #返回商品總價和商品個數 #編輯購物車商品函數# def shopping_cart_edit(modify_dict,modify_goods_dict): a_flag = 1 #初始化第一層編號迴圈標記 while a_flag: index = input('請輸入商品編號 | 完成修改(q) : ') if len(index) != 0: #商品編號不為空進行字元轉化 index = digit_input(index) #調用函數(自建) if index == 'q': #輸入為q,即完成修改退出 break elif index in modify_dict: #輸入為正確編號### b_flag = 1 #初始化第二層數量迴圈標記 name = modify_dict[index][0] #對name賦值商品名稱 while b_flag: num = input('請輸入新的商品數量(最大值為%d) | 完成修改(q) : ' % modify_dict[index][2] ) if len(num) != 0: #商品數量不為空進行字元轉化### num = digit_input(num) if num == 'q': #輸入為q,即完成修改退出### break elif num == 0: #輸入為0,即刪除字典中的這個條目 modify_goods_dict[name]['num'] = modify_dict[index][2] #商品列表中的商品數量變為初始值 del modify_dict[index] #購物車刪除這個商品 b_flag = 0 elif num > 0 and num <= modify_dict[index][2]: #輸入為要求數字,則進行數量和金額修改 modify_dict[index][3] = num modify_dict[index][4] = modify_dict[index][1] * num modify_goods_dict[name]['num'] = modify_dict[index][2] - num #更新商品列表中的商品數量 b_flag = 0 else: pass else: pass return (modify_dict,modify_goods_dict) ###返回修改後的購物車商品列表### #購物車展示函數# def shopping_cart_show(my_cart,my_goods_dict): print('歡迎來到您的購物車'.center(80,'#')) goods_all_sum = 0 ###初始化購物車商品總金額### goods_all_num = 0 ###初始化購物車商品總數量### if my_cart: ###購物車參數不為空### ###########調用購物車商品列表函數,並返回商品總金額和總數量######### (goods_all_sum,goods_all_num) = shopping_cart(my_cart) choice = input('請進行如下操作 : 修改記錄(c) | 繼續購物(!c)') if choice == 'c': ###對購物車商品列表進行修改### (my_shop_cart,my_goods_dict) = shopping_cart_edit(my_cart,my_goods_dict) ###調用商品修改函數,並返回新的商品列表### (goods_all_sum,goods_all_num) = shopping_cart(my_shop_cart) ###購物車商品展示,並返回最新的商品總價### else: pass else: print('當前您的購物車為空'.center(80,' ')) time.sleep(2) return (goods_all_sum,goods_all_num,my_goods_dict) #購物車中商品總價、數量和用戶商品列表# #餘額充值函# def balance_recharge(recharge_init_balance,recharge_now_balance,recharge_money): recharge_flag = 1 #充值迴圈參數初始化### while recharge_flag: recharge_num = input('請輸入充值金額 | 返回(b) | 退出(q):') if len(recharge_num) != 0: #如果輸入非空,對輸入進行判斷並轉化類型 recharge_num = digit_input(recharge_num) if recharge_num == 'q': #如果輸入為q,則退出程式 sys.exit(0) elif recharge_num == 'b': #如果輸入為b,則返回第一層迴圈,重新選擇商品編號 break elif type(recharge_num) is int and recharge_num > 0 : #輸入要求充值金額 recharge_init_balance += recharge_num #初始金額增加 recharge_now_balance += recharge_num #當前餘額增加 recharge_money += recharge_num #充值金額增加 recharge_flag = 0 #改變充值迴圈參數 print('充值成功,請查收'.center(80,' ')) #提示充值成功 else: pass return (recharge_init_balance,recharge_now_balance,recharge_money) #返回初始、當前、充值金額 #用戶結帳函數# def pending_order(billing_list,my_cart,billing_balance): print('歡迎來到結算菜單'.center(80,'#')) if my_cart: #購物車參數不為空 #############調用購物車商品列表函數################################ shopping_cart(my_cart) billing_flag = input('請確認是否商品結算(y | n):') if billing_flag == 'y': #商品結算確認 billing_file = open('buyer_account','w') #打開讀寫帳號文件 for user_info in billing_list: billing_file.writelines(user_info) #回寫用戶列表信息 billing_file.close() #關閉帳號文件 sys.exit('結帳成功,你當前餘額 :%d'.center(80,' ') % billing_balance) else: print('退出結算菜單,繼續購物'.center(80,' ')) time.sleep(2) else: print('當前您的購物車為空,無需結算'.center(80,' ')) time.sleep(2) ################################主程式開始################################## ################################商品列表#################################### goods_list = { 'iphone6s': {'price':6000,'num':10,'sum':10}, #num為當前庫存,sum為商品總數量 'ipad pro': {'price':3000,'num':20,'sum':20}, 'Bike': {'price':2000,'num':15,'sum':15}, 'DLS Camera': {'price':1999,'num':8,'sum':8}, 'macbook pro': {'price':14000,'num':5,'sum':5}, 'macbook air': {'price':7000,'num':10,'sum':10}, 'Fountain Pen':{'price':15,'num':50,'sum':50}, } ######用戶註冊,寫入login_account.txt文件里###################### ask_question = input('是否已經有賬號? y|n:') ###是否有賬號,是則登錄,不是則註冊 while True: if ask_question == 'y': break else: register() ###調用登錄函數 break ############################################################## i = 0 while i < 3: ###只要用戶登錄異常不超過3次就不斷迴圈### username = input('請輸入用戶名:') ###輸入用戶名### password = input('請輸入密碼:') ###輸入隱藏密碼### user_file = open('login_account.txt','r') ###打開帳號文件### #next(user_file) user_list = user_file.readlines() ###用戶列表信息### user_file.close() ###關閉帳號文件### for user_line in user_list: #對帳號文件進行遍歷,因為只有三個用戶,所以只讀前3行 ######################分別獲取帳號、密碼信息和當前餘額############## (user,passwd,init_balance) = user_line.strip('\n').split() init_balance = int(init_balance) ###對總金額進行數字化### now_balance = init_balance ###對當前餘額進行數字化### my_goods_sum = 0 ###初始化購買商品總金額### if username == user and password == passwd: ###如用戶名和密碼正常匹配### user_shopping_cart = {} ###初始化用戶購物車字典### user_shopping_cart_count = 0 ###初始化用戶購物車內商品的數量### recharge_value = 0 ###初始化充值金額### line_num = user_list.index(user_line) ###賦值匹配用戶的下標### first_flag = 1 ###定義第一層迴圈變數參數### while first_flag: ########################調用框架函數輸出用戶信息############ shopping_func(username,init_balance,now_balance,recharge_value,user_shopping_cart_count) goods_output_dict = products_page(goods_list) ###調用商品列表展示函數輸出商品信息### goods_index = input('請選擇菜單 :輸入商品編號 | 購物車(c) | 餘額充值(r) | 結帳(b) | 退出(q) : ') if len(goods_index) != 0: ###如果輸入非空,對輸入進行判斷並轉化類型### goods_index = digit_input(goods_index) if goods_index == 'q': ###如果輸入為q,則退出程式### sys.exit(0) elif goods_index == 'c': ###如果輸入為c,則展示購物車### ###調用購物車顯示函數,並返回購物車商品總金額########### (my_goods_sum,user_shopping_cart_count,goods_list) = shopping_cart_show(user_shopping_cart,goods_list) now_balance = init_balance - my_goods_sum ###計算出當前餘額### if now_balance < 0: print('您的餘額不足,請及時充值,謝謝') time.sleep(2) elif goods_index == 'r': ###如果輸入為r,則進行餘額充值### (init_balance,now_balance,recharge_value) = balance_recharge(init_balance,now_balance,recharge_value) elif goods_index == 'b': ###如果輸入為b,則進入結賬菜單### ##############更新用戶文件中用戶的餘額################## user_list[line_num] = user + ' ' + passwd + ' ' + repr(now_balance) + '\n' pending_order(user_list,user_shopping_cart,now_balance) ###調用結算函數### elif goods_index in goods_output_dict: ###輸入編號為正確的商品編號### ###############################取出goods_index商品列表信息併進行賦值和展示############ (goods_name,goods_price,goods_num) = (goods_output_dict[goods_index][0], goods_output_dict[goods_index][1], goods_output_dict[goods_index][2]) print('【 編號:%-5d \t 名稱:%-15s \t 價格:%-5d(元) \t 數量:%-5d(個)】' % (goods_index,goods_name,goods_price,goods_num)) second_flag = 1 ###定義第二層迴圈變數參數### while second_flag: buy_num = input('請輸入購買商品個數(最大值為%d) | 返回(b) | 退出(q): ' % goods_num) if len(buy_num) != 0: ###如果輸入非空,對輸入進行判斷並轉化類型### buy_num = digit_input(buy_num) if buy_num == 'q': ###如果輸入為q,則退出程式### sys.exit(0) elif buy_num == 'b': ###如果輸入為b,則返回第一層迴圈,重新選擇商品編號### break elif type(buy_num) is int and buy_num > 0 and buy_num <= goods_num: ###輸入要求商品數量### my_goods_sum = goods_price * buy_num ###計算購買商品的總金額### if my_goods_sum <= now_balance: print('購買商品 %s 總價格為 : %d' % (goods_name,my_goods_sum)) add_flag = input('請確認是否加入購物車(y | n):') if add_flag == 'y': ###購買商品確認加入購物車### ###判斷購物車不存在該商品############### if goods_index not in user_shopping_cart: user_shopping_cart_count += 1 ###購物車裡商品數量加1### ####將該商品加入用戶購物車字典中#### user_shopping_cart[goods_index] = [goods_name,goods_price,goods_num,buy_num,my_goods_sum] ####購物車已經存在該商品,則進行數量和金額累計計算############ else: user_shopping_cart[goods_index][3] += buy_num user_shopping_cart[goods_index][4] += my_goods_sum now_balance -= my_goods_sum ###計算出當前餘額### goods_list[goods_name]['num'] -= buy_num ###商品列表的商品數量更新### second_flag = 0 ###設置第二層迴圈值為0,結束第二層迴圈#### else: break else: print('您的餘額不足,請充值或重新選擇,謝謝') time.sleep(2) else: pass else: pass else: if i != 2: ###i=2時,最後一次機會,不在提示還剩餘0次機會了## print('用戶或密碼錯誤,請重新輸入,還有 %d 次機會' % (2 - i)) i += 1 ###當用戶輸入錯誤時,迴圈值增加1### else: sys.exit('用戶或密碼輸入錯誤超過三次,退出系統,歡迎下次光臨') #三次錯誤後,異常退出###