這是模擬淘寶的一個簡易的購物商城程序。git
用戶入口具備如下功能:app
商家入口具備如下功能:spa
每一個用戶的用戶名、密碼、餘額、支付密碼,以行記錄定義在 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您已退出商城...')