第二周作業 - 簡單購物車
阿新 • • 發佈:2018-10-05
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
第二周作業 - 簡單購物車