1. 程式人生 > >第二周作業 - 簡單購物車

第二周作業 - 簡單購物車

usr 函數 輸入 lob imp 字符串 val 獲取 可能

簡單購物車程序

1、功能:登錄、註冊、購物、支付、充值、退出

2、註:

  1)有賬戶就登錄,沒有則註冊後登錄

  2)可隨時退出

  3)登錄成功後顯示用戶余額,這時提示是否充值

  4)選擇商品時檢測余額是否夠用,夠了就支付扣款,不夠就提醒充值

  5)重新登錄後余額是上次更改後的金額

技術分享圖片
一個系統需要一個入口, 告訴用戶有哪些功能:
    註冊/登錄/充值/賬戶/購物/支付/購物車/註銷/退出

登錄:
    判斷是否存在這個用戶
        存在: 登錄, 輸密碼
            密碼正確: 記錄狀態, 避免重復登錄
            密碼錯誤: 重新輸入密碼
        不存在: 重新輸入, 一直沒有就退出; 或者提示註冊

註冊:
    輸入賬號, 可以設置用戶名規範, 判斷賬號是否存在
        存在: 提示已註冊, 可以登錄該賬號
        不存在: 輸入密碼註冊, 可以設置密碼規範, 註冊成功, 註冊信息寫入文件, 永久保存

登錄成功後:
    可以查看余額, 余額不足提示充值
    可以購物, 添加到購物車, 添加多個相同商品
        商品有編號, 對應商品名和價格
    購物完成有一個結束購物的標誌, 當余額充足直接支付扣款
        余額不足提示充值, 商品存放於購物車, 來到充值功能
        充值完成主動支付

支付:
    
1) 購物車沒有商品, 提示去購物再付款 2) 由於購物余額不足充值完成去支付, 支付成功, 並清空購物車 註: 充值/支付都需要更新的余額信息, 可以使用函數去調用 如果登錄失敗, 後面的功能不讓查看
分析 技術分享圖片
# -*- coding: utf-8 -*-

import time

# 文件用戶信息
# "abc|123|0,qwe|123|1000"
# 將文件信息讀取到內存中, 以變量存儲, 後期需要與這些信息交互
# 設計存儲用戶總信息的變量
# 以用戶名為key的字典, value也可以為字典, 存儲密碼和余額
users_dic = {}
# 從文件中讀取 ‘‘‘ { ‘abc‘: {‘pwd‘: ‘123‘, ‘money‘: 0}, ‘qwe‘: {‘pwd‘: ‘000‘, ‘money‘: 1000} } ‘‘‘ # 存儲當前登錄成功的用戶信息 user = {} # {‘name‘: ‘abc‘, ‘pwd‘: ‘123‘, ‘money‘: 0} # 獲取所有已註冊的用戶, 存放到user_dic # 獲取文件中用戶信息 def get_users(): # 如果用戶總信息有值, 代表用戶信息已經讀取過了, 不需要重復讀取 if users_dic:
return users_dic # 如果用戶總信息沒有值, 讀文件, 存用戶 with open("user.txt", "rt", encoding="utf-8") as f: # data裏面可能有一個用戶/多個用戶/沒有用戶, 即 # "abc|123|0,qwe|123|1000" 或 "abc|123|0" 或 None data = f.read() if not data: # 沒有用戶 return users_dic # data_list裏面 [‘abc|123|0‘, ‘qwe|123|1000‘] 或 [‘abc|123|0‘] data_list = data.split(",") for d in data_list: # user_info裏面[‘abc‘, ‘123‘, ‘0‘] user_info = d.split("|") usr = user_info[0] pwd = user_info[1] # 文件中讀取的money為字符串, 將money以數字存儲在內存, 方便後面的運算 money = float(user_info[2]) # 按照 ‘abc‘: {‘pwd‘: ‘123‘, ‘money‘: 0} 存儲到 user_dic users_dic[usr] = {pwd: pwd, money: money} return users_dic # 註冊 def register(): print("\033[32m註冊界面...\033[0m") # 獲取所有用戶信息 users = get_users() # 賬號輸入操作 temp_info = "" while True: usr = input(temp_info + "輸入賬號: ").strip() # 輸入的用戶名有格式錯誤 if not usr: # 用戶名為空 print("\033[31m賬號不能為空!\033[0m") temp_info = "請重新" continue # 用戶已存在 if usr in users: print("\033[31m用戶已存在, 請更換用戶名!\033[0m") temp_info = "請重新" continue # 用戶不存在, 可以進入輸入密碼階段 break # 密碼輸入操作 temp_info = "" while True: pwd = input(temp_info + "輸入密碼: ").strip() # 輸入的密碼有格式錯誤 if len(pwd) < 3: print("\033[31m密碼長度過短!\033[0m") temp_info = "請重新" continue # ... 可以添加其它密碼需求 break # 賬號密碼均滿足條件, 可以註冊(註冊就是寫入信息到文件) with open("user.txt", "at", encoding="utf-8") as f: # 文件是否為空 # 如果為空, 寫入 abc|123|0 # 如果不為空, 寫入 ,qwe|123|0 # users是否為空可以直接反映文件是否為空 if users: user_info = ,%s|%s|%s % (usr, pwd, 0) else: user_info = %s|%s|%s % (usr, pwd, 0) f.write(user_info) # 文件操作完代表信息更新到文件中, 還需要將信息更新到內存字典中 users[usr] = {pwd: pwd, money: 0} print("\033[32m註冊成功!\033[0m") # 登錄 def login(): global user print("\033[32m登錄界面...\033[0m") # 獲取所有用戶信息 users = get_users() # 當前是否為登錄狀態 # 可以通過user(存儲已登錄賬戶來反應是否為登錄狀態) if user: print("\033[31m系統已處於登錄狀態!\033[0m") return # 如果處於未登錄狀態 # 用戶名輸入 temp_info = "" while True: usr = input(temp_info + "輸入賬號: ").strip() # 賬號不能為空 if not usr: print("\033[31m賬號不能為空!\033[0m") temp_info = "請重新" continue # 賬戶不存在 if usr not in users: print("\033[31m輸入的賬號不存在\033[0m") # 文件為空, 不能進行下一步操作, 否則永遠是賬號不存在 # 文件不為空, 可以讓用戶重新輸入 if users: temp_info = "請重新" continue return break # 輸入密碼操作 temp_info = "" count = 0 while count < 3: pwd = input(temp_info + "輸入密碼: ").strip() if users[usr][pwd] == pwd: print("\033[32m登錄成功!\033[0m") # money在二次登錄以後操作文件可能已經擁有金額 money = users[usr][money] # 直接賦值代表覆蓋, 但函數內不能直接覆蓋全局變量, 需要做global處理 user = {usr: usr, "pwd": pwd, money: money} break print(\033[31m密碼輸入錯誤!\033[0m) temp_info = "請重新" count += 1 else: print("\033[31m密碼錯誤三次, 請等待5秒...\033[0m") time.sleep(5) # 賬戶 def account(): if not user: print("\033[31m系統未登錄, 無法查看用戶信息!\033[0m") return user_info = 賬戶: %s | 密碼: %s | 金額: %s % (user[usr], user[pwd], user[money]) print(user_info) # 註銷 def logout(): if not user: print("\033[31m系統未登錄, 無需註銷!\033[0m") return user.clear() print("\033[32m註銷成功!\033[0m") # 登錄成功後, 對於商品的一系列操作 # 商品列表 goods_dic = {1: iPhone, 2: Mac, 3: iPad, 4: iWatch, 5: girlfriend} price_dic = {iPhone: 6688, Mac: 13800, iPad: 5888, iWatch: 3199, girlfriend: 1} # 購物車: 商品與對應的購買個數 shop_car = {} # {‘iPhone‘: 3, ‘iPad‘: 1} goods_msg = ‘‘‘ 請添加商品到購物車: 1. iPhone 6688元 2. Mac 13800元 3. iPad 5888元 4. iWatch 3199元 0. 退出購買 ‘‘‘ # 充值 def top_up(): if not user: print("\033[31m系統未登錄, 不能充值!\033[0m") return temp_info = "" while True: money = input(temp_info + "輸入充值金額: ").strip() if not money.isdigit(): print("\033[31m輸入金額有誤!\033[0m") temp_info = "請重新" continue money = float(money) break # 更新金額 update_info(money, money) print("\033[32m充值完畢\033[0m") # 對密碼或金額進行修改 def update_info(k, v): # 需要更新的內容有: # 1. 當前登錄狀態下的用戶 # 2. 內存中的用戶 # 3. 文件中的用戶信息 # 首先更新1 if k == money: user[k] += v else: user[k] = v # 通過1更新2 users = get_users() users[user[usr]][k] = user[k] # 通過2更新3 # 將{‘abc‘: {‘ps‘: ‘123‘, ‘money‘: 0},‘qwe‘: {‘ps‘: ‘000‘, ‘money‘: 1000}} # 轉換為 "abc|123|0,qwe|123|1000" 寫入文件 # dict 轉換為 str users_info = ‘‘ for k, v in users.items(): usr = k pwd = v[pwd] money = str(v[money]) if not users_info: users_info += |.join((usr, pwd, money)) else: users_info += , + |.join((usr, pwd, money)) # 轉換完畢後便可以寫入文件 with open(user.txt, wt, encoding=utf-8) as f: f.write(users_info) # 購物 def shopping(): if not user: print(\033[31m系統未登錄, 無法購物!\033[0m) return print(goods_msg) while True: # 商品編號 goods_num = input("商品編號: ").strip() if goods_num == 0: print(\033[32m退出購買!\033[0m) break if not goods_num in goods_dic: print(\033[31m商品不存在!\033[0m) continue while True: # 商品數 count = input(商品個數: ).strip() if not count.isdigit(): print(\033[31m個數有誤!\033[0m) continue count = int(count) # 編號與個數均正確 # 加入購物車:{商品名: 個數} goods = goods_dic[goods_num] # 通過商品與購物車進行匹配,判斷商品個數是累加還是賦值 if not goods in shop_car: shop_car[goods] = count else: shop_car[goods] += count # 更新完購物車後代表一次購物車添加完畢 # 查看一下當前購物車信息 shop_cart_info() break # 進入支付:余額充足直接付款,不足充值 pay_money() # 購物車 def shop_cart_info(): if not shop_car: print("\033[32m購物車為空, 可前往購物\033[0m") return print("購物車: ", shop_car) # 支付 def pay_money(): if not user: print(\033[31m系統未登錄, 不能支付!\033[0m) return # 由購物來到支付,也可能主動調用支付 if not shop_car: print("\033[31m購物車為空, 請前往購物!\033[0m") return # 計算購物車內商品總價 total = 0 for goods in shop_car: total += price_dic[goods] * shop_car[goods] # 判斷余額與商品總價大小 if user[money] >= total: print(\033[32m余額充足, 購買成功!\033[0m) # 更新信息 reduce = 0 - total update_info(money, reduce) # 支付成功後,需要清空購物車 shop_car.clear() else: print(\033[31m余額不足, 請充值!\033[0m) top_up() # 系統功能提示信息 sys_msg = ‘‘‘ 歡迎使用購物車簡單系統,請選擇: 1.註冊 | 2.登錄 | 3.賬戶 | 4.充值 | 5.購物 | 6.支付 | 7.購物車 | 8.註銷 | 0.退出 >>>‘‘‘ # 功能字典(編號與功能對應) method_dic = { 1: register, 2: login, 3: account, 4: top_up, 5: shopping, 6: pay_money, 7: shop_cart_info, 8: logout, } # 系統入口 def system(): while True: choice = input(sys_msg).strip() # 退出選項 if choice == 0: print("退出系統") break # 錯誤選項 if choice not in method_dic: print("功能輸入有誤, 請重新輸入") continue # 正確選項 method_dic[choice]() system()
View Code

第二周作業 - 簡單購物車