發現之前的三級菜單代碼有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
花了兩天,感覺還是值得的!!哈哈!