Python 實現購物商城,含有用戶入口和商家入口

這是模擬淘寶的一個簡易的購物商城程序。git

用戶入口具備如下功能:app

  1. 登陸認證
    1. 能夠鎖定用戶
    2. 密碼輸入次數大於3次,鎖定用戶名
    3. 連續三次輸錯用戶名退出程序
  2. 能夠選擇直接購買,也能夠選擇加入購物車
  3. 用戶使用支付密碼完成支付,支付密碼連續輸入錯誤達3次,鎖定用戶名

商家入口具備如下功能:spa

  1. 登陸認證
    1. 能夠鎖定用戶
    2. 密碼輸入次數大於3次,鎖定用戶名
    3. 連續三次輸錯用戶名退出程序
  2. 商家能夠編輯商品
    1. 上架新品
    2. 下架商品
    3. 修改商品信息:商品名、單價、庫存

每一個用戶的用戶名、密碼、餘額、支付密碼,以行記錄定義在 user_list.txt 文件中,以逗號分隔;code

每件商品的商品名、單價、庫存,以行記錄定義在 product_list.txt 文件中,以逗號加一個空格分隔;blog

被鎖定用戶名記錄在 lock_list.txt 文件中,以行分隔;索引

商家的用戶名、密碼定義在 seller_list.txt 文件中,以逗號分隔;接口

 

  1 # Joe Young
  2 
  3 import getpass
  4 import os
  5 
  6 # 調用os模塊的system方法傳入'cls'參數,清屏
  7 os.system('cls')    
  8 
  9 while True:
 10     entrance = input('請選擇:\n\t1. 用戶登錄\n\t2. 商家登錄\n>>>')
 11     if entrance != '1' and entrance != '2':
 12         print('\n輸入有誤,請重試...\n')
 13     else:
 14         break
 15 
 16 # 打印商品列表
 17 def print_product_list():
 18     index = 1
 19     with open('product_list.txt', 'r') as product_file:
 20         for product_line in product_file:
 21             L = [commodity, price, stock] = product_line.strip('\n').split(', ')
 22             commodity_list.append(L)
 23             print((str(index) + '. ' + commodity).ljust(20) + ('單價:' + price + '').ljust(15) + '庫存:' + stock)
 24             index += 1
 25     return
 26 
 27 # 用戶入口
 28 if entrance == '1':
 29 
 30     info = []          # 存放用戶的信息,初始爲空
 31     if_payed = True    # if_payed 表示訂單是否已支付
 32     username = ''
 33 
 34     # 登陸接口
 35     count = 0
 36     while count < 3:
 37         username = input('\n用戶名: ')
 38 
 39         # 打開鎖定列表文件
 40         with open('lock_list.txt', 'r+') as lock_file:  
 41             for lock_line in lock_file:
 42                 # 用戶名在鎖定名單裏面,則退出程序
 43                 if username == lock_line.strip('\n'):   
 44                     exit('\n用戶名 %s 已被鎖定,請聯繫管理員...' % username)
 45 
 46         login = False   # 登陸標誌,初始爲False
 47 
 48         # 打開用戶名列表文件,讀權限
 49         user_file = open('user_list.txt', 'r')     
 50 
 51         for user_line in user_file:
 52             # 獲取每行的用戶信息,用戶名、密碼、餘額、支付密碼,存入info列表
 53             info = [user, passwd, balance, pay_passwd] = user_line.strip('\n').split(',')
 54             # 用戶名匹配,則進入密碼輸入環節
 55             if user == username:    
 56                 n = 0
 57                 # 3次輸入機會
 58                 while n < 3:    
 59                     password = getpass.getpass('密碼: ')
 60                     # 密碼匹配,顯示登陸成功
 61                     if passwd == password:  
 62                         print('\n歡迎 %s 登陸商城,祝您購物愉快!\n' % username)
 63                         login = True        # 登陸標誌賦值爲True
 64                         break
 65                     # 密碼不匹配
 66                     else:   
 67                         # n = 2 時是最後一次機會,沒必要提示還剩下0次機會
 68                         if n != 2:  
 69                             print('\n密碼錯誤,請從新輸入,您還有 %d 次機會\n' % (2-n))
 70                     n += 1
 71                 # 密碼錯誤次數達到3次,鎖定用戶名,退出程序
 72                 else:   
 73                     open('lock_list.txt', 'w').write(username + '\n')
 74                     exit('\n錯誤次數過多,帳戶已被鎖定...')
 75 
 76                 # 登陸成功,跳出for循環
 77                 if login:   
 78                     break
 79         else:
 80             if count != 2:
 81                 print('\n用戶名不存在,請重試,您還有 %d 次機會' % (2-count))
 82 
 83         user_file.close()
 84 
 85         count += 1
 86 
 87         # 登陸成功,跳出while循環
 88         if login:   
 89             break
 90 
 91     else:
 92         exit('\n錯誤次數過多,程序已退出...')
 93 
 94     # 購買程序
 95     shopping_cart = []  # 購物車初始爲空
 96     commodity_list = []
 97 
 98     print_product_list()
 99 
100     while True:
101         i = input('\n請選擇商品(輸入序號),或輸入 c 取消購買:')
102 
103         if i == 'c':
104             while True:
105                 a = input('\n是否繼續購買?(Y/N):')
106                 if a == 'n' or a == 'N':
107                     exit('\n交易結束...')
108                 elif a == 'y' or a == 'Y':
109                     break
110                 else:
111                     print('\n輸入格式有誤,請重試...')
112                     continue
113 
114         if not i.isdigit():
115             print('\n輸入格式有誤,請重試...')
116             continue
117 
118         i = int(i)
119 
120         if i <= 0 or i > len(commodity_list):
121             print('\n此商品不存在,請重試...')
122             continue
123 
124         item_name = commodity_list[i-1][0]      # 商品名稱
125         item_price = commodity_list[i-1][1]     # 商品價格
126         item_stock = commodity_list[i-1][2]     # 商品庫存
127 
128         print('\n您已選擇了 %s ,請輸入購買的數量,或輸入 b 從新選擇:' % item_name)
129 
130         back = False
131 
132         while True:
133             num = input('>>>')
134             if num == 'b':
135                 back = True
136                 break
137             if not num.isdigit():
138                 print('輸入格式有誤,請重試...')
139                 continue
140             if int(num) > int(item_stock):
141                 print('數量大於庫存,請重試...')
142                 continue
143             if int(num) == 0:
144                 print('數量應大於0,請重試...')
145             break
146         if back:
147             continue
148 
149         item = [item_name, item_price, num]
150 
151         print('\n您已選擇了 %s,單價:%s 元,數量:%s,您想當即購買仍是加入購物車?\n' % (item_name, item_price, num))
152         print('\t1. 當即購買\n\t2. 加入購物車\n')
153 
154         while True:
155             choice = input('>>>')
156             if not (choice == '1' or choice == '2'):
157                 print('輸入有誤,請重試...')
158                 continue
159             break
160 
161         user_balance = int(info[2])
162 
163         # 當即購買
164         if choice == '1':   
165             amount = int(item_price) * int(num)
166             count = 0
167             cancel = False
168 
169             while count < 3:
170                 user_pay_passwd = getpass.getpass('\n請輸入支付密碼,或輸入 c 放棄支付:')
171                 if user_pay_passwd == 'c':
172                     print('\n取消支付成功...')
173                     cancel = True
174                     break
175                 elif user_pay_passwd != info[3]:
176                     if count != 2:
177                         print('\n密碼錯誤,請重試,您還有 %d 次機會...' % (2-count))
178                     count += 1
179                 else:
180                     break
181 
182             if count == 3:
183                 with open('lock_list.txt', 'w') as lock_file:
184                     lock_file.write(username + '\n')
185                 exit('密碼錯誤,帳戶已被鎖定...')
186 
187             if cancel:
188                 while True:
189                     choice = input('\n是否繼續購買?(Y/N):')
190                     if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
191                         print('\n輸入格式有誤,請重試...')
192                         continue
193                     break
194                 if choice == 'Y' or choice == 'y':
195                     continue
196                 else:
197                     break
198 
199             # 若是用戶的帳戶餘額大於總金額
200             if user_balance >= amount:  
201                 user_balance -= amount
202                 print('\n支付成功!您已成功購買 %s ,單價:%s 元,數量:%s,總金額:%s 元,帳戶餘額:%s 元'
203                       % (item_name, item_price, num, amount, user_balance))
204                 lines = open('product_list.txt', 'r').readlines()
205                 # 定位到用戶所購買的商品所在行,分割成列表賦值給select
206                 select = lines[i-1].strip('\n').split(', ')             
207                 # 修改商品的庫存
208                 select[-1] = (str(int(select[-1]) - int(num)) + '\n')   
209                 # 拼接成字符串
210                 lines[i-1] = ', '.join(select)                          
211                 # 將修改寫回文件
212                 open('product_list.txt', 'w').writelines(lines)         
213 
214                 lines = open('user_list.txt', 'r').readlines()
215                 # 修改用戶餘額
216                 for line in lines:  
217                     if username in line.split(','):     # 定位到用戶名所在行
218                         j = lines.index(line)           # 獲取用戶名所在行的行號索引
219                         select = line.split(',')        # 分割用戶名所在行賦值給列表select
220                         select[-2] = str(user_balance)  # 修改用戶餘額
221                         lines[j] = ','.join(select)     # 修改後的列表拼接成字符串,覆蓋用戶名所在行
222                         open('user_list.txt', 'w').writelines(lines)    # 將修改寫回文件
223             else:
224                 print('\n對不起,您的餘額不足...')
225 
226         else:   # 加入購物車
227             j = 0
228             for j in range(len(shopping_cart)):
229                 # 若是商品在購物車裏面,更新商品數量
230                 if item_name in shopping_cart[j]:   
231                     shopping_cart[j][2] = str(int(shopping_cart[j][2]) + int(num))
232                     break
233             # 商品若不在購物車,則添加到購物車
234             else:
235                 shopping_cart.append(item)  
236             print('\n成功加入購物車!')
237 
238         while True:
239             choice = input('\n是否繼續購買?(Y/N):')
240             if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
241                 print('\n輸入格式有誤,請重試...')
242                 continue
243             break
244 
245         if choice == 'Y' or choice == 'y':
246             continue
247         else:
248             break
249 
250     # 若是購物車不爲空
251     if shopping_cart:   
252         print('\n您的購物車裏有如下寶貝:\n')
253         i = 1
254         total_sum = 0
255         for item in shopping_cart:
256             (commodity, price, number) = (item[0], item[1], item[2])
257             print((str(i) + '. ' + commodity).ljust(20) + ('單價:' + price + '').ljust(15) + '數量:' + number)
258             total_sum += int(price) * int(number)
259             i += 1
260         print('\n合計:%d 元' % total_sum)
261 
262         while True:
263             if_buy = input('\n是否結算?(Y/N):')
264             if not (if_buy == 'Y' or if_buy == 'y' or if_buy == 'N' or if_buy == 'n'):
265                 print('\n輸入有誤,請重試...')
266                 continue
267             break
268 
269         while True:
270             # 結算
271             if if_buy == 'Y' or if_buy == 'y':  
272                 count = 0
273                 cancel = False
274 
275                 while count < 3:
276                     user_pay_passwd = getpass.getpass('\n請輸入支付密碼,或輸入 c 放棄支付:')
277                     if user_pay_passwd == 'c':
278                         print('\n取消支付成功...')
279                         cancel = True
280                         break
281                     elif user_pay_passwd != info[3]:
282                         if count != 2:
283                             print('\n密碼錯誤,請重試,您還有 %d 次機會...' % (2-count))
284                         count += 1
285                     else:
286                         break
287 
288                 if cancel:
289                     if_payed = False
290 
291                 elif count == 3:
292                     with open('lock_list.txt', 'w') as lock_file:
293                         lock_file.write(username + '\n')
294                     exit('\n密碼錯誤,帳戶已被鎖定...')
295 
296                 else:
297                     if total_sum <= user_balance:
298                         user_balance -= total_sum
299                         print('\n支付成功!您已成功購買如下商品:\n')
300                         i = 1
301                         for item in shopping_cart:
302                             (commodity, price, number) = (item[0], item[1], item[2])
303                             print((str(i) + '. ' + commodity).ljust(20) +
304                                   ('單價:' + price + '').ljust(15) + '數量:' + number)
305                             lines = open('product_list.txt', 'r').readlines()
306                             for line in lines:  # 修改商品庫存
307                                 if commodity in line.split(', '):                    # 定位到商品所在行
308                                     j = lines.index(line)                            # 獲取商品所在行的行號索引
309                                     select = line.split(', ')                        # 商品所在行分割爲字符串列表
310                                     select[-1] = (str(int(select[-1]) - int(number)) + '\n')    # 修改商品庫存
311                                     lines[j] = ', '.join(select)                     # 將修改後的字符串列表組成字符串
312                                     open('product_list.txt', 'w').writelines(lines)  # 把修改寫回文件
313                             i += 1
314 
315                         lines = open('user_list.txt', 'r').readlines()
316 
317                         for line in lines:  # 用戶餘額寫入文件
318                             if username in line.split(','):
319                                 j = lines.index(line)
320                                 select = line.split(',')
321                                 select[-2] = str(user_balance)
322                                 lines[j] = ','.join(select)
323                                 open('user_list.txt', 'w').writelines(lines)
324 
325                         exit('\n合計:%d 元, 帳戶餘額:%d 元' % (total_sum, user_balance))
326 
327             # 不結算
328             else:   
329                 print('\n您有一筆未支付訂單...')
330                 while True:
331                     choice = input('\n是否進行支付?(Y/N):')
332                     if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
333                         print('\n輸入有誤,請重試...')
334                         continue
335                     break
336                 if choice == 'n' or choice == 'N':
337                     exit('\n訂單已取消,感謝光臨購物商城,再見...')
338                 else:
339                     if_buy = 'Y'
340                     continue
341 
342             if not if_payed:
343                 print('\n您有一筆未支付訂單...')
344                 while True:
345                     choice = input('\n是否進行支付?(Y/N):')
346                     if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
347                         print('\n輸入有誤,請重試...')
348                         continue
349                     break
350 
351                 if choice == 'n' or choice == 'N':
352                     exit('\n訂單已取消,感謝光臨購物商城,再見...')
353                 else:
354                     if_buy = 'Y'
355                     continue
356 
357 # 商家入口
358 if entrance == '2':     
359 
360     seller_name = ''
361 
362     # 登陸接口
363     count = 0
364     while count < 3:
365         seller_name = input('\n用戶名:')
366 
367         with open('lock_list.txt', 'r') as lock_file:
368             for lock_line in lock_file:
369                 if seller_name == lock_line.strip('\n'):
370                     exit('\n用戶名 %s 已被鎖定,請聯繫管理員...' % seller_name)
371 
372         seller_file = open('seller_list.txt', 'r')
373         login = False
374 
375         for seller_line in seller_file:
376             (seller, passwd) = seller_line.strip('\n').split(',')
377             if seller_name == seller:
378                 n = 0
379                 while n < 3:
380                     password = getpass.getpass('密碼:')
381                     # 登陸成功,跳出while循環
382                     if password == passwd:
383                         print('\n歡迎 %s 登陸商城' % seller_name)
384                         login = True
385                         break   
386                     else:
387                         if n != 2:
388                             print('\n密碼錯誤,請重試,您還有 %d 次機會' % (2-n))
389                     n += 1
390                 # n = 3,鎖定用戶名
391                 else:           
392                     open('lock_list.txt', 'w').write(seller_name + '\n')
393                     exit('\n錯誤次數過多,帳戶已被鎖定...')
394                 # 登陸成功,跳出for循環
395                 if login:       
396                     break
397 
398         # 用戶名不存在
399         else:       
400             if count != 2:
401                 print('\n用戶名不存在,請重試,您還有 %d 次機會' % (2-count))
402 
403         # 登陸成功,跳出while循環
404         if login:   
405             break
406 
407         count += 1
408 
409     else:
410         exit('\n錯誤次數過多,程序已退出...')
411 
412 
413     # 商品列表編輯程序
414   
415     L = []
416     # 存放商品列表,初始爲空
417     commodity_list = []
418     index = 1
419 
420     print('\n您的貨架上有如下商品:\n')
421   
422     print_product_list()
423 
424     while True:
425         choice = input('\n是否編輯您的商品列表?(Y/N):')
426         if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
427             print('\n輸入有誤,請重試...')
428             continue
429         break
430 
431     if choice == 'Y' or choice == 'y':
432         while True:
433             print('\n請選擇(輸入 q 退出):\n')
434             print('1. 上架新品\n\n2. 下架商品\n\n3. 修改商品信息')
435             choice = input('\n>>>')
436             if not (choice == '1' or choice == '2' or choice == '3' or choice == 'q'):
437                 print('輸入有誤,請重試...')
438                 continue
439 
440             # 上架新品
441             if choice == '1':
442                 while True:
443                     if_add = False  # 是否添加商品的標誌,初始爲False
444                     new_commodity = input('\n輸入商品名:')
445 
446                     product_file = open('product_list.txt', 'r')
447 
448                     for product_line in product_file:
449                         commodity = product_line.strip('\n').split(', ')[0]     # 獲取商品列表中的商品名
450                         if new_commodity == commodity:
451                             print('\n此商品已在貨架上...')
452                             continue
453                         else:
454                             while True:
455                                 if_sure = input('\n肯定上架新品 %s 嗎?(Y/N):' % new_commodity)
456                                 if not (if_sure == 'Y' or if_sure == 'y' or if_sure == 'N' or if_sure == 'n'):
457                                     print('\n輸入有誤,請重試...')
458                                     continue
459                                 break
460                             # 肯定上架新品
461                             if if_sure == 'Y' or if_sure == 'y':
462                                 while True:     # 輸入單價
463                                     price = input('\n請輸入單價:')
464                                     if not price.isdigit():
465                                         print('\n輸入有誤,請重試...')
466                                         continue
467                                     break
468                                 while True:     # 輸入庫存
469                                     stock = input('\n請輸入庫存:')
470                                     if not stock.isdigit():
471                                         print('\n輸入有誤,請重試...')
472                                         continue
473                                     break
474                                 new_line = '\n' + new_commodity + ', ' + price + ', ' + stock
475                                 open('product_list.txt', 'a').writelines(new_line)
476                                 print('\n成功上架新品 %s ,單價 %s 元,庫存 %s 件' % (new_commodity, price, stock))
477 
478                                 while True:
479                                     option = input('\n是否繼續添加?(Y/N):')
480                                     if not (option == 'Y' or option or option == 'N' or option == 'n'):
481                                         print('\n輸入有誤,請重試...')
482                                         continue
483                                     break
484                                 if option == 'Y' or option == 'y':
485                                     if_add = True
486                                     break   # 跳出for循環
487                                 else:
488                                     break
489                             # 取消上架新品
490                             else:
491                                 if_add = False
492                                 break   # 跳出for循環
493                     product_file.close()
494 
495                     if if_add is True:
496                         continue
497                     else:
498                         break   # 跳出while循環
499 
500             # 下架商品
501             elif choice == '2':
502                 while True:
503                     del_num = input('\n請輸入您想下架商品的序號:')
504                     if not (del_num.isdigit() or int(del_num) > 0 and int(del_num) <= len(commodity_list)):
505                         print('\n輸入有誤,請重試...')
506                         continue
507                     break
508 
509                 del_num = int(del_num)
510                 del_commodity = commodity_list[del_num - 1][0]
511 
512                 with open('product_list.txt', 'r') as old_file:
513                     with open('product_list.txt', 'r+') as new_file:
514 
515                         current_line = 0
516 
517                         # 定位到須要刪除的行
518                         while current_line < (del_num - 1):
519                             old_file.readline()
520                             current_line += 1
521 
522                         # 當前光標在被刪除行的行首,記錄該位置
523                         seek_point = old_file.tell()
524 
525                         # 設置光標位置
526                         new_file.seek(seek_point, 0)
527 
528                         # 讀須要刪除的行,光標移到下一行行首
529                         old_file.readline()
530                         
531                         # 被刪除行的下一行讀給 next_line
532                         next_line = old_file.readline()
533 
534                         # 連續覆蓋剩餘行,後面全部行上移一行
535                         while next_line:
536                             new_file.write(next_line)
537                             next_line = old_file.readline()
538 
539                         # 寫完最後一行後截斷文件,由於刪除操做,文件總體少了一行,原文件最後一行須要去掉
540                         new_file.truncate()
541 
542                 print('\n您已成功下架 %s !' % del_commodity)
543 
544             # 修改商品信息
545             elif choice == '3':
546 
547                 # 修改商品信息
548                 def mod_commodity_info(i, j):
549                     i = int(i)
550                     j = int(j)
551                     with open('product_list.txt', 'r+') as f:
552                         current_line = 0
553                         while current_line < i - 1:
554                             f.readline()
555                             current_line += 1
556                         seek_point = f.tell()
557                         f.seek(seek_point, 0)
558 
559                         # 修改商品名
560                         if j == 1:
561                             update_line = mod_name() + ', ' + commodity_list[i-1][1] + ', ' + commodity_list[i-1][2] + '\n'
562                         # 修改商品價格
563                         elif j == 2:
564                             update_line = commodity_list[i-1][0] + ', ' + mod_price() + ', ' + commodity_list[i-1][2] + '\n'
565                         # 修改商品庫存
566                         else:
567                             update_line = commodity_list[i-1][0] + ', ' + commodity_list[i-1][1] + ', ' + mod_stock() + '\n'
568                         
569                         f.write(update_line)
570                     return
571                 
572                 def mod_name():
573                     new_name = input("\n請輸入新的商品名:")
574                     return new_name
575 
576                 def mod_price():
577                     new_price = input("\n請輸入新的商品單價:")
578                     return new_price
579 
580                 def mod_stock():
581                     new_stock = input("\n請輸入新的商品庫存:")
582                     return new_stock
583 
584                 # 修改商品單價
585                 def mod_commodity_price(i):
586                     i = int(i)
587                     with open('product_list.txt', 'r+') as f:
588                         current_line = 0
589                         while current_line < i -1:
590                             f.readline()
591                             current_line += 1
592                         seek_point = f.tell()
593                         f.seek(seek_point, 0)
594                         new_price = input()
595 
596 
597                 while True:
598                     i = input("\n請輸入須要編輯的商品序號(輸入 c 取消):")
599                     if not (i.isdigit or i == 'c' or int(i) > 0 and int(i) <= len(commodity_list)):
600                         print("\n輸入有誤,請重試...")
601                         continue
602                     elif i == 'c':
603                         break
604                     else:
605                         while True:
606                             j = input("\n請選擇須要編輯的選項(輸入 c 取消):\n\n1. 商品名\n\n2. 單價\n\n3. 庫存\n\n>>>")
607                             if not (j == 'c' or j == '1' or j == '2' or j == '3'):
608                                 print("\n輸入有誤,請重試...")
609                                 continue
610                             break
611                         if j == 'c':
612                             break
613                         else:
614                             mod_commodity_info(i, j)
615 
616             else:
617                 exit('\n您已退出商城...')
618     else:
619         exit('\n您已退出商城...')
相關文章
相關標籤/搜索