python第八天)——購物車作業優化完成


發現之前的三級菜單代碼有BUG現已經修改過來了

購物車程序:
啟動程序后,輸入用戶名密碼后,如果是第一次登錄,讓用戶輸入工資,然后打印商品列表
允許用戶根據商品編號購買商品
用戶選擇商品后,檢測余額是否夠,夠就直接扣款,不夠就提醒
可隨時退出,退出時,打印已購買商品和余額
在用戶使用過程中, 關鍵輸出,如余額,商品已加入購物車等消息,需高亮顯示
用戶下一次登錄后,輸入用戶名密碼,直接回到上次的狀態,即上次消費的余額什么的還是那些,再次登錄可繼續購買
允許查詢之前的消費記錄

對於昨天的作業自己不太滿意!所以重新設計了流程圖:

增加新的功能:

1,可以注冊!

2,可以查看當前購物的清單

3,可以不結算退出

詳細代碼如下:

  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 import time,sys,os
  5 user_file=open("user_file.txt",'r+',encoding='utf-8')#打開用戶列表文件
  6 #with open('user_file.txt','r+',encoding='utf-8') as user_file:
  7 user_list=eval(user_file.readline())#轉換用戶文件中的字符串  user_list:注冊用戶列表
  8 lock_name=open('lock_name.txt','r+',encoding='utf-8')#打開鎖定用戶列表文件
  9 lock_list=eval(lock_name.readline())#轉換鎖定用戶文件中的字符串
 10 
 11 
 12 def regis():
 13     while True:
 14         name=input("請輸入您要注冊的用戶名:")
 15         if name not in user_list:
 16             print("恭喜!該用戶名可以被注冊!>>>")
 17             password=input('請輸入密碼:')
 18             password2=input('請再次確認密碼:')
 19             if password==password2:
 20                 name_infor='''恭喜您用戶注冊成功!
 21                     用戶名:{name}
 22                     密  碼:{password}
 23                     請牢記您的用戶名與密碼
 24                 '''
 25                 print(name_infor.format(name=name,password=password2))
 26                 user_list[name]=password2#增加注冊用戶到字典中
 27                 user_file.seek(0)#稱到最前
 28                 user_file.write(str(user_list))#寫入文件
 29                 user_file.flush()#即可保存
 30 
 31                 #confirm()
 32                 break
 33         else:
 34             print("該用戶名已經被注冊啦!請重新來過<<<")
 35             confirm()#是否退出
 36             continue
 37 
 38 
 39 
 40 def userchar(_user_name):#檢測用戶名的函數
 41     while True:
 42         if _user_name in user_list and _user_name not in lock_list:#判斷用戶是否存在並正常
 43             return True#存在返回真
 44         elif _user_name in user_list and _user_name  in lock_list:#判斷用戶是否被鎖定
 45             print('您的用戶已經被鎖定,請聯系商家解鎖!')
 46             break
 47         else:
 48             reg=input('您輸入用戶不存在,請先注冊!按\033[31;1m Q/q\033[0m 直接退出  \033[31;1m Y/y\033[0m 確定注冊,其它鍵返回!')
 49             if reg=='y' or reg=='Y':
 50                 regis()#用戶注冊函數
 51                 print('是否直接退出商城?')
 52                 break
 53             elif  reg=='q' or reg=='Q':
 54                 print("您已經退出!" )
 55                 exit()
 56             else :
 57                 break
 58 
 59 def confirm():#退出確認函數
 60     qu=input("是否退出!按\033[31;1mY/y\033[0m退出? 按其它鍵返回<<<")
 61     if qu=='Y'or qu=='y':
 62         print("您已經退出!" )
 63         exit()#退出程序
 64     else :
 65         pass
 66 
 67 def user_pass():
 68     bool=True#定義退出循環條件變量
 69     while bool:
 70         print("用戶登陸".center(30,'-'))
 71         _user_name=(input('請輸入用戶名:'))
 72         if userchar(_user_name.strip()):#運行檢測用戶名的函數判斷,去除兩邊空格
 73             count=3#定義鎖次數
 74             while count>0 :#如果密碼錯誤次數超過退出密碼輸入
 75                 #password=getpass.getpass('請輸入密碼:')
 76                 password=input('請輸入密碼:')
 77                 if password==user_list[_user_name]:#密碼通過驗證結束循環
 78                     print("密碼通過驗證")
 79                     bool=False
 80                     print("歡迎您  \033[32;1m%s\033[0m  您已經登陸成功!" % _user_name)
 81                     return _user_name#返回用戶名
 82                 else:
 83                     count -=1#次數減少
 84                     print("密碼錯誤請重試,剩余:\033[31;1m%s\033[0m次! "% count)
 85                     pass
 86             else:
 87                 print("\033[31;1m超出所試次數,賬戶已鎖定!請聯系商家!\033[0m")
 88                 lock_list.append(_user_name)#將用戶名加出鎖定列表
 89                 lock_name.seek(0)#指針移動到開頭,以免產生多個元組
 90                 lock_name.write(str(lock_list))#寫入鎖定用戶文件
 91                 lock_name.tell()#獲取當前指針,以免產生多個元組
 92                 lock_name.close()#關閉鎖定用戶文件
 93                 confirm()#退出確認函數
 94                 #continue#退回到輸入用戶名的位置
 95         else:#如果用戶名出錯新來過
 96             confirm()
 97             pass
 98 
 99 def infor():#打開用戶信息函數
100     with open('user_infor','r+',encoding='utf-8') as user_infor:#打開用戶購物信息文件
101         infor_list=eval(user_infor.readline())#轉換文件的字符串
102     return infor_list
103 
104 def history_user():#用戶購物歷史記錄函數
105     with open('history','r',encoding="utf-8") as user_history:#讀取用戶文件
106         history_list=eval(user_history.readline())#用戶購物信息
107     return history_list
108 
109 def history():#用戶消費記錄函數
110     history_list=history_user()#用戶購物歷史記錄
111     history=history_list[_user_name]#用戶購物記錄信息
112     print('您的購物記錄如下:')
113     for k,v in history.items():#轉為列表進行輸出
114         print(k,v)#輸出購物記錄
115     choose_index=input("請選擇您想要的操作:按\033[32;1mq/Q\033[0m直接退出商城!其它鍵返回!")
116     if choose_index=='Q' or choose_index=='q' :
117         choo=input('''>>>>>\033[42;1m您確定出退商城嗎?\033[0m
118                     如果您已經添加商品,此操作將不進行結算,
119                     您就無法將心愛的東東買回家了,按\033[31;1my/Y\033[0m確定直接退出!''')
120         if choo=='y'or choo=='Y':
121             print("您已經出退商城!")
122             exit()
123     else:
124         pass
125 #程序開始:
126 if os.path.exists('history'):#確認文件是否存在
127     pass
128 else:
129     with open('history','w',encoding='utf-8') as user_history:#創建一個用戶帳戶購物記錄文件
130         user_history.write('{}')#寫入空值
131     pass
132 
133 if os.path.exists('user_infor'):#確認文件是否存在
134     pass
135 else:
136     with open('user_infor','w',encoding='utf-8') as user_infor:#創建一個用戶帳戶信息記錄文件
137         user_infor.write('{}')#寫入空值
138     pass
139 
140 print("歡迎來到\033[31;1mpython\033[0m購物商城!")
141 
142 time_format='%y-%m-%d %X'#定義時間格式
143 times=time.strftime(time_format)#定義時間
144 _user_name= user_pass()#將通過驗證的用戶名賦於變量
145 
146 if _user_name in infor():#如果用戶信息存在記錄就跳過
147     pass
148 else:
149     while True:
150         name_char=input("首次登陸,請輸入工資(購物資金):")#用戶輸入工資(購物資金)
151         if  name_char.isdigit():#檢測輸入是否為整數
152             name_char=int(name_char)#轉為int
153             with open('history','r+',encoding='utf-8') as user_history:#打開用戶帳戶購物記錄文件
154                 history_list=eval(user_history.readline())#將文本讀為字典
155                 history_list[_user_name]={}#創建用戶購物記錄
156                 user_history.seek(0)#移到開頭
157                 user_history.write(str(history_list))#寫入文件
158             with open('user_infor','r+',encoding='utf-8') as user_infor:
159                 infor_list=eval(user_infor.readline())#轉換首登用戶文件中的字符串
160                 infor_list[_user_name]={"金額":name_char}
161                 user_infor.seek(0)
162                 user_infor.write(str(infor_list))#寫入用戶信息
163             print("充值成功,充值金額:\033[32;1m%s\033[0m元."% name_char)
164             break
165         else:
166             print('金額不能為0或負數請正確輸入金額!')
167             continue
168 
169 #再次登陸直接顯示用戶信息
170 infor_list=infor()#使用用戶信息函數 獲取用戶信息字典
171 name_char=int(infor_list[_user_name]['金額'])#獲取余額
172 print("\n您的帳戶信息:")
173 print('用戶名:\033[32;1m%s\033[0m:'%_user_name)#輸出用戶信息
174 print('您的余額:\033[31;1m%s\033[0m元.:'%name_char)
175 while True:
176     print('''您可以進行以下相關操作:\n
177             按 1 >>>查詢購物記錄。
178             按 2 >>>顯示商品列表開始購物!
179             按 3 >>>直接出退商城!
180     ''')
181     choose=input("請選擇您所要的功能:")#請用戶可以查詢
182     if choose=='1':
183         history()#查詢消費記錄
184     elif choose=='2':
185         ###進入商品列表###
186         shoplist=[]#購物車列表
187         shop_count=0#購物金額統計
188         goodsname=[]#定義商品列表
189         print('加載商品列表:')
190         for i in range(40):#加載動畫
191             sys.stdout.write('#')
192             sys.stdout.flush()
193             time.sleep(0.05)
194         print('\n')
195         with open('goodslist.txt','r',encoding='utf-8') as f:#打開商品列表文件
196             for line in f:
197                 a=line.find(',')#定位分割符的索引進行分割
198                 goodsname.append((line[0:a],int(line[a+1:])))#元組模式追加到列表,價格轉為整數
199         while True:
200             print("商品列表".center(50,'='))
201             for index,p_item in enumerate(goodsname):#取出下標輸出 商品列表
202                 print(index,p_item)#輸出商品列表
203             print("列表底部".center(50,'='))
204             user_index=input('請輸入商品編號添加你所在購買的商品,按\033[31;1mc/C\033[0m>> 查看當前購物清單, \033[31;1mh/H\033[0m查看消費記錄 \033[31;1mq/Q\033[0m結算商品退出>>>:')
205             if user_index.isdigit():#判斷是否為整數
206                 user_index=int(user_index)#轉為數字
207                 if user_index < len(goodsname) and user_index>=0:#判斷所選商品編號在在列表
208                     p_item=goodsname[user_index]#讀取下標所在(元素)商品
209                     if p_item[1]<=name_char:#余額是否足夠
210                         shoplist.append(p_item)#添加到購物車
211                         name_char-=p_item[1]#扣除金額
212                         shop_count+=p_item[1]#累加購物金額
213                         print("添加 \033[32;1m%s\033[0m 到購物車,價格: \033[32;1m%s\033[0m 元"% p_item)
214                         print("你的購物金額余: \033[31;1m%s\033[0m 元"% name_char)
215                     else:
216                         print("你的購物金額余: \033[41;1m%s\033[0m 元,無法購買該商品!" % name_char)
217                 else:
218                      print('輸入錯誤,該編號 \033[41;1m%s\033[0m 的商品不存在!'%user_index)
219             elif user_index=='q'or user_index=='Q':
220                 print('你的購物清單:')
221                 for up in shoplist:#打印購物清單
222                     print(up)
223                 print("你的購物總金額為:\033[32;1m%s\033[0m 元!"% shop_count)
224                 print("你的購物金額余: \033[31;1m%s\033[0m 元!" % name_char)
225                 while True:
226                     confirm=input("你是否確定結算商品並退出商城?\033[31;1m Y/y\033[0m是, \033[31;1mN/n\033[0m否:")
227                     if confirm== 'Y'or confirm== 'y' :
228                         infor_list[_user_name]['金額']=name_char#修改用戶金額(購物后)
229                         shoplist.append(('總額:',shop_count))#列表加入總額
230                         history_list=history_user()#用戶消費記錄函數
231                         history_list[_user_name][times+'購物清單:']=shoplist#添加時間:清單
232                         with open('user_infor','w',encoding="utf-8") as user_infor:#寫入文件用戶信息
233                             user_infor.seek(0)#移到最前
234                             user_infor.write(str(infor_list))#寫入
235                         with open('history','r+',encoding='utf-8') as user_history:#購物信息寫入文件
236                             user_history.seek(0)#移到最前
237                             user_history.write(str(history_list))#寫入
238                         exit(print("謝謝!\033[31;1mpython\033[0m 商城歡迎您再次光臨!"))
239                     elif confirm=='N'or confirm== 'n' :
240                         break
241                     else:
242                         print("輸入錯誤!請按提示輸入!")
243                         continue
244             elif user_index=='h'or user_index=='H':
245                 history()#查消費記錄
246             elif user_index=='c'or user_index=='C':
247                 print("當前購物清單:")
248                 for up in shoplist:#打印購物清單
249                     print(up)
250                 print("總金額:\033[32;1m%s\033[0m"%shop_count)
251                 continue
252             else:
253                 print('\033[41;1m輸入商品編號錯誤,請重新輸入!\033[0m')
254 
255     elif choose=='3':
256         print("您已經出退商城!")
257         exit()#退出商城
258     else:
259         print("\033[31;1m輸入有誤,請重新輸入!\033[0m")
260         continue

花了兩天,感覺還是值得的!!哈哈!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM